| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| 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;
|
|
|