import { useCallback, useEffect, useState } from 'react' import { Model, ModelEvent, events, joinPath, openFileExplorer, } from '@janhq/core' import { Modal, Button, Input, ModalClose, TextArea } from '@janhq/joi' import { atom, useAtom, useAtomValue, useSetAtom } from 'jotai' import { Paperclip } from 'lucide-react' import useImportModel, { getImportModelStageAtom, setImportModelStageAtom, } from '@/hooks/useImportModel' import { toGibibytes } from '@/utils/converter' import { openFileTitle } from '@/utils/titleUtils' import { janDataFolderPathAtom } from '@/helpers/atoms/AppConfig.atom' import { importingModelsAtom, updateImportingModelAtom, } from '@/helpers/atoms/Model.atom' export const editingModelIdAtom = atom(undefined) const EditModelInfoModal = () => { const importModelStage = useAtomValue(getImportModelStageAtom) const importingModels = useAtomValue(importingModelsAtom) const setImportModelStage = useSetAtom(setImportModelStageAtom) const [editingModelId, setEditingModelId] = useAtom(editingModelIdAtom) const [modelName, setModelName] = useState('') const [modelId, setModelId] = useState('') const [description, setDescription] = useState('') const [tags, setTags] = useState([]) const janDataFolder = useAtomValue(janDataFolderPathAtom) const updateImportingModel = useSetAtom(updateImportingModelAtom) const { updateModelInfo } = useImportModel() const [modelPath, setModelPath] = useState('') const editingModel = importingModels.find( (model) => model.importId === editingModelId ) useEffect(() => { if (editingModel && editingModel.modelId != null) { setModelName(editingModel.name) setModelId(editingModel.modelId) setDescription(editingModel.description) setTags(editingModel.tags) } }, [editingModel]) const onCancelClick = () => { setImportModelStage('IMPORTING_MODEL') setEditingModelId(undefined) } const onSaveClick = async () => { if (!editingModel || !editingModel.modelId) return const modelInfo: Partial = { id: editingModel.modelId, name: modelName, description, metadata: { author: 'User', tags, size: 0, }, } await updateModelInfo(modelInfo) events.emit(ModelEvent.OnModelsUpdate, {}) updateImportingModel(editingModel.importId, modelName, description, tags) setImportModelStage('IMPORTING_MODEL') setEditingModelId(undefined) } useEffect(() => { const getModelPath = async () => { const modelId = editingModel?.modelId if (!modelId) return '' const path = await joinPath([janDataFolder, 'models', modelId]) setModelPath(path) } getModelPath() }, [janDataFolder, editingModel]) const onShowInFinderClick = useCallback(() => { openFileExplorer(modelPath) }, [modelPath]) if (!editingModel) { setImportModelStage('IMPORTING_MODEL') setEditingModelId(undefined) return null } const onTagsChange = (e: React.ChangeEvent) => { const tags = e.target.value.split(',') setTags(tags) } return (

{editingModel.name}

{toGibibytes(editingModel.size)}
Format: {editingModel.format.toUpperCase()}
{modelPath}
{ e.preventDefault() setModelName(e.target.value) }} />
{ e.preventDefault() setModelId(e.target.value) }} />