| | import { useEffect } from 'react'; |
| | import TagManager from 'react-gtm-module'; |
| | import { useRecoilState, useSetRecoilState } from 'recoil'; |
| | import { LocalStorageKeys } from 'librechat-data-provider'; |
| | import { useAvailablePluginsQuery } from 'librechat-data-provider/react-query'; |
| | import type { TStartupConfig, TPlugin, TUser } from 'librechat-data-provider'; |
| | import { mapPlugins, selectPlugins, processPlugins } from '~/utils'; |
| | import { cleanupTimestampedStorage } from '~/utils/timestamps'; |
| | import useSpeechSettingsInit from './useSpeechSettingsInit'; |
| | import { useMCPToolsQuery } from '~/data-provider'; |
| | import store from '~/store'; |
| |
|
| | const pluginStore: TPlugin = { |
| | name: 'Plugin store', |
| | pluginKey: 'pluginStore', |
| | isButton: true, |
| | description: '', |
| | icon: '', |
| | authConfig: [], |
| | authenticated: false, |
| | }; |
| |
|
| | export default function useAppStartup({ |
| | startupConfig, |
| | user, |
| | }: { |
| | startupConfig?: TStartupConfig; |
| | user?: TUser; |
| | }) { |
| | const setAvailableTools = useSetRecoilState(store.availableTools); |
| | const [defaultPreset, setDefaultPreset] = useRecoilState(store.defaultPreset); |
| | const { data: allPlugins } = useAvailablePluginsQuery({ |
| | enabled: !!user?.plugins, |
| | select: selectPlugins, |
| | }); |
| |
|
| | useSpeechSettingsInit(!!user); |
| |
|
| | useMCPToolsQuery({ |
| | enabled: !!startupConfig?.mcpServers && !!user, |
| | }); |
| |
|
| | |
| | useEffect(() => { |
| | cleanupTimestampedStorage(); |
| | }, []); |
| |
|
| | |
| | useEffect(() => { |
| | const appTitle = startupConfig?.appTitle ?? ''; |
| | if (!appTitle) { |
| | return; |
| | } |
| | document.title = appTitle; |
| | localStorage.setItem(LocalStorageKeys.APP_TITLE, appTitle); |
| | }, [startupConfig]); |
| |
|
| | |
| | useEffect(() => { |
| | if (defaultPreset && defaultPreset.spec != null) { |
| | return; |
| | } |
| |
|
| | const modelSpecs = startupConfig?.modelSpecs?.list; |
| |
|
| | if (!modelSpecs || !modelSpecs.length) { |
| | return; |
| | } |
| |
|
| | const defaultSpec = modelSpecs.find((spec) => spec.default); |
| |
|
| | if (!defaultSpec) { |
| | return; |
| | } |
| |
|
| | setDefaultPreset({ |
| | ...defaultSpec.preset, |
| | iconURL: defaultSpec.iconURL, |
| | spec: defaultSpec.name, |
| | }); |
| | }, [defaultPreset, setDefaultPreset, startupConfig?.modelSpecs?.list]); |
| |
|
| | |
| | useEffect(() => { |
| | if (!user) { |
| | return; |
| | } |
| |
|
| | if (!allPlugins) { |
| | return; |
| | } |
| |
|
| | const userPlugins = user.plugins ?? []; |
| |
|
| | if (userPlugins.length === 0) { |
| | setAvailableTools({ pluginStore }); |
| | return; |
| | } |
| |
|
| | const tools = [...userPlugins] |
| | .map((el) => allPlugins.map[el]) |
| | .filter((el: TPlugin | undefined): el is TPlugin => el !== undefined); |
| |
|
| | |
| | const localStorageItem = localStorage.getItem(LocalStorageKeys.LAST_TOOLS) ?? ''; |
| | if (!localStorageItem) { |
| | return setAvailableTools({ pluginStore, ...mapPlugins(tools) }); |
| | } |
| | const lastSelectedTools = processPlugins(JSON.parse(localStorageItem) ?? [], allPlugins.map); |
| | const filteredTools = lastSelectedTools |
| | .filter((tool: TPlugin) => |
| | tools.some((existingTool) => existingTool.pluginKey === tool.pluginKey), |
| | ) |
| | .filter((tool: TPlugin | undefined) => !!tool); |
| | localStorage.setItem(LocalStorageKeys.LAST_TOOLS, JSON.stringify(filteredTools)); |
| |
|
| | setAvailableTools({ pluginStore, ...mapPlugins(tools) }); |
| | }, [allPlugins, user, setAvailableTools]); |
| |
|
| | useEffect(() => { |
| | if (startupConfig?.analyticsGtmId != null && typeof window.google_tag_manager === 'undefined') { |
| | const tagManagerArgs = { |
| | gtmId: startupConfig.analyticsGtmId, |
| | }; |
| | TagManager.initialize(tagManagerArgs); |
| | } |
| | }, [startupConfig?.analyticsGtmId]); |
| | } |
| |
|