chore: clean up code and remove some lint suppression (#1777)

* chore: clean up code and remove some lint suppression

Signed-off-by: James <james@jan.ai>

* Update .gitignore

---------

Signed-off-by: James <james@jan.ai>
Co-authored-by: James <james@jan.ai>
Co-authored-by: Louis <louis@jan.ai>
This commit is contained in:
NamH 2024-01-26 12:19:02 +07:00 committed by GitHub
parent 85b58eb824
commit 143e76a0de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 96 additions and 74 deletions

3
.gitignore vendored
View File

@ -12,6 +12,8 @@ build
electron/renderer
electron/models
electron/docs
electron/engines
server/pre-install
package-lock.json
*.log
@ -26,3 +28,4 @@ extensions/inference-nitro-extension/bin/*/*.exp
extensions/inference-nitro-extension/bin/*/*.lib
extensions/inference-nitro-extension/bin/saved-*
extensions/inference-nitro-extension/bin/*.tar.gz

View File

@ -1,5 +1,4 @@
import { fs, Assistant } from "@janhq/core";
import { AssistantExtension } from "@janhq/core";
import { fs, Assistant, AssistantExtension } from "@janhq/core";
import { join } from "path";
export default class JanAssistantExtension extends AssistantExtension {

View File

@ -1,5 +1,4 @@
import { MonitoringExtension } from "@janhq/core";
import { executeOnMain } from "@janhq/core";
import { MonitoringExtension, executeOnMain } from "@janhq/core";
/**
* JanMonitoringExtension is a extension that provides system monitoring functionality.

View File

@ -28,7 +28,7 @@ const BaseLayout = (props: PropsWithChildren) => {
if (localStorage.getItem(SUCCESS_SET_NEW_DESTINATION) === 'true') {
setMainViewState(MainViewState.Settings)
}
}, [])
}, [setMainViewState])
return (
<div className="flex h-screen w-screen flex-1 overflow-hidden">

View File

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { ReactNode, useEffect, useRef } from 'react'
import { ReactNode, useCallback, useEffect, useRef } from 'react'
import {
events,
@ -48,48 +48,61 @@ export default function EventHandler({ children }: { children: ReactNode }) {
modelsRef.current = downloadedModels
}, [downloadedModels])
async function handleNewMessageResponse(message: ThreadMessage) {
addNewMessage(message)
}
const onNewMessageResponse = useCallback(
(message: ThreadMessage) => {
addNewMessage(message)
},
[addNewMessage]
)
async function handleModelReady(model: Model) {
setActiveModel(model)
toaster({
title: 'Success!',
description: `Model ${model.id} has been started.`,
})
setStateModel(() => ({
state: 'stop',
loading: false,
model: model.id,
}))
}
const onModelReady = useCallback(
(model: Model) => {
setActiveModel(model)
toaster({
title: 'Success!',
description: `Model ${model.id} has been started.`,
})
setStateModel(() => ({
state: 'stop',
loading: false,
model: model.id,
}))
},
[setActiveModel, setStateModel]
)
async function handleModelStopped() {
setTimeout(async () => {
const onModelStopped = useCallback(() => {
setTimeout(() => {
setActiveModel(undefined)
setStateModel({ state: 'start', loading: false, model: '' })
}, 500)
}
}, [setActiveModel, setStateModel])
async function handleModelFail(res: any) {
const errorMessage = `${res.error}`
alert(errorMessage)
setStateModel(() => ({
state: 'start',
loading: false,
model: res.modelId,
}))
}
const onModelInitFailed = useCallback(
(res: any) => {
const errorMessage = `${res.error}`
console.error('Failed to load model: ' + errorMessage)
setStateModel(() => ({
state: 'start',
loading: false,
model: res.modelId,
}))
},
[setStateModel]
)
const onMessageResponseUpdate = useCallback(
(message: ThreadMessage) => {
updateMessage(
message.id,
message.thread_id,
message.content,
message.status
)
if (message.status === MessageStatus.Pending) {
return
}
async function handleMessageResponseUpdate(message: ThreadMessage) {
updateMessage(
message.id,
message.thread_id,
message.content,
message.status
)
if (message.status !== MessageStatus.Pending) {
// Mark the thread as not waiting for response
updateThreadWaiting(message.thread_id, false)
@ -111,26 +124,33 @@ export default function EventHandler({ children }: { children: ReactNode }) {
.get<ConversationalExtension>(ExtensionTypeEnum.Conversational)
?.addNewMessage(message)
}
}
}
},
[updateMessage, updateThreadWaiting]
)
useEffect(() => {
console.log('Registering events')
if (window.core?.events) {
events.on(MessageEvent.OnMessageResponse, handleNewMessageResponse)
events.on(MessageEvent.OnMessageUpdate, handleMessageResponseUpdate)
events.on(ModelEvent.OnModelReady, handleModelReady)
events.on(ModelEvent.OnModelFail, handleModelFail)
events.on(ModelEvent.OnModelStopped, handleModelStopped)
events.on(MessageEvent.OnMessageResponse, onNewMessageResponse)
events.on(MessageEvent.OnMessageUpdate, onMessageResponseUpdate)
events.on(ModelEvent.OnModelReady, onModelReady)
events.on(ModelEvent.OnModelFail, onModelInitFailed)
events.on(ModelEvent.OnModelStopped, onModelStopped)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
}, [
onNewMessageResponse,
onMessageResponseUpdate,
onModelReady,
onModelInitFailed,
onModelStopped,
])
useEffect(() => {
return () => {
events.off(MessageEvent.OnMessageResponse, handleNewMessageResponse)
events.off(MessageEvent.OnMessageUpdate, handleMessageResponseUpdate)
events.off(MessageEvent.OnMessageResponse, onNewMessageResponse)
events.off(MessageEvent.OnMessageUpdate, onMessageResponseUpdate)
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
}, [onNewMessageResponse, onMessageResponseUpdate])
return <>{children}</>
}

View File

@ -105,12 +105,14 @@ export default function EventListenerWrapper({ children }: PropsWithChildren) {
})
}
return () => {}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
}, [
setDownloadState,
setDownloadStateCancelled,
setDownloadStateFailed,
setDownloadStateSuccess,
setDownloadedModels,
setProgress,
])
return (
<div id="eventlistener">
<EventHandler>{children}</EventHandler>
</div>
)
return <EventHandler>{children}</EventHandler>
}

View File

@ -1,4 +1,4 @@
import { useEffect, useState } from 'react'
import { useCallback, useEffect, useState } from 'react'
import { ExtensionTypeEnum, ModelExtension, Model } from '@janhq/core'
@ -8,24 +8,23 @@ export function useGetConfiguredModels() {
const [loading, setLoading] = useState<boolean>(false)
const [models, setModels] = useState<Model[]>([])
const getConfiguredModels = async (): Promise<Model[]> => {
const models = await extensionManager
.get<ModelExtension>(ExtensionTypeEnum.Model)
?.getConfiguredModels()
return models ?? []
}
async function fetchModels() {
const fetchModels = useCallback(async () => {
setLoading(true)
const models = await getConfiguredModels()
setLoading(false)
setModels(models)
}
}, [])
useEffect(() => {
fetchModels()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
}, [fetchModels])
return { loading, models }
}
const getConfiguredModels = async (): Promise<Model[]> => {
const models = await extensionManager
.get<ModelExtension>(ExtensionTypeEnum.Model)
?.getConfiguredModels()
return models ?? []
}

View File

@ -3,8 +3,8 @@ import {
ExtensionTypeEnum,
ThreadMessage,
ChatCompletionRole,
ConversationalExtension,
} from '@janhq/core'
import { ConversationalExtension } from '@janhq/core'
import { useAtomValue, useSetAtom } from 'jotai'
import { RefreshCcw, CopyIcon, Trash2Icon, CheckIcon } from 'lucide-react'