@ -2,12 +2,11 @@ import { useDebouncedCallback } from '@rocket.chat/fuselage-hooks';
import { usePermission , useStream } from '@rocket.chat/ui-contexts' ;
import { useQuery , useQueryClient } from '@tanstack/react-query' ;
import type { ReactNode } from 'react' ;
import React , { useEffect } from 'react' ;
import React , { useEffect , useState } from 'react' ;
import { AppClientOrchestratorInstance } from '../../apps/orchestrator' ;
import { AppsContext } from '../../contexts/AppsContext' ;
import { useIsEnterprise } from '../../hooks/useIsEnterprise' ;
import { useInvalidateLicense } from '../../hooks/useLicense' ;
import { useInvalidateLicense , useLicense } from '../../hooks/useLicense' ;
import type { AsyncState } from '../../lib/asyncState' ;
import { AsyncStatePhase } from '../../lib/asyncState' ;
import { useInvalidateAppsCountQueryCallback } from '../../views/marketplace/hooks/useAppsCountQuery' ;
@ -17,15 +16,24 @@ import { storeQueryFunction } from './storeQueryFunction';
const getAppState = (
loading : boolean ,
apps : App [ ] | undefined ,
) : Omit <
AsyncState < {
apps : App [ ] ;
} > ,
'error'
> = > ( {
phase : loading ? AsyncStatePhase.LOADING : AsyncStatePhase.RESOLVED ,
value : { apps : apps || [ ] } ,
} ) ;
error? : Error ,
) : AsyncState < {
apps : App [ ] ;
} > = > {
if ( error ) {
return {
phase : AsyncStatePhase.REJECTED ,
value : undefined ,
error ,
} ;
}
return {
phase : loading ? AsyncStatePhase.LOADING : AsyncStatePhase.RESOLVED ,
value : { apps : apps || [ ] } ,
error ,
} ;
} ;
type AppsProviderProps = {
children : ReactNode ;
@ -36,8 +44,10 @@ const AppsProvider = ({ children }: AppsProviderProps) => {
const queryClient = useQueryClient ( ) ;
const { data } = useIsEnterprise ( ) ;
const isEnterprise = ! ! data ? . isEnterprise ;
const { isLoading : isLicenseInformationLoading , data : { license } = { } } = useLicense ( { loadValues : true } ) ;
const isEnterprise = isLicenseInformationLoading ? undefined : ! ! license ;
const [ marketplaceError , setMarketplaceError ] = useState < Error > ( ) ;
const invalidateAppsCountQuery = useInvalidateAppsCountQueryCallback ( ) ;
const invalidateLicenseQuery = useInvalidateLicense ( ) ;
@ -66,10 +76,14 @@ const AppsProvider = ({ children }: AppsProviderProps) => {
const marketplace = useQuery (
[ 'marketplace' , 'apps-marketplace' , isAdminUser ] ,
( ) = > {
const result = AppClientOrchestratorInstance . getAppsFromMarketplace ( isAdminUser ) ;
async ( ) = > {
const result = await AppClientOrchestratorInstance . getAppsFromMarketplace ( isAdminUser ) ;
queryClient . invalidateQueries ( [ 'marketplace' , 'apps-stored' ] ) ;
return result ;
if ( result . error && typeof result . error === 'string' ) {
setMarketplaceError ( new Error ( result . error ) ) ;
return [ ] ;
}
return result . apps ;
} ,
{
staleTime : Infinity ,
@ -95,21 +109,25 @@ const AppsProvider = ({ children }: AppsProviderProps) => {
} ,
) ;
const store = useQuery ( [ 'marketplace' , 'apps-stored' , instance . data , marketplace . data ] , ( ) = > storeQueryFunction ( marketplace , instance ) , {
enabled : marketplace.isFetched && instance . isFetched ,
keepPreviousData : true ,
} ) ;
const { isLoading : isMarketplaceDataLoading , data : marketplaceData } = useQuery (
[ 'marketplace' , 'apps-stored' , instance . data , marketplace . data ] ,
( ) = > storeQueryFunction ( marketplace , instance ) ,
{
enabled : marketplace.isFetched && instance . isFetched ,
keepPreviousData : true ,
} ,
) ;
const [ marketplaceAppsData , installedAppsData , privateAppsData ] = store . data || [ ] ;
const { isLoading } = store ;
const [ marketplaceAppsData , installedAppsData , privateAppsData ] = marketplaceData || [ ] ;
return (
< AppsContext.Provider
children = { children }
value = { {
installedApps : getAppState ( isLoading , installedAppsData ) ,
marketplaceApps : getAppState ( isLoading , marketplaceAppsData ) ,
privateApps : getAppState ( isLoading , privateAppsData ) ,
installedApps : getAppState ( isMarketplaceDataLoading , installedAppsData ) ,
marketplaceApps : getAppState ( isMarketplaceDataLoading , marketplaceAppsData , marketplaceError ) ,
privateApps : getAppState ( isMarketplaceDataLoading , privateAppsData ) ,
reload : async ( ) = > {
await Promise . all ( [ queryClient . invalidateQueries ( [ 'marketplace' ] ) ] ) ;
} ,