|
@@ -1,4 +1,4 @@
|
|
|
-import { useEffect } from 'react';
|
|
|
|
|
|
|
+import { useCallback, useEffect } from 'react';
|
|
|
|
|
|
|
|
|
|
|
|
|
import { isClient } from '@growi/core/dist/utils';
|
|
import { isClient } from '@growi/core/dist/utils';
|
|
@@ -6,20 +6,46 @@ import { Breakpoint } from '@growi/ui/dist/interfaces';
|
|
|
import { addBreakpointListener, cleanupBreakpointListener } from '@growi/ui/dist/utils';
|
|
import { addBreakpointListener, cleanupBreakpointListener } from '@growi/ui/dist/utils';
|
|
|
import { atom, useAtom } from 'jotai';
|
|
import { atom, useAtom } from 'jotai';
|
|
|
|
|
|
|
|
|
|
+import { scheduleToPut } from '~/client/services/user-ui-settings';
|
|
|
import { SidebarMode } from '~/interfaces/ui';
|
|
import { SidebarMode } from '~/interfaces/ui';
|
|
|
import { EditorMode } from '~/stores-universal/ui';
|
|
import { EditorMode } from '~/stores-universal/ui';
|
|
|
|
|
|
|
|
|
|
+
|
|
|
const isDrawerOpenedAtom = atom<boolean>(false);
|
|
const isDrawerOpenedAtom = atom<boolean>(false);
|
|
|
|
|
|
|
|
export const useDrawerOpened = () => {
|
|
export const useDrawerOpened = () => {
|
|
|
return useAtom(isDrawerOpenedAtom);
|
|
return useAtom(isDrawerOpenedAtom);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+// Avoid local storage to prevent conflicts with DB settings
|
|
|
const preferCollapsedModeAtom = atom<boolean>(false);
|
|
const preferCollapsedModeAtom = atom<boolean>(false);
|
|
|
|
|
|
|
|
|
|
+// Custom hook for managing sidebar state
|
|
|
export const usePreferCollapsedMode = () => {
|
|
export const usePreferCollapsedMode = () => {
|
|
|
- return useAtom(preferCollapsedModeAtom);
|
|
|
|
|
|
|
+ const [value, setValue] = useAtom(preferCollapsedModeAtom);
|
|
|
|
|
+
|
|
|
|
|
+ const setValueWithPersist = useCallback((newValue: boolean) => {
|
|
|
|
|
+ setValue(newValue);
|
|
|
|
|
+ // Save to server
|
|
|
|
|
+ scheduleToPut({ preferCollapsedModeByUser: newValue });
|
|
|
|
|
+ }, [setValue]);
|
|
|
|
|
+
|
|
|
|
|
+ return [value, setValueWithPersist] as const;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+// Initialize state from server-side props only once per session
|
|
|
|
|
+const preferCollapsedModeInitializedAtom = atom<boolean>(false);
|
|
|
|
|
+
|
|
|
|
|
+export const usePreferCollapsedModeInitializer = (initialData: boolean): void => {
|
|
|
|
|
+ const [isInitialized, setIsInitialized] = useAtom(preferCollapsedModeInitializedAtom);
|
|
|
|
|
+ const [, setPreferCollapsedMode] = usePreferCollapsedMode();
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ if (!isInitialized) {
|
|
|
|
|
+ setPreferCollapsedMode(initialData);
|
|
|
|
|
+ setIsInitialized(true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [isInitialized, setPreferCollapsedMode, setIsInitialized, initialData]);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
|