|
|
|
import React from 'react';
|
|
|
|
import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton';
|
|
|
|
import { PubKey } from '../../session/types';
|
|
|
|
import { ToastUtils } from '../../session/utils';
|
|
|
|
import { SessionModal } from '../session/SessionModal';
|
|
|
|
import { DefaultTheme } from 'styled-components';
|
|
|
|
import { SessionSpinner } from '../session/SessionSpinner';
|
|
|
|
import { Flex } from '../basic/Flex';
|
|
|
|
import { ConversationModel } from '../../models/conversation';
|
|
|
|
import { ApiV2 } from '../../opengroup/opengroupV2';
|
|
|
|
interface Props {
|
|
|
|
convo: ConversationModel;
|
|
|
|
onClose: any;
|
|
|
|
theme: DefaultTheme;
|
|
|
|
}
|
|
|
|
|
|
|
|
interface State {
|
|
|
|
inputBoxValue: string;
|
|
|
|
addingInProgress: boolean;
|
|
|
|
firstLoading: boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class AddModeratorsDialog extends React.Component<Props, State> {
|
|
|
|
private channelAPI: any;
|
|
|
|
|
|
|
|
constructor(props: Props) {
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
this.addAsModerator = this.addAsModerator.bind(this);
|
|
|
|
this.onPubkeyBoxChanges = this.onPubkeyBoxChanges.bind(this);
|
|
|
|
|
|
|
|
this.state = {
|
|
|
|
inputBoxValue: '',
|
|
|
|
addingInProgress: false,
|
|
|
|
firstLoading: true,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
public async componentDidMount() {
|
|
|
|
if (this.props.convo.isOpenGroupV1()) {
|
|
|
|
this.channelAPI = await this.props.convo.getPublicSendData();
|
|
|
|
}
|
|
|
|
|
|
|
|
this.setState({ firstLoading: false });
|
|
|
|
}
|
|
|
|
|
|
|
|
public async addAsModerator() {
|
|
|
|
// if we don't have valid data entered by the user
|
|
|
|
const pubkey = PubKey.from(this.state.inputBoxValue);
|
|
|
|
if (!pubkey) {
|
|
|
|
window?.log?.info('invalid pubkey for adding as moderator:', this.state.inputBoxValue);
|
|
|
|
ToastUtils.pushInvalidPubKey();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
window?.log?.info(`asked to add moderator: ${pubkey.key}`);
|
|
|
|
|
|
|
|
try {
|
|
|
|
this.setState({
|
|
|
|
addingInProgress: true,
|
|
|
|
});
|
|
|
|
let isAdded: any;
|
|
|
|
if (this.props.convo.isOpenGroupV1()) {
|
|
|
|
isAdded = await this.channelAPI.serverAPI.addModerator([pubkey.key]);
|
|
|
|
} else {
|
|
|
|
// this is a v2 opengroup
|
|
|
|
const roomInfos = this.props.convo.toOpenGroupV2();
|
|
|
|
isAdded = await ApiV2.addModerator(pubkey, roomInfos);
|
|
|
|
}
|
|
|
|
if (!isAdded) {
|
|
|
|
window?.log?.warn('failed to add moderators:', isAdded);
|
|
|
|
|
|
|
|
ToastUtils.pushUserNeedsToHaveJoined();
|
|
|
|
} else {
|
|
|
|
window?.log?.info(`${pubkey.key} added as moderator...`);
|
|
|
|
ToastUtils.pushUserAddedToModerators();
|
|
|
|
|
|
|
|
// clear input box
|
|
|
|
this.setState({
|
|
|
|
inputBoxValue: '',
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
window?.log?.error('Got error while adding moderator:', e);
|
|
|
|
} finally {
|
|
|
|
this.setState({
|
|
|
|
addingInProgress: false,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public render() {
|
|
|
|
const { i18n } = window;
|
|
|
|
const { addingInProgress, inputBoxValue, firstLoading } = this.state;
|
|
|
|
const chatName = this.props.convo.get('name');
|
|
|
|
|
|
|
|
const title = `${i18n('addModerators')}: ${chatName}`;
|
|
|
|
|
|
|
|
const renderContent = !firstLoading;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<SessionModal title={title} onClose={() => this.props.onClose()} theme={this.props.theme}>
|
|
|
|
<Flex container={true} flexDirection="column" alignItems="center">
|
|
|
|
{renderContent && (
|
|
|
|
<>
|
|
|
|
<p>Add Moderator:</p>
|
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
className="module-main-header__search__input"
|
|
|
|
placeholder={i18n('enterSessionID')}
|
|
|
|
dir="auto"
|
|
|
|
onChange={this.onPubkeyBoxChanges}
|
|
|
|
disabled={addingInProgress}
|
|
|
|
value={inputBoxValue}
|
|
|
|
/>
|
|
|
|
<SessionButton
|
|
|
|
buttonType={SessionButtonType.Brand}
|
|
|
|
buttonColor={SessionButtonColor.Primary}
|
|
|
|
onClick={this.addAsModerator}
|
|
|
|
text={i18n('add')}
|
|
|
|
disabled={addingInProgress}
|
|
|
|
/>
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
<SessionSpinner loading={addingInProgress || firstLoading} />
|
|
|
|
</Flex>
|
|
|
|
</SessionModal>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
private onPubkeyBoxChanges(e: any) {
|
|
|
|
const val = e.target.value;
|
|
|
|
this.setState({ inputBoxValue: val });
|
|
|
|
}
|
|
|
|
}
|