diff --git a/apps/desktop/layer/renderer/src/modules/settings/tabs/general.tsx b/apps/desktop/layer/renderer/src/modules/settings/tabs/general.tsx index 99cf00b02..822d0e89a 100644 --- a/apps/desktop/layer/renderer/src/modules/settings/tabs/general.tsx +++ b/apps/desktop/layer/renderer/src/modules/settings/tabs/general.tsx @@ -268,6 +268,9 @@ export const LanguageSelector = ({ setGeneralSetting("language", value as string) dayjs.locale(value) }} + renderValue={useTypeScriptHappyCallback((item) => { + return {defaultResources[item.value].lang.name} + }, [])} renderItem={useTypeScriptHappyCallback((item) => { const lang = item.value const percent = I18N_COMPLETENESS_MAP[lang] diff --git a/apps/desktop/layer/renderer/src/pages/(main)/layout.tsx b/apps/desktop/layer/renderer/src/pages/(main)/layout.tsx index 60b62ca05..3b0263252 100644 --- a/apps/desktop/layer/renderer/src/pages/(main)/layout.tsx +++ b/apps/desktop/layer/renderer/src/pages/(main)/layout.tsx @@ -8,4 +8,5 @@ export const Component = withResponsiveComponent( const { default: DownloadPage } = await import("~/modules/download") return { default: DownloadPage } }, + (w) => w < 768, ) diff --git a/apps/desktop/layer/renderer/src/providers/setting-sync.tsx b/apps/desktop/layer/renderer/src/providers/setting-sync.tsx index d871f4034..42fb30fad 100644 --- a/apps/desktop/layer/renderer/src/providers/setting-sync.tsx +++ b/apps/desktop/layer/renderer/src/providers/setting-sync.tsx @@ -1,4 +1,4 @@ -import { isMobile } from "@follow/components/hooks/useMobile.js" +import { useMobile } from "@follow/components/hooks/useMobile.js" import { useIsDark } from "@follow/hooks" import { getAccentColorValue } from "@follow/shared/settings/constants" import type { UISettings } from "@follow/shared/settings/interface" @@ -47,12 +47,12 @@ const useUpdateDockBadge = (setting: UISettings) => { } const useUISettingSync = () => { const setting = useUISettingValue() - const mobile = isMobile() + const mobile = useMobile() useSyncTheme() useInsertionEffect(() => { const root = document.documentElement - root.style.fontSize = `${setting.uiTextSize * (mobile ? 1.125 : 1)}px` - }, [setting.uiTextSize]) + root.style.fontSize = `${setting.uiTextSize * (mobile ? 0.875 : 1)}px` + }, [setting.uiTextSize, mobile]) const isDark = useIsDark() useInsertionEffect(() => { diff --git a/packages/internal/components/src/utils/selector.tsx b/packages/internal/components/src/utils/selector.tsx index b6d950d9f..e10702eb2 100644 --- a/packages/internal/components/src/utils/selector.tsx +++ b/packages/internal/components/src/utils/selector.tsx @@ -1,4 +1,5 @@ import { useMobile } from "@follow/components/hooks/useMobile.js" +import { useViewport } from "@follow/components/hooks/useViewport.js" import type { ComponentType, ReactNode, RefAttributes } from "react" import { lazy, Suspense } from "react" @@ -6,15 +7,34 @@ export function withResponsiveComponent

( desktopImport: () => Promise<{ default: ComponentType

}>, mobileImport: () => Promise<{ default: ComponentType

}>, fallbackElement?: ReactNode, +): ComponentType

+export function withResponsiveComponent

( + desktopImport: () => Promise<{ default: ComponentType

}>, + mobileImport: () => Promise<{ default: ComponentType

}>, + breakpointFn: (w: number) => boolean, + fallbackElement?: ReactNode, +): ComponentType

+export function withResponsiveComponent

( + desktopImport: () => Promise<{ default: ComponentType

}>, + mobileImport: () => Promise<{ default: ComponentType

}>, + fallbackElementOrBreakpointFn?: ReactNode | ((w: number) => boolean), + fallbackElement?: ReactNode, ) { const LazyDesktopLayout = lazy(desktopImport) as unknown as ComponentType

const LazyMobileLayout = lazy(mobileImport) as unknown as ComponentType

+ // Check if the third parameter is a function (breakpoint function) or ReactNode (fallback) + const isBreakpointFn = typeof fallbackElementOrBreakpointFn === "function" + const breakpointFn = isBreakpointFn ? fallbackElementOrBreakpointFn : undefined + const fallback = isBreakpointFn ? fallbackElement : fallbackElementOrBreakpointFn + return function ResponsiveLayout(props: P) { - const isMobile = useMobile() + const isMobile = useViewport(({ w: viewport }) => + breakpointFn ? breakpointFn(viewport) : viewport < 1024 && viewport !== 0, + ) return ( - + {isMobile ? : } )