mirror of
https://github.com/makeplane/plane
synced 2024-06-14 14:31:34 +00:00
9b4aebc385
* chore: show message if dragging unjoined project (#1763) * fix: invalid project selection in create issue modal (#1766) * style: sidebar project list improvement (#1767) * fix: comment reaction mutation (#1768) * fix: user profiles n plus 1 (#1765) * fix: bulk issue import (#1773) * style: profile activity (#1771) * style: profile activity comment log styling * chore: profile feed activity refactor * style: sidebar project list * chore: add non existing states for project entities (#1770) * fix: notification read status being toggled when click on link (#1769) * fix: custom theme persisting after signing out (#1780) * fix: custom theme persistence * chore: remove console logs * fix: build error * fix: change theme from command k --------- Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Co-authored-by: Dakshesh Jain <65905942+dakshesh14@users.noreply.github.com> Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
122 lines
3.0 KiB
TypeScript
122 lines
3.0 KiB
TypeScript
import { createContext, useCallback, useReducer, useEffect } from "react";
|
|
import { useRouter } from "next/router";
|
|
// swr
|
|
import useSWR from "swr";
|
|
// components
|
|
import ToastAlert from "components/toast-alert";
|
|
// hooks
|
|
import useUserAuth from "hooks/use-user-auth";
|
|
// services
|
|
import projectService from "services/project.service";
|
|
// fetch-keys
|
|
import { USER_PROJECT_VIEW } from "constants/fetch-keys";
|
|
// helper
|
|
import { applyTheme, unsetCustomCssVariables } from "helpers/theme.helper";
|
|
// constants
|
|
|
|
export const themeContext = createContext<ContextType>({} as ContextType);
|
|
|
|
type ThemeProps = {
|
|
collapsed: boolean;
|
|
};
|
|
|
|
type ReducerActionType = {
|
|
type: "TOGGLE_SIDEBAR" | "REHYDRATE_THEME";
|
|
payload?: Partial<ThemeProps>;
|
|
};
|
|
|
|
type ContextType = {
|
|
collapsed: boolean;
|
|
toggleCollapsed: () => void;
|
|
};
|
|
|
|
type StateType = {
|
|
collapsed: boolean;
|
|
};
|
|
type ReducerFunctionType = (state: StateType, action: ReducerActionType) => StateType;
|
|
|
|
export const initialState: StateType = {
|
|
collapsed: false,
|
|
};
|
|
|
|
export const reducer: ReducerFunctionType = (state, action) => {
|
|
const { type, payload } = action;
|
|
|
|
switch (type) {
|
|
case "TOGGLE_SIDEBAR":
|
|
const newState = {
|
|
...state,
|
|
collapsed: !state.collapsed,
|
|
};
|
|
localStorage.setItem("collapsed", JSON.stringify(newState.collapsed));
|
|
return newState;
|
|
|
|
case "REHYDRATE_THEME": {
|
|
let collapsed: any = localStorage.getItem("collapsed");
|
|
collapsed = collapsed ? JSON.parse(collapsed) : false;
|
|
return { ...initialState, ...payload, collapsed };
|
|
}
|
|
|
|
default: {
|
|
return state;
|
|
}
|
|
}
|
|
};
|
|
|
|
export const ThemeContextProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
|
|
const [state, dispatch] = useReducer(reducer, initialState);
|
|
const { user } = useUserAuth(null);
|
|
|
|
const router = useRouter();
|
|
const { workspaceSlug, projectId } = router.query;
|
|
|
|
const { data: myViewProps } = useSWR(
|
|
workspaceSlug && projectId ? USER_PROJECT_VIEW(projectId as string) : null,
|
|
workspaceSlug && projectId
|
|
? () => projectService.projectMemberMe(workspaceSlug as string, projectId as string)
|
|
: null
|
|
);
|
|
|
|
const toggleCollapsed = useCallback(() => {
|
|
dispatch({
|
|
type: "TOGGLE_SIDEBAR",
|
|
});
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
dispatch({
|
|
type: "REHYDRATE_THEME",
|
|
payload: myViewProps?.view_props as any,
|
|
});
|
|
}, [myViewProps]);
|
|
|
|
useEffect(() => {
|
|
const theme = localStorage.getItem("theme");
|
|
|
|
if (theme) {
|
|
if (theme === "custom") {
|
|
if (user && user.theme.palette) {
|
|
applyTheme(
|
|
user.theme.palette !== ",,,,"
|
|
? user.theme.palette
|
|
: "#0d101b,#c5c5c5,#3f76ff,#0d101b,#c5c5c5",
|
|
user.theme.darkPalette
|
|
);
|
|
}
|
|
} else unsetCustomCssVariables();
|
|
}
|
|
}, [user]);
|
|
|
|
return (
|
|
<themeContext.Provider
|
|
value={{
|
|
collapsed: state.collapsed,
|
|
toggleCollapsed,
|
|
}}
|
|
>
|
|
<ToastAlert />
|
|
{children}
|
|
</themeContext.Provider>
|
|
);
|
|
};
|