From 336b62256daacf2c79560f249ab468d70ab77583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E9=9C=96=E9=93=83?= Date: Fri, 22 May 2026 21:26:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=85=A8=E9=9D=A2=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=20StorageCleaner=20=E9=A1=B5=E9=9D=A2=E8=87=B3=20shad?= =?UTF-8?q?cn=20=E6=A0=B7=E5=BC=8F=E5=B9=B6=E7=A7=BB=E9=99=A4=20GlobalSnac?= =?UTF-8?q?kbar=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 110 ++++++++++++- package.json | 3 + pages/StorageCleaner/AutoRefreshToggle.tsx | 54 +++++-- pages/StorageCleaner/CleaningResult.tsx | 49 +++--- pages/StorageCleaner/ErrorDisplay.tsx | 40 +++-- pages/StorageCleaner/OptionItem.tsx | 57 +++++-- .../StorageCleaner/StorageCleanerConfirm.tsx | 67 +++++--- pages/StorageCleaner/StorageOptionsGrid.tsx | 80 +++++++--- pages/StorageCleaner/index.tsx | 80 ++++++---- pages/StorageCleaner/useStorageCleaner.ts | 150 +++++++++--------- 10 files changed, 483 insertions(+), 207 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0f76923..7c106be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,12 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", "@testing-library/dom": "^10.4.1", "@vitest/coverage-v8": "^4.1.7", "@webext-core/messaging": "^3.0.1", @@ -1801,6 +1804,36 @@ } } }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.3", + "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-checkbox/-/react-checkbox-1.3.3.tgz", + "integrity": "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-collection": { "version": "1.1.7", "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", @@ -2029,6 +2062,52 @@ } } }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-label/-/react-label-2.1.8.tgz", + "integrity": "sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label/node_modules/@radix-ui/react-primitive": { + "version": "2.1.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-primitive/-/react-primitive-2.1.4.tgz", + "integrity": "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.8", "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-popper/-/react-popper-1.2.8.tgz", @@ -2213,7 +2292,7 @@ }, "node_modules/@radix-ui/react-slot": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", + "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", "license": "MIT", "dependencies": { @@ -2229,6 +2308,35 @@ } } }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.6", + "resolved": "https://mirrors.cloud.tencent.com/npm/@radix-ui/react-switch/-/react-switch-1.2.6.tgz", + "integrity": "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", diff --git a/package.json b/package.json index 3de03f4..cb87e44 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,12 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", + "@radix-ui/react-checkbox": "^1.3.3", "@radix-ui/react-dialog": "^1.1.15", + "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", + "@radix-ui/react-switch": "^1.2.6", "@testing-library/dom": "^10.4.1", "@vitest/coverage-v8": "^4.1.7", "@webext-core/messaging": "^3.0.1", diff --git a/pages/StorageCleaner/AutoRefreshToggle.tsx b/pages/StorageCleaner/AutoRefreshToggle.tsx index 3b49c8a..301a35c 100644 --- a/pages/StorageCleaner/AutoRefreshToggle.tsx +++ b/pages/StorageCleaner/AutoRefreshToggle.tsx @@ -1,26 +1,52 @@ +import React from 'react'; import { useLazyTranslation } from '@/utils/useLazyTranslation'; +import { cn } from '@/lib/utils'; +// 引入官方的 Switch 原子组件 +import { Switch } from '@/components/ui/switch'; +import { Label } from '@/components/ui/label'; -interface AutoRefreshToggleProps { +interface AutoRefreshToggleProps extends Omit, 'onChange'> { autoRefresh: boolean; onChange: (checked: boolean) => void; } -export default function AutoRefreshToggle({ autoRefresh, onChange }: AutoRefreshToggleProps) { +export default function AutoRefreshToggle({ + autoRefresh, + onChange, + className, + ...props +}: AutoRefreshToggleProps) { const { t } = useLazyTranslation('storageCleaner'); + return ( -
- +
+ {/* 3. 使用标准的 shadcn/ui Label 组件: + 绑定 htmlFor 建立安全的表单无障碍桥梁,使得用户点击文字也能触发开关联动 + */} +