Add loader stating model on select dropdown

This commit is contained in:
Faisal Amir 2024-01-16 23:46:24 +07:00
parent 14fc686d50
commit 58161598c3

View File

@ -1,4 +1,5 @@
import { useCallback, useEffect } from 'react' import { useCallback, useEffect } from 'react'
import { useCallback, useEffect, useRef, useState } from 'react'
import { InferenceEngine, Model } from '@janhq/core' import { InferenceEngine, Model } from '@janhq/core'
import { import {
@ -48,7 +49,7 @@ export default function DropdownListSidebar() {
const threadStates = useAtomValue(threadStatesAtom) const threadStates = useAtomValue(threadStatesAtom)
const [selectedModel, setSelectedModel] = useAtom(selectedModelAtom) const [selectedModel, setSelectedModel] = useAtom(selectedModelAtom)
const setThreadModelParams = useSetAtom(setThreadModelParamsAtom) const setThreadModelParams = useSetAtom(setThreadModelParamsAtom)
const { activeModel, startModel } = useActiveModel() const { activeModel, startModel, stateModel } = useActiveModel()
const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom) const [serverEnabled, setServerEnabled] = useAtom(serverEnabledAtom)
const { setMainViewState } = useMainViewState() const { setMainViewState } = useMainViewState()
@ -67,7 +68,6 @@ export default function DropdownListSidebar() {
}, []) }, [])
const { recommendedModel, downloadedModels } = useRecommendedModel() const { recommendedModel, downloadedModels } = useRecommendedModel()
const [first, setfirst] = useState(false)
const selectedName = const selectedName =
downloadedModels.filter((x) => x.id === selectedModel?.id)[0]?.name ?? '' downloadedModels.filter((x) => x.id === selectedModel?.id)[0]?.name ?? ''
@ -80,8 +80,12 @@ export default function DropdownListSidebar() {
return 4096 return 4096
} }
const selectedRef = useRef(null)
useEffect(() => { useEffect(() => {
setSelectedModel(recommendedModel) setSelectedModel(recommendedModel)
setSelected(activeModel || recommendedModel)
setSelectedModel(activeModel || recommendedModel)
if (activeThread) { if (activeThread) {
const finishInit = threadStates[activeThread.id].isFinishInit ?? true const finishInit = threadStates[activeThread.id].isFinishInit ?? true
@ -110,6 +114,33 @@ export default function DropdownListSidebar() {
threadStates, threadStates,
]) ])
const [loader, setLoader] = useState(0)
// This is fake loader please fix this when we have realtime percentage when load model
useEffect(() => {
if (stateModel.loading) {
if (loader === 24) {
setTimeout(() => {
setLoader(loader + 1)
}, 250)
} else if (loader === 50) {
setTimeout(() => {
setLoader(loader + 1)
}, 250)
} else if (loader === 78) {
setTimeout(() => {
setLoader(loader + 1)
}, 250)
} else if (loader === 99) {
setLoader(99)
} else {
setLoader(loader + 1)
}
} else {
setLoader(0)
}
}, [stateModel.loading, loader])
const onValueSelected = useCallback( const onValueSelected = useCallback(
(modelId: string) => { (modelId: string) => {
const model = downloadedModels.find((m) => m.id === modelId) const model = downloadedModels.find((m) => m.id === modelId)
@ -150,9 +181,24 @@ export default function DropdownListSidebar() {
<> <>
<Select value={selectedModel?.id} onValueChange={onValueSelected}> <Select value={selectedModel?.id} onValueChange={onValueSelected}>
<div className="relative"> <div className="relative">
<div
className={twMerge(
'relative w-full overflow-hidden rounded-md',
stateModel.loading && 'bg-blue-100'
)}
>
{stateModel.loading && (
<div
className="absolute left-0 top-0 z-10 h-full w-full rounded-md bg-blue-50/80"
style={{ width: `${loader}%` }}
/>
)}
<Select value={selected?.id} onValueChange={onValueSelected}> <Select value={selected?.id} onValueChange={onValueSelected}>
<SelectTrigger className="w-full"> <SelectTrigger className="w-full">
<SelectValue placeholder="Choose model to start"> <SelectValue
placeholder="Choose model to start"
className="relative z-50"
>
{selectedName} {selectedName}
</SelectValue> </SelectValue>
</SelectTrigger> </SelectTrigger>
@ -191,10 +237,14 @@ export default function DropdownListSidebar() {
{downloadedModels.map((x, i) => ( {downloadedModels.map((x, i) => (
<SelectItem <SelectItem
key={i} key={i}
ref={selectedRef}
value={x.id} value={x.id}
className={twMerge(x.id === selected?.id && 'bg-secondary')} className={twMerge(x.id === selected?.id && 'bg-secondary')}
onClick={() => {
x.id === selected?.id && console.log('huhft')
}}
> >
<div className="z-50 flex w-full justify-between"> <div className="flex w-full justify-between">
<span className="line-clamp-1 block">{x.name}</span> <span className="line-clamp-1 block">{x.name}</span>
<div className="space-x-2"> <div className="space-x-2">
<span className="font-bold text-muted-foreground"> <span className="font-bold text-muted-foreground">