@planningcenter/chat-react-native 4.4.1-qa-staging.2 → 4.4.1-qa-staging.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/contexts/api_provider.d.ts.map +1 -1
- package/build/contexts/api_provider.js +24 -24
- package/build/contexts/api_provider.js.map +1 -1
- package/build/hooks/use_chat_permissions.d.ts +10 -2
- package/build/hooks/use_chat_permissions.d.ts.map +1 -1
- package/build/hooks/use_chat_permissions.js +8 -0
- package/build/hooks/use_chat_permissions.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/contexts/api_provider.test.tsx +50 -0
- package/src/contexts/api_provider.tsx +5 -8
- package/src/hooks/use_chat_permissions.ts +15 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_provider.d.ts","sourceRoot":"","sources":["../../src/contexts/api_provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAIZ,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAgCxC,eAAO,MAAM,eAAe,aAO1B,CAAA;AAEF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,2CA6BlD;
|
|
1
|
+
{"version":3,"file":"api_provider.d.ts","sourceRoot":"","sources":["../../src/contexts/api_provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAIZ,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAgCxC,eAAO,MAAM,eAAe,aAO1B,CAAA;AAEF,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,SAAS,2CA6BlD;AAcD,wBAAgB,eAAe,WAQ9B"}
|
|
@@ -3,9 +3,8 @@ import { focusManager, QueryClient, QueryClientProvider, usePrefetchQuery } from
|
|
|
3
3
|
import React, { useContext, useEffect, useRef } from 'react';
|
|
4
4
|
import { useApiClient } from '../hooks/use_api_client';
|
|
5
5
|
import { useAppState } from '../hooks/use_app_state';
|
|
6
|
-
import {
|
|
6
|
+
import { appGrantsQueryOptions } from '../hooks/use_chat_permissions';
|
|
7
7
|
import { featuresQueryOptions } from '../hooks/use_features';
|
|
8
|
-
import { getRequestQueryKey } from '../hooks/use_suspense_api';
|
|
9
8
|
import { emitAuthRefresh } from '../utils/auth_events';
|
|
10
9
|
import { ResponseError } from '../utils/response_error';
|
|
11
10
|
import { ChatContext } from './chat_context';
|
|
@@ -40,13 +39,14 @@ export const chatQueryClient = new QueryClient({
|
|
|
40
39
|
}
|
|
41
40
|
});
|
|
42
41
|
export function ApiProvider(t0) {
|
|
43
|
-
const $ = _c(
|
|
42
|
+
const $ = _c(14);
|
|
44
43
|
const {
|
|
45
44
|
children
|
|
46
45
|
} = t0;
|
|
47
46
|
const {
|
|
48
47
|
token,
|
|
49
|
-
env
|
|
48
|
+
env,
|
|
49
|
+
session
|
|
50
50
|
} = useContext(ChatContext);
|
|
51
51
|
let t1;
|
|
52
52
|
if ($[0] !== env || $[1] !== token) {
|
|
@@ -101,22 +101,24 @@ export function ApiProvider(t0) {
|
|
|
101
101
|
}
|
|
102
102
|
useEffect(t4, t5);
|
|
103
103
|
let t6;
|
|
104
|
-
if ($[9]
|
|
105
|
-
t6 = /*#__PURE__*/_jsx(PrefetchQueries, {});
|
|
106
|
-
$[9] =
|
|
104
|
+
if ($[9] !== session.isAuthenticated) {
|
|
105
|
+
t6 = session.isAuthenticated && /*#__PURE__*/_jsx(PrefetchQueries, {});
|
|
106
|
+
$[9] = session.isAuthenticated;
|
|
107
|
+
$[10] = t6;
|
|
107
108
|
} else {
|
|
108
|
-
t6 = $[
|
|
109
|
+
t6 = $[10];
|
|
109
110
|
}
|
|
110
111
|
let t7;
|
|
111
|
-
if ($[
|
|
112
|
+
if ($[11] !== children || $[12] !== t6) {
|
|
112
113
|
t7 = /*#__PURE__*/_jsxs(QueryClientProvider, {
|
|
113
114
|
client: chatQueryClient,
|
|
114
115
|
children: [t6, children]
|
|
115
116
|
});
|
|
116
|
-
$[
|
|
117
|
-
$[
|
|
117
|
+
$[11] = children;
|
|
118
|
+
$[12] = t6;
|
|
119
|
+
$[13] = t7;
|
|
118
120
|
} else {
|
|
119
|
-
t7 = $[
|
|
121
|
+
t7 = $[13];
|
|
120
122
|
}
|
|
121
123
|
return t7;
|
|
122
124
|
}
|
|
@@ -128,26 +130,24 @@ function _temp() {
|
|
|
128
130
|
return chatQueryClient.invalidateQueries();
|
|
129
131
|
}
|
|
130
132
|
const PrefetchQueries = () => {
|
|
131
|
-
const $ = _c(
|
|
133
|
+
const $ = _c(4);
|
|
132
134
|
const client = useApiClient();
|
|
133
135
|
let t0;
|
|
134
|
-
if ($[0]
|
|
135
|
-
t0 =
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
};
|
|
139
|
-
$[0] = t0;
|
|
136
|
+
if ($[0] !== client) {
|
|
137
|
+
t0 = appGrantsQueryOptions(client);
|
|
138
|
+
$[0] = client;
|
|
139
|
+
$[1] = t0;
|
|
140
140
|
} else {
|
|
141
|
-
t0 = $[
|
|
141
|
+
t0 = $[1];
|
|
142
142
|
}
|
|
143
143
|
usePrefetchQuery(t0);
|
|
144
144
|
let t1;
|
|
145
|
-
if ($[
|
|
145
|
+
if ($[2] !== client) {
|
|
146
146
|
t1 = featuresQueryOptions(client);
|
|
147
|
-
$[
|
|
148
|
-
$[
|
|
147
|
+
$[2] = client;
|
|
148
|
+
$[3] = t1;
|
|
149
149
|
} else {
|
|
150
|
-
t1 = $[
|
|
150
|
+
t1 = $[3];
|
|
151
151
|
}
|
|
152
152
|
usePrefetchQuery(t1);
|
|
153
153
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api_provider.js","names":["focusManager","QueryClient","QueryClientProvider","usePrefetchQuery","React","useContext","useEffect","useRef","useApiClient","useAppState","
|
|
1
|
+
{"version":3,"file":"api_provider.js","names":["focusManager","QueryClient","QueryClientProvider","usePrefetchQuery","React","useContext","useEffect","useRef","useApiClient","useAppState","appGrantsQueryOptions","featuresQueryOptions","emitAuthRefresh","ResponseError","ChatContext","jsx","_jsx","jsxs","_jsxs","apiClient","defaultQueryFn","queryKey","Error","url","data","headers","app","get","configuredRetry","failureCount","error","is429Error","status","chatQueryClient","defaultOptions","queries","queryFn","retry","ApiProvider","t0","$","_c","children","token","env","session","t1","sessionChanged","useSessionChanged","client","t2","t3","isFetching","cancelQueries","then","_temp","clear","t4","t5","t6","isAuthenticated","PrefetchQueries","t7","invalidateQueries","useFocusManager","appState","setFocused","value","newToken","newEnv","prevToken","prevEnv","usePrevious","isInitialLogin","tokenChanged","Boolean","access_token","envChanged","ref","current"],"sources":["../../src/contexts/api_provider.tsx"],"sourcesContent":["import {\n focusManager,\n QueryClient,\n QueryClientProvider,\n QueryKey,\n usePrefetchQuery,\n} from '@tanstack/react-query'\nimport React, { useContext, useEffect, useRef } from 'react'\nimport { ViewProps } from 'react-native'\nimport { ApiClient, useApiClient } from '../hooks/use_api_client'\nimport { useAppState } from '../hooks/use_app_state'\nimport { appGrantsQueryOptions } from '../hooks/use_chat_permissions'\nimport { featuresQueryOptions } from '../hooks/use_features'\nimport { RequestQueryKey } from '../hooks/use_suspense_api'\nimport { emitAuthRefresh } from '../utils/auth_events'\nimport { ResponseError } from '../utils/response_error'\nimport { ChatContext, ChatContextValue } from './chat_context'\n\nlet apiClient: ApiClient | undefined\n\nconst defaultQueryFn = ({ queryKey }: { queryKey: QueryKey }) => {\n if (!apiClient) {\n throw new Error('No token present')\n }\n\n const [url, data, headers, app = 'chat'] = queryKey as RequestQueryKey\n\n return apiClient[app].get({ url, data, headers })\n}\n\nconst configuredRetry = (failureCount: number, error: any) => {\n if (is429Error(error)) return false\n\n return failureCount < 3\n}\n\nconst is429Error = (error: any): boolean => {\n return error instanceof ResponseError && error.status === 429\n}\n\nexport const chatQueryClient = new QueryClient({\n defaultOptions: {\n queries: {\n queryFn: defaultQueryFn,\n retry: configuredRetry,\n },\n },\n})\n\nexport function ApiProvider({ children }: ViewProps) {\n const { token, env, session } = useContext(ChatContext)\n const sessionChanged = useSessionChanged({ token, env })\n\n const client = useApiClient()\n\n useEffect(() => {\n if (!sessionChanged) return\n\n emitAuthRefresh()\n\n if (chatQueryClient.isFetching()) {\n chatQueryClient.cancelQueries().then(() => chatQueryClient.invalidateQueries())\n return\n }\n\n chatQueryClient.clear()\n }, [sessionChanged])\n\n useEffect(() => {\n apiClient = client\n }, [client])\n\n return (\n <QueryClientProvider client={chatQueryClient}>\n {session.isAuthenticated && <PrefetchQueries />}\n {children}\n </QueryClientProvider>\n )\n}\n\n// Component to prefetch queries when the app is focused\n// This needs to live in the provider so that it can access the api client\n// and the chat query client\nconst PrefetchQueries = () => {\n const client = useApiClient()\n\n usePrefetchQuery(appGrantsQueryOptions(client))\n usePrefetchQuery(featuresQueryOptions(client))\n\n return null\n}\n\nexport function useFocusManager() {\n const appState = useAppState()\n\n useEffect(() => {\n focusManager.setFocused(appState === 'active')\n }, [appState])\n\n return appState\n}\n\nfunction useSessionChanged(value: Pick<ChatContextValue, 'token' | 'env'>): boolean {\n const { token: newToken, env: newEnv } = value\n const { token: prevToken, env: prevEnv } = usePrevious<typeof value>(value)\n\n const isInitialLogin = !prevToken && !!newToken\n if (isInitialLogin) return false\n\n const tokenChanged = Boolean(\n prevToken?.access_token && newToken?.access_token !== prevToken?.access_token\n )\n\n const envChanged = Boolean(prevEnv && newEnv !== prevEnv)\n\n return tokenChanged || envChanged\n}\n\nfunction usePrevious<T>(value: T): T {\n const ref = useRef<T>(value)\n\n useEffect(() => {\n ref.current = value\n }, [value])\n\n return ref.current\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AppGrantsResource } from '../types';
|
|
2
|
-
import { App } from './use_api_client';
|
|
1
|
+
import { ApiCollection, AppGrantsResource } from '../types';
|
|
2
|
+
import { ApiClient, App } from './use_api_client';
|
|
3
3
|
export declare const appGrantsRequestArgs: {
|
|
4
4
|
url: string;
|
|
5
5
|
data: {
|
|
@@ -9,6 +9,14 @@ export declare const appGrantsRequestArgs: {
|
|
|
9
9
|
};
|
|
10
10
|
app: App;
|
|
11
11
|
};
|
|
12
|
+
export declare const appGrantsQueryOptions: (apiClient: ApiClient) => import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<ApiCollection<AppGrantsResource>, Error, ApiCollection<AppGrantsResource>, import("./use_suspense_api").RequestQueryKey>, "queryFn"> & {
|
|
13
|
+
queryFn?: import("@tanstack/query-core").QueryFunction<ApiCollection<AppGrantsResource>, import("./use_suspense_api").RequestQueryKey, never> | undefined;
|
|
14
|
+
} & {
|
|
15
|
+
queryKey: import("./use_suspense_api").RequestQueryKey & {
|
|
16
|
+
[dataTagSymbol]: ApiCollection<AppGrantsResource>;
|
|
17
|
+
[dataTagErrorSymbol]: Error;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
12
20
|
export declare function useAppGrants(): {
|
|
13
21
|
error: import("..").ResponseError;
|
|
14
22
|
isError: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_chat_permissions.d.ts","sourceRoot":"","sources":["../../src/hooks/use_chat_permissions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use_chat_permissions.d.ts","sourceRoot":"","sources":["../../src/hooks/use_chat_permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAI3D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGjD,eAAO,MAAM,oBAAoB;;;;;;;SAOhB,GAAG;CACnB,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,WAAW,SAAS;;;;;;;CAQtD,CAAA;AAEJ,wBAAgB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI3B;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAInD"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { c as _c } from "react/compiler-runtime";
|
|
2
|
+
import { queryOptions } from '@tanstack/react-query';
|
|
3
|
+
import { throwResponseError } from '../utils/response_error';
|
|
2
4
|
import { FIVE_MINUTES } from '../utils/time';
|
|
3
5
|
import { useApiGet } from './use_api';
|
|
6
|
+
import { getRequestQueryKey } from './use_suspense_api';
|
|
4
7
|
export const appGrantsRequestArgs = {
|
|
5
8
|
url: '/me/app_grants',
|
|
6
9
|
data: {
|
|
@@ -10,6 +13,11 @@ export const appGrantsRequestArgs = {
|
|
|
10
13
|
},
|
|
11
14
|
app: 'chat'
|
|
12
15
|
};
|
|
16
|
+
export const appGrantsQueryOptions = apiClient => queryOptions({
|
|
17
|
+
queryKey: getRequestQueryKey(appGrantsRequestArgs),
|
|
18
|
+
queryFn: () => apiClient[appGrantsRequestArgs.app].get(appGrantsRequestArgs).catch(throwResponseError),
|
|
19
|
+
staleTime: FIVE_MINUTES
|
|
20
|
+
});
|
|
13
21
|
export function useAppGrants() {
|
|
14
22
|
const $ = _c(1);
|
|
15
23
|
let t0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_chat_permissions.js","names":["FIVE_MINUTES","useApiGet","appGrantsRequestArgs","url","data","fields","AppGrant","app","useAppGrants","$","_c","t0","Symbol","for","
|
|
1
|
+
{"version":3,"file":"use_chat_permissions.js","names":["queryOptions","throwResponseError","FIVE_MINUTES","useApiGet","getRequestQueryKey","appGrantsRequestArgs","url","data","fields","AppGrant","app","appGrantsQueryOptions","apiClient","queryKey","queryFn","get","catch","staleTime","useAppGrants","$","_c","t0","Symbol","for","useCanCreateConversations","t1","undefined","appGrants","t2","some","_temp","appGrant","createConversations"],"sources":["../../src/hooks/use_chat_permissions.ts"],"sourcesContent":["import { queryOptions } from '@tanstack/react-query'\nimport { ApiCollection, AppGrantsResource } from '../types'\nimport { throwResponseError } from '../utils/response_error'\nimport { FIVE_MINUTES } from '../utils/time'\nimport { useApiGet } from './use_api'\nimport { ApiClient, App } from './use_api_client'\nimport { getRequestQueryKey } from './use_suspense_api'\n\nexport const appGrantsRequestArgs = {\n url: '/me/app_grants',\n data: {\n fields: {\n AppGrant: ['create_conversations', 'app_name'],\n },\n },\n app: 'chat' as App,\n}\n\nexport const appGrantsQueryOptions = (apiClient: ApiClient) =>\n queryOptions({\n queryKey: getRequestQueryKey(appGrantsRequestArgs),\n queryFn: (): Promise<ApiCollection<AppGrantsResource>> =>\n apiClient[appGrantsRequestArgs.app]\n .get<ApiCollection<AppGrantsResource>>(appGrantsRequestArgs)\n .catch(throwResponseError),\n staleTime: FIVE_MINUTES,\n })\n\nexport function useAppGrants() {\n return useApiGet<AppGrantsResource[]>(appGrantsRequestArgs, {\n staleTime: FIVE_MINUTES,\n })\n}\n\nexport function useCanCreateConversations(): boolean {\n const { data: appGrants = [] } = useAppGrants()\n\n return appGrants.some(appGrant => appGrant.createConversations)\n}\n"],"mappings":";AAAA,SAASA,YAAY,QAAQ,uBAAuB;AAEpD,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,YAAY,QAAQ,eAAe;AAC5C,SAASC,SAAS,QAAQ,WAAW;AAErC,SAASC,kBAAkB,QAAQ,oBAAoB;AAEvD,OAAO,MAAMC,oBAAoB,GAAG;EAClCC,GAAG,EAAE,gBAAgB;EACrBC,IAAI,EAAE;IACJC,MAAM,EAAE;MACNC,QAAQ,EAAE,CAAC,sBAAsB,EAAE,UAAU;IAC/C;EACF,CAAC;EACDC,GAAG,EAAE;AACP,CAAC;AAED,OAAO,MAAMC,qBAAqB,GAAIC,SAAoB,IACxDZ,YAAY,CAAC;EACXa,QAAQ,EAAET,kBAAkB,CAACC,oBAAoB,CAAC;EAClDS,OAAO,EAAEA,CAAA,KACPF,SAAS,CAACP,oBAAoB,CAACK,GAAG,CAAC,CAChCK,GAAG,CAAmCV,oBAAoB,CAAC,CAC3DW,KAAK,CAACf,kBAAkB,CAAC;EAC9BgB,SAAS,EAAEf;AACb,CAAC,CAAC;AAEJ,OAAO,SAAAgB,aAAA;EAAA,MAAAC,CAAA,GAAAC,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAF,CAAA,QAAAG,MAAA,CAAAC,GAAA;IACuDF,EAAA;MAAAJ,SAAA,EAC/Cf;IACb,CAAC;IAAAiB,CAAA,MAAAE,EAAA;EAAA;IAAAA,EAAA,GAAAF,CAAA;EAAA;EAAA,OAFMhB,SAAS,CAAsBE,oBAAoB,EAAEgB,EAE3D,CAAC;AAAA;AAGJ,OAAO,SAAAG,0BAAA;EAAA,MAAAL,CAAA,GAAAC,EAAA;EACL;IAAAb,IAAA,EAAAc;EAAA,IAAiCH,YAAY,CAAC,CAAC;EAAA,IAAAO,EAAA;EAAA,IAAAN,CAAA,QAAAE,EAAA;IAAjCI,EAAA,GAAAJ,EAAc,KAAdK,SAAc,GAAd,EAAc,GAAdL,EAAc;IAAAF,CAAA,MAAAE,EAAA;IAAAF,CAAA,MAAAM,EAAA;EAAA;IAAAA,EAAA,GAAAN,CAAA;EAAA;EAAd,MAAAQ,SAAA,GAAAF,EAAc;EAAA,IAAAG,EAAA;EAAA,IAAAT,CAAA,QAAAQ,SAAA;IAErBC,EAAA,GAAAD,SAAS,CAAAE,IAAK,CAACC,KAAwC,CAAC;IAAAX,CAAA,MAAAQ,SAAA;IAAAR,CAAA,MAAAS,EAAA;EAAA;IAAAA,EAAA,GAAAT,CAAA;EAAA;EAAA,OAAxDS,EAAwD;AAAA;AAH1D,SAAAE,MAAAC,QAAA;EAAA,OAG6BA,QAAQ,CAAAC,mBAAoB;AAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "4.4.1-qa-staging.
|
|
3
|
+
"version": "4.4.1-qa-staging.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@fortawesome/fontawesome-svg-core": "^7.2.0",
|
|
35
35
|
"@fortawesome/react-native-fontawesome": "^0.3.2",
|
|
36
|
-
"@planningcenter/emoji-keyboard": "4.4.1-qa-staging.
|
|
36
|
+
"@planningcenter/emoji-keyboard": "4.4.1-qa-staging.3",
|
|
37
37
|
"lodash-inflection": "^1.5.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"sf-symbols-typescript": "^2.2.0",
|
|
85
85
|
"typescript": "~6.0.3"
|
|
86
86
|
},
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "5b1b37d9943e2726aacabdd5a59add02d4dfb04c"
|
|
88
88
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { render } from '@testing-library/react-native'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import { ApiProvider, chatQueryClient } from '../../contexts/api_provider'
|
|
4
|
+
import { ChatContext, ChatContextValue } from '../../contexts/chat_context'
|
|
5
|
+
import { ApiClient, useApiClient } from '../../hooks/use_api_client'
|
|
6
|
+
import { Session } from '../../utils'
|
|
7
|
+
|
|
8
|
+
jest.mock('../../hooks/use_api_client')
|
|
9
|
+
|
|
10
|
+
const mockedUseApiClient = useApiClient as jest.MockedFunction<typeof useApiClient>
|
|
11
|
+
|
|
12
|
+
let get: jest.Mock
|
|
13
|
+
|
|
14
|
+
const renderApiProvider = ({ token }: { token?: { access_token: string } } = {}) => {
|
|
15
|
+
const session = new Session({ token })
|
|
16
|
+
|
|
17
|
+
return render(
|
|
18
|
+
<ChatContext.Provider value={{ session, token } as unknown as ChatContextValue}>
|
|
19
|
+
<ApiProvider>{null}</ApiProvider>
|
|
20
|
+
</ChatContext.Provider>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
jest.useFakeTimers()
|
|
26
|
+
chatQueryClient.clear()
|
|
27
|
+
get = jest.fn().mockResolvedValue({ data: [] })
|
|
28
|
+
mockedUseApiClient.mockReturnValue({ chat: { get } } as unknown as ApiClient)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
afterEach(() => {
|
|
32
|
+
chatQueryClient.clear()
|
|
33
|
+
jest.clearAllMocks()
|
|
34
|
+
jest.useRealTimers()
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
describe('ApiProvider', () => {
|
|
38
|
+
it('requests app grants on the first attempt without waiting for a retry', () => {
|
|
39
|
+
renderApiProvider({ token: { access_token: 'a-real-token' } })
|
|
40
|
+
|
|
41
|
+
expect(get).toHaveBeenCalledWith(expect.objectContaining({ url: '/me/app_grants' }))
|
|
42
|
+
expect(get.mock.calls.filter(([args]) => args.url === '/me/app_grants')).toHaveLength(1)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('does not prefetch anything without a token', () => {
|
|
46
|
+
renderApiProvider()
|
|
47
|
+
|
|
48
|
+
expect(get).not.toHaveBeenCalled()
|
|
49
|
+
})
|
|
50
|
+
})
|
|
@@ -9,9 +9,9 @@ import React, { useContext, useEffect, useRef } from 'react'
|
|
|
9
9
|
import { ViewProps } from 'react-native'
|
|
10
10
|
import { ApiClient, useApiClient } from '../hooks/use_api_client'
|
|
11
11
|
import { useAppState } from '../hooks/use_app_state'
|
|
12
|
-
import {
|
|
12
|
+
import { appGrantsQueryOptions } from '../hooks/use_chat_permissions'
|
|
13
13
|
import { featuresQueryOptions } from '../hooks/use_features'
|
|
14
|
-
import {
|
|
14
|
+
import { RequestQueryKey } from '../hooks/use_suspense_api'
|
|
15
15
|
import { emitAuthRefresh } from '../utils/auth_events'
|
|
16
16
|
import { ResponseError } from '../utils/response_error'
|
|
17
17
|
import { ChatContext, ChatContextValue } from './chat_context'
|
|
@@ -48,7 +48,7 @@ export const chatQueryClient = new QueryClient({
|
|
|
48
48
|
})
|
|
49
49
|
|
|
50
50
|
export function ApiProvider({ children }: ViewProps) {
|
|
51
|
-
const { token, env } = useContext(ChatContext)
|
|
51
|
+
const { token, env, session } = useContext(ChatContext)
|
|
52
52
|
const sessionChanged = useSessionChanged({ token, env })
|
|
53
53
|
|
|
54
54
|
const client = useApiClient()
|
|
@@ -72,7 +72,7 @@ export function ApiProvider({ children }: ViewProps) {
|
|
|
72
72
|
|
|
73
73
|
return (
|
|
74
74
|
<QueryClientProvider client={chatQueryClient}>
|
|
75
|
-
<PrefetchQueries />
|
|
75
|
+
{session.isAuthenticated && <PrefetchQueries />}
|
|
76
76
|
{children}
|
|
77
77
|
</QueryClientProvider>
|
|
78
78
|
)
|
|
@@ -84,10 +84,7 @@ export function ApiProvider({ children }: ViewProps) {
|
|
|
84
84
|
const PrefetchQueries = () => {
|
|
85
85
|
const client = useApiClient()
|
|
86
86
|
|
|
87
|
-
usePrefetchQuery(
|
|
88
|
-
queryKey: getRequestQueryKey(appGrantsRequestArgs),
|
|
89
|
-
queryFn: defaultQueryFn,
|
|
90
|
-
})
|
|
87
|
+
usePrefetchQuery(appGrantsQueryOptions(client))
|
|
91
88
|
usePrefetchQuery(featuresQueryOptions(client))
|
|
92
89
|
|
|
93
90
|
return null
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { queryOptions } from '@tanstack/react-query'
|
|
2
|
+
import { ApiCollection, AppGrantsResource } from '../types'
|
|
3
|
+
import { throwResponseError } from '../utils/response_error'
|
|
2
4
|
import { FIVE_MINUTES } from '../utils/time'
|
|
3
5
|
import { useApiGet } from './use_api'
|
|
4
|
-
import { App } from './use_api_client'
|
|
6
|
+
import { ApiClient, App } from './use_api_client'
|
|
7
|
+
import { getRequestQueryKey } from './use_suspense_api'
|
|
5
8
|
|
|
6
9
|
export const appGrantsRequestArgs = {
|
|
7
10
|
url: '/me/app_grants',
|
|
@@ -13,6 +16,16 @@ export const appGrantsRequestArgs = {
|
|
|
13
16
|
app: 'chat' as App,
|
|
14
17
|
}
|
|
15
18
|
|
|
19
|
+
export const appGrantsQueryOptions = (apiClient: ApiClient) =>
|
|
20
|
+
queryOptions({
|
|
21
|
+
queryKey: getRequestQueryKey(appGrantsRequestArgs),
|
|
22
|
+
queryFn: (): Promise<ApiCollection<AppGrantsResource>> =>
|
|
23
|
+
apiClient[appGrantsRequestArgs.app]
|
|
24
|
+
.get<ApiCollection<AppGrantsResource>>(appGrantsRequestArgs)
|
|
25
|
+
.catch(throwResponseError),
|
|
26
|
+
staleTime: FIVE_MINUTES,
|
|
27
|
+
})
|
|
28
|
+
|
|
16
29
|
export function useAppGrants() {
|
|
17
30
|
return useApiGet<AppGrantsResource[]>(appGrantsRequestArgs, {
|
|
18
31
|
staleTime: FIVE_MINUTES,
|