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.
		
		
		
		
		
			
		
			
				
	
	
		
			215 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			TypeScript
		
	
| // TODO move into redux slice
 | |
| 
 | |
| import type { SessionSettingCategory } from '../../types/ReduxTypes';
 | |
| 
 | |
| 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'
 | |
|   | 'invite-a-friend';
 | |
| 
 | |
| 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: '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;
 | |
|   }
 | |
| };
 |