UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

68 lines (61 loc) 2.11 kB
import { SWRResponse } from 'swr'; import type { StateCreator } from 'zustand/vanilla'; import { useOnlyFetchOnceSWR } from '@/libs/swr'; import type { GlobalStore } from '@/store/global'; import { DatabaseLoadingState, OnStageChange } from '@/types/clientDB'; type InitClientDBParams = { onStateChange: OnStageChange }; /** * 设置操作 */ export interface GlobalClientDBAction { initializeClientDB: (params?: InitClientDBParams) => Promise<void>; markPgliteEnabled: () => void; useInitClientDB: (params?: InitClientDBParams) => SWRResponse; } export const clientDBSlice: StateCreator< GlobalStore, [['zustand/devtools', never]], [], GlobalClientDBAction > = (set, get) => ({ initializeClientDB: async (params) => { // if the db has started initialized or not error, just skip. if ( get().initClientDBStage !== DatabaseLoadingState.Idle && get().initClientDBStage !== DatabaseLoadingState.Error ) return; const { initializeDB } = await import('@/database/client/db'); await initializeDB({ onError: ({ error, migrationsSQL, migrationTableItems }) => { set({ initClientDBError: error, initClientDBMigrations: { sqls: migrationsSQL, tableRecords: migrationTableItems, }, }); }, onProgress: (data) => { set({ initClientDBProcess: data }); }, onStateChange: (state) => { set({ initClientDBStage: state }); params?.onStateChange?.(state); }, }); }, markPgliteEnabled: async () => { get().updateSystemStatus({ isEnablePglite: true }); if (navigator.storage && !!navigator.storage.persist) { // 1. Check if persistent permission has been obtained const isPersisted = await navigator.storage.persisted(); // 2. If the persistent permission has not been obtained, request permission if (!isPersisted) { await navigator.storage.persist(); } } }, useInitClientDB: (params) => useOnlyFetchOnceSWR('initClientDB', () => get().initializeClientDB(params)), });