| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import React, { useState } from 'react'; |
| import { Banner, Button, Modal } from '@douyinfe/semi-ui'; |
| import { IconAlertTriangle, IconClose } from '@douyinfe/semi-icons'; |
| import CardPro from '../../common/ui/CardPro'; |
| import ModelsTable from './ModelsTable'; |
| import ModelsActions from './ModelsActions'; |
| import ModelsFilters from './ModelsFilters'; |
| import ModelsTabs from './ModelsTabs'; |
| import EditModelModal from './modals/EditModelModal'; |
| import EditVendorModal from './modals/EditVendorModal'; |
| import { useModelsData } from '../../../hooks/models/useModelsData'; |
| import { useIsMobile } from '../../../hooks/common/useIsMobile'; |
| import { createCardProPagination } from '../../../helpers/utils'; |
|
|
| const MARKETPLACE_DISPLAY_NOTICE_STORAGE_KEY = |
| 'models_marketplace_display_notice_dismissed'; |
|
|
| const ModelsPage = () => { |
| const modelsData = useModelsData(); |
| const isMobile = useIsMobile(); |
|
|
| const { |
| |
| showEdit, |
| editingModel, |
| closeEdit, |
| refresh, |
|
|
| |
| selectedKeys, |
| setSelectedKeys, |
| setEditingModel, |
| setShowEdit, |
| batchDeleteModels, |
|
|
| |
| formInitValues, |
| setFormApi, |
| searchModels, |
| loading, |
| searching, |
|
|
| |
| compactMode, |
| setCompactMode, |
|
|
| |
| showAddVendor, |
| setShowAddVendor, |
| showEditVendor, |
| setShowEditVendor, |
| editingVendor, |
| setEditingVendor, |
| loadVendors, |
|
|
| |
| t, |
| } = modelsData; |
|
|
| const [showMarketplaceDisplayNotice, setShowMarketplaceDisplayNotice] = |
| useState(() => { |
| try { |
| return ( |
| localStorage.getItem(MARKETPLACE_DISPLAY_NOTICE_STORAGE_KEY) !== '1' |
| ); |
| } catch (_) { |
| return true; |
| } |
| }); |
|
|
| const confirmCloseMarketplaceDisplayNotice = () => { |
| Modal.confirm({ |
| title: t('确认关闭提示'), |
| content: t( |
| '关闭后将不再显示此提示(仅对当前浏览器生效)。确定要关闭吗?', |
| ), |
| okText: t('关闭提示'), |
| cancelText: t('取消'), |
| okButtonProps: { |
| type: 'danger', |
| }, |
| onOk: () => { |
| try { |
| localStorage.setItem(MARKETPLACE_DISPLAY_NOTICE_STORAGE_KEY, '1'); |
| } catch (_) {} |
| setShowMarketplaceDisplayNotice(false); |
| }, |
| }); |
| }; |
|
|
| return ( |
| <> |
| <EditModelModal |
| refresh={refresh} |
| editingModel={editingModel} |
| visiable={showEdit} |
| handleClose={closeEdit} |
| /> |
| |
| <EditVendorModal |
| visible={showAddVendor || showEditVendor} |
| handleClose={() => { |
| setShowAddVendor(false); |
| setShowEditVendor(false); |
| setEditingVendor({ id: undefined }); |
| }} |
| editingVendor={showEditVendor ? editingVendor : { id: undefined }} |
| refresh={() => { |
| loadVendors(); |
| refresh(); |
| }} |
| /> |
| |
| {showMarketplaceDisplayNotice ? ( |
| <div style={{ position: 'relative', marginBottom: 12 }}> |
| <Banner |
| type='warning' |
| closeIcon={null} |
| icon={ |
| <IconAlertTriangle |
| size='large' |
| style={{ color: 'var(--semi-color-warning)' }} |
| /> |
| } |
| description={t( |
| '提示:此处配置仅用于控制「模型广场」对用户的展示效果,不会影响模型的实际调用与路由。若需配置真实调用行为,请前往「渠道管理」进行设置。', |
| )} |
| style={{ marginBottom: 0 }} |
| /> |
| <Button |
| theme='borderless' |
| size='small' |
| type='tertiary' |
| icon={<IconClose aria-hidden={true} />} |
| onClick={confirmCloseMarketplaceDisplayNotice} |
| style={{ position: 'absolute', top: 8, right: 8 }} |
| aria-label={t('关闭')} |
| /> |
| </div> |
| ) : null} |
| <CardPro |
| type='type3' |
| tabsArea={<ModelsTabs {...modelsData} />} |
| actionsArea={ |
| <div className='flex flex-col md:flex-row justify-between items-center gap-2 w-full'> |
| <ModelsActions |
| selectedKeys={selectedKeys} |
| setSelectedKeys={setSelectedKeys} |
| setEditingModel={setEditingModel} |
| setShowEdit={setShowEdit} |
| batchDeleteModels={batchDeleteModels} |
| syncing={modelsData.syncing} |
| syncUpstream={modelsData.syncUpstream} |
| previewing={modelsData.previewing} |
| previewUpstreamDiff={modelsData.previewUpstreamDiff} |
| applyUpstreamOverwrite={modelsData.applyUpstreamOverwrite} |
| compactMode={compactMode} |
| setCompactMode={setCompactMode} |
| t={t} |
| /> |
| |
| <div className='w-full md:w-full lg:w-auto order-1 md:order-2'> |
| <ModelsFilters |
| formInitValues={formInitValues} |
| setFormApi={setFormApi} |
| searchModels={searchModels} |
| loading={loading} |
| searching={searching} |
| t={t} |
| /> |
| </div> |
| </div> |
| } |
| paginationArea={createCardProPagination({ |
| currentPage: modelsData.activePage, |
| pageSize: modelsData.pageSize, |
| total: modelsData.modelCount, |
| onPageChange: modelsData.handlePageChange, |
| onPageSizeChange: modelsData.handlePageSizeChange, |
| isMobile: isMobile, |
| t: modelsData.t, |
| })} |
| t={modelsData.t} |
| > |
| <ModelsTable {...modelsData} /> |
| </CardPro> |
| </> |
| ); |
| }; |
|
|
| export default ModelsPage; |
|
|