import type { StoreApi } from 'zustand' import { createContext, use } from 'react' import { useStore } from 'zustand' import { createStore } from 'zustand/vanilla' export type PluginInstallPermissionState = { canInstallPlugin: boolean canUpdatePlugin: boolean currentDifyVersion?: string } type PluginInstallPermissionAction = { setPluginInstallPermission: (state: PluginInstallPermissionState) => void } export type PluginInstallPermissionStoreState = PluginInstallPermissionState & PluginInstallPermissionAction export type PluginInstallPermissionStore = StoreApi const defaultPluginInstallPermissionState: PluginInstallPermissionState = { canInstallPlugin: true, canUpdatePlugin: true, } export const createPluginInstallPermissionStore = ( initProps?: Partial, ) => { const canInstallPlugin = initProps?.canInstallPlugin ?? defaultPluginInstallPermissionState.canInstallPlugin return createStore()((set) => ({ ...defaultPluginInstallPermissionState, ...initProps, canUpdatePlugin: initProps?.canUpdatePlugin ?? canInstallPlugin, setPluginInstallPermission: (state) => set(() => state), })) } const fallbackPluginInstallPermissionStore = createPluginInstallPermissionStore() export const PluginInstallPermissionContext = createContext( null, ) export const usePluginInstallPermissionStore = ( selector: (state: PluginInstallPermissionStoreState) => T, ): T => { const store = use(PluginInstallPermissionContext) if (!store) throw new Error('Missing PluginInstallPermissionProvider in the tree') return useStore(store, selector) } const usePluginInstallPermission = () => { const canInstallPlugin = usePluginInstallPermissionStore((state) => state.canInstallPlugin) const canUpdatePlugin = usePluginInstallPermissionStore((state) => state.canUpdatePlugin) const currentDifyVersion = usePluginInstallPermissionStore((state) => state.currentDifyVersion) return { canInstallPlugin, canUpdatePlugin, currentDifyVersion, } } export const useOptionalPluginInstallPermission = () => { const store = use(PluginInstallPermissionContext) ?? fallbackPluginInstallPermissionStore const canInstallPlugin = useStore(store, (state) => state.canInstallPlugin) const canUpdatePlugin = useStore(store, (state) => state.canUpdatePlugin) const currentDifyVersion = useStore(store, (state) => state.currentDifyVersion) return { canInstallPlugin, canUpdatePlugin, currentDifyVersion, } } export default usePluginInstallPermission