| 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
|