70 lines
1.4 KiB
TypeScript
70 lines
1.4 KiB
TypeScript
|
// Copyright 2020 Signal Messenger, LLC
|
||
|
// SPDX-License-Identifier: AGPL-3.0-only
|
||
|
|
||
|
import type { ReadonlyDeep } from 'type-fest';
|
||
|
import type { BoundActionCreatorsMapObject } from '../../hooks/useBoundActions';
|
||
|
import { useBoundActions } from '../../hooks/useBoundActions';
|
||
|
|
||
|
// Types
|
||
|
|
||
|
export enum NavTab {
|
||
|
Chats = 'Chats',
|
||
|
Calls = 'Calls',
|
||
|
Stories = 'Stories',
|
||
|
}
|
||
|
|
||
|
// State
|
||
|
|
||
|
export type NavStateType = ReadonlyDeep<{
|
||
|
selectedNavTab: NavTab;
|
||
|
}>;
|
||
|
|
||
|
// Actions
|
||
|
|
||
|
export const CHANGE_NAV_TAB = 'nav/CHANGE_NAV_TAB';
|
||
|
|
||
|
export type ChangeNavTabActionType = ReadonlyDeep<{
|
||
|
type: typeof CHANGE_NAV_TAB;
|
||
|
payload: { selectedNavTab: NavTab };
|
||
|
}>;
|
||
|
|
||
|
export type NavActionType = ReadonlyDeep<ChangeNavTabActionType>;
|
||
|
|
||
|
// Action Creators
|
||
|
|
||
|
function changeNavTab(selectedNavTab: NavTab): NavActionType {
|
||
|
return {
|
||
|
type: CHANGE_NAV_TAB,
|
||
|
payload: { selectedNavTab },
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export const actions = {
|
||
|
changeNavTab,
|
||
|
};
|
||
|
|
||
|
export const useNavActions = (): BoundActionCreatorsMapObject<typeof actions> =>
|
||
|
useBoundActions(actions);
|
||
|
|
||
|
// Reducer
|
||
|
|
||
|
export function getEmptyState(): NavStateType {
|
||
|
return {
|
||
|
selectedNavTab: NavTab.Chats,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export function reducer(
|
||
|
state: Readonly<NavStateType> = getEmptyState(),
|
||
|
action: Readonly<NavActionType>
|
||
|
): NavStateType {
|
||
|
if (action.type === CHANGE_NAV_TAB) {
|
||
|
return {
|
||
|
...state,
|
||
|
selectedNavTab: action.payload.selectedNavTab,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return state;
|
||
|
}
|