@planningcenter/chat-react-native 3.2.0-rc.15 → 3.2.0-rc.16
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/chat_context.d.ts +4 -4
- package/build/contexts/chat_context.d.ts.map +1 -1
- package/build/contexts/chat_context.js +3 -3
- package/build/contexts/chat_context.js.map +1 -1
- package/build/hooks/use_api_client.d.ts.map +1 -1
- package/build/hooks/use_api_client.js +5 -3
- package/build/hooks/use_api_client.js.map +1 -1
- package/build/hooks/use_jolt.d.ts.map +1 -1
- package/build/hooks/use_jolt.js +7 -4
- package/build/hooks/use_jolt.js.map +1 -1
- package/build/types/resources/oauth_token.d.ts +4 -4
- package/build/types/resources/oauth_token.d.ts.map +1 -1
- package/build/types/resources/oauth_token.js.map +1 -1
- package/build/utils/client/client.d.ts +4 -8
- package/build/utils/client/client.d.ts.map +1 -1
- package/build/utils/client/client.js +10 -9
- package/build/utils/client/client.js.map +1 -1
- package/build/utils/session.d.ts +6 -2
- package/build/utils/session.d.ts.map +1 -1
- package/build/utils/session.js +6 -1
- package/build/utils/session.js.map +1 -1
- package/build/utils/uri.d.ts +10 -2
- package/build/utils/uri.d.ts.map +1 -1
- package/build/utils/uri.js +24 -6
- package/build/utils/uri.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/hooks/useTheme.tsx +1 -1
- package/src/__tests__/{client.ts → utils/client.ts} +7 -115
- package/src/__tests__/{session.ts → utils/session.ts} +4 -4
- package/src/__tests__/utils/uri.ts +107 -0
- package/src/contexts/chat_context.tsx +7 -7
- package/src/hooks/use_api_client.ts +7 -3
- package/src/hooks/use_jolt.ts +9 -4
- package/src/types/resources/oauth_token.ts +4 -4
- package/src/utils/client/client.ts +13 -13
- package/src/utils/session.ts +10 -4
- package/src/utils/uri.ts +30 -6
|
@@ -4,12 +4,12 @@ import { DeepPartial } from '../types';
|
|
|
4
4
|
import { ENV, PartialToken, ResponseError, Session } from '../utils';
|
|
5
5
|
import { ChatTheme, DefaultTheme } from '../utils/theme';
|
|
6
6
|
export type ChatContextValue = {
|
|
7
|
-
token?: PartialToken;
|
|
8
|
-
onUnauthorizedResponse: (_response: ResponseError) => void;
|
|
9
|
-
theme: ChatTheme;
|
|
10
7
|
env?: ENV;
|
|
11
|
-
session: Session;
|
|
12
8
|
giphyApiKey?: string;
|
|
9
|
+
onUnauthorizedResponse: (_response: ResponseError) => void;
|
|
10
|
+
session: Session;
|
|
11
|
+
theme: ChatTheme;
|
|
12
|
+
token?: PartialToken;
|
|
13
13
|
};
|
|
14
14
|
export interface ChatProviderProps extends Omit<ChatContextValue, 'client' | 'theme' | 'session'> {
|
|
15
15
|
theme: CreateChatThemeProps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_context.d.ts","sourceRoot":"","sources":["../../src/contexts/chat_context.tsx"],"names":[],"mappings":"AACA,OAAO,KAAiC,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,SAAS,EAAgB,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,
|
|
1
|
+
{"version":3,"file":"chat_context.d.ts","sourceRoot":"","sources":["../../src/contexts/chat_context.tsx"],"names":[],"mappings":"AACA,OAAO,KAAiC,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAE,SAAS,EAAgB,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,sBAAsB,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAA;IAC1D,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB,CAAA;AAED,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IAC/F,KAAK,EAAE,oBAAoB,CAAA;CAC5B;AAED,eAAO,MAAM,WAAW,iCAOtB,CAAA;AAEF,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;IAAE,QAAQ,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,qBAe5F;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;IACjC,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B;AAED,eAAO,MAAM,cAAc,wBAE1B,CAAA;AAED,eAAO,MAAM,kBAAkB,yDAG5B,oBAAoB,KAAG,SAYzB,CAAA"}
|
|
@@ -4,12 +4,12 @@ import { useColorScheme } from 'react-native';
|
|
|
4
4
|
import { Session } from '../utils';
|
|
5
5
|
import { defaultTheme } from '../utils/theme';
|
|
6
6
|
export const ChatContext = createContext({
|
|
7
|
-
theme: defaultTheme('light'),
|
|
8
|
-
token: undefined,
|
|
9
7
|
env: undefined,
|
|
8
|
+
giphyApiKey: undefined,
|
|
10
9
|
onUnauthorizedResponse: () => { },
|
|
11
10
|
session: new Session(),
|
|
12
|
-
|
|
11
|
+
theme: defaultTheme('light'),
|
|
12
|
+
token: undefined,
|
|
13
13
|
});
|
|
14
14
|
export function ChatProvider({ children, value }) {
|
|
15
15
|
const { env, token, onUnauthorizedResponse, giphyApiKey } = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_context.js","sourceRoot":"","sources":["../../src/contexts/chat_context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAmB,cAAc,EAAE,MAAM,cAAc,CAAA;AAE9D,OAAO,EAAoC,OAAO,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAa,YAAY,EAAgB,MAAM,gBAAgB,CAAA;AAetE,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAmB;IACzD,
|
|
1
|
+
{"version":3,"file":"chat_context.js","sourceRoot":"","sources":["../../src/contexts/chat_context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAmB,cAAc,EAAE,MAAM,cAAc,CAAA;AAE9D,OAAO,EAAoC,OAAO,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EAAa,YAAY,EAAgB,MAAM,gBAAgB,CAAA;AAetE,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAmB;IACzD,GAAG,EAAE,SAAS;IACd,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,GAAG,EAAE,GAAE,CAAC;IAChC,OAAO,EAAE,IAAI,OAAO,EAAE;IACtB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;IAC5B,KAAK,EAAE,SAAS;CACjB,CAAC,CAAA;AAEF,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,KAAK,EAA+C;IAC3F,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,GAAG,KAAK,CAAA;IACjE,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAExE,MAAM,YAAY,GAAqB;QACrC,GAAG;QACH,KAAK;QACL,sBAAsB;QACtB,OAAO;QACP,KAAK;QACL,WAAW;KACZ,CAAA;IAED,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;AACrF,CAAC;AAOD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,OAAO,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,KAAK,EAAE,WAAW,GAAG,EAAE,EACvB,WAAW,EAAE,cAAc,GACN,EAAa,EAAE;IACpC,MAAM,mBAAmB,GAAG,cAAc,EAAE,IAAI,OAAO,CAAA;IACvD,MAAM,WAAW,GAAG,cAAc,IAAI,mBAAmB,CAAA;IAEzD,MAAM,KAAK,GAAG;QACZ,GAAG,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;QACpD,MAAM,EAAE;YACN,GAAG,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;SACpE;KACF,CAAA;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA","sourcesContent":["import { merge } from 'lodash'\nimport React, { createContext, useMemo } from 'react'\nimport { ColorSchemeName, useColorScheme } from 'react-native'\nimport { DeepPartial } from '../types'\nimport { ENV, PartialToken, ResponseError, Session } from '../utils'\nimport { ChatTheme, defaultTheme, DefaultTheme } from '../utils/theme'\n\nexport type ChatContextValue = {\n env?: ENV\n giphyApiKey?: string\n onUnauthorizedResponse: (_response: ResponseError) => void\n session: Session\n theme: ChatTheme\n token?: PartialToken\n}\n\nexport interface ChatProviderProps extends Omit<ChatContextValue, 'client' | 'theme' | 'session'> {\n theme: CreateChatThemeProps\n}\n\nexport const ChatContext = createContext<ChatContextValue>({\n env: undefined,\n giphyApiKey: undefined,\n onUnauthorizedResponse: () => {},\n session: new Session(),\n theme: defaultTheme('light'),\n token: undefined,\n})\n\nexport function ChatProvider({ children, value }: { children: any; value: ChatProviderProps }) {\n const { env, token, onUnauthorizedResponse, giphyApiKey } = value\n const theme = useCreateChatTheme(value.theme || {})\n const session = useMemo(() => new Session({ token, env }), [env, token])\n\n const contextValue: ChatContextValue = {\n env,\n token,\n onUnauthorizedResponse,\n session,\n theme,\n giphyApiKey,\n }\n\n return <ChatContext.Provider value={contextValue}>{children}</ChatContext.Provider>\n}\n\nexport interface CreateChatThemeProps {\n theme?: DeepPartial<DefaultTheme>\n colorScheme?: ColorSchemeName\n}\n\nexport const useChatContext = () => {\n return React.useContext(ChatContext)\n}\n\nexport const useCreateChatTheme = ({\n theme: customTheme = {},\n colorScheme: appColorScheme,\n}: CreateChatThemeProps): ChatTheme => {\n const internalColorScheme = useColorScheme() || 'light'\n const colorScheme = appColorScheme || internalColorScheme\n\n const theme = {\n ...merge({}, defaultTheme(colorScheme), customTheme),\n colors: {\n ...merge({}, defaultTheme(colorScheme).colors, customTheme?.colors),\n },\n }\n\n return theme\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_api_client.d.ts","sourceRoot":"","sources":["../../src/hooks/use_api_client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"use_api_client.d.ts","sourceRoot":"","sources":["../../src/hooks/use_api_client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGxC,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGhD,MAAM,MAAM,SAAS,GAAG;KAAG,EAAE,IAAI,GAAG,GAAG,MAAM;CAAE,CAAA;AAE/C,eAAO,MAAM,YAAY,iBAoBxB,CAAA"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { useContext, useMemo } from 'react';
|
|
2
2
|
import { ChatContext } from '../contexts/chat_context';
|
|
3
3
|
import { Client } from '../utils/client';
|
|
4
|
+
import { Uri } from '../utils';
|
|
4
5
|
const apps = ['chat', 'groups', 'services'];
|
|
5
6
|
export const useApiClient = () => {
|
|
6
7
|
const { session, onUnauthorizedResponse } = useContext(ChatContext);
|
|
8
|
+
const uri = useMemo(() => new Uri({ session }), [session]);
|
|
7
9
|
const api = useMemo(() => apps.reduce((acc, app) => {
|
|
8
10
|
acc[app] = new Client({
|
|
9
|
-
app,
|
|
10
|
-
|
|
11
|
+
root: uri.api(`/${app}/v2`),
|
|
12
|
+
defaultHeaders: uri.headers,
|
|
11
13
|
version: '2018-11-01',
|
|
12
14
|
onUnauthorizedResponse,
|
|
13
15
|
});
|
|
14
16
|
return acc;
|
|
15
|
-
}, {}), [
|
|
17
|
+
}, {}), [uri, onUnauthorizedResponse]);
|
|
16
18
|
return api;
|
|
17
19
|
};
|
|
18
20
|
//# sourceMappingURL=use_api_client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_api_client.js","sourceRoot":"","sources":["../../src/hooks/use_api_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"use_api_client.js","sourceRoot":"","sources":["../../src/hooks/use_api_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,MAAM,IAAI,GAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;AAIlD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IAEnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAE1D,MAAM,GAAG,GAAG,OAAO,CACjB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC;YACpB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;YAC3B,cAAc,EAAE,GAAG,CAAC,OAAO;YAC3B,OAAO,EAAE,YAAY;YACrB,sBAAsB;SACvB,CAAC,CAAA;QACF,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAe,CAAC,EACrB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAC9B,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA","sourcesContent":["import { useContext, useMemo } from 'react'\nimport { ChatContext } from '../contexts/chat_context'\nimport { Client } from '../utils/client'\nimport { Uri } from '../utils'\n\nexport type App = 'chat' | 'groups' | 'services'\nconst apps: App[] = ['chat', 'groups', 'services']\n\nexport type ApiClient = { [_K in App]: Client }\n\nexport const useApiClient = () => {\n const { session, onUnauthorizedResponse } = useContext(ChatContext)\n\n const uri = useMemo(() => new Uri({ session }), [session])\n\n const api = useMemo(\n () =>\n apps.reduce((acc, app) => {\n acc[app] = new Client({\n root: uri.api(`/${app}/v2`),\n defaultHeaders: uri.headers,\n version: '2018-11-01',\n onUnauthorizedResponse,\n })\n return acc\n }, {} as ApiClient),\n [uri, onUnauthorizedResponse]\n )\n\n return api\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_jolt.d.ts","sourceRoot":"","sources":["../../src/hooks/use_jolt.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,6BAA6B,CAAA;AACpD,OAAO,EACL,aAAa,EAEd,MAAM,uDAAuD,CAAA;AAC9D,OAAO,EAEL,gBAAgB,EACjB,MAAM,yDAAyD,CAAA;AAahE,eAAO,MAAM,aAAa,QAAO,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"use_jolt.d.ts","sourceRoot":"","sources":["../../src/hooks/use_jolt.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,6BAA6B,CAAA;AACpD,OAAO,EACL,aAAa,EAEd,MAAM,uDAAuD,CAAA;AAC9D,OAAO,EAEL,gBAAgB,EACjB,MAAM,yDAAyD,CAAA;AAahE,eAAO,MAAM,aAAa,QAAO,UAAU,GAAG,SA+F7C,CAAA;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,gCAUjD;AAED,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAA;AAE5C,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAClD,OAAO,EAAE,gBAAgB,GAAG,SAAS,EACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,QAO5B"}
|
package/build/hooks/use_jolt.js
CHANGED
|
@@ -2,13 +2,16 @@ import JoltClient from '@planningcenter/jolt-client';
|
|
|
2
2
|
import { useQuery, useQueryClient, useSuspenseQuery } from '@tanstack/react-query';
|
|
3
3
|
import { useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { useChatContext } from '../contexts/chat_context';
|
|
5
|
-
import { Client } from '../utils';
|
|
5
|
+
import { Client, Uri } from '../utils';
|
|
6
6
|
export const useJoltClient = () => {
|
|
7
7
|
const { session } = useChatContext();
|
|
8
8
|
const queryClient = useQueryClient();
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const uri = useMemo(() => new Uri({ session }), [session]);
|
|
10
|
+
const apiClient = useMemo(() => new Client({
|
|
11
|
+
root: uri.api(`/chat/v2`),
|
|
12
|
+
defaultHeaders: uri.headers,
|
|
13
|
+
version: '2018-11-01',
|
|
14
|
+
}), [uri]);
|
|
12
15
|
const { data: joltToken } = useSuspenseQuery({
|
|
13
16
|
queryKey: ['jolt-token'],
|
|
14
17
|
queryFn: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_jolt.js","sourceRoot":"","sources":["../../src/hooks/use_jolt.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,6BAA6B,CAAA;AASpD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"use_jolt.js","sourceRoot":"","sources":["../../src/hooks/use_jolt.ts"],"names":[],"mappings":"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","sourcesContent":["import JoltClient from '@planningcenter/jolt-client'\nimport {\n CustomMessage,\n FetchAuthToken,\n} from '@planningcenter/jolt-client/dist/types/JoltConnection'\nimport {\n FetchSubscribeToken,\n JoltSubscription,\n} from '@planningcenter/jolt-client/dist/types/JoltSubscription'\nimport { useQuery, useQueryClient, useSuspenseQuery } from '@tanstack/react-query'\nimport { useEffect, useMemo, useState } from 'react'\nimport { useChatContext } from '../contexts/chat_context'\nimport { ApiResource } from '../types'\nimport { Client, Uri } from '../utils'\n\ninterface JoltResponse {\n type: 'JoltToken'\n id: string\n wssUrl: string\n}\n\nexport const useJoltClient = (): JoltClient | undefined => {\n const { session } = useChatContext()\n const queryClient = useQueryClient()\n const uri = useMemo(() => new Uri({ session }), [session])\n const apiClient = useMemo(\n () =>\n new Client({\n root: uri.api(`/chat/v2`),\n defaultHeaders: uri.headers,\n version: '2018-11-01',\n }),\n [uri]\n )\n\n const { data: joltToken } = useSuspenseQuery<ApiResource<JoltResponse>>({\n queryKey: ['jolt-token'],\n queryFn: () => {\n return apiClient.post({\n url: '/me/jolt_authorize',\n data: {\n data: {\n type: 'JoltToken',\n attributes: {},\n },\n },\n })\n },\n })\n\n const fetchJoltToken = async () => {\n return apiClient.post<ApiResource<JoltResponse>>({\n url: '/me/jolt_authorize',\n data: {\n data: {\n type: 'JoltToken',\n attributes: {},\n },\n },\n })\n }\n\n const fetchAuthTokenFn: FetchAuthToken = () => {\n return queryClient.fetchQuery({\n queryKey: ['jolt-token'],\n queryFn: () => fetchJoltToken().then(res => res.data.id),\n })\n }\n\n const fetchSubscribeToken: FetchSubscribeToken = (channel: string, connectionId: string) => {\n return apiClient\n .post<ApiResource<JoltResponse>>({\n url: '/me/jolt_subscribe',\n data: {\n data: {\n type: 'JoltSubscribeToken',\n attributes: { channel, cid: connectionId },\n },\n },\n })\n .then(res => res.data.id)\n .catch((res: unknown) => {\n console.error('failed to subscribe to Jolt channel', res)\n return ''\n })\n }\n\n const fetchSubscribeTokenFn: FetchSubscribeToken = (\n channel: string,\n connectionId: string,\n options\n ) => {\n return queryClient.fetchQuery({\n queryKey: ['jolt-subscribe-token', channel, connectionId],\n queryFn: () => fetchSubscribeToken(channel, connectionId, options),\n })\n }\n\n const { data: joltClient } = useQuery({\n enabled: Boolean(joltToken),\n queryKey: ['jolt-client', joltToken],\n queryFn: async () => {\n if (!joltToken) return undefined\n\n return new JoltClient(\n joltToken?.data.wssUrl,\n {\n fetchAuthTokenFn,\n fetchSubscribeTokenFn,\n },\n { logToConsole: false }\n )\n },\n })\n\n return joltClient\n}\n\nexport function useJoltChannel(channelName: string) {\n const [joltChannel, setJoltChannel] = useState<JoltSubscription>()\n const jolt = useJoltClient()\n\n useEffect(() => {\n setJoltChannel(jolt?.subscribe(channelName))\n return () => jolt?.unsubscribe(channelName)\n }, [channelName, jolt])\n\n return joltChannel\n}\n\ntype UserCallbackFn<T> = (_event: T) => void\n\nexport function useJoltEvent<T extends CustomMessage>(\n channel: JoltSubscription | undefined,\n eventName: string,\n callback: UserCallbackFn<T>\n) {\n useEffect(() => {\n if (!channel) return () => {}\n\n return channel.bind(eventName, e => callback(e as T))\n }, [channel, eventName, callback])\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export type OAuthToken = {
|
|
2
|
-
token_type:
|
|
3
|
-
access_token:
|
|
2
|
+
token_type: string;
|
|
3
|
+
access_token: string;
|
|
4
4
|
created_at: number;
|
|
5
|
-
expires_in:
|
|
5
|
+
expires_in: number;
|
|
6
6
|
scope: string;
|
|
7
|
-
refresh_token:
|
|
7
|
+
refresh_token: string;
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=oauth_token.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth_token.d.ts","sourceRoot":"","sources":["../../../src/types/resources/oauth_token.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"oauth_token.d.ts","sourceRoot":"","sources":["../../../src/types/resources/oauth_token.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth_token.js","sourceRoot":"","sources":["../../../src/types/resources/oauth_token.ts"],"names":[],"mappings":"","sourcesContent":["export type OAuthToken = {\n token_type:
|
|
1
|
+
{"version":3,"file":"oauth_token.js","sourceRoot":"","sources":["../../../src/types/resources/oauth_token.ts"],"names":[],"mappings":"","sourcesContent":["export type OAuthToken = {\n token_type: string\n access_token: string\n created_at: number\n expires_in: number\n scope: string\n refresh_token: string\n}\n"]}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { ApiCollection, ApiError, ApiResource } from '../../types';
|
|
2
|
-
import { Session } from '../session';
|
|
3
|
-
import { Uri } from '../uri';
|
|
4
2
|
import { DeleteRequest, GetRequest, PatchRequest, PostRequest } from './types';
|
|
5
3
|
export interface ResponseError extends Response {
|
|
6
4
|
errors: ApiError['errors'];
|
|
@@ -10,24 +8,22 @@ type ClientArgs = {
|
|
|
10
8
|
version: string;
|
|
11
9
|
defaultHeaders?: Record<string, string>;
|
|
12
10
|
onUnauthorizedResponse?: OnUnauthorizedResponse;
|
|
13
|
-
|
|
14
|
-
app: string;
|
|
11
|
+
root?: string;
|
|
15
12
|
};
|
|
16
13
|
export declare class Client {
|
|
17
14
|
version: string;
|
|
18
15
|
defaultHeaders: Record<string, string>;
|
|
19
|
-
uri: Uri;
|
|
20
16
|
onUnauthorizedResponse?: OnUnauthorizedResponse;
|
|
21
|
-
|
|
17
|
+
root?: string;
|
|
18
|
+
constructor({ version, defaultHeaders, onUnauthorizedResponse, root }: ClientArgs);
|
|
22
19
|
get<T extends ApiCollection | ApiResource>(args: GetRequest): Promise<T>;
|
|
23
20
|
patch<T extends ApiCollection | ApiResource>(args: PatchRequest): Promise<T>;
|
|
24
21
|
post<T extends ApiCollection | ApiResource>(args: PostRequest): Promise<T>;
|
|
25
22
|
delete(args: DeleteRequest): Promise<any>;
|
|
26
23
|
handleNotOk: (response: Response) => Promise<never>;
|
|
27
24
|
parseErrorResponse: (response: Response) => Promise<Partial<ApiError>>;
|
|
25
|
+
appUrl(url: string): string;
|
|
28
26
|
get headers(): {
|
|
29
|
-
'User-Agent': string;
|
|
30
|
-
Authorization: string;
|
|
31
27
|
Accept: string;
|
|
32
28
|
'Content-Type': string;
|
|
33
29
|
'X-PCO-API-Version': string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/utils/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAUlE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,SAAS,CAAA;AAE3F,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;CAC3B;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAA;AAEvE,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,qBAAa,MAAM;IACjB,OAAO,EAAE,MAAM,CAAK;IACpB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAK;IAC3C,sBAAsB,CAAC,EAAE,sBAAsB,CAAA;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;gBAED,EAAE,OAAO,EAAE,cAAmB,EAAE,sBAAsB,EAAE,IAAI,EAAE,EAAE,UAAU;IAOhF,GAAG,CAAC,CAAC,SAAS,aAAa,GAAG,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IA2CxE,KAAK,CAAC,CAAC,SAAS,aAAa,GAAG,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC;IAW5E,IAAI,CAAC,CAAC,SAAS,aAAa,GAAG,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;IAW1E,MAAM,CAAC,IAAI,EAAE,aAAa;IAShC,WAAW,aAAoB,QAAQ,oBAUtC;IAED,kBAAkB,aAAoB,QAAQ,KAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAM1E;IAED,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI,OAAO;;;;MAOV;CACF;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { Uri } from '../uri';
|
|
2
1
|
import { concatRecords, ensureNoQueryParamsInDev, makeRequest, throwErrorIfFieldsMissing, throwErrorIfQueryParams, } from './request_helpers';
|
|
3
2
|
export class Client {
|
|
4
3
|
version = '';
|
|
5
4
|
defaultHeaders = {};
|
|
6
|
-
uri;
|
|
7
5
|
onUnauthorizedResponse;
|
|
8
|
-
|
|
6
|
+
root;
|
|
7
|
+
constructor({ version, defaultHeaders = {}, onUnauthorizedResponse, root }) {
|
|
9
8
|
this.version = version;
|
|
10
|
-
this.uri = new Uri({ session, app });
|
|
11
9
|
this.defaultHeaders = defaultHeaders;
|
|
12
10
|
this.onUnauthorizedResponse = onUnauthorizedResponse;
|
|
11
|
+
this.root = root;
|
|
13
12
|
}
|
|
14
13
|
async get(args) {
|
|
15
14
|
const { walk, ...data } = args.data;
|
|
16
15
|
const isWalking = Boolean(walk);
|
|
17
16
|
const headers = { ...this.headers, ...args.headers };
|
|
18
|
-
const url = this.
|
|
17
|
+
const url = this.appUrl(args.url);
|
|
19
18
|
await throwErrorIfQueryParams(url);
|
|
20
19
|
const requestArgs = { data, url, action: 'GET', headers };
|
|
21
20
|
const walkRequest = ({ url: requestUrl, data: d = { fields: {} }, acc = { data: [], included: [], meta: {}, links: {} }, ...options }) => {
|
|
@@ -45,7 +44,7 @@ export class Client {
|
|
|
45
44
|
}
|
|
46
45
|
async patch(args) {
|
|
47
46
|
const headers = { ...this.headers, ...args.headers };
|
|
48
|
-
const url = this.
|
|
47
|
+
const url = this.appUrl(args.url);
|
|
49
48
|
const requestArgs = { data: args.data, url, action: 'PATCH', headers };
|
|
50
49
|
return ensureNoQueryParamsInDev(makeRequest, requestArgs)
|
|
51
50
|
.then(response => response)
|
|
@@ -53,7 +52,7 @@ export class Client {
|
|
|
53
52
|
}
|
|
54
53
|
async post(args) {
|
|
55
54
|
const headers = { ...this.headers, ...args.headers };
|
|
56
|
-
const url = this.
|
|
55
|
+
const url = this.appUrl(args.url);
|
|
57
56
|
const requestArgs = { ...args, data: args.data, url, action: 'POST', headers };
|
|
58
57
|
return ensureNoQueryParamsInDev(makeRequest, requestArgs)
|
|
59
58
|
.then(response => response)
|
|
@@ -61,7 +60,7 @@ export class Client {
|
|
|
61
60
|
}
|
|
62
61
|
async delete(args) {
|
|
63
62
|
const headers = { ...this.headers, ...args.headers };
|
|
64
|
-
const url = this.
|
|
63
|
+
const url = this.appUrl(args.url);
|
|
65
64
|
const requestArgs = { url, action: 'DELETE', headers };
|
|
66
65
|
return makeRequest(requestArgs).catch(this.handleNotOk);
|
|
67
66
|
}
|
|
@@ -83,12 +82,14 @@ export class Client {
|
|
|
83
82
|
return {};
|
|
84
83
|
}
|
|
85
84
|
};
|
|
85
|
+
appUrl(url) {
|
|
86
|
+
return `${this.root}${url}`;
|
|
87
|
+
}
|
|
86
88
|
get headers() {
|
|
87
89
|
return {
|
|
88
90
|
Accept: 'application/vnd.api+json',
|
|
89
91
|
'Content-Type': 'application/json',
|
|
90
92
|
'X-PCO-API-Version': this.version,
|
|
91
|
-
...this.uri.headers,
|
|
92
93
|
...this.defaultHeaders,
|
|
93
94
|
};
|
|
94
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/utils/client/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/utils/client/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ApiCollection, ApiError, ApiResource } from '../../types'\nimport {\n concatRecords,\n ensureNoQueryParamsInDev,\n makeRequest,\n MakeRequestArgs,\n throwErrorIfFieldsMissing,\n throwErrorIfQueryParams,\n} from './request_helpers'\n\nimport { DeleteRequest, GetRequest, PatchRequest, PostRequest, WalkRequest } from './types'\n\nexport interface ResponseError extends Response {\n errors: ApiError['errors']\n}\n\nexport type OnUnauthorizedResponse = (_response: ResponseError) => void\n\ntype ClientArgs = {\n version: string\n defaultHeaders?: Record<string, string>\n onUnauthorizedResponse?: OnUnauthorizedResponse\n root?: string\n}\n\nexport class Client {\n version: string = ''\n defaultHeaders: Record<string, string> = {}\n onUnauthorizedResponse?: OnUnauthorizedResponse\n root?: string\n\n constructor({ version, defaultHeaders = {}, onUnauthorizedResponse, root }: ClientArgs) {\n this.version = version\n this.defaultHeaders = defaultHeaders\n this.onUnauthorizedResponse = onUnauthorizedResponse\n this.root = root\n }\n\n async get<T extends ApiCollection | ApiResource>(args: GetRequest): Promise<T> {\n const { walk, ...data } = args.data\n const isWalking = Boolean(walk)\n const headers = { ...this.headers, ...args.headers }\n const url = this.appUrl(args.url)\n\n await throwErrorIfQueryParams(url)\n\n const requestArgs: MakeRequestArgs = { data, url, action: 'GET', headers }\n\n const walkRequest = ({\n url: requestUrl,\n data: d = { fields: {} },\n acc = { data: [], included: [], meta: {}, links: {} },\n ...options\n }: WalkRequest): Promise<T> => {\n return makeRequest({\n action: 'GET',\n data: d,\n url: requestUrl,\n ...options,\n headers,\n }).then(({ links, ...rest }) => {\n const records = Array.isArray(rest.data) ? concatRecords(acc, rest) : rest\n\n // `next` will have our params in the link so we do not want to pass them back in\n if (links?.next) {\n return walkRequest({ ...options, data: d, url: links.next, acc: records })\n } else {\n return records\n }\n })\n }\n\n const handler = isWalking\n ? (a: MakeRequestArgs | WalkRequest) => walkRequest(a as WalkRequest)\n : (a: MakeRequestArgs | WalkRequest) => makeRequest(a as MakeRequestArgs)\n\n return throwErrorIfFieldsMissing(handler, requestArgs)\n .then(response => response as T)\n .catch(this.handleNotOk)\n }\n\n async patch<T extends ApiCollection | ApiResource>(args: PatchRequest): Promise<T> {\n const headers = { ...this.headers, ...args.headers }\n const url = this.appUrl(args.url)\n\n const requestArgs: MakeRequestArgs = { data: args.data, url, action: 'PATCH', headers }\n\n return ensureNoQueryParamsInDev(makeRequest, requestArgs)\n .then(response => response as T)\n .catch(this.handleNotOk)\n }\n\n async post<T extends ApiCollection | ApiResource>(args: PostRequest): Promise<T> {\n const headers = { ...this.headers, ...args.headers }\n const url = this.appUrl(args.url)\n\n const requestArgs: MakeRequestArgs = { ...args, data: args.data, url, action: 'POST', headers }\n\n return ensureNoQueryParamsInDev(makeRequest, requestArgs)\n .then(response => response as T)\n .catch(this.handleNotOk)\n }\n\n async delete(args: DeleteRequest) {\n const headers = { ...this.headers, ...args.headers }\n const url = this.appUrl(args.url)\n\n const requestArgs: MakeRequestArgs = { url, action: 'DELETE', headers }\n\n return makeRequest(requestArgs).catch(this.handleNotOk)\n }\n\n handleNotOk = async (response: Response) => {\n if (response.status === 401) {\n const { errors } = await this.parseErrorResponse(response)\n this.onUnauthorizedResponse?.({\n ...response,\n errors: errors || [],\n })\n }\n\n return Promise.reject(response)\n }\n\n parseErrorResponse = async (response: Response): Promise<Partial<ApiError>> => {\n try {\n return (await response.json()) as ApiError\n } catch {\n return {}\n }\n }\n\n appUrl(url: string) {\n return `${this.root}${url}`\n }\n\n get headers() {\n return {\n Accept: 'application/vnd.api+json',\n 'Content-Type': 'application/json',\n 'X-PCO-API-Version': this.version,\n ...this.defaultHeaders,\n }\n }\n}\n\nexport default Client\n"]}
|
package/build/utils/session.d.ts
CHANGED
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { OAuthToken } from '../types';
|
|
2
2
|
export type ENV = 'production' | 'staging' | 'development';
|
|
3
|
+
export type OauthType = 'OAuth' | 'ChurchCenterOauth';
|
|
3
4
|
export type PartialToken = Pick<OAuthToken, 'access_token'> & Partial<OAuthToken>;
|
|
4
|
-
export type SessionProps<T
|
|
5
|
+
export type SessionProps<T extends PartialToken> = {
|
|
5
6
|
env?: ENV;
|
|
6
7
|
token?: T;
|
|
8
|
+
type?: OauthType;
|
|
7
9
|
};
|
|
8
10
|
/**
|
|
9
11
|
* Session class to track the environment and token
|
|
10
12
|
* Not intended to make network requests or handle authentication
|
|
11
13
|
*/
|
|
12
|
-
export declare class Session<T = PartialToken> {
|
|
14
|
+
export declare class Session<T extends PartialToken = PartialToken> {
|
|
13
15
|
env: ENV;
|
|
14
16
|
token: T | undefined;
|
|
17
|
+
type: OauthType;
|
|
15
18
|
constructor(props?: SessionProps<T>);
|
|
16
19
|
get isAuthenticated(): boolean;
|
|
20
|
+
get isChurchCenterToken(): boolean;
|
|
17
21
|
toString(): string;
|
|
18
22
|
static hydrate<T extends PartialToken>(sessionString: string): Session<T>;
|
|
19
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,MAAM,MAAM,GAAG,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,MAAM,MAAM,GAAG,GAAG,YAAY,GAAG,SAAS,GAAG,aAAa,CAAA;AAC1D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,mBAAmB,CAAA;AACrD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AACjF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,YAAY,IAAI;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,CAAA;AAE7F;;;GAGG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACxD,GAAG,EAAE,GAAG,CAAA;IACR,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IACpB,IAAI,EAAE,SAAS,CAAA;gBAEH,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAOnC,IAAI,eAAe,YAElB;IAED,IAAI,mBAAmB,YAEtB;IAED,QAAQ;IAIR,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,YAAY,EAAE,aAAa,EAAE,MAAM;CAQ7D"}
|
package/build/utils/session.js
CHANGED
|
@@ -5,14 +5,19 @@
|
|
|
5
5
|
export class Session {
|
|
6
6
|
env;
|
|
7
7
|
token;
|
|
8
|
+
type;
|
|
8
9
|
constructor(props) {
|
|
9
|
-
const { env = 'production', token } = props || {};
|
|
10
|
+
const { env = 'production', token, type } = props || {};
|
|
10
11
|
this.env = env;
|
|
11
12
|
this.token = token;
|
|
13
|
+
this.type = type || 'OAuth';
|
|
12
14
|
}
|
|
13
15
|
get isAuthenticated() {
|
|
14
16
|
return Boolean(this.token);
|
|
15
17
|
}
|
|
18
|
+
get isChurchCenterToken() {
|
|
19
|
+
return this.type === 'ChurchCenterOauth';
|
|
20
|
+
}
|
|
16
21
|
toString() {
|
|
17
22
|
return JSON.stringify({ env: this.env, token: this.token });
|
|
18
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,OAAO,OAAO;IAClB,GAAG,CAAK;IACR,KAAK,CAAe;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,OAAO,OAAO;IAClB,GAAG,CAAK;IACR,KAAK,CAAe;IACpB,IAAI,CAAW;IAEf,YAAY,KAAuB;QACjC,MAAM,EAAE,GAAG,GAAG,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,CAAA;QACvD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO,CAAA;IAC7B,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,IAAI,KAAK,mBAAmB,CAAA;IAC1C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,CAAC,OAAO,CAAyB,aAAqB;QAC1D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACvC,OAAO,IAAI,OAAO,CAAI,KAAK,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,OAAO,EAAK,CAAA;QACzB,CAAC;IACH,CAAC;CACF","sourcesContent":["import { OAuthToken } from '../types'\n\nexport type ENV = 'production' | 'staging' | 'development'\nexport type OauthType = 'OAuth' | 'ChurchCenterOauth'\nexport type PartialToken = Pick<OAuthToken, 'access_token'> & Partial<OAuthToken>\nexport type SessionProps<T extends PartialToken> = { env?: ENV; token?: T; type?: OauthType }\n\n/**\n * Session class to track the environment and token\n * Not intended to make network requests or handle authentication\n */\nexport class Session<T extends PartialToken = PartialToken> {\n env: ENV\n token: T | undefined\n type: OauthType\n\n constructor(props?: SessionProps<T>) {\n const { env = 'production', token, type } = props || {}\n this.env = env\n this.token = token\n this.type = type || 'OAuth'\n }\n\n get isAuthenticated() {\n return Boolean(this.token)\n }\n\n get isChurchCenterToken() {\n return this.type === 'ChurchCenterOauth'\n }\n\n toString() {\n return JSON.stringify({ env: this.env, token: this.token })\n }\n\n static hydrate<T extends PartialToken>(sessionString: string) {\n try {\n const props = JSON.parse(sessionString)\n return new Session<T>(props)\n } catch (error) {\n return new Session<T>()\n }\n }\n}\n"]}
|
package/build/utils/uri.d.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import { Session } from './session';
|
|
2
|
+
type Graph = 'churchcenter' | 'planningcenter';
|
|
2
3
|
export declare class Uri {
|
|
3
4
|
session: Session;
|
|
5
|
+
graph: Graph;
|
|
4
6
|
app?: string;
|
|
5
|
-
constructor({ session, app }: {
|
|
7
|
+
constructor({ session, app, graph }: {
|
|
6
8
|
session: Session;
|
|
7
9
|
app?: string;
|
|
10
|
+
graph?: Graph;
|
|
8
11
|
});
|
|
9
12
|
get schema(): "http" | "https";
|
|
10
|
-
get host():
|
|
13
|
+
get host(): string;
|
|
14
|
+
get subdomain(): "api.staging" | "api-staging" | "api";
|
|
15
|
+
get domain(): 'pco' | 'planningcenteronline' | 'churchcenter';
|
|
16
|
+
get tld(): "test" | "com";
|
|
17
|
+
get isChurchCenter(): boolean;
|
|
11
18
|
get env(): import("./session").ENV;
|
|
12
19
|
get baseUrl(): string;
|
|
13
20
|
get directory(): string;
|
|
@@ -18,4 +25,5 @@ export declare class Uri {
|
|
|
18
25
|
appUrl: (path: string) => string;
|
|
19
26
|
api: (path: string) => string;
|
|
20
27
|
}
|
|
28
|
+
export {};
|
|
21
29
|
//# sourceMappingURL=uri.d.ts.map
|
package/build/utils/uri.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/utils/uri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,qBAAa,GAAG;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAA;gBAEA,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/utils/uri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,KAAK,KAAK,GAAG,cAAc,GAAG,gBAAgB,CAAA;AAC9C,qBAAa,GAAG;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAmB;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAA;gBAEA,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,KAAK,CAAA;KAAE;IAMtF,IAAI,MAAM,qBAMT;IAED,IAAI,IAAI,WAEP;IAED,IAAI,SAAS,0CAOZ;IAED,IAAI,MAAM,IAAI,KAAK,GAAG,sBAAsB,GAAG,cAAc,CAM5D;IAED,IAAI,GAAG,mBAON;IAED,IAAI,cAAc,YAEjB;IAED,IAAI,GAAG,4BAEN;IAED,IAAI,OAAO,WAEV;IAED,IAAI,SAAS,WAEZ;IAED,IAAI,OAAO;;;MAKV;IAED,MAAM,SAAU,MAAM,YAIrB;IAED,GAAG,SAAU,MAAM,YAIlB;CACF"}
|
package/build/utils/uri.js
CHANGED
|
@@ -7,10 +7,12 @@ const readableVersion = DeviceInfo.getReadableVersion();
|
|
|
7
7
|
const appName = DeviceInfo.getApplicationName();
|
|
8
8
|
export class Uri {
|
|
9
9
|
session;
|
|
10
|
+
graph = 'planningcenter';
|
|
10
11
|
app;
|
|
11
|
-
constructor({ session, app }) {
|
|
12
|
+
constructor({ session, app, graph }) {
|
|
12
13
|
this.session = session;
|
|
13
14
|
this.app = app;
|
|
15
|
+
this.graph = graph || 'planningcenter';
|
|
14
16
|
}
|
|
15
17
|
get schema() {
|
|
16
18
|
if (this.env === 'development') {
|
|
@@ -21,17 +23,33 @@ export class Uri {
|
|
|
21
23
|
}
|
|
22
24
|
}
|
|
23
25
|
get host() {
|
|
26
|
+
return `${this.subdomain}.${this.domain}.${this.tld}`;
|
|
27
|
+
}
|
|
28
|
+
get subdomain() {
|
|
24
29
|
switch (this.env) {
|
|
25
|
-
case 'production':
|
|
26
|
-
return 'api.planningcenteronline.com';
|
|
27
30
|
case 'staging':
|
|
28
|
-
return 'api-staging
|
|
31
|
+
return this.isChurchCenter ? 'api.staging' : 'api-staging';
|
|
32
|
+
default:
|
|
33
|
+
return 'api';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
get domain() {
|
|
37
|
+
if (this.isChurchCenter) {
|
|
38
|
+
return 'churchcenter';
|
|
39
|
+
}
|
|
40
|
+
return this.env === 'development' ? 'pco' : 'planningcenteronline';
|
|
41
|
+
}
|
|
42
|
+
get tld() {
|
|
43
|
+
switch (this.env) {
|
|
29
44
|
case 'development':
|
|
30
|
-
return '
|
|
45
|
+
return 'test';
|
|
31
46
|
default:
|
|
32
|
-
return '
|
|
47
|
+
return 'com';
|
|
33
48
|
}
|
|
34
49
|
}
|
|
50
|
+
get isChurchCenter() {
|
|
51
|
+
return this.session.isChurchCenterToken;
|
|
52
|
+
}
|
|
35
53
|
get env() {
|
|
36
54
|
return this.session?.env || 'production';
|
|
37
55
|
}
|
package/build/utils/uri.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/utils/uri.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAA;AAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;AACnC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;AACnC,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;AAC7C,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAA;AACnD,MAAM,eAAe,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAA;AACvD,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/utils/uri.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAA;AAEjD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;AACnC,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAA;AACnC,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,EAAE,CAAA;AAC7C,MAAM,aAAa,GAAG,UAAU,CAAC,gBAAgB,EAAE,CAAA;AACnD,MAAM,eAAe,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAA;AACvD,MAAM,OAAO,GAAG,UAAU,CAAC,kBAAkB,EAAE,CAAA;AAG/C,MAAM,OAAO,GAAG;IACd,OAAO,CAAS;IAChB,KAAK,GAAU,gBAAgB,CAAA;IAC/B,GAAG,CAAS;IAEZ,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAqD;QACpF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,gBAAgB,CAAA;IACxC,CAAC;IAED,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACvD,CAAC;IAED,IAAI,SAAS;QACX,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;YAC5D;gBACE,OAAO,KAAK,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,cAAc,CAAA;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAA;IACpE,CAAC;IAED,IAAI,GAAG;QACL,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;YACjB,KAAK,aAAa;gBAChB,OAAO,MAAM,CAAA;YACf;gBACE,OAAO,KAAK,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAA;IACzC,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,YAAY,CAAA;IAC1C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1C,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACL,YAAY,EAAE,GAAG,OAAO,IAAI,eAAe,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,aAAa,GAAG;YACnG,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE;SAC5D,CAAA;IACH,CAAC;IAED,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAErD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,GAAG,EAAE,CAAA;IACzD,CAAC,CAAA;IAED,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAErD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,CAAA;IACxC,CAAC,CAAA;CACF","sourcesContent":["import DeviceInfo from 'react-native-device-info'\nimport { Session } from './session'\nconst brand = DeviceInfo.getBrand()\nconst model = DeviceInfo.getModel()\nconst systemName = DeviceInfo.getSystemName()\nconst systemVersion = DeviceInfo.getSystemVersion()\nconst readableVersion = DeviceInfo.getReadableVersion()\nconst appName = DeviceInfo.getApplicationName()\n\ntype Graph = 'churchcenter' | 'planningcenter'\nexport class Uri {\n session: Session\n graph: Graph = 'planningcenter'\n app?: string\n\n constructor({ session, app, graph }: { session: Session; app?: string; graph?: Graph }) {\n this.session = session\n this.app = app\n this.graph = graph || 'planningcenter'\n }\n\n get schema() {\n if (this.env === 'development') {\n return 'http'\n } else {\n return 'https'\n }\n }\n\n get host() {\n return `${this.subdomain}.${this.domain}.${this.tld}`\n }\n\n get subdomain() {\n switch (this.env) {\n case 'staging':\n return this.isChurchCenter ? 'api.staging' : 'api-staging'\n default:\n return 'api'\n }\n }\n\n get domain(): 'pco' | 'planningcenteronline' | 'churchcenter' {\n if (this.isChurchCenter) {\n return 'churchcenter'\n }\n\n return this.env === 'development' ? 'pco' : 'planningcenteronline'\n }\n\n get tld() {\n switch (this.env) {\n case 'development':\n return 'test'\n default:\n return 'com'\n }\n }\n\n get isChurchCenter() {\n return this.session.isChurchCenterToken\n }\n\n get env() {\n return this.session?.env || 'production'\n }\n\n get baseUrl() {\n return `${this.schema}://${this.host}`\n }\n\n get directory() {\n return this.app ? `/${this.app}/v2` : ''\n }\n\n get headers() {\n return {\n 'User-Agent': `${appName}/${readableVersion} (${brand}, ${model}, ${systemName}, ${systemVersion})`,\n Authorization: `Bearer ${this.session.token?.access_token}`,\n }\n }\n\n appUrl = (path: string) => {\n if (path.startsWith(`${this.schema}://`)) return path\n\n return `${this.baseUrl}${this.directory}${path || '/'}`\n }\n\n api = (path: string) => {\n if (path.startsWith(`${this.schema}://`)) return path\n\n return `${this.baseUrl}${path || '/'}`\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "3.2.0-rc.
|
|
3
|
+
"version": "3.2.0-rc.16",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"prettier": "^3.4.2",
|
|
56
56
|
"typescript": "<5.6.0"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "b7fcb15ed8dc6dc141389a3b6cfb13b673383489"
|
|
59
59
|
}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import MockServer from '
|
|
2
|
-
import Client from '
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import { ApiError, OAuthToken } from '../types'
|
|
1
|
+
import MockServer from '../../__utils__/server'
|
|
2
|
+
import Client from '../../utils/client/client'
|
|
3
|
+
import DefaultFixtures from '../../__utils__/fixtures/defaults'
|
|
4
|
+
import { BASE_URL } from '../../__utils__/handlers'
|
|
5
|
+
import { ApiError } from '../../types'
|
|
7
6
|
|
|
8
7
|
const APP_BASE_URL = BASE_URL
|
|
9
|
-
|
|
10
|
-
let session: Session
|
|
11
8
|
let client: Client
|
|
12
9
|
let clientWithDefaultHeaders: Client
|
|
13
10
|
let fetchSpy: jest.SpyInstance
|
|
@@ -21,20 +18,17 @@ const onUnauthorizedResponse = jest.fn()
|
|
|
21
18
|
beforeEach(() => {
|
|
22
19
|
jest.clearAllMocks()
|
|
23
20
|
fetchSpy = jest.spyOn(globalThis, 'fetch')
|
|
24
|
-
session = new Session({ env: 'development' })
|
|
25
21
|
client = new Client({
|
|
26
|
-
app: 'chat',
|
|
27
22
|
version: '2018-11-01',
|
|
28
|
-
|
|
23
|
+
root: APP_BASE_URL,
|
|
29
24
|
onUnauthorizedResponse,
|
|
30
25
|
})
|
|
31
26
|
clientWithDefaultHeaders = new Client({
|
|
32
|
-
app: 'chat',
|
|
33
27
|
version: '2018-11-01',
|
|
28
|
+
root: APP_BASE_URL,
|
|
34
29
|
defaultHeaders: {
|
|
35
30
|
'X-Custom-Default-Header': 'important data',
|
|
36
31
|
},
|
|
37
|
-
session,
|
|
38
32
|
onUnauthorizedResponse,
|
|
39
33
|
})
|
|
40
34
|
})
|
|
@@ -345,96 +339,6 @@ describe('delete', () => {
|
|
|
345
339
|
})
|
|
346
340
|
})
|
|
347
341
|
|
|
348
|
-
describe('url switching', () => {
|
|
349
|
-
it('Changes to session switches the base url', async () => {
|
|
350
|
-
const devBase = 'http://api.pco.test/chat/v2'
|
|
351
|
-
const prodBase = 'https://api.planningcenteronline.com/chat/v2'
|
|
352
|
-
const stagingBase = 'https://api-staging.planningcenteronline.com/chat/v2'
|
|
353
|
-
|
|
354
|
-
MockServer.get(prodBase + '/records', {}, 200, { once: true })
|
|
355
|
-
MockServer.get(stagingBase + '/records', {}, 200, { once: true })
|
|
356
|
-
|
|
357
|
-
const newClient = new Client({
|
|
358
|
-
app: 'chat',
|
|
359
|
-
session,
|
|
360
|
-
version: '2018-11-01',
|
|
361
|
-
onUnauthorizedResponse: () => {},
|
|
362
|
-
})
|
|
363
|
-
|
|
364
|
-
await newClient.get({
|
|
365
|
-
url: '/records',
|
|
366
|
-
data: { fields: { Record: ['id'] } },
|
|
367
|
-
})
|
|
368
|
-
|
|
369
|
-
expect(fetchSpy).toHaveBeenCalledWith(
|
|
370
|
-
devBase + '/records?fields[Record]=id&per_page=100',
|
|
371
|
-
expect.any(Object)
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
session.env = 'staging'
|
|
375
|
-
|
|
376
|
-
await newClient.get({
|
|
377
|
-
url: '/records',
|
|
378
|
-
data: { fields: { Record: ['id'] } },
|
|
379
|
-
})
|
|
380
|
-
|
|
381
|
-
expect(fetchSpy).toHaveBeenLastCalledWith(
|
|
382
|
-
'https://api-staging.planningcenteronline.com/chat/v2' +
|
|
383
|
-
'/records?fields[Record]=id&per_page=100',
|
|
384
|
-
expect.any(Object)
|
|
385
|
-
)
|
|
386
|
-
|
|
387
|
-
session.env = 'production'
|
|
388
|
-
|
|
389
|
-
await newClient.get({
|
|
390
|
-
url: '/records',
|
|
391
|
-
data: { fields: { Record: ['id'] } },
|
|
392
|
-
})
|
|
393
|
-
|
|
394
|
-
expect(fetchSpy).toHaveBeenLastCalledWith(
|
|
395
|
-
'https://api.planningcenteronline.com/chat/v2' + '/records?fields[Record]=id&per_page=100',
|
|
396
|
-
expect.any(Object)
|
|
397
|
-
)
|
|
398
|
-
})
|
|
399
|
-
|
|
400
|
-
it('Changes to session switches the base url with custom headers', async () => {
|
|
401
|
-
const token: OAuthToken = {
|
|
402
|
-
access_token: 'foo',
|
|
403
|
-
token_type: undefined,
|
|
404
|
-
created_at: 0,
|
|
405
|
-
expires_in: undefined,
|
|
406
|
-
scope: '',
|
|
407
|
-
refresh_token: undefined,
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
session.token = token
|
|
411
|
-
|
|
412
|
-
await client.get({
|
|
413
|
-
url: '/records',
|
|
414
|
-
data: { fields: { Record: ['id'] } },
|
|
415
|
-
})
|
|
416
|
-
|
|
417
|
-
requestHeadersShouldContain({
|
|
418
|
-
...fetchSpy.mock.calls[0][1],
|
|
419
|
-
key: 'Authorization',
|
|
420
|
-
value: 'foo',
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
session.token.access_token = 'bar'
|
|
424
|
-
|
|
425
|
-
await client.get({
|
|
426
|
-
url: '/records',
|
|
427
|
-
data: { fields: { Record: ['id'] } },
|
|
428
|
-
})
|
|
429
|
-
|
|
430
|
-
requestHeadersShouldContain({
|
|
431
|
-
...fetchSpy.mock.calls[1][1],
|
|
432
|
-
key: 'Authorization',
|
|
433
|
-
value: 'bar',
|
|
434
|
-
})
|
|
435
|
-
})
|
|
436
|
-
})
|
|
437
|
-
|
|
438
342
|
describe('error handling', () => {
|
|
439
343
|
describe('401 errors', () => {
|
|
440
344
|
it('defaults', async () => {
|
|
@@ -466,15 +370,3 @@ describe('error handling', () => {
|
|
|
466
370
|
}
|
|
467
371
|
})
|
|
468
372
|
})
|
|
469
|
-
|
|
470
|
-
const requestHeadersShouldContain = ({
|
|
471
|
-
headers,
|
|
472
|
-
key,
|
|
473
|
-
value,
|
|
474
|
-
}: {
|
|
475
|
-
headers: Record<string, unknown>
|
|
476
|
-
key: string
|
|
477
|
-
value: unknown
|
|
478
|
-
}) => {
|
|
479
|
-
expect(headers[key]).toContain(value)
|
|
480
|
-
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { OAuthToken } from '
|
|
2
|
-
import { Session } from '
|
|
1
|
+
import { OAuthToken } from '../../types'
|
|
2
|
+
import { Session } from '../../utils/session'
|
|
3
3
|
|
|
4
4
|
const token: OAuthToken = {
|
|
5
5
|
access_token: 'access_token',
|
|
6
6
|
refresh_token: 'refresh_token',
|
|
7
|
-
token_type: undefined,
|
|
7
|
+
token_type: 'undefined',
|
|
8
8
|
created_at: 0,
|
|
9
|
-
expires_in:
|
|
9
|
+
expires_in: 0,
|
|
10
10
|
scope: '',
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Uri } from '../../utils'
|
|
2
|
+
|
|
3
|
+
describe('URI', () => {
|
|
4
|
+
it('should be defined', () => {
|
|
5
|
+
expect(Uri).toBeDefined()
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
it('should create a new instance', () => {
|
|
9
|
+
const uri = new Uri({
|
|
10
|
+
session: {
|
|
11
|
+
env: 'production',
|
|
12
|
+
token: undefined,
|
|
13
|
+
type: 'OAuth',
|
|
14
|
+
isAuthenticated: false,
|
|
15
|
+
isChurchCenterToken: false,
|
|
16
|
+
},
|
|
17
|
+
})
|
|
18
|
+
expect(uri).toBeDefined()
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
describe('baseUrl', () => {
|
|
22
|
+
describe('planning center', () => {
|
|
23
|
+
it('should return the correct base URL for production', () => {
|
|
24
|
+
const uri = new Uri({
|
|
25
|
+
session: {
|
|
26
|
+
env: 'production',
|
|
27
|
+
token: undefined,
|
|
28
|
+
type: 'OAuth',
|
|
29
|
+
isAuthenticated: false,
|
|
30
|
+
isChurchCenterToken: false,
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
expect(uri.baseUrl).toBe('https://api.planningcenteronline.com')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
it('should return the correct base URL for staging', () => {
|
|
37
|
+
const uri = new Uri({
|
|
38
|
+
session: {
|
|
39
|
+
env: 'staging',
|
|
40
|
+
token: undefined,
|
|
41
|
+
type: 'OAuth',
|
|
42
|
+
isAuthenticated: false,
|
|
43
|
+
isChurchCenterToken: false,
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
expect(uri.baseUrl).toBe('https://api-staging.planningcenteronline.com')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('should return the correct base URL for development', () => {
|
|
50
|
+
const uri = new Uri({
|
|
51
|
+
session: {
|
|
52
|
+
env: 'development',
|
|
53
|
+
token: undefined,
|
|
54
|
+
type: 'OAuth',
|
|
55
|
+
isAuthenticated: false,
|
|
56
|
+
isChurchCenterToken: false,
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
expect(uri.baseUrl).toBe('http://api.pco.test')
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
describe('church center', () => {
|
|
64
|
+
it('should return the correct base URL for production', () => {
|
|
65
|
+
const uri = new Uri({
|
|
66
|
+
session: {
|
|
67
|
+
env: 'production',
|
|
68
|
+
token: undefined,
|
|
69
|
+
type: 'ChurchCenterOauth',
|
|
70
|
+
isAuthenticated: false,
|
|
71
|
+
isChurchCenterToken: true,
|
|
72
|
+
},
|
|
73
|
+
graph: 'churchcenter',
|
|
74
|
+
})
|
|
75
|
+
expect(uri.baseUrl).toBe('https://api.churchcenter.com')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('should return the correct base URL for staging', () => {
|
|
79
|
+
const uri = new Uri({
|
|
80
|
+
session: {
|
|
81
|
+
env: 'staging',
|
|
82
|
+
token: undefined,
|
|
83
|
+
type: 'ChurchCenterOauth',
|
|
84
|
+
isAuthenticated: false,
|
|
85
|
+
isChurchCenterToken: true,
|
|
86
|
+
},
|
|
87
|
+
graph: 'churchcenter',
|
|
88
|
+
})
|
|
89
|
+
expect(uri.baseUrl).toBe('https://api.staging.churchcenter.com')
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('should return the correct base URL for development', () => {
|
|
93
|
+
const uri = new Uri({
|
|
94
|
+
session: {
|
|
95
|
+
env: 'development',
|
|
96
|
+
token: undefined,
|
|
97
|
+
type: 'ChurchCenterOauth',
|
|
98
|
+
isAuthenticated: false,
|
|
99
|
+
isChurchCenterToken: true,
|
|
100
|
+
},
|
|
101
|
+
graph: 'churchcenter',
|
|
102
|
+
})
|
|
103
|
+
expect(uri.baseUrl).toBe('http://api.churchcenter.test')
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
})
|
|
@@ -6,12 +6,12 @@ import { ENV, PartialToken, ResponseError, Session } from '../utils'
|
|
|
6
6
|
import { ChatTheme, defaultTheme, DefaultTheme } from '../utils/theme'
|
|
7
7
|
|
|
8
8
|
export type ChatContextValue = {
|
|
9
|
-
token?: PartialToken
|
|
10
|
-
onUnauthorizedResponse: (_response: ResponseError) => void
|
|
11
|
-
theme: ChatTheme
|
|
12
9
|
env?: ENV
|
|
13
|
-
session: Session
|
|
14
10
|
giphyApiKey?: string
|
|
11
|
+
onUnauthorizedResponse: (_response: ResponseError) => void
|
|
12
|
+
session: Session
|
|
13
|
+
theme: ChatTheme
|
|
14
|
+
token?: PartialToken
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
export interface ChatProviderProps extends Omit<ChatContextValue, 'client' | 'theme' | 'session'> {
|
|
@@ -19,12 +19,12 @@ export interface ChatProviderProps extends Omit<ChatContextValue, 'client' | 'th
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export const ChatContext = createContext<ChatContextValue>({
|
|
22
|
-
theme: defaultTheme('light'),
|
|
23
|
-
token: undefined,
|
|
24
22
|
env: undefined,
|
|
23
|
+
giphyApiKey: undefined,
|
|
25
24
|
onUnauthorizedResponse: () => {},
|
|
26
25
|
session: new Session(),
|
|
27
|
-
|
|
26
|
+
theme: defaultTheme('light'),
|
|
27
|
+
token: undefined,
|
|
28
28
|
})
|
|
29
29
|
|
|
30
30
|
export function ChatProvider({ children, value }: { children: any; value: ChatProviderProps }) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useContext, useMemo } from 'react'
|
|
2
2
|
import { ChatContext } from '../contexts/chat_context'
|
|
3
3
|
import { Client } from '../utils/client'
|
|
4
|
+
import { Uri } from '../utils'
|
|
4
5
|
|
|
5
6
|
export type App = 'chat' | 'groups' | 'services'
|
|
6
7
|
const apps: App[] = ['chat', 'groups', 'services']
|
|
@@ -9,18 +10,21 @@ export type ApiClient = { [_K in App]: Client }
|
|
|
9
10
|
|
|
10
11
|
export const useApiClient = () => {
|
|
11
12
|
const { session, onUnauthorizedResponse } = useContext(ChatContext)
|
|
13
|
+
|
|
14
|
+
const uri = useMemo(() => new Uri({ session }), [session])
|
|
15
|
+
|
|
12
16
|
const api = useMemo(
|
|
13
17
|
() =>
|
|
14
18
|
apps.reduce((acc, app) => {
|
|
15
19
|
acc[app] = new Client({
|
|
16
|
-
app,
|
|
17
|
-
|
|
20
|
+
root: uri.api(`/${app}/v2`),
|
|
21
|
+
defaultHeaders: uri.headers,
|
|
18
22
|
version: '2018-11-01',
|
|
19
23
|
onUnauthorizedResponse,
|
|
20
24
|
})
|
|
21
25
|
return acc
|
|
22
26
|
}, {} as ApiClient),
|
|
23
|
-
[
|
|
27
|
+
[uri, onUnauthorizedResponse]
|
|
24
28
|
)
|
|
25
29
|
|
|
26
30
|
return api
|
package/src/hooks/use_jolt.ts
CHANGED
|
@@ -11,7 +11,7 @@ import { useQuery, useQueryClient, useSuspenseQuery } from '@tanstack/react-quer
|
|
|
11
11
|
import { useEffect, useMemo, useState } from 'react'
|
|
12
12
|
import { useChatContext } from '../contexts/chat_context'
|
|
13
13
|
import { ApiResource } from '../types'
|
|
14
|
-
import { Client } from '../utils'
|
|
14
|
+
import { Client, Uri } from '../utils'
|
|
15
15
|
|
|
16
16
|
interface JoltResponse {
|
|
17
17
|
type: 'JoltToken'
|
|
@@ -22,10 +22,15 @@ interface JoltResponse {
|
|
|
22
22
|
export const useJoltClient = (): JoltClient | undefined => {
|
|
23
23
|
const { session } = useChatContext()
|
|
24
24
|
const queryClient = useQueryClient()
|
|
25
|
+
const uri = useMemo(() => new Uri({ session }), [session])
|
|
25
26
|
const apiClient = useMemo(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
() =>
|
|
28
|
+
new Client({
|
|
29
|
+
root: uri.api(`/chat/v2`),
|
|
30
|
+
defaultHeaders: uri.headers,
|
|
31
|
+
version: '2018-11-01',
|
|
32
|
+
}),
|
|
33
|
+
[uri]
|
|
29
34
|
)
|
|
30
35
|
|
|
31
36
|
const { data: joltToken } = useSuspenseQuery<ApiResource<JoltResponse>>({
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { ApiCollection, ApiError, ApiResource } from '../../types'
|
|
2
|
-
import { Session } from '../session'
|
|
3
|
-
import { Uri } from '../uri'
|
|
4
2
|
import {
|
|
5
3
|
concatRecords,
|
|
6
4
|
ensureNoQueryParamsInDev,
|
|
@@ -22,28 +20,27 @@ type ClientArgs = {
|
|
|
22
20
|
version: string
|
|
23
21
|
defaultHeaders?: Record<string, string>
|
|
24
22
|
onUnauthorizedResponse?: OnUnauthorizedResponse
|
|
25
|
-
|
|
26
|
-
app: string
|
|
23
|
+
root?: string
|
|
27
24
|
}
|
|
28
25
|
|
|
29
26
|
export class Client {
|
|
30
27
|
version: string = ''
|
|
31
28
|
defaultHeaders: Record<string, string> = {}
|
|
32
|
-
uri: Uri
|
|
33
29
|
onUnauthorizedResponse?: OnUnauthorizedResponse
|
|
30
|
+
root?: string
|
|
34
31
|
|
|
35
|
-
constructor({ version, defaultHeaders = {},
|
|
32
|
+
constructor({ version, defaultHeaders = {}, onUnauthorizedResponse, root }: ClientArgs) {
|
|
36
33
|
this.version = version
|
|
37
|
-
this.uri = new Uri({ session, app })
|
|
38
34
|
this.defaultHeaders = defaultHeaders
|
|
39
35
|
this.onUnauthorizedResponse = onUnauthorizedResponse
|
|
36
|
+
this.root = root
|
|
40
37
|
}
|
|
41
38
|
|
|
42
39
|
async get<T extends ApiCollection | ApiResource>(args: GetRequest): Promise<T> {
|
|
43
40
|
const { walk, ...data } = args.data
|
|
44
41
|
const isWalking = Boolean(walk)
|
|
45
42
|
const headers = { ...this.headers, ...args.headers }
|
|
46
|
-
const url = this.
|
|
43
|
+
const url = this.appUrl(args.url)
|
|
47
44
|
|
|
48
45
|
await throwErrorIfQueryParams(url)
|
|
49
46
|
|
|
@@ -54,7 +51,7 @@ export class Client {
|
|
|
54
51
|
data: d = { fields: {} },
|
|
55
52
|
acc = { data: [], included: [], meta: {}, links: {} },
|
|
56
53
|
...options
|
|
57
|
-
}: WalkRequest): Promise<
|
|
54
|
+
}: WalkRequest): Promise<T> => {
|
|
58
55
|
return makeRequest({
|
|
59
56
|
action: 'GET',
|
|
60
57
|
data: d,
|
|
@@ -84,7 +81,7 @@ export class Client {
|
|
|
84
81
|
|
|
85
82
|
async patch<T extends ApiCollection | ApiResource>(args: PatchRequest): Promise<T> {
|
|
86
83
|
const headers = { ...this.headers, ...args.headers }
|
|
87
|
-
const url = this.
|
|
84
|
+
const url = this.appUrl(args.url)
|
|
88
85
|
|
|
89
86
|
const requestArgs: MakeRequestArgs = { data: args.data, url, action: 'PATCH', headers }
|
|
90
87
|
|
|
@@ -95,7 +92,7 @@ export class Client {
|
|
|
95
92
|
|
|
96
93
|
async post<T extends ApiCollection | ApiResource>(args: PostRequest): Promise<T> {
|
|
97
94
|
const headers = { ...this.headers, ...args.headers }
|
|
98
|
-
const url = this.
|
|
95
|
+
const url = this.appUrl(args.url)
|
|
99
96
|
|
|
100
97
|
const requestArgs: MakeRequestArgs = { ...args, data: args.data, url, action: 'POST', headers }
|
|
101
98
|
|
|
@@ -106,7 +103,7 @@ export class Client {
|
|
|
106
103
|
|
|
107
104
|
async delete(args: DeleteRequest) {
|
|
108
105
|
const headers = { ...this.headers, ...args.headers }
|
|
109
|
-
const url = this.
|
|
106
|
+
const url = this.appUrl(args.url)
|
|
110
107
|
|
|
111
108
|
const requestArgs: MakeRequestArgs = { url, action: 'DELETE', headers }
|
|
112
109
|
|
|
@@ -133,12 +130,15 @@ export class Client {
|
|
|
133
130
|
}
|
|
134
131
|
}
|
|
135
132
|
|
|
133
|
+
appUrl(url: string) {
|
|
134
|
+
return `${this.root}${url}`
|
|
135
|
+
}
|
|
136
|
+
|
|
136
137
|
get headers() {
|
|
137
138
|
return {
|
|
138
139
|
Accept: 'application/vnd.api+json',
|
|
139
140
|
'Content-Type': 'application/json',
|
|
140
141
|
'X-PCO-API-Version': this.version,
|
|
141
|
-
...this.uri.headers,
|
|
142
142
|
...this.defaultHeaders,
|
|
143
143
|
}
|
|
144
144
|
}
|
package/src/utils/session.ts
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
import { OAuthToken } from '../types'
|
|
2
2
|
|
|
3
3
|
export type ENV = 'production' | 'staging' | 'development'
|
|
4
|
-
|
|
4
|
+
export type OauthType = 'OAuth' | 'ChurchCenterOauth'
|
|
5
5
|
export type PartialToken = Pick<OAuthToken, 'access_token'> & Partial<OAuthToken>
|
|
6
|
-
export type SessionProps<T
|
|
6
|
+
export type SessionProps<T extends PartialToken> = { env?: ENV; token?: T; type?: OauthType }
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Session class to track the environment and token
|
|
10
10
|
* Not intended to make network requests or handle authentication
|
|
11
11
|
*/
|
|
12
|
-
export class Session<T = PartialToken> {
|
|
12
|
+
export class Session<T extends PartialToken = PartialToken> {
|
|
13
13
|
env: ENV
|
|
14
14
|
token: T | undefined
|
|
15
|
+
type: OauthType
|
|
15
16
|
|
|
16
17
|
constructor(props?: SessionProps<T>) {
|
|
17
|
-
const { env = 'production', token } = props || {}
|
|
18
|
+
const { env = 'production', token, type } = props || {}
|
|
18
19
|
this.env = env
|
|
19
20
|
this.token = token
|
|
21
|
+
this.type = type || 'OAuth'
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
get isAuthenticated() {
|
|
23
25
|
return Boolean(this.token)
|
|
24
26
|
}
|
|
25
27
|
|
|
28
|
+
get isChurchCenterToken() {
|
|
29
|
+
return this.type === 'ChurchCenterOauth'
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
toString() {
|
|
27
33
|
return JSON.stringify({ env: this.env, token: this.token })
|
|
28
34
|
}
|
package/src/utils/uri.ts
CHANGED
|
@@ -7,13 +7,16 @@ const systemVersion = DeviceInfo.getSystemVersion()
|
|
|
7
7
|
const readableVersion = DeviceInfo.getReadableVersion()
|
|
8
8
|
const appName = DeviceInfo.getApplicationName()
|
|
9
9
|
|
|
10
|
+
type Graph = 'churchcenter' | 'planningcenter'
|
|
10
11
|
export class Uri {
|
|
11
12
|
session: Session
|
|
13
|
+
graph: Graph = 'planningcenter'
|
|
12
14
|
app?: string
|
|
13
15
|
|
|
14
|
-
constructor({ session, app }: { session: Session; app?: string }) {
|
|
16
|
+
constructor({ session, app, graph }: { session: Session; app?: string; graph?: Graph }) {
|
|
15
17
|
this.session = session
|
|
16
18
|
this.app = app
|
|
19
|
+
this.graph = graph || 'planningcenter'
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
get schema() {
|
|
@@ -25,18 +28,39 @@ export class Uri {
|
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
get host() {
|
|
31
|
+
return `${this.subdomain}.${this.domain}.${this.tld}`
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
get subdomain() {
|
|
28
35
|
switch (this.env) {
|
|
29
|
-
case 'production':
|
|
30
|
-
return 'api.planningcenteronline.com'
|
|
31
36
|
case 'staging':
|
|
32
|
-
return 'api-staging
|
|
37
|
+
return this.isChurchCenter ? 'api.staging' : 'api-staging'
|
|
38
|
+
default:
|
|
39
|
+
return 'api'
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get domain(): 'pco' | 'planningcenteronline' | 'churchcenter' {
|
|
44
|
+
if (this.isChurchCenter) {
|
|
45
|
+
return 'churchcenter'
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return this.env === 'development' ? 'pco' : 'planningcenteronline'
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get tld() {
|
|
52
|
+
switch (this.env) {
|
|
33
53
|
case 'development':
|
|
34
|
-
return '
|
|
54
|
+
return 'test'
|
|
35
55
|
default:
|
|
36
|
-
return '
|
|
56
|
+
return 'com'
|
|
37
57
|
}
|
|
38
58
|
}
|
|
39
59
|
|
|
60
|
+
get isChurchCenter() {
|
|
61
|
+
return this.session.isChurchCenterToken
|
|
62
|
+
}
|
|
63
|
+
|
|
40
64
|
get env() {
|
|
41
65
|
return this.session?.env || 'production'
|
|
42
66
|
}
|