|  |  |  | 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) { | 
					
						
							|  |  |  |   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); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; |