| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { useState, useEffect, useMemo, useContext, useRef } from 'react'; |
| import { StatusContext } from '../../context/Status'; |
| import { API } from '../../helpers'; |
|
|
| |
| const sidebarEventTarget = new EventTarget(); |
| const SIDEBAR_REFRESH_EVENT = 'sidebar-refresh'; |
|
|
| export const useSidebar = () => { |
| const [statusState] = useContext(StatusContext); |
| const [userConfig, setUserConfig] = useState(null); |
| const [loading, setLoading] = useState(true); |
| const instanceIdRef = useRef(null); |
| const hasLoadedOnceRef = useRef(false); |
|
|
| if (!instanceIdRef.current) { |
| const randomPart = Math.random().toString(16).slice(2); |
| instanceIdRef.current = `sidebar-${Date.now()}-${randomPart}`; |
| } |
|
|
| |
| const defaultAdminConfig = { |
| chat: { |
| enabled: true, |
| playground: true, |
| chat: true, |
| }, |
| console: { |
| enabled: true, |
| detail: true, |
| token: true, |
| log: true, |
| midjourney: true, |
| task: true, |
| }, |
| personal: { |
| enabled: true, |
| topup: true, |
| personal: true, |
| }, |
| admin: { |
| enabled: true, |
| channel: true, |
| models: true, |
| redemption: true, |
| user: true, |
| setting: true, |
| }, |
| }; |
|
|
| |
| const adminConfig = useMemo(() => { |
| if (statusState?.status?.SidebarModulesAdmin) { |
| try { |
| const config = JSON.parse(statusState.status.SidebarModulesAdmin); |
| return config; |
| } catch (error) { |
| return defaultAdminConfig; |
| } |
| } |
| return defaultAdminConfig; |
| }, [statusState?.status?.SidebarModulesAdmin]); |
|
|
| |
| const loadUserConfig = async ({ withLoading } = {}) => { |
| const shouldShowLoader = |
| typeof withLoading === 'boolean' |
| ? withLoading |
| : !hasLoadedOnceRef.current; |
|
|
| try { |
| if (shouldShowLoader) { |
| setLoading(true); |
| } |
|
|
| const res = await API.get('/api/user/self'); |
| if (res.data.success && res.data.data.sidebar_modules) { |
| let config; |
| |
| if (typeof res.data.data.sidebar_modules === 'string') { |
| config = JSON.parse(res.data.data.sidebar_modules); |
| } else { |
| config = res.data.data.sidebar_modules; |
| } |
| setUserConfig(config); |
| } else { |
| |
| |
| const defaultUserConfig = {}; |
| Object.keys(adminConfig).forEach((sectionKey) => { |
| if (adminConfig[sectionKey]?.enabled) { |
| defaultUserConfig[sectionKey] = { enabled: true }; |
| |
| Object.keys(adminConfig[sectionKey]).forEach((moduleKey) => { |
| if ( |
| moduleKey !== 'enabled' && |
| adminConfig[sectionKey][moduleKey] |
| ) { |
| defaultUserConfig[sectionKey][moduleKey] = true; |
| } |
| }); |
| } |
| }); |
| setUserConfig(defaultUserConfig); |
| } |
| } catch (error) { |
| |
| const defaultUserConfig = {}; |
| Object.keys(adminConfig).forEach((sectionKey) => { |
| if (adminConfig[sectionKey]?.enabled) { |
| defaultUserConfig[sectionKey] = { enabled: true }; |
| Object.keys(adminConfig[sectionKey]).forEach((moduleKey) => { |
| if (moduleKey !== 'enabled' && adminConfig[sectionKey][moduleKey]) { |
| defaultUserConfig[sectionKey][moduleKey] = true; |
| } |
| }); |
| } |
| }); |
| setUserConfig(defaultUserConfig); |
| } finally { |
| if (shouldShowLoader) { |
| setLoading(false); |
| } |
| hasLoadedOnceRef.current = true; |
| } |
| }; |
|
|
| |
| const refreshUserConfig = async () => { |
| if (Object.keys(adminConfig).length > 0) { |
| await loadUserConfig({ withLoading: false }); |
| } |
|
|
| |
| sidebarEventTarget.dispatchEvent( |
| new CustomEvent(SIDEBAR_REFRESH_EVENT, { |
| detail: { sourceId: instanceIdRef.current, skipLoader: true }, |
| }), |
| ); |
| }; |
|
|
| |
| useEffect(() => { |
| |
| if (Object.keys(adminConfig).length > 0) { |
| loadUserConfig(); |
| } |
| }, [adminConfig]); |
|
|
| |
| useEffect(() => { |
| const handleRefresh = (event) => { |
| if (event?.detail?.sourceId === instanceIdRef.current) { |
| return; |
| } |
|
|
| if (Object.keys(adminConfig).length > 0) { |
| loadUserConfig({ |
| withLoading: event?.detail?.skipLoader ? false : undefined, |
| }); |
| } |
| }; |
|
|
| sidebarEventTarget.addEventListener(SIDEBAR_REFRESH_EVENT, handleRefresh); |
|
|
| return () => { |
| sidebarEventTarget.removeEventListener( |
| SIDEBAR_REFRESH_EVENT, |
| handleRefresh, |
| ); |
| }; |
| }, [adminConfig]); |
|
|
| |
| const finalConfig = useMemo(() => { |
| const result = {}; |
|
|
| |
| if (!adminConfig || Object.keys(adminConfig).length === 0) { |
| return result; |
| } |
|
|
| |
| if (!userConfig) { |
| return result; |
| } |
|
|
| |
| Object.keys(adminConfig).forEach((sectionKey) => { |
| const adminSection = adminConfig[sectionKey]; |
| const userSection = userConfig[sectionKey]; |
|
|
| |
| if (!adminSection?.enabled) { |
| result[sectionKey] = { enabled: false }; |
| return; |
| } |
|
|
| |
| |
| const sectionEnabled = userSection ? userSection.enabled !== false : true; |
| result[sectionKey] = { enabled: sectionEnabled }; |
|
|
| |
| Object.keys(adminSection).forEach((moduleKey) => { |
| if (moduleKey === 'enabled') return; |
|
|
| const adminAllowed = adminSection[moduleKey]; |
| |
| const userAllowed = userSection |
| ? userSection[moduleKey] !== false |
| : true; |
|
|
| result[sectionKey][moduleKey] = |
| adminAllowed && userAllowed && sectionEnabled; |
| }); |
| }); |
|
|
| return result; |
| }, [adminConfig, userConfig]); |
|
|
| |
| const isModuleVisible = (sectionKey, moduleKey = null) => { |
| if (moduleKey) { |
| return finalConfig[sectionKey]?.[moduleKey] === true; |
| } else { |
| return finalConfig[sectionKey]?.enabled === true; |
| } |
| }; |
|
|
| |
| const hasSectionVisibleModules = (sectionKey) => { |
| const section = finalConfig[sectionKey]; |
| if (!section?.enabled) return false; |
|
|
| return Object.keys(section).some( |
| (key) => key !== 'enabled' && section[key] === true, |
| ); |
| }; |
|
|
| |
| const getVisibleModules = (sectionKey) => { |
| const section = finalConfig[sectionKey]; |
| if (!section?.enabled) return []; |
|
|
| return Object.keys(section).filter( |
| (key) => key !== 'enabled' && section[key] === true, |
| ); |
| }; |
|
|
| return { |
| loading, |
| adminConfig, |
| userConfig, |
| finalConfig, |
| isModuleVisible, |
| hasSectionVisibleModules, |
| getVisibleModules, |
| refreshUserConfig, |
| }; |
| }; |
|
|