From b41c89972b78052d539f02bd5683cad3f9d7626a Mon Sep 17 00:00:00 2001 From: Teo Date: Wed, 11 Jun 2025 12:48:24 +0800 Subject: [PATCH] refactor(Selector): enhance Selector component with placeholder support and improve type safety; update GeneralSettings and WebSearchSettings to utilize Selector --- src/renderer/src/components/Selector.tsx | 44 ++++++++++++++----- src/renderer/src/context/AntdProvider.tsx | 3 ++ .../src/pages/settings/GeneralSettings.tsx | 34 +++++++------- .../settings/WebSearchSettings/index.tsx | 6 +-- 4 files changed, 55 insertions(+), 32 deletions(-) diff --git a/src/renderer/src/components/Selector.tsx b/src/renderer/src/components/Selector.tsx index f405b1202d..860750b94a 100644 --- a/src/renderer/src/components/Selector.tsx +++ b/src/renderer/src/components/Selector.tsx @@ -1,19 +1,34 @@ import { ConfigProvider, Dropdown } from 'antd' import { Check, ChevronsUpDown } from 'lucide-react' -import { FC, useMemo } from 'react' -import styled from 'styled-components' +import { ReactNode, useMemo, useState } from 'react' +import styled, { css } from 'styled-components' -interface SelectorProps { - options: { label: string; value: string }[] - value: string | number | undefined +interface SelectorProps { + options: { label: string | ReactNode; value: V }[] + value?: V + placeholder?: string placement?: 'topLeft' | 'topCenter' | 'topRight' | 'bottomLeft' | 'bottomCenter' | 'bottomRight' | 'top' | 'bottom' /** 字体大小 */ size?: number - onChange: (value: string) => void + onChange: (value: V) => void } -const Selector: FC = ({ options, value, onChange, placement = 'bottomRight', size = 13 }) => { - const label = useMemo(() => options?.find((option) => option.value === value)?.label, [options, value]) +const Selector = ({ + options, + value, + onChange = () => {}, + placement = 'bottomRight', + size = 13, + placeholder +}: SelectorProps) => { + const [open, setOpen] = useState(false) + + const label = useMemo(() => { + if (value) { + return options?.find((option) => option.value === value)?.label + } + return placeholder + }, [options, value, placeholder]) const items = useMemo(() => { return options.map((option) => ({ @@ -24,7 +39,7 @@ const Selector: FC = ({ options, value, onChange, placement = 'bo }, [options, value]) function onClick(e: { key: string }) { - onChange(e.key) + onChange(e.key as V) } return ( @@ -36,8 +51,8 @@ const Selector: FC = ({ options, value, onChange, placement = 'bo } } }}> - -