You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			196 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			TypeScript
		
	
import _ from 'lodash';
 | 
						|
import { getV2OpenGroupRoom } from '../data/opengroups';
 | 
						|
import { ConversationModel } from '../models/conversation';
 | 
						|
import { ApiV2 } from '../opengroup/opengroupV2';
 | 
						|
import { joinOpenGroupV2WithUIEvents } from '../opengroup/opengroupV2/JoinOpenGroupV2';
 | 
						|
import { isOpenGroupV2, openGroupV2CompleteURLRegex } from '../opengroup/utils/OpenGroupUtils';
 | 
						|
import { getConversationController } from '../session/conversations';
 | 
						|
import { PubKey } from '../session/types';
 | 
						|
import { ToastUtils } from '../session/utils';
 | 
						|
 | 
						|
import { updateConfirmModal } from '../state/ducks/modalDialog';
 | 
						|
 | 
						|
export function banUser(userToBan: string, conversationId: string) {
 | 
						|
  let pubKeyToBan: PubKey;
 | 
						|
  try {
 | 
						|
    pubKeyToBan = PubKey.cast(userToBan);
 | 
						|
  } catch (e) {
 | 
						|
    window?.log?.warn(e);
 | 
						|
    ToastUtils.pushUserBanFailure();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  const onClickClose = () => {
 | 
						|
    window.inboxStore?.dispatch(updateConfirmModal(null));
 | 
						|
  };
 | 
						|
 | 
						|
  const confirmationModalProps = {
 | 
						|
    title: window.i18n('banUser'),
 | 
						|
    message: window.i18n('banUserConfirm'),
 | 
						|
    onClickClose,
 | 
						|
    onClickOk: async () => {
 | 
						|
      const conversation = getConversationController().get(conversationId);
 | 
						|
      if (!conversation) {
 | 
						|
        window.log.info('cannot ban user, the corresponding conversation was not found.');
 | 
						|
        return;
 | 
						|
      }
 | 
						|
      let success = false;
 | 
						|
      if (isOpenGroupV2(conversation.id)) {
 | 
						|
        const roomInfos = await getV2OpenGroupRoom(conversation.id);
 | 
						|
        if (!roomInfos) {
 | 
						|
          window.log.warn('banUser room not found');
 | 
						|
        } else {
 | 
						|
          success = await ApiV2.banUser(pubKeyToBan, _.pick(roomInfos, 'serverUrl', 'roomId'));
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        throw new Error('V1 opengroup are not supported');
 | 
						|
      }
 | 
						|
      if (success) {
 | 
						|
        ToastUtils.pushUserBanSuccess();
 | 
						|
      } else {
 | 
						|
        ToastUtils.pushUserBanFailure();
 | 
						|
      }
 | 
						|
    },
 | 
						|
  };
 | 
						|
 | 
						|
  window.inboxStore?.dispatch(updateConfirmModal(confirmationModalProps));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * There is no way to unban on an opengroupv1 server.
 | 
						|
 * This function only works for opengroupv2 server
 | 
						|
 */
 | 
						|
export function unbanUser(userToUnBan: string, conversationId: string) {
 | 
						|
  let pubKeyToUnban: PubKey;
 | 
						|
  try {
 | 
						|
    pubKeyToUnban = PubKey.cast(userToUnBan);
 | 
						|
  } catch (e) {
 | 
						|
    window?.log?.warn(e);
 | 
						|
    ToastUtils.pushUserBanFailure();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  if (!isOpenGroupV2(conversationId || '')) {
 | 
						|
    window?.log?.warn('no way to unban on a opengroupv1');
 | 
						|
    ToastUtils.pushUserBanFailure();
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  const onClickClose = () => window.inboxStore?.dispatch(updateConfirmModal(null));
 | 
						|
 | 
						|
  const onClickOk = async () => {
 | 
						|
    const conversation = getConversationController().get(conversationId);
 | 
						|
 | 
						|
    if (!conversation) {
 | 
						|
      // double check here. the convo might have been removed since the dialog was opened
 | 
						|
      window.log.info('cannot unban user, the corresponding conversation was not found.');
 | 
						|
      return;
 | 
						|
    }
 | 
						|
    let success = false;
 | 
						|
    if (isOpenGroupV2(conversation.id)) {
 | 
						|
      const roomInfos = await getV2OpenGroupRoom(conversation.id);
 | 
						|
      if (!roomInfos) {
 | 
						|
        window.log.warn('unbanUser room not found');
 | 
						|
      } else {
 | 
						|
        success = await ApiV2.unbanUser(pubKeyToUnban, _.pick(roomInfos, 'serverUrl', 'roomId'));
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if (success) {
 | 
						|
      ToastUtils.pushUserUnbanSuccess();
 | 
						|
    } else {
 | 
						|
      ToastUtils.pushUserUnbanFailure();
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  window.inboxStore?.dispatch(
 | 
						|
    updateConfirmModal({
 | 
						|
      title: window.i18n('unbanUser'),
 | 
						|
      message: window.i18n('unbanUserConfirm'),
 | 
						|
      onClickOk,
 | 
						|
      onClickClose,
 | 
						|
    })
 | 
						|
  );
 | 
						|
}
 | 
						|
 | 
						|
export function copyBodyToClipboard(body?: string | null) {
 | 
						|
  window.clipboard.writeText(body);
 | 
						|
 | 
						|
  ToastUtils.pushCopiedToClipBoard();
 | 
						|
}
 | 
						|
 | 
						|
export function copyPubKey(sender: string) {
 | 
						|
  // this.getSource return out pubkey if this is an outgoing message, or the sender pubkey
 | 
						|
  window.clipboard.writeText();
 | 
						|
 | 
						|
  ToastUtils.pushCopiedToClipBoard();
 | 
						|
}
 | 
						|
 | 
						|
export async function removeSenderFromModerator(sender: string, convoId: string) {
 | 
						|
  try {
 | 
						|
    const pubKeyToRemove = PubKey.cast(sender);
 | 
						|
    const convo = getConversationController().getOrThrow(convoId);
 | 
						|
 | 
						|
    const roomInfo = convo.toOpenGroupV2();
 | 
						|
    const res = await ApiV2.removeModerator(pubKeyToRemove, roomInfo);
 | 
						|
    if (!res) {
 | 
						|
      window?.log?.warn('failed to remove moderator:', res);
 | 
						|
 | 
						|
      ToastUtils.pushFailedToRemoveFromModerator();
 | 
						|
    } else {
 | 
						|
      window?.log?.info(`${pubKeyToRemove.key} removed from moderators...`);
 | 
						|
      ToastUtils.pushUserRemovedFromModerators();
 | 
						|
    }
 | 
						|
  } catch (e) {
 | 
						|
    window?.log?.error('Got error while removing moderator:', e);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export async function addSenderAsModerator(sender: string, convoId: string) {
 | 
						|
  try {
 | 
						|
    const pubKeyToAdd = PubKey.cast(sender);
 | 
						|
    const convo = getConversationController().getOrThrow(convoId);
 | 
						|
 | 
						|
    const roomInfo = convo.toOpenGroupV2();
 | 
						|
    const res = await ApiV2.addModerator(pubKeyToAdd, roomInfo);
 | 
						|
    if (!res) {
 | 
						|
      window?.log?.warn('failed to add moderator:', res);
 | 
						|
 | 
						|
      ToastUtils.pushFailedToAddAsModerator();
 | 
						|
    } else {
 | 
						|
      window?.log?.info(`${pubKeyToAdd.key} added to moderators...`);
 | 
						|
      ToastUtils.pushUserAddedToModerators();
 | 
						|
    }
 | 
						|
  } catch (e) {
 | 
						|
    window?.log?.error('Got error while adding moderator:', e);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const acceptOpenGroupInvitationV2 = (completeUrl: string, roomName?: string) => {
 | 
						|
  const onClickClose = () => {
 | 
						|
    window.inboxStore?.dispatch(updateConfirmModal(null));
 | 
						|
  };
 | 
						|
 | 
						|
  window.inboxStore?.dispatch(
 | 
						|
    updateConfirmModal({
 | 
						|
      title: window.i18n('joinOpenGroupAfterInvitationConfirmationTitle', roomName),
 | 
						|
      message: window.i18n('joinOpenGroupAfterInvitationConfirmationDesc', roomName),
 | 
						|
      onClickOk: async () => {
 | 
						|
        await joinOpenGroupV2WithUIEvents(completeUrl, true, false);
 | 
						|
      },
 | 
						|
 | 
						|
      onClickClose,
 | 
						|
    })
 | 
						|
  );
 | 
						|
  // this function does not throw, and will showToasts if anything happens
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Accepts a v2 url open group invitation (with pubkey) or just log an error
 | 
						|
 */
 | 
						|
export const acceptOpenGroupInvitation = (completeUrl: string, roomName?: string) => {
 | 
						|
  if (completeUrl.match(openGroupV2CompleteURLRegex)) {
 | 
						|
    acceptOpenGroupInvitationV2(completeUrl, roomName);
 | 
						|
  } else {
 | 
						|
    window?.log?.warn('Invalid opengroup url:', completeUrl);
 | 
						|
  }
 | 
						|
};
 |