| 
                        1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | 
                        - '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')
 - 
 -   // Compute shareCode directly
 -   const shareCode = getShareCodeFromRedirectUrl(redirectUrlParam) || getShareCodeFromPathname(pathname)
 -   updateShareCode(shareCode)
 - 
 -   const { isFetching, data: accessModeResult } = useGetWebAppAccessModeByCode(shareCode)
 -   const [isFetchingAccessToken, setIsFetchingAccessToken] = useState(false)
 - 
 -   useEffect(() => {
 -     if (accessModeResult?.accessMode) {
 -       updateWebAppAccessMode(accessModeResult.accessMode)
 -       if (accessModeResult.accessMode === AccessMode.PUBLIC) {
 -         setIsFetchingAccessToken(true)
 -         checkOrSetAccessToken(shareCode).finally(() => {
 -           setIsFetchingAccessToken(false)
 -         })
 -       }
 -       else {
 -         setIsFetchingAccessToken(false)
 -       }
 -     }
 -   }, [accessModeResult, updateWebAppAccessMode, shareCode])
 - 
 -   if (isFetching || isFetchingAccessToken) {
 -     return <div className='flex h-full w-full items-center justify-center'>
 -       <Loading />
 -     </div>
 -   }
 -   return (
 -     <>
 -       {children}
 -     </>
 -   )
 - }
 - export default WebAppStoreProvider
 
 
  |