AppMain.hooks.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { useAppDispatch, useAppSelector } from '$app/stores/store';
  2. import { useCallback, useEffect, useMemo } from 'react';
  3. import { UserSettingController } from '$app/stores/effects/user/user_setting_controller';
  4. import { currentUserActions } from '$app_reducers/current-user/slice';
  5. import { Theme as ThemeType, ThemeMode } from '$app/interfaces';
  6. import { createTheme } from '@mui/material/styles';
  7. import { getDesignTokens } from '$app/utils/mui';
  8. import { useTranslation } from 'react-i18next';
  9. export function useUserSetting() {
  10. const dispatch = useAppDispatch();
  11. const { i18n } = useTranslation();
  12. const currentUser = useAppSelector((state) => state.currentUser);
  13. const userSettingController = useMemo(() => {
  14. if (!currentUser?.id) return;
  15. const controller = new UserSettingController(currentUser.id);
  16. return controller;
  17. }, [currentUser?.id]);
  18. const loadUserSetting = useCallback(async () => {
  19. if (!userSettingController) return;
  20. const settings = await userSettingController.getAppearanceSetting();
  21. if (!settings) return;
  22. dispatch(currentUserActions.setUserSetting(settings));
  23. await i18n.changeLanguage(settings.language);
  24. }, [dispatch, i18n, userSettingController]);
  25. useEffect(() => {
  26. void loadUserSetting();
  27. }, [loadUserSetting]);
  28. const { themeMode = ThemeMode.Light, theme: themeType = ThemeType.Default } = useAppSelector((state) => {
  29. return state.currentUser.userSetting || {};
  30. });
  31. const muiTheme = useMemo(() => createTheme(getDesignTokens(themeMode)), [themeMode]);
  32. return {
  33. muiTheme,
  34. themeMode,
  35. themeType,
  36. userSettingController,
  37. };
  38. }