chore: seperate function handle import model

This commit is contained in:
Faisal Amir 2025-08-19 22:01:14 +07:00
parent 6ee044d106
commit 6c612d8eba

View File

@ -96,6 +96,69 @@ function ProviderDetail() {
!setting.controller_props.value) !setting.controller_props.value)
) )
const handleImportModel = async () => {
if (!provider) {
return
}
setImportingModel(true)
const selectedFile = await open({
multiple: false,
directory: false,
filters: [
{
name: 'GGUF',
extensions: ['gguf'],
},
],
})
// If the dialog returns a file path, extract just the file name
const fileName =
typeof selectedFile === 'string'
? selectedFile
.split(/[\\/]/)
.pop()
?.replace(/\s/g, '-')
: undefined
if (selectedFile && fileName) {
// Check if model already exists
const modelExists = provider.models.some(
(model) => model.name === fileName
)
if (modelExists) {
toast.error('Model already exists', {
description: `${fileName} already imported`,
})
setImportingModel(false)
return
}
try {
await pullModel(fileName, selectedFile)
// Refresh the provider to update the models list
await getProviders().then(setProviders)
toast.success(t('providers:import'), {
id: `import-model-${provider.provider}`,
description: t(
'providers:importModelSuccess',
{ provider: fileName }
),
})
} catch (error) {
console.error(
t('providers:importModelError'),
error
)
} finally {
setImportingModel(false)
}
} else {
setImportingModel(false)
}
}
useEffect(() => { useEffect(() => {
// Initial data fetch // Initial data fetch
getActiveModels().then((models) => setActiveModels(models || [])) getActiveModels().then((models) => setActiveModels(models || []))
@ -484,64 +547,7 @@ function ProviderDetail() {
size="sm" size="sm"
className="hover:no-underline" className="hover:no-underline"
disabled={importingModel} disabled={importingModel}
onClick={async () => { onClick={handleImportModel}
setImportingModel(true)
const selectedFile = await open({
multiple: false,
directory: false,
filters: [
{
name: 'GGUF',
extensions: ['gguf'],
},
],
})
// If the dialog returns a file path, extract just the file name
const fileName =
typeof selectedFile === 'string'
? selectedFile
.split(/[\\/]/)
.pop()
?.replace(/\s/g, '-')
: undefined
if (selectedFile && fileName) {
// Check if model already exists
const modelExists = provider.models.some(
(model) => model.name === fileName
)
if (modelExists) {
toast.error('Model already exists', {
description: `${fileName} already imported`,
})
setImportingModel(false)
return
}
try {
await pullModel(fileName, selectedFile)
} catch (error) {
console.error(
t('providers:importModelError'),
error
)
} finally {
// Refresh the provider to update the models list
await getProviders().then(setProviders)
toast.success(t('providers:import'), {
id: `import-model-${provider.provider}`,
description: t(
'providers:importModelSuccess',
{ provider: fileName }
),
})
setImportingModel(false)
}
} else {
setImportingModel(false)
}
}}
> >
<div className="cursor-pointer flex items-center justify-center rounded hover:bg-main-view-fg/15 bg-main-view-fg/10 transition-all duration-200 ease-in-out p-1.5 py-1 gap-1 -mr-2"> <div className="cursor-pointer flex items-center justify-center rounded hover:bg-main-view-fg/15 bg-main-view-fg/10 transition-all duration-200 ease-in-out p-1.5 py-1 gap-1 -mr-2">
{importingModel ? ( {importingModel ? (