72 lines
1.9 KiB
TypeScript
72 lines
1.9 KiB
TypeScript
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
import merge from 'lodash/merge';
|
|
|
|
export type Theme = 'light' | 'dark';
|
|
|
|
export type Sidebar = 'left' | 'right';
|
|
|
|
export type SidebarState = { open: boolean };
|
|
|
|
export type Orientation = 'horizontal' | 'vertical';
|
|
|
|
export type BuildState = {
|
|
theme?: Theme;
|
|
sidebar: Record<Sidebar, SidebarState>;
|
|
page: {
|
|
breakLine: boolean;
|
|
orientation: Orientation;
|
|
};
|
|
};
|
|
|
|
const initialState: BuildState = {
|
|
sidebar: {
|
|
left: { open: false },
|
|
right: { open: false },
|
|
},
|
|
page: {
|
|
breakLine: true,
|
|
orientation: 'horizontal',
|
|
},
|
|
};
|
|
|
|
type SetThemePayload = { theme: Theme };
|
|
|
|
type ToggleSidebarPayload = { sidebar: Sidebar };
|
|
|
|
type SetSidebarStatePayload = { sidebar: Sidebar; state: SidebarState };
|
|
|
|
export const buildSlice = createSlice({
|
|
name: 'build',
|
|
initialState,
|
|
reducers: {
|
|
setTheme: (state, action: PayloadAction<SetThemePayload>) => {
|
|
const { theme } = action.payload;
|
|
|
|
state.theme = theme;
|
|
},
|
|
toggleSidebar: (state, action: PayloadAction<ToggleSidebarPayload>) => {
|
|
const { sidebar } = action.payload;
|
|
|
|
state.sidebar[sidebar].open = !state.sidebar[sidebar].open;
|
|
},
|
|
setSidebarState: (state, action: PayloadAction<SetSidebarStatePayload>) => {
|
|
const { sidebar, state: newState } = action.payload;
|
|
|
|
state.sidebar[sidebar] = merge(state.sidebar[sidebar], newState);
|
|
},
|
|
togglePageBreakLine: (state) => {
|
|
state.page.breakLine = !state.page.breakLine;
|
|
},
|
|
togglePageOrientation: (state) => {
|
|
const orientation: Orientation = state.page.orientation === 'horizontal' ? 'vertical' : 'horizontal';
|
|
|
|
state.page.orientation = orientation;
|
|
},
|
|
},
|
|
});
|
|
|
|
export const { setTheme, toggleSidebar, setSidebarState, togglePageBreakLine, togglePageOrientation } =
|
|
buildSlice.actions;
|
|
|
|
export default buildSlice.reducer;
|