import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { BlockOrUnblockModalState } from '../../components/dialog/blockOrUnblock/BlockOrUnblockModalState'; import { EnterPasswordModalProps } from '../../components/dialog/EnterPasswordModal'; import { HideRecoveryPasswordDialogProps } from '../../components/dialog/HideRecoveryPasswordDialog'; import { SessionConfirmDialogProps } from '../../components/dialog/SessionConfirm'; import { MediaItemType } from '../../components/lightbox/LightboxGallery'; import { AttachmentTypeWithPath } from '../../types/Attachment'; import type { EditProfilePictureModalProps, PasswordAction } from '../../types/ReduxTypes'; import { WithConvoId } from '../../session/types/with'; export type BanType = 'ban' | 'unban'; export type ConfirmModalState = SessionConfirmDialogProps | null; export type InviteContactModalState = WithConvoId | null; export type BanOrUnbanUserModalState = | (WithConvoId & { banType: BanType; pubkey?: string; }) | null; export type AddModeratorsModalState = InviteContactModalState; export type RemoveModeratorsModalState = InviteContactModalState; export type UpdateGroupMembersModalState = InviteContactModalState; export type UpdateGroupNameModalState = WithConvoId | null; export type ChangeNickNameModalState = InviteContactModalState; export type EditProfileModalState = object | null; export type OnionPathModalState = EditProfileModalState; export type EnterPasswordModalState = EnterPasswordModalProps | null; export type DeleteAccountModalState = EditProfileModalState; export type OpenUrlModalState = { urlToOpen: string } | null; export type SessionPasswordModalState = { passwordAction: PasswordAction; onOk: () => void } | null; export type UserDetailsModalState = { conversationId: string; authorAvatarPath: string | null; userName: string; } | null; export type ReactModalsState = { reaction: string; messageId: string; } | null; export type EditProfilePictureModalState = EditProfilePictureModalProps | null; export type HideRecoveryPasswordModalState = HideRecoveryPasswordDialogProps | null; export type LightBoxOptions = { media: Array; attachment: AttachmentTypeWithPath; selectedIndex?: number; onClose?: () => void; } | null; export type DebugMenuModalState = object | null; export type ModalState = { confirmModal: ConfirmModalState; inviteContactModal: InviteContactModalState; banOrUnbanUserModal: BanOrUnbanUserModalState; blockOrUnblockModal: BlockOrUnblockModalState; removeModeratorsModal: RemoveModeratorsModalState; addModeratorsModal: AddModeratorsModalState; groupNameModal: UpdateGroupNameModalState; groupMembersModal: UpdateGroupMembersModalState; userDetailsModal: UserDetailsModalState; nickNameModal: ChangeNickNameModalState; editProfileModal: EditProfileModalState; onionPathModal: OnionPathModalState; enterPasswordModal: EnterPasswordModalState; sessionPasswordModal: SessionPasswordModalState; deleteAccountModal: DeleteAccountModalState; reactListModalState: ReactModalsState; reactClearAllModalState: ReactModalsState; editProfilePictureModalState: EditProfilePictureModalState; hideRecoveryPasswordModalState: HideRecoveryPasswordModalState; openUrlModal: OpenUrlModalState; lightBoxOptions: LightBoxOptions; debugMenuModal: DebugMenuModalState; }; export const initialModalState: ModalState = { confirmModal: null, inviteContactModal: null, addModeratorsModal: null, removeModeratorsModal: null, banOrUnbanUserModal: null, blockOrUnblockModal: null, groupNameModal: null, groupMembersModal: null, userDetailsModal: null, nickNameModal: null, editProfileModal: null, onionPathModal: null, enterPasswordModal: null, sessionPasswordModal: null, deleteAccountModal: null, reactListModalState: null, reactClearAllModalState: null, editProfilePictureModalState: null, hideRecoveryPasswordModalState: null, openUrlModal: null, lightBoxOptions: null, debugMenuModal: null, }; const ModalSlice = createSlice({ name: 'modals', initialState: initialModalState, reducers: { updateConfirmModal(state, action: PayloadAction) { return { ...state, confirmModal: action.payload }; }, updateInviteContactModal(state, action: PayloadAction) { return { ...state, inviteContactModal: action.payload }; }, updateBanOrUnbanUserModal(state, action: PayloadAction) { return { ...state, banOrUnbanUserModal: action.payload }; }, updateBlockOrUnblockModal(state, action: PayloadAction) { return { ...state, blockOrUnblockModal: action.payload }; }, updateAddModeratorsModal(state, action: PayloadAction) { return { ...state, addModeratorsModal: action.payload }; }, updateRemoveModeratorsModal(state, action: PayloadAction) { return { ...state, removeModeratorsModal: action.payload }; }, updateGroupNameModal(state, action: PayloadAction) { return { ...state, groupNameModal: action.payload }; }, updateGroupMembersModal(state, action: PayloadAction) { return { ...state, groupMembersModal: action.payload }; }, updateUserDetailsModal(state, action: PayloadAction) { return { ...state, userDetailsModal: action.payload }; }, changeNickNameModal(state, action: PayloadAction) { return { ...state, nickNameModal: action.payload }; }, editProfileModal(state, action: PayloadAction) { return { ...state, editProfileModal: action.payload }; }, onionPathModal(state, action: PayloadAction) { return { ...state, onionPathModal: action.payload }; }, updateEnterPasswordModal(state, action: PayloadAction) { return { ...state, enterPasswordModal: action.payload }; }, sessionPassword(state, action: PayloadAction) { return { ...state, sessionPasswordModal: action.payload }; }, updateDeleteAccountModal(state, action: PayloadAction) { return { ...state, deleteAccountModal: action.payload }; }, updateReactListModal(state, action: PayloadAction) { return { ...state, reactListModalState: action.payload }; }, updateReactClearAllModal(state, action: PayloadAction) { return { ...state, reactClearAllModalState: action.payload }; }, updateEditProfilePictureModal(state, action: PayloadAction) { return { ...state, editProfilePictureModalState: action.payload }; }, updateHideRecoveryPasswordModal(state, action: PayloadAction) { return { ...state, hideRecoveryPasswordModalState: action.payload }; }, updateOpenUrlModal(state, action: PayloadAction) { return { ...state, openUrlModal: action.payload }; }, updateLightBoxOptions(state, action: PayloadAction) { const lightBoxOptions = action.payload; if (lightBoxOptions) { const { media, attachment } = lightBoxOptions; if (attachment && media) { const selectedIndex = media.length > 1 ? media.findIndex(mediaMessage => mediaMessage.attachment.path === attachment.path) : 0; lightBoxOptions.selectedIndex = selectedIndex; } } return { ...state, lightBoxOptions }; }, updateDebugMenuModal(state, action: PayloadAction) { return { ...state, debugMenuModal: action.payload }; }, }, }); export const { actions, reducer } = ModalSlice; export const { updateConfirmModal, updateInviteContactModal, updateAddModeratorsModal, updateRemoveModeratorsModal, updateGroupNameModal, updateGroupMembersModal, updateUserDetailsModal, changeNickNameModal, editProfileModal, onionPathModal, updateEnterPasswordModal, sessionPassword, updateDeleteAccountModal, updateBanOrUnbanUserModal, updateBlockOrUnblockModal, updateReactListModal, updateReactClearAllModal, updateEditProfilePictureModal, updateHideRecoveryPasswordModal, updateOpenUrlModal, updateLightBoxOptions, updateDebugMenuModal, } = actions; export const modalReducer = reducer;