| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | 
                        - 'use client'
 - 
 - import type { ChatConfig } from '@/app/components/base/chat/types'
 - import Loading from '@/app/components/base/loading'
 - import { checkOrSetAccessToken } from '@/app/components/share/utils'
 - import { AccessMode } from '@/models/access-control'
 - import type { AppData, AppMeta } from '@/models/share'
 - import { useGetWebAppAccessModeByCode } from '@/service/use-share'
 - import { usePathname, useSearchParams } from 'next/navigation'
 - import type { FC, PropsWithChildren } from 'react'
 - import { useEffect } from 'react'
 - import { useState } from 'react'
 - import { create } from 'zustand'
 - 
 - type WebAppStore = {
 -   shareCode: string | null
 -   updateShareCode: (shareCode: string | null) => void
 -   appInfo: AppData | null
 -   updateAppInfo: (appInfo: AppData | null) => void
 -   appParams: ChatConfig | null
 -   updateAppParams: (appParams: ChatConfig | null) => void
 -   webAppAccessMode: AccessMode
 -   updateWebAppAccessMode: (accessMode: AccessMode) => void
 -   appMeta: AppMeta | null
 -   updateWebAppMeta: (appMeta: AppMeta | null) => void
 -   userCanAccessApp: boolean
 -   updateUserCanAccessApp: (canAccess: boolean) => void
 - }
 - 
 - export const useWebAppStore = create<WebAppStore>(set => ({
 -   shareCode: null,
 -   updateShareCode: (shareCode: string | null) => set(() => ({ shareCode })),
 -   appInfo: null,
 -   updateAppInfo: (appInfo: AppData | null) => set(() => ({ appInfo })),
 -   appParams: null,
 -   updateAppParams: (appParams: ChatConfig | null) => set(() => ({ appParams })),
 -   webAppAccessMode: AccessMode.SPECIFIC_GROUPS_MEMBERS,
 -   updateWebAppAccessMode: (accessMode: AccessMode) => set(() => ({ webAppAccessMode: accessMode })),
 -   appMeta: null,
 -   updateWebAppMeta: (appMeta: AppMeta | null) => set(() => ({ appMeta })),
 -   userCanAccessApp: false,
 -   updateUserCanAccessApp: (canAccess: boolean) => set(() => ({ userCanAccessApp: canAccess })),
 - }))
 - 
 - const getShareCodeFromRedirectUrl = (redirectUrl: string | null): string | null => {
 -   if (!redirectUrl || redirectUrl.length === 0)
 -     return null
 -   const url = new URL(`${window.location.origin}${decodeURIComponent(redirectUrl)}`)
 -   return url.pathname.split('/').pop() || null
 - }
 - const getShareCodeFromPathname = (pathname: string): string | null => {
 -   const code = pathname.split('/').pop() || null
 -   if (code === 'webapp-signin')
 -     return null
 -   return code
 - }
 - 
 - const WebAppStoreProvider: FC<PropsWithChildren> = ({ children }) => {
 -   const updateWebAppAccessMode = useWebAppStore(state => state.updateWebAppAccessMode)
 -   const updateShareCode = useWebAppStore(state => state.updateShareCode)
 -   const pathname = usePathname()
 -   const searchParams = useSearchParams()
 -   const redirectUrlParam = searchParams.get('redirect_url')
 -   const session = searchParams.get('session')
 -   const sysUserId = searchParams.get('sys.user_id')
 -   const [shareCode, setShareCode] = useState<string | null>(null)
 -   useEffect(() => {
 -     const shareCodeFromRedirect = getShareCodeFromRedirectUrl(redirectUrlParam)
 -     const shareCodeFromPathname = getShareCodeFromPathname(pathname)
 -     const newShareCode = shareCodeFromRedirect || shareCodeFromPathname
 -     setShareCode(newShareCode)
 -     updateShareCode(newShareCode)
 -   }, [pathname, redirectUrlParam, updateShareCode])
 -   const { isFetching, data: accessModeResult } = useGetWebAppAccessModeByCode(shareCode)
 -   const [isFetchingAccessToken, setIsFetchingAccessToken] = useState(true)
 -   useEffect(() => {
 -     if (accessModeResult?.accessMode) {
 -       updateWebAppAccessMode(accessModeResult.accessMode)
 -       if (accessModeResult?.accessMode === AccessMode.PUBLIC && session && sysUserId) {
 -         setIsFetchingAccessToken(true)
 -         checkOrSetAccessToken(shareCode).finally(() => {
 -           setIsFetchingAccessToken(false)
 -         })
 -       }
 -       else {
 -         setIsFetchingAccessToken(false)
 -       }
 -     }
 -   }, [accessModeResult, updateWebAppAccessMode, setIsFetchingAccessToken, shareCode, session, sysUserId])
 -   if (isFetching || isFetchingAccessToken) {
 -     return <div className='flex h-full w-full items-center justify-center'>
 -       <Loading />
 -     </div>
 -   }
 -   return (
 -     <>
 -       {children}
 -     </>
 -   )
 - }
 - export default WebAppStoreProvider
 
 
  |