2023-05-05 15:53:15 +04:00

231 lines
7.2 KiB
TypeScript

import React, { memo, useCallback } from '../../../../lib/teact/teact';
import { getActions } from '../../../../global';
import type { FC } from '../../../../lib/teact/teact';
import type { ApiChatFolder } from '../../../../api/types';
import { SettingsScreens } from '../../../../types';
import type { FolderEditDispatch, FoldersState } from '../../../../hooks/reducers/useFoldersReducer';
import { selectChatFilters } from '../../../../hooks/reducers/useFoldersReducer';
import SettingsFoldersMain from './SettingsFoldersMain';
import SettingsFoldersEdit, { ERROR_NO_CHATS, ERROR_NO_TITLE } from './SettingsFoldersEdit';
import SettingsFoldersChatFilters from './SettingsFoldersChatFilters';
import SettingsShareChatlist from './SettingsShareChatlist';
import './SettingsFolders.scss';
const TRANSITION_DURATION = 200;
export type OwnProps = {
currentScreen: SettingsScreens;
shownScreen: SettingsScreens;
state: FoldersState;
dispatch: FolderEditDispatch;
isActive?: boolean;
onScreenSelect: (screen: SettingsScreens) => void;
onReset: () => void;
};
const SettingsFolders: FC<OwnProps> = ({
currentScreen,
shownScreen,
state,
dispatch,
isActive,
onScreenSelect,
onReset,
}) => {
const {
openShareChatFolderModal,
editChatFolder,
addChatFolder,
} = getActions();
const handleReset = useCallback(() => {
if (
currentScreen === SettingsScreens.FoldersCreateFolder
|| currentScreen === SettingsScreens.FoldersEditFolder
|| currentScreen === SettingsScreens.FoldersEditFolderFromChatList
|| currentScreen === SettingsScreens.FoldersEditFolderInvites
) {
setTimeout(() => {
dispatch({ type: 'reset' });
}, TRANSITION_DURATION);
}
if (
currentScreen === SettingsScreens.FoldersIncludedChats
|| currentScreen === SettingsScreens.FoldersExcludedChats
) {
if (state.mode === 'create') {
onScreenSelect(SettingsScreens.FoldersCreateFolder);
} else {
onScreenSelect(SettingsScreens.FoldersEditFolder);
}
return;
}
onReset();
}, [
state.mode, dispatch,
currentScreen, onReset, onScreenSelect,
]);
const isCreating = state.mode === 'create';
const saveState = useCallback((newState: FoldersState) => {
const { title } = newState.folder;
if (!title) {
dispatch({ type: 'setError', payload: ERROR_NO_TITLE });
return false;
}
const {
selectedChatIds: includedChatIds,
selectedChatTypes: includedChatTypes,
} = selectChatFilters(newState, 'included');
if (!includedChatIds.length && !Object.keys(includedChatTypes).length) {
dispatch({ type: 'setError', payload: ERROR_NO_CHATS });
return false;
}
if (!isCreating) {
editChatFolder({ id: newState.folderId!, folderUpdate: newState.folder });
} else {
addChatFolder({ folder: newState.folder as ApiChatFolder });
}
dispatch({ type: 'setError', payload: undefined });
dispatch({ type: 'setIsTouched', payload: false });
return true;
}, [dispatch, isCreating]);
const handleSaveFolder = useCallback((cb?: NoneToVoidFunction) => {
if (!saveState(state)) {
return;
}
cb?.();
}, [saveState, state]);
const handleSaveFilter = useCallback(() => {
const newState = dispatch({ type: 'saveFilters' });
handleReset();
saveState(newState);
}, [dispatch, handleReset, saveState]);
const handleCreateFolder = useCallback(() => {
dispatch({ type: 'reset' });
onScreenSelect(SettingsScreens.FoldersCreateFolder);
}, [onScreenSelect, dispatch]);
const handleEditFolder = useCallback((folder: ApiChatFolder) => {
dispatch({ type: 'editFolder', payload: folder });
onScreenSelect(SettingsScreens.FoldersEditFolder);
}, [dispatch, onScreenSelect]);
const handleAddIncludedChats = useCallback(() => {
dispatch({ type: 'editIncludeFilters' });
onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList
? SettingsScreens.FoldersIncludedChatsFromChatList
: SettingsScreens.FoldersIncludedChats);
}, [currentScreen, dispatch, onScreenSelect]);
const handleAddExcludedChats = useCallback(() => {
dispatch({ type: 'editExcludeFilters' });
onScreenSelect(currentScreen === SettingsScreens.FoldersEditFolderFromChatList
? SettingsScreens.FoldersExcludedChatsFromChatList
: SettingsScreens.FoldersExcludedChats);
}, [currentScreen, dispatch, onScreenSelect]);
const handleShareFolder = useCallback(() => {
openShareChatFolderModal({ folderId: state.folderId!, noRequestNextScreen: true });
dispatch({ type: 'setIsChatlist', payload: true });
onScreenSelect(SettingsScreens.FoldersShare);
}, [dispatch, onScreenSelect, state.folderId]);
const handleOpenInvite = useCallback((url: string) => {
openShareChatFolderModal({ folderId: state.folderId!, url, noRequestNextScreen: true });
onScreenSelect(SettingsScreens.FoldersShare);
}, [onScreenSelect, state.folderId]);
switch (currentScreen) {
case SettingsScreens.Folders:
return (
<SettingsFoldersMain
onCreateFolder={handleCreateFolder}
onEditFolder={handleEditFolder}
isActive={isActive || [
SettingsScreens.FoldersCreateFolder,
SettingsScreens.FoldersEditFolder,
SettingsScreens.FoldersIncludedChats,
SettingsScreens.FoldersExcludedChats,
].includes(shownScreen)}
onReset={onReset}
/>
);
case SettingsScreens.FoldersCreateFolder:
case SettingsScreens.FoldersEditFolder:
case SettingsScreens.FoldersEditFolderFromChatList:
case SettingsScreens.FoldersEditFolderInvites:
return (
<SettingsFoldersEdit
state={state}
dispatch={dispatch}
onAddIncludedChats={handleAddIncludedChats}
onAddExcludedChats={handleAddExcludedChats}
onShareFolder={handleShareFolder}
onOpenInvite={handleOpenInvite}
onReset={handleReset}
isActive={isActive || [
SettingsScreens.FoldersIncludedChats,
SettingsScreens.FoldersExcludedChats,
].includes(shownScreen)}
isOnlyInvites={currentScreen === SettingsScreens.FoldersEditFolderInvites}
onBack={onReset}
onSaveFolder={handleSaveFolder}
/>
);
case SettingsScreens.FoldersIncludedChats:
case SettingsScreens.FoldersIncludedChatsFromChatList:
return (
<SettingsFoldersChatFilters
mode="included"
state={state}
dispatch={dispatch}
onReset={handleReset}
onSaveFilter={handleSaveFilter}
isActive={isActive}
/>
);
case SettingsScreens.FoldersExcludedChats:
case SettingsScreens.FoldersExcludedChatsFromChatList:
return (
<SettingsFoldersChatFilters
mode="excluded"
state={state}
dispatch={dispatch}
onReset={handleReset}
onSaveFilter={handleSaveFilter}
isActive={isActive}
/>
);
case SettingsScreens.FoldersShare:
return (
<SettingsShareChatlist
isActive={isActive}
onReset={handleReset}
/>
);
default:
return undefined;
}
};
export default memo(SettingsFolders);