| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 | 
							- 'use client'
 
- import { createRef, useEffect, useRef, useState } from 'react'
 
- import useSWR from 'swr'
 
- import { createContext, useContext, useContextSelector } from 'use-context-selector'
 
- import type { FC, ReactNode } from 'react'
 
- import { fetchAppList } from '@/service/apps'
 
- import Loading from '@/app/components/base/loading'
 
- import { fetchLanggeniusVersion, fetchUserProfile } from '@/service/common'
 
- import type { App } from '@/types/app'
 
- import type { LangGeniusVersionResponse, UserProfileResponse } from '@/models/common'
 
- export type AppContextValue = {
 
-   apps: App[]
 
-   mutateApps: () => void
 
-   userProfile: UserProfileResponse
 
-   mutateUserProfile: () => void
 
-   pageContainerRef: React.RefObject<HTMLDivElement>
 
-   langeniusVersionInfo: LangGeniusVersionResponse
 
-   useSelector: typeof useSelector
 
- }
 
- const initialLangeniusVersionInfo = {
 
-   current_env: '',
 
-   current_version: '',
 
-   latest_version: '',
 
-   release_date: '',
 
-   release_notes: '',
 
-   version: '',
 
-   can_auto_update: false,
 
- }
 
- const AppContext = createContext<AppContextValue>({
 
-   apps: [],
 
-   mutateApps: () => { },
 
-   userProfile: {
 
-     id: '',
 
-     name: '',
 
-     email: '',
 
-   },
 
-   mutateUserProfile: () => { },
 
-   pageContainerRef: createRef(),
 
-   langeniusVersionInfo: initialLangeniusVersionInfo,
 
-   useSelector,
 
- })
 
- export function useSelector<T>(selector: (value: AppContextValue) => T): T {
 
-   return useContextSelector(AppContext, selector)
 
- }
 
- export type AppContextProviderProps = {
 
-   children: ReactNode
 
- }
 
- export const AppContextProvider: FC<AppContextProviderProps> = ({ children }) => {
 
-   const pageContainerRef = useRef<HTMLDivElement>(null)
 
-   const { data: appList, mutate: mutateApps } = useSWR({ url: '/apps', params: { page: 1 } }, fetchAppList)
 
-   const { data: userProfileResponse, mutate: mutateUserProfile } = useSWR({ url: '/account/profile', params: {} }, fetchUserProfile)
 
-   const [userProfile, setUserProfile] = useState<UserProfileResponse>()
 
-   const [langeniusVersionInfo, setLangeniusVersionInfo] = useState<LangGeniusVersionResponse>(initialLangeniusVersionInfo)
 
-   const updateUserProfileAndVersion = async () => {
 
-     if (userProfileResponse && !userProfileResponse.bodyUsed) {
 
-       const result = await userProfileResponse.json()
 
-       setUserProfile(result)
 
-       const current_version = userProfileResponse.headers.get('x-version')
 
-       const current_env = userProfileResponse.headers.get('x-env')
 
-       const versionData = await fetchLanggeniusVersion({ url: '/version', params: { current_version } })
 
-       setLangeniusVersionInfo({ ...versionData, current_version, latest_version: versionData.version, current_env })
 
-     }
 
-   }
 
-   useEffect(() => {
 
-     updateUserProfileAndVersion()
 
-   }, [userProfileResponse])
 
-   if (!appList || !userProfile)
 
-     return <Loading type='app' />
 
-   return (
 
-     <AppContext.Provider value={{ apps: appList.data, mutateApps, userProfile, mutateUserProfile, pageContainerRef, langeniusVersionInfo, useSelector }}>
 
-       <div ref={pageContainerRef} className='relative flex flex-col h-full overflow-auto bg-gray-100'>
 
-         {children}
 
-       </div>
 
-     </AppContext.Provider>
 
-   )
 
- }
 
- export const useAppContext = () => useContext(AppContext)
 
- export default AppContext
 
 
  |