- import { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
 - import { get, post } from './base'
 - import { getUserCanAccess } from './share'
 - import type { AccessControlAccount, AccessControlGroup, AccessMode, Subject } from '@/models/access-control'
 - import type { App } from '@/types/app'
 - import { useGlobalPublicStore } from '@/context/global-public-context'
 - 
 - const NAME_SPACE = 'access-control'
 - 
 - export const useAppWhiteListSubjects = (appId: string | undefined, enabled: boolean) => {
 -   return useQuery({
 -     queryKey: [NAME_SPACE, 'app-whitelist-subjects', appId],
 -     queryFn: () => get<{ groups: AccessControlGroup[]; members: AccessControlAccount[] }>(`/enterprise/webapp/app/subjects?appId=${appId}`),
 -     enabled: !!appId && enabled,
 -     staleTime: 0,
 -     gcTime: 0,
 -   })
 - }
 - 
 - type SearchResults = {
 -   currPage: number
 -   totalPages: number
 -   subjects: Subject[]
 -   hasMore: boolean
 - }
 - 
 - export const useSearchForWhiteListCandidates = (query: { keyword?: string; groupId?: AccessControlGroup['id']; resultsPerPage?: number }, enabled: boolean) => {
 -   return useInfiniteQuery({
 -     queryKey: [NAME_SPACE, 'app-whitelist-candidates', query],
 -     queryFn: ({ pageParam }) => {
 -       const params = new URLSearchParams()
 -       Object.keys(query).forEach((key) => {
 -         const typedKey = key as keyof typeof query
 -         if (query[typedKey])
 -           params.append(key, `${query[typedKey]}`)
 -       })
 -       params.append('pageNumber', `${pageParam}`)
 -       return get<SearchResults>(`/enterprise/webapp/app/subject/search?${new URLSearchParams(params).toString()}`)
 -     },
 -     initialPageParam: 1,
 -     getNextPageParam: (lastPage) => {
 -       if (lastPage.hasMore)
 -         return lastPage.currPage + 1
 -       return undefined
 -     },
 -     gcTime: 0,
 -     staleTime: 0,
 -     enabled,
 -   })
 - }
 - 
 - type UpdateAccessModeParams = {
 -   appId: App['id']
 -   subjects?: Pick<Subject, 'subjectId' | 'subjectType'>[]
 -   accessMode: AccessMode
 - }
 - 
 - export const useUpdateAccessMode = () => {
 -   const queryClient = useQueryClient()
 -   return useMutation({
 -     mutationKey: [NAME_SPACE, 'update-access-mode'],
 -     mutationFn: (params: UpdateAccessModeParams) => {
 -       return post('/enterprise/webapp/app/access-mode', { body: params })
 -     },
 -     onSuccess: () => {
 -       queryClient.invalidateQueries({
 -         queryKey: [NAME_SPACE, 'app-whitelist-subjects'],
 -       })
 -     },
 -   })
 - }
 - 
 - export const useGetUserCanAccessApp = ({ appId, isInstalledApp = true }: { appId?: string; isInstalledApp?: boolean; }) => {
 -   const systemFeatures = useGlobalPublicStore(s => s.systemFeatures)
 -   return useQuery({
 -     queryKey: [NAME_SPACE, 'user-can-access-app', appId],
 -     queryFn: () => {
 -       if (systemFeatures.webapp_auth.enabled)
 -         return getUserCanAccess(appId!, isInstalledApp)
 -       else
 -         return { result: true }
 -     },
 -     enabled: !!appId,
 -     staleTime: 0,
 -     gcTime: 0,
 -   })
 - }
 
 
  |