From de00a1864ede2622046bdee255421921c583417c Mon Sep 17 00:00:00 2001 From: Innei Date: Tue, 27 May 2025 23:29:11 +0800 Subject: [PATCH] refactor: enhance mobile settings modal and layout components - Introduced `useTypeScriptHappyCallback` for improved tab change handling in the mobile settings modal. - Updated the `Content` component to utilize `useLoaderData` for better data management and added a dynamic `viewportClassName`. - Simplified the `SettingItemButtonImpl` by removing the `tab` prop and using an `isActive` flag for better clarity in active state management. Signed-off-by: Innei --- .../modules/settings/modal/content.mobile.tsx | 16 ++++++---- .../src/modules/settings/modal/content.tsx | 13 ++++++-- .../src/modules/settings/modal/layout.tsx | 31 +++++++++---------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/apps/desktop/layer/renderer/src/modules/settings/modal/content.mobile.tsx b/apps/desktop/layer/renderer/src/modules/settings/modal/content.mobile.tsx index aa5320e51..1ea6f16ee 100644 --- a/apps/desktop/layer/renderer/src/modules/settings/modal/content.mobile.tsx +++ b/apps/desktop/layer/renderer/src/modules/settings/modal/content.mobile.tsx @@ -1,3 +1,4 @@ +import { useTypeScriptHappyCallback } from "@follow/hooks" import PKG from "@pkg" import { createElement, Suspense } from "react" import { Trans, useTranslation } from "react-i18next" @@ -21,12 +22,15 @@ export const MobileSettingModalContent = () => { { - present({ - title: "", - content: () => , - }) - }} + onChange={useTypeScriptHappyCallback( + (tab) => { + present({ + title: "", + content: () => , + }) + }, + [present], + )} /> diff --git a/apps/desktop/layer/renderer/src/modules/settings/modal/content.tsx b/apps/desktop/layer/renderer/src/modules/settings/modal/content.tsx index 1acb7afe4..25c16d50a 100644 --- a/apps/desktop/layer/renderer/src/modules/settings/modal/content.tsx +++ b/apps/desktop/layer/renderer/src/modules/settings/modal/content.tsx @@ -1,13 +1,16 @@ import { ScrollArea } from "@follow/components/ui/scroll-area/index.js" +import { cn } from "@follow/utils" import { repository } from "@pkg" import type { FC } from "react" import { Suspense, useDeferredValue, useLayoutEffect, useState } from "react" import { Trans } from "react-i18next" +import { useLoaderData } from "react-router" import { ModalClose } from "~/components/ui/modal/stacked/components" import { SettingsTitle } from "~/modules/settings/title" import { getSettingPages } from "../settings-glob" +import type { SettingPageConfig } from "../utils" import { SettingTabProvider, useSettingTab } from "./context" import { SettingModalLayout } from "./layout" @@ -39,6 +42,7 @@ const Content = () => { } }, [key]) + const config = (useLoaderData() || loader || {}) as SettingPageConfig if (!Component) return null return ( @@ -49,12 +53,15 @@ const Content = () => { mask={false} ref={setScroller} rootClassName="h-full grow flex-1 shrink-0 overflow-auto pl-8 pr-7" - viewportClassName="px-1 min-h-full [&>div]:min-h-full [&>div]:relative pb-8" + viewportClassName={cn( + "px-1 min-h-full [&>div]:min-h-full [&>div]:relative", + config.viewportClassName, + )} > -
-

+

+

void item: SettingPageConfig path: string - + isActive: boolean onChange?: (tab: string) => void }) => { - const { tab, setTab, item, path, onChange } = props + const { setTab, item, path, onChange, isActive } = props const { disableIf } = item const ctx = useSettingPageContext() @@ -174,7 +173,7 @@ const SettingItemButtonImpl = (props: {