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/renderer
electron/models electron/models
electron/docs electron/docs
electron/engines
server/pre-install
package-lock.json package-lock.json
*.log *.log
@ -26,3 +28,4 @@ extensions/inference-nitro-extension/bin/*/*.exp
extensions/inference-nitro-extension/bin/*/*.lib extensions/inference-nitro-extension/bin/*/*.lib
extensions/inference-nitro-extension/bin/saved-* extensions/inference-nitro-extension/bin/saved-*
extensions/inference-nitro-extension/bin/*.tar.gz extensions/inference-nitro-extension/bin/*.tar.gz

View File

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

View File

@ -1,5 +1,4 @@
import { MonitoringExtension } from "@janhq/core"; import { MonitoringExtension, executeOnMain } from "@janhq/core";
import { executeOnMain } from "@janhq/core";
/** /**
* JanMonitoringExtension is a extension that provides system monitoring functionality. * 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') { if (localStorage.getItem(SUCCESS_SET_NEW_DESTINATION) === 'true') {
setMainViewState(MainViewState.Settings) setMainViewState(MainViewState.Settings)
} }
}, []) }, [setMainViewState])
return ( return (
<div className="flex h-screen w-screen flex-1 overflow-hidden"> <div className="flex h-screen w-screen flex-1 overflow-hidden">

View File

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

View File

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

View File

@ -1,4 +1,4 @@
import { useEffect, useState } from 'react' import { useCallback, useEffect, useState } from 'react'
import { ExtensionTypeEnum, ModelExtension, Model } from '@janhq/core' import { ExtensionTypeEnum, ModelExtension, Model } from '@janhq/core'
@ -8,24 +8,23 @@ export function useGetConfiguredModels() {
const [loading, setLoading] = useState<boolean>(false) const [loading, setLoading] = useState<boolean>(false)
const [models, setModels] = useState<Model[]>([]) const [models, setModels] = useState<Model[]>([])
const getConfiguredModels = async (): Promise<Model[]> => { const fetchModels = useCallback(async () => {
const models = await extensionManager
.get<ModelExtension>(ExtensionTypeEnum.Model)
?.getConfiguredModels()
return models ?? []
}
async function fetchModels() {
setLoading(true) setLoading(true)
const models = await getConfiguredModels() const models = await getConfiguredModels()
setLoading(false) setLoading(false)
setModels(models) setModels(models)
} }, [])
useEffect(() => { useEffect(() => {
fetchModels() fetchModels()
// eslint-disable-next-line react-hooks/exhaustive-deps }, [fetchModels])
}, [])
return { loading, models } 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, ExtensionTypeEnum,
ThreadMessage, ThreadMessage,
ChatCompletionRole, ChatCompletionRole,
ConversationalExtension,
} from '@janhq/core' } from '@janhq/core'
import { ConversationalExtension } from '@janhq/core'
import { useAtomValue, useSetAtom } from 'jotai' import { useAtomValue, useSetAtom } from 'jotai'
import { RefreshCcw, CopyIcon, Trash2Icon, CheckIcon } from 'lucide-react' import { RefreshCcw, CopyIcon, Trash2Icon, CheckIcon } from 'lucide-react'