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.
session-desktop/ts/state/ducks/section.tsx

213 lines
5.0 KiB
TypeScript

// TODOLATER move into redux slice
import { SessionSettingCategory } from '../../components/settings/SessionSettings';
export const FOCUS_SECTION = 'FOCUS_SECTION';
export const FOCUS_SETTINGS_SECTION = 'FOCUS_SETTINGS_SECTION';
export const IS_APP_FOCUSED = 'IS_APP_FOCUSED';
export const LEFT_OVERLAY_MODE = 'LEFT_OVERLAY_MODE';
export const RESET_LEFT_OVERLAY_MODE = 'RESET_OVERLAY_MODE';
export const RIGHT_OVERLAY_MODE = 'RIGHT_OVERLAY_MODE';
export const RESET_RIGHT_OVERLAY_MODE = 'RESET_RIGHT_OVERLAY_MODE';
export enum SectionType {
Profile,
Message,
Settings,
ColorMode,
PathIndicator,
}
type FocusSectionActionType = {
type: 'FOCUS_SECTION';
payload: SectionType;
};
type FocusSettingsSectionActionType = {
type: 'FOCUS_SETTINGS_SECTION';
payload: SessionSettingCategory;
};
type IsAppFocusedActionType = {
type: 'IS_APP_FOCUSED';
payload: boolean;
};
type LeftOverlayModeActionType = {
type: 'LEFT_OVERLAY_MODE';
payload: LeftOverlayMode;
};
type ResetLeftOverlayModeActionType = {
type: 'RESET_OVERLAY_MODE';
};
type RightOverlayModeActionType = {
type: 'RIGHT_OVERLAY_MODE';
payload: RightOverlayMode;
};
type ResetRightOverlayModeActionType = {
type: 'RESET_RIGHT_OVERLAY_MODE';
};
export function showLeftPaneSection(section: SectionType): FocusSectionActionType {
return {
type: FOCUS_SECTION,
payload: section,
};
}
type SectionActionTypes = FocusSectionActionType | FocusSettingsSectionActionType;
export function setIsAppFocused(focused: boolean): IsAppFocusedActionType {
return {
type: IS_APP_FOCUSED,
payload: focused,
};
}
export type LeftOverlayMode =
| 'choose-action'
| 'message'
| 'open-group'
| 'closed-group'
| 'message-requests';
export function setLeftOverlayMode(overlayMode: LeftOverlayMode): LeftOverlayModeActionType {
return {
type: LEFT_OVERLAY_MODE,
payload: overlayMode,
};
}
export function resetLeftOverlayMode(): ResetLeftOverlayModeActionType {
return {
type: RESET_LEFT_OVERLAY_MODE,
};
}
type RightPanelDefaultState = { type: 'default'; params: null };
type RightPanelMessageInfoState = {
type: 'message_info';
params: { messageId: string; visibleAttachmentIndex: number | undefined };
};
type RightPanelDisappearingMessagesState = { type: 'disappearing_messages'; params: null };
export type RightOverlayMode =
| RightPanelDefaultState
| RightPanelMessageInfoState
| RightPanelDisappearingMessagesState;
export function setRightOverlayMode(overlayMode: RightOverlayMode): RightOverlayModeActionType {
return {
type: RIGHT_OVERLAY_MODE,
payload: overlayMode,
};
}
export function resetRightOverlayMode(): ResetRightOverlayModeActionType {
return {
type: RESET_RIGHT_OVERLAY_MODE,
};
}
export function showSettingsSection(
category: SessionSettingCategory
): FocusSettingsSectionActionType {
return {
type: FOCUS_SETTINGS_SECTION,
payload: category,
};
}
export const actions = {
showLeftPaneSection,
showSettingsSection,
setLeftOverlayMode,
resetLeftOverlayMode,
setRightOverlayMode,
resetRightOverlayMode,
};
export const initialSectionState: SectionStateType = {
focusedSection: SectionType.Message,
focusedSettingsSection: undefined,
isAppFocused: false,
leftOverlayMode: undefined,
rightOverlayMode: { type: 'default', params: null },
};
export type SectionStateType = {
focusedSection: SectionType;
focusedSettingsSection?: SessionSettingCategory;
isAppFocused: boolean;
leftOverlayMode: LeftOverlayMode | undefined;
rightOverlayMode: RightOverlayMode | undefined;
};
export const reducer = (
state: any = initialSectionState,
{
type,
payload,
}: {
type: string;
payload: SectionActionTypes;
}
): SectionStateType => {
switch (type) {
case FOCUS_SECTION:
// if we change to something else than settings, reset the focused settings section
// eslint-disable-next-line no-case-declarations
const castedPayload = payload as unknown as SectionType;
if (castedPayload !== SectionType.Settings) {
return {
...state,
focusedSection: castedPayload,
focusedSettingsSection: undefined,
};
}
// on click on the gear icon: show the appearance tab by default
return {
...state,
focusedSection: payload,
focusedSettingsSection: SessionSettingCategory.Privacy,
};
case FOCUS_SETTINGS_SECTION:
return {
...state,
focusedSettingsSection: payload,
};
case IS_APP_FOCUSED:
return {
...state,
isAppFocused: payload,
};
case LEFT_OVERLAY_MODE:
return {
...state,
leftOverlayMode: payload,
};
case RESET_LEFT_OVERLAY_MODE:
return {
...state,
leftOverlayMode: undefined,
};
case RIGHT_OVERLAY_MODE:
return {
...state,
rightOverlayMode: payload,
};
case RESET_RIGHT_OVERLAY_MODE:
return {
...state,
rightOverlayMode: undefined,
};
default:
return state;
}
};