import React, {FC} from 'react'; import { createTableColumn, DataGrid, DataGridBody, DataGridCell, DataGridHeader, DataGridHeaderCell, DataGridRow, TableCellLayout, TableColumnDefinition, Text, Textarea } from '@fluentui/react-components'; import {ToolTipButton} from '../components/ToolTipButton'; import {ArrowClockwise20Regular, ArrowDownload20Regular, Folder20Regular, Open20Regular} from '@fluentui/react-icons'; import {observer} from 'mobx-react-lite'; import commonStore, {ModelSourceItem} from '../stores/commonStore'; import {BrowserOpenURL} from '../../wailsjs/runtime'; import {DownloadFile, OpenFileFolder} from '../../wailsjs/go/backend_golang/App'; import manifest from '../../../manifest.json'; import {toast} from 'react-toastify'; import {Page} from '../components/Page'; import {refreshModels, saveConfigs} from '../utils'; import {useTranslation} from 'react-i18next'; const columns: TableColumnDefinition[] = [ createTableColumn({ columnId: 'file', compare: (a, b) => { return a.name.localeCompare(b.name); }, renderHeaderCell: () => { const {t} = useTranslation(); return t('File'); }, renderCell: (item) => { return ( {item.name} ); } }), createTableColumn({ columnId: 'desc', compare: (a, b) => { const lang: string = commonStore.settings.language; if (a.desc && b.desc) { if (lang in a.desc && lang in b.desc) return a.desc[lang].localeCompare(b.desc[lang]); else if ('en' in a.desc && 'en' in b.desc) return a.desc['en'].localeCompare(b.desc['en']); } return 0; }, renderHeaderCell: () => { const {t} = useTranslation(); return t('Desc'); }, renderCell: (item) => { const lang: string = commonStore.settings.language; return ( {item.desc && (lang in item.desc ? item.desc[lang] : ('en' in item.desc && item.desc['en']))} ); } }), createTableColumn({ columnId: 'size', compare: (a, b) => { return a.size - b.size; }, renderHeaderCell: () => { const {t} = useTranslation(); return t('Size'); }, renderCell: (item) => { return ( {(item.size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'} ); } }), createTableColumn({ columnId: 'lastUpdated', compare: (a, b) => { if (!a.lastUpdatedMs) a.lastUpdatedMs = Date.parse(a.lastUpdated); if (!b.lastUpdatedMs) b.lastUpdatedMs = Date.parse(b.lastUpdated); return b.lastUpdatedMs - a.lastUpdatedMs; }, renderHeaderCell: () => { const {t} = useTranslation(); return t('Last updated'); }, renderCell: (item) => { return new Date(item.lastUpdated).toLocaleString(); } }), createTableColumn({ columnId: 'actions', compare: (a, b) => { return a.isDownloading ? 0 : a.isLocal ? -1 : 1; }, renderHeaderCell: () => { const {t} = useTranslation(); return t('Actions'); }, renderCell: (item) => { const {t} = useTranslation(); return (
{ item.isLocal && } onClick={() => { OpenFileFolder(`./${manifest.localModelDir}/${item.name}`); }}/> } {item.downloadUrl && !item.isLocal && } onClick={() => { toast(`${t('Downloading')} ${item.name}`); DownloadFile(`./${manifest.localModelDir}/${item.name}`, item.downloadUrl!); }}/>} {item.url && } onClick={() => { BrowserOpenURL(item.url!); }}/>}
); } }) ]; export const Models: FC = observer(() => { const {t} = useTranslation(); return (
{t('Model Source Manifest List')} } onClick={() => { refreshModels(false); saveConfigs(); }}/>
{t('Provide JSON file URLs for the models manifest. Separate URLs with semicolons. The "models" field in JSON files will be parsed into the following table.')}