mirror of
https://github.com/Crosstalk-Solutions/project-nomad.git
synced 2026-03-28 03:29:25 +01:00
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import { useEffect, useState } from 'react'
|
|
import { useTransmit } from 'react-adonis-transmit'
|
|
|
|
export type OllamaModelDownload = {
|
|
model: string
|
|
percent: number
|
|
timestamp: string
|
|
}
|
|
|
|
export default function useOllamaModelDownloads() {
|
|
const { subscribe } = useTransmit()
|
|
const [downloads, setDownloads] = useState<Map<string, OllamaModelDownload>>(new Map())
|
|
|
|
useEffect(() => {
|
|
const unsubscribe = subscribe('ollama-model-download', (data: OllamaModelDownload) => {
|
|
setDownloads((prev) => {
|
|
const updated = new Map(prev)
|
|
|
|
if (data.percent >= 100) {
|
|
// If download is complete, keep it for a short time before removing to allow UI to show 100% progress
|
|
updated.set(data.model, data)
|
|
setTimeout(() => {
|
|
setDownloads((current) => {
|
|
const next = new Map(current)
|
|
next.delete(data.model)
|
|
return next
|
|
})
|
|
}, 2000)
|
|
} else {
|
|
updated.set(data.model, data)
|
|
}
|
|
|
|
return updated
|
|
})
|
|
})
|
|
|
|
return () => {
|
|
unsubscribe()
|
|
}
|
|
}, [subscribe])
|
|
|
|
const downloadsArray = Array.from(downloads.values())
|
|
|
|
return { downloads: downloadsArray, activeCount: downloads.size }
|
|
}
|