| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import React, { memo, useCallback } from 'react'; |
| | import { Input, Button, Switch, Select, Divider } from '@douyinfe/semi-ui'; |
| | import { IconSearch, IconCopy, IconFilter } from '@douyinfe/semi-icons'; |
| |
|
| | const SearchActions = memo( |
| | ({ |
| | selectedRowKeys = [], |
| | copyText, |
| | handleChange, |
| | handleCompositionStart, |
| | handleCompositionEnd, |
| | isMobile = false, |
| | searchValue = '', |
| | setShowFilterModal, |
| | showWithRecharge, |
| | setShowWithRecharge, |
| | currency, |
| | setCurrency, |
| | showRatio, |
| | setShowRatio, |
| | viewMode, |
| | setViewMode, |
| | tokenUnit, |
| | setTokenUnit, |
| | t, |
| | }) => { |
| | const handleCopyClick = useCallback(() => { |
| | if (copyText && selectedRowKeys.length > 0) { |
| | copyText(selectedRowKeys); |
| | } |
| | }, [copyText, selectedRowKeys]); |
| |
|
| | const handleFilterClick = useCallback(() => { |
| | setShowFilterModal?.(true); |
| | }, [setShowFilterModal]); |
| |
|
| | const handleViewModeToggle = useCallback(() => { |
| | setViewMode?.(viewMode === 'table' ? 'card' : 'table'); |
| | }, [viewMode, setViewMode]); |
| |
|
| | const handleTokenUnitToggle = useCallback(() => { |
| | setTokenUnit?.(tokenUnit === 'K' ? 'M' : 'K'); |
| | }, [tokenUnit, setTokenUnit]); |
| |
|
| | return ( |
| | <div className='flex items-center gap-2 w-full'> |
| | <div className='flex-1'> |
| | <Input |
| | prefix={<IconSearch />} |
| | placeholder={t('模糊搜索模型名称')} |
| | value={searchValue} |
| | onCompositionStart={handleCompositionStart} |
| | onCompositionEnd={handleCompositionEnd} |
| | onChange={handleChange} |
| | showClear |
| | /> |
| | </div> |
| | |
| | <Button |
| | theme='outline' |
| | type='primary' |
| | icon={<IconCopy />} |
| | onClick={handleCopyClick} |
| | disabled={selectedRowKeys.length === 0} |
| | className='!bg-blue-500 hover:!bg-blue-600 !text-white disabled:!bg-gray-300 disabled:!text-gray-500' |
| | > |
| | {t('复制')} |
| | </Button> |
| | |
| | {!isMobile && ( |
| | <> |
| | <Divider layout='vertical' margin='8px' /> |
| | |
| | {/* 充值价格显示开关 */} |
| | <div className='flex items-center gap-2'> |
| | <span className='text-sm text-gray-600'>{t('充值价格显示')}</span> |
| | <Switch |
| | checked={showWithRecharge} |
| | onChange={setShowWithRecharge} |
| | /> |
| | </div> |
| | |
| | {/* 货币单位选择 */} |
| | {showWithRecharge && ( |
| | <Select |
| | value={currency} |
| | onChange={setCurrency} |
| | optionList={[ |
| | { value: 'USD', label: 'USD' }, |
| | { value: 'CNY', label: 'CNY' }, |
| | { value: 'CUSTOM', label: t('自定义货币') }, |
| | ]} |
| | /> |
| | )} |
| | |
| | {/* 显示倍率开关 */} |
| | <div className='flex items-center gap-2'> |
| | <span className='text-sm text-gray-600'>{t('倍率')}</span> |
| | <Switch checked={showRatio} onChange={setShowRatio} /> |
| | </div> |
| | |
| | {/* 视图模式切换按钮 */} |
| | <Button |
| | theme={viewMode === 'table' ? 'solid' : 'outline'} |
| | type={viewMode === 'table' ? 'primary' : 'tertiary'} |
| | onClick={handleViewModeToggle} |
| | > |
| | {t('表格视图')} |
| | </Button> |
| | |
| | {/* Token单位切换按钮 */} |
| | <Button |
| | theme={tokenUnit === 'K' ? 'solid' : 'outline'} |
| | type={tokenUnit === 'K' ? 'primary' : 'tertiary'} |
| | onClick={handleTokenUnitToggle} |
| | > |
| | {tokenUnit} |
| | </Button> |
| | </> |
| | )} |
| |
|
| | {isMobile && ( |
| | <Button |
| | theme='outline' |
| | type='tertiary' |
| | icon={<IconFilter />} |
| | onClick={handleFilterClick} |
| | > |
| | {t('筛选')} |
| | </Button> |
| | )} |
| | </div> |
| | ); |
| | }, |
| | ); |
| |
|
| | SearchActions.displayName = 'SearchActions'; |
| |
|
| | export default SearchActions; |
| |
|