@planningcenter/chat-react-native 2.2.1 → 2.2.2-rc.1
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 +2 -1
- package/build/contexts/chat_context.d.ts.map +1 -1
- package/build/contexts/chat_context.js +3 -1
- package/build/contexts/chat_context.js.map +1 -1
- package/build/screens/conversation_details_screen.d.ts.map +1 -1
- package/build/screens/conversation_details_screen.js +178 -101
- package/build/screens/conversation_details_screen.js.map +1 -1
- package/build/types/api_primitives.d.ts +15 -0
- package/build/types/api_primitives.d.ts.map +1 -1
- package/build/types/api_primitives.js.map +1 -1
- package/build/types/utils/index.d.ts +1 -0
- package/build/types/utils/index.d.ts.map +1 -1
- package/build/types/utils/index.js +3 -1
- package/build/types/utils/index.js.map +1 -1
- package/build/utils/client/client.d.ts +8 -5
- package/build/utils/client/client.d.ts.map +1 -1
- package/build/utils/client/client.js +22 -7
- package/build/utils/client/client.js.map +1 -1
- package/build/vendor/tapestry/alias_tokens_color_map.d.ts +12 -0
- package/build/vendor/tapestry/alias_tokens_color_map.d.ts.map +1 -1
- package/build/vendor/tapestry/alias_tokens_color_map.js +12 -0
- package/build/vendor/tapestry/alias_tokens_color_map.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/client.ts +59 -4
- package/src/__tests__/hooks/useTheme.tsx +1 -1
- package/src/contexts/chat_context.tsx +5 -2
- package/src/screens/conversation_details_screen.tsx +295 -130
- package/src/types/api_primitives.ts +12 -0
- package/src/types/utils/index.ts +4 -0
- package/src/utils/client/client.ts +34 -11
- package/src/vendor/tapestry/alias_tokens_color_map.ts +18 -0
|
@@ -5,11 +5,13 @@ export class Client {
|
|
|
5
5
|
defaultHeaders = {};
|
|
6
6
|
uri;
|
|
7
7
|
onTokenExpired;
|
|
8
|
-
|
|
8
|
+
onForceLogout;
|
|
9
|
+
constructor({ version, defaultHeaders = {}, session, app, onTokenExpired, onForceLogout, }) {
|
|
9
10
|
this.version = version;
|
|
10
11
|
this.uri = new Uri({ session, app });
|
|
11
12
|
this.defaultHeaders = defaultHeaders;
|
|
12
13
|
this.onTokenExpired = onTokenExpired;
|
|
14
|
+
this.onForceLogout = onForceLogout;
|
|
13
15
|
}
|
|
14
16
|
async get(args) {
|
|
15
17
|
const { walk, ...data } = args.data;
|
|
@@ -37,32 +39,45 @@ export class Client {
|
|
|
37
39
|
});
|
|
38
40
|
};
|
|
39
41
|
const handler = isWalking ? walkRequest : makeRequest;
|
|
40
|
-
return throwErrorIfFieldsMissing(handler, requestArgs).catch(this.
|
|
42
|
+
return throwErrorIfFieldsMissing(handler, requestArgs).catch(this.handleNotOk);
|
|
41
43
|
}
|
|
42
44
|
async patch(args) {
|
|
43
45
|
const headers = { ...this.headers, ...args.headers };
|
|
44
46
|
const url = this.uri.appUrl(args.url);
|
|
45
47
|
const requestArgs = { data: args.data, url, action: 'PATCH', headers };
|
|
46
|
-
return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.
|
|
48
|
+
return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.handleNotOk);
|
|
47
49
|
}
|
|
48
50
|
async post(args) {
|
|
49
51
|
const headers = { ...this.headers, ...args.headers };
|
|
50
52
|
const url = this.uri.appUrl(args.url);
|
|
51
53
|
const requestArgs = { ...args, data: args.data, url, action: 'POST', headers };
|
|
52
|
-
return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.
|
|
54
|
+
return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.handleNotOk);
|
|
53
55
|
}
|
|
54
56
|
async delete(args) {
|
|
55
57
|
const headers = { ...this.headers, ...args.headers };
|
|
56
58
|
const url = this.uri.appUrl(args.url);
|
|
57
59
|
const requestArgs = { url, action: 'DELETE', headers };
|
|
58
|
-
return makeRequest(requestArgs).catch(this.
|
|
60
|
+
return makeRequest(requestArgs).catch(this.handleNotOk);
|
|
59
61
|
}
|
|
60
|
-
|
|
62
|
+
handleNotOk = async (response) => {
|
|
61
63
|
if (response.status === 401) {
|
|
62
|
-
this.
|
|
64
|
+
const parsed = await this.parseErrorResponse(response);
|
|
65
|
+
const errors = parsed?.errors || [];
|
|
66
|
+
const isTokenExpired = errors.some(e => /baboon/i.test(e.detail));
|
|
67
|
+
const isForceLogout = errors.some(e => /capuchin/i.test(e.detail));
|
|
68
|
+
isTokenExpired && this.onTokenExpired?.();
|
|
69
|
+
isForceLogout && this.onForceLogout?.();
|
|
63
70
|
}
|
|
64
71
|
return Promise.reject(response);
|
|
65
72
|
};
|
|
73
|
+
parseErrorResponse = async (response) => {
|
|
74
|
+
try {
|
|
75
|
+
return (await response.json());
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
66
81
|
get headers() {
|
|
67
82
|
return {
|
|
68
83
|
Accept: 'application/vnd.api+json',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/utils/client/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC5B,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,WAAW,EAEX,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,mBAAmB,CAAA;
|
|
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 { Session } from '../session'\nimport { Uri } from '../uri'\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\ntype ClientArgs = {\n version: string\n defaultHeaders?: Record<string, string>\n onForceLogout?: () => void\n onTokenExpired?: () => void\n session: Session\n app: string\n}\n\nexport class Client {\n version: string = ''\n defaultHeaders: Record<string, string> = {}\n uri: Uri\n onTokenExpired?: () => void\n onForceLogout?: () => void\n\n constructor({\n version,\n defaultHeaders = {},\n session,\n app,\n onTokenExpired,\n onForceLogout,\n }: ClientArgs) {\n this.version = version\n this.uri = new Uri({ session, app })\n this.defaultHeaders = defaultHeaders\n this.onTokenExpired = onTokenExpired\n this.onForceLogout = onForceLogout\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.uri.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) => {\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 ? walkRequest : makeRequest\n\n return throwErrorIfFieldsMissing(handler, requestArgs).catch(this.handleNotOk)\n }\n\n async patch(args: PatchRequest) {\n const headers = { ...this.headers, ...args.headers }\n const url = this.uri.appUrl(args.url)\n\n const requestArgs: MakeRequestArgs = { data: args.data, url, action: 'PATCH', headers }\n\n return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.handleNotOk)\n }\n\n async post(args: PostRequest) {\n const headers = { ...this.headers, ...args.headers }\n const url = this.uri.appUrl(args.url)\n\n const requestArgs: MakeRequestArgs = { ...args, data: args.data, url, action: 'POST', headers }\n\n return ensureNoQueryParamsInDev(makeRequest, requestArgs).catch(this.handleNotOk)\n }\n\n async delete(args: DeleteRequest) {\n const headers = { ...this.headers, ...args.headers }\n const url = this.uri.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 parsed = await this.parseErrorResponse(response)\n const errors = parsed?.errors || []\n const isTokenExpired = errors.some(e => /baboon/i.test(e.detail))\n const isForceLogout = errors.some(e => /capuchin/i.test(e.detail))\n isTokenExpired && this.onTokenExpired?.()\n isForceLogout && this.onForceLogout?.()\n }\n\n return Promise.reject(response)\n }\n\n parseErrorResponse = async (response: Response): Promise<ApiError | undefined> => {\n try {\n return (await response.json()) as ApiError\n } catch {\n return undefined\n }\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.uri.headers,\n ...this.defaultHeaders,\n }\n }\n}\n\nexport default Client\n"]}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export declare const aliasTokensColorMap: {
|
|
2
2
|
readonly light: {
|
|
3
3
|
readonly name: string;
|
|
4
|
+
readonly borderColorDefaultBase: string;
|
|
5
|
+
readonly borderColorDefaultDark: string;
|
|
6
|
+
readonly borderColorDefaultDarker: string;
|
|
7
|
+
readonly borderColorDefaultDisabled: string;
|
|
8
|
+
readonly borderColorDefaultDim: string;
|
|
9
|
+
readonly borderColorDefaultWhite: string;
|
|
4
10
|
readonly iconColorDefaultPrimary: string;
|
|
5
11
|
readonly iconColorDefaultSecondary: string;
|
|
6
12
|
readonly iconColorDefaultDim: string;
|
|
@@ -32,6 +38,12 @@ export declare const aliasTokensColorMap: {
|
|
|
32
38
|
};
|
|
33
39
|
readonly dark: {
|
|
34
40
|
readonly name: string;
|
|
41
|
+
readonly borderColorDefaultBase: string;
|
|
42
|
+
readonly borderColorDefaultDark: string;
|
|
43
|
+
readonly borderColorDefaultDarker: string;
|
|
44
|
+
readonly borderColorDefaultDisabled: string;
|
|
45
|
+
readonly borderColorDefaultDim: string;
|
|
46
|
+
readonly borderColorDefaultWhite: string;
|
|
35
47
|
readonly iconColorDefaultPrimary: string;
|
|
36
48
|
readonly iconColorDefaultSecondary: string;
|
|
37
49
|
readonly iconColorDefaultDim: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alias_tokens_color_map.d.ts","sourceRoot":"","sources":["../../../src/vendor/tapestry/alias_tokens_color_map.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alias_tokens_color_map.d.ts","sourceRoot":"","sources":["../../../src/vendor/tapestry/alias_tokens_color_map.ts"],"names":[],"mappings":"AAoIA,eAAO,MAAM,mBAAmB;;uBAhFxB,MAAM;yCACY,MAAM;yCACN,MAAM;2CACJ,MAAM;6CACJ,MAAM;wCACX,MAAM;0CACJ,MAAM;0CACN,MAAM;4CACJ,MAAM;sCACZ,MAAM;2CACD,MAAM;2CACN,MAAM;2CACN,MAAM;0CACP,MAAM;4CACJ,MAAM;2CACP,MAAM;8CACH,MAAM;2CACT,MAAM;oDACG,MAAM;8CACZ,MAAM;6CACP,MAAM;sDACG,MAAM;uCACrB,MAAM;kCACX,MAAM;sCAnEF,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;0CACF,MAAM;sCACV,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;8CACE,MAAM;;;uBAkC7B,MAAM;yCACY,MAAM;yCACN,MAAM;2CACJ,MAAM;6CACJ,MAAM;wCACX,MAAM;0CACJ,MAAM;0CACN,MAAM;4CACJ,MAAM;sCACZ,MAAM;2CACD,MAAM;2CACN,MAAM;2CACN,MAAM;0CACP,MAAM;4CACJ,MAAM;2CACP,MAAM;8CACH,MAAM;2CACT,MAAM;oDACG,MAAM;8CACZ,MAAM;6CACP,MAAM;sDACG,MAAM;uCACrB,MAAM;kCACX,MAAM;sCAnEF,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;0CACF,MAAM;sCACV,MAAM;sCACN,MAAM;sCACN,MAAM;sCACN,MAAM;8CACE,MAAM;;CAqH3B,CAAA"}
|
|
@@ -29,6 +29,12 @@ const neutralsDark = {
|
|
|
29
29
|
};
|
|
30
30
|
const semanticAliasesLight = {
|
|
31
31
|
name: 'light',
|
|
32
|
+
borderColorDefaultBase: neutralsLight.fillColorNeutral050Base,
|
|
33
|
+
borderColorDefaultDark: neutralsLight.fillColorNeutral040,
|
|
34
|
+
borderColorDefaultDarker: neutralsLight.fillColorNeutral020,
|
|
35
|
+
borderColorDefaultDisabled: neutralsLight.fillColorNeutral050Base,
|
|
36
|
+
borderColorDefaultDim: neutralsLight.fillColorNeutral070,
|
|
37
|
+
borderColorDefaultWhite: neutralsLight.fillColorNeutral100Inverted,
|
|
32
38
|
iconColorDefaultPrimary: neutralsLight.fillColorNeutral010,
|
|
33
39
|
iconColorDefaultSecondary: neutralsLight.fillColorNeutral020,
|
|
34
40
|
iconColorDefaultDim: neutralsLight.fillColorNeutral030,
|
|
@@ -49,6 +55,12 @@ const semanticAliasesLight = {
|
|
|
49
55
|
};
|
|
50
56
|
const semanticAliasesDark = {
|
|
51
57
|
name: 'dark',
|
|
58
|
+
borderColorDefaultBase: neutralsDark.fillColorNeutral050Base,
|
|
59
|
+
borderColorDefaultDark: neutralsDark.fillColorNeutral040,
|
|
60
|
+
borderColorDefaultDarker: neutralsDark.fillColorNeutral020,
|
|
61
|
+
borderColorDefaultDisabled: neutralsDark.fillColorNeutral050Base,
|
|
62
|
+
borderColorDefaultDim: neutralsDark.fillColorNeutral070,
|
|
63
|
+
borderColorDefaultWhite: neutralsDark.fillColorNeutral100Inverted,
|
|
52
64
|
iconColorDefaultPrimary: neutralsDark.fillColorNeutral010,
|
|
53
65
|
iconColorDefaultSecondary: neutralsDark.fillColorNeutral020,
|
|
54
66
|
iconColorDefaultDim: neutralsDark.fillColorNeutral030,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alias_tokens_color_map.js","sourceRoot":"","sources":["../../../src/vendor/tapestry/alias_tokens_color_map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAqBjC,MAAM,aAAa,GAAkB;IACnC,IAAI,EAAE,OAAO;IACb,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,uBAAuB,EAAE,MAAM,CAAC,cAAc;IAC9C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,2BAA2B,EAAE,MAAM,CAAC,oBAAoB;CAChD,CAAA;AAEV,MAAM,YAAY,GAAkB;IAClC,IAAI,EAAE,MAAM;IACZ,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,uBAAuB,EAAE,MAAM,CAAC,cAAc;IAC9C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,mBAAmB,EAAE,MAAM,CAAC,cAAc;IAC1C,2BAA2B,EAAE,MAAM,CAAC,aAAa;CACzC,CAAA;
|
|
1
|
+
{"version":3,"file":"alias_tokens_color_map.js","sourceRoot":"","sources":["../../../src/vendor/tapestry/alias_tokens_color_map.ts"],"names":[],"mappings":"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","sourcesContent":["import { tokens } from './tokens'\n\n// Copied from `@planningcenter/tapestry` package.\n// Defining these tokens locally is a temporary solution until the package supports mobile.\n// Tokens Reference: https://planningcenter.github.io/tapestry/?path=/docs/foundations-design-tokens--docs\n\ninterface NeutralColors {\n name: string\n fillColorNeutral000: string\n fillColorNeutral010: string\n fillColorNeutral020: string\n fillColorNeutral030: string\n fillColorNeutral040: string\n fillColorNeutral050Base: string\n fillColorNeutral060: string\n fillColorNeutral070: string\n fillColorNeutral080: string\n fillColorNeutral090: string\n fillColorNeutral100Inverted: string\n}\n\nconst neutralsLight: NeutralColors = {\n name: 'light',\n fillColorNeutral000: tokens.colorNeutral12,\n fillColorNeutral010: tokens.colorNeutral24,\n fillColorNeutral020: tokens.colorNeutral45,\n fillColorNeutral030: tokens.colorNeutral58,\n fillColorNeutral040: tokens.colorNeutral81,\n fillColorNeutral050Base: tokens.colorNeutral88,\n fillColorNeutral060: tokens.colorNeutral93,\n fillColorNeutral070: tokens.colorNeutral95,\n fillColorNeutral080: tokens.colorNeutral97,\n fillColorNeutral090: tokens.colorNeutral98,\n fillColorNeutral100Inverted: tokens.colorNeutral100White,\n} as const\n\nconst neutralsDark: NeutralColors = {\n name: 'dark',\n fillColorNeutral000: tokens.colorNeutral98,\n fillColorNeutral010: tokens.colorNeutral88,\n fillColorNeutral020: tokens.colorNeutral68,\n fillColorNeutral030: tokens.colorNeutral50,\n fillColorNeutral040: tokens.colorNeutral32,\n fillColorNeutral050Base: tokens.colorNeutral24,\n fillColorNeutral060: tokens.colorNeutral19,\n fillColorNeutral070: tokens.colorNeutral17,\n fillColorNeutral080: tokens.colorNeutral15,\n fillColorNeutral090: tokens.colorNeutral12,\n fillColorNeutral100Inverted: tokens.colorNeutral7,\n} as const\n\ninterface SemanticAliasesColors {\n name: string\n borderColorDefaultBase: string\n borderColorDefaultDark: string\n borderColorDefaultDarker: string\n borderColorDefaultDisabled: string\n borderColorDefaultDim: string\n borderColorDefaultWhite: string\n iconColorDefaultPrimary: string\n iconColorDefaultSecondary: string\n iconColorDefaultDim: string\n iconColorDefaultDisabled: string\n iconColorDefaultInverted: string\n textColorDefaultHeadline: string\n textColorDefaultPrimary: string\n textColorDefaultSecondary: string\n textColorDefaultDisabled: string\n textColorDefaultPlaceholder: string\n textColorDefaultInverted: string\n fillColorInteractionOnlineDefault: string\n fillColorInteractionDefault: string\n fillColorStatusErrorMedium: string\n fillColorButtonNeutralSolidDisabled: string\n androidRippleNeutral: string\n needsDesignPass: string\n}\n\nconst semanticAliasesLight: SemanticAliasesColors = {\n name: 'light',\n borderColorDefaultBase: neutralsLight.fillColorNeutral050Base,\n borderColorDefaultDark: neutralsLight.fillColorNeutral040,\n borderColorDefaultDarker: neutralsLight.fillColorNeutral020,\n borderColorDefaultDisabled: neutralsLight.fillColorNeutral050Base,\n borderColorDefaultDim: neutralsLight.fillColorNeutral070,\n borderColorDefaultWhite: neutralsLight.fillColorNeutral100Inverted,\n iconColorDefaultPrimary: neutralsLight.fillColorNeutral010,\n iconColorDefaultSecondary: neutralsLight.fillColorNeutral020,\n iconColorDefaultDim: neutralsLight.fillColorNeutral030,\n iconColorDefaultDisabled: neutralsLight.fillColorNeutral040,\n iconColorDefaultInverted: neutralsLight.fillColorNeutral100Inverted,\n textColorDefaultHeadline: neutralsLight.fillColorNeutral000,\n textColorDefaultPrimary: neutralsLight.fillColorNeutral010,\n textColorDefaultSecondary: neutralsLight.fillColorNeutral020,\n textColorDefaultDisabled: neutralsLight.fillColorNeutral040,\n textColorDefaultPlaceholder: neutralsLight.fillColorNeutral030,\n textColorDefaultInverted: tokens.colorNeutral100White,\n fillColorInteractionOnlineDefault: tokens.colorInteractionOnlineDefault,\n fillColorInteractionDefault: tokens.fillColorInteractionDefault,\n fillColorStatusErrorMedium: tokens.fillColorStatusErrorMedium,\n fillColorButtonNeutralSolidDisabled: neutralsLight.fillColorNeutral070,\n androidRippleNeutral: tokens.fillColorTransparencyDark020,\n needsDesignPass: 'hotpink',\n} as const\n\nconst semanticAliasesDark: SemanticAliasesColors = {\n name: 'dark',\n borderColorDefaultBase: neutralsDark.fillColorNeutral050Base,\n borderColorDefaultDark: neutralsDark.fillColorNeutral040,\n borderColorDefaultDarker: neutralsDark.fillColorNeutral020,\n borderColorDefaultDisabled: neutralsDark.fillColorNeutral050Base,\n borderColorDefaultDim: neutralsDark.fillColorNeutral070,\n borderColorDefaultWhite: neutralsDark.fillColorNeutral100Inverted,\n iconColorDefaultPrimary: neutralsDark.fillColorNeutral010,\n iconColorDefaultSecondary: neutralsDark.fillColorNeutral020,\n iconColorDefaultDim: neutralsDark.fillColorNeutral030,\n iconColorDefaultDisabled: neutralsDark.fillColorNeutral040,\n iconColorDefaultInverted: neutralsDark.fillColorNeutral100Inverted,\n textColorDefaultHeadline: neutralsDark.fillColorNeutral000,\n textColorDefaultPrimary: neutralsDark.fillColorNeutral010,\n textColorDefaultSecondary: neutralsDark.fillColorNeutral020,\n textColorDefaultDisabled: neutralsDark.fillColorNeutral040,\n textColorDefaultPlaceholder: neutralsDark.fillColorNeutral030,\n textColorDefaultInverted: tokens.colorNeutral7,\n fillColorInteractionOnlineDefault: tokens.colorInteractionOnlineDefault,\n fillColorInteractionDefault: tokens.fillColorInteractionDefaultDark,\n fillColorStatusErrorMedium: tokens.fillColorStatusErrorMedium,\n fillColorButtonNeutralSolidDisabled: neutralsDark.fillColorNeutral070,\n androidRippleNeutral: tokens.fillColorTransparencyLight020,\n needsDesignPass: 'pink',\n}\n\nexport const aliasTokensColorMap = {\n light: { ...neutralsLight, ...semanticAliasesLight },\n dark: { ...neutralsDark, ...semanticAliasesDark },\n} as const\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planningcenter/chat-react-native",
|
|
3
|
-
"version": "2.2.1",
|
|
3
|
+
"version": "2.2.2-rc.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"prettier": "^3.4.2",
|
|
53
53
|
"typescript": "<5.6.0"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "9a3a46afb5c78a3e7b5c4892a1d92c9874214f37"
|
|
56
56
|
}
|
package/src/__tests__/client.ts
CHANGED
|
@@ -3,7 +3,7 @@ import Client from '../utils/client/client'
|
|
|
3
3
|
import { Session } from '../utils/session'
|
|
4
4
|
import DefaultFixtures from '../__utils__/fixtures/defaults'
|
|
5
5
|
import { BASE_URL } from '../__utils__/handlers'
|
|
6
|
-
import { OAuthToken } from '../types'
|
|
6
|
+
import { ApiError, OAuthToken } from '../types'
|
|
7
7
|
|
|
8
8
|
const APP_BASE_URL = BASE_URL
|
|
9
9
|
|
|
@@ -16,6 +16,9 @@ beforeAll(() => MockServer.server().listen())
|
|
|
16
16
|
afterEach(() => MockServer.server().resetHandlers())
|
|
17
17
|
afterAll(() => MockServer.server().close())
|
|
18
18
|
|
|
19
|
+
const onTokenExpired = jest.fn()
|
|
20
|
+
const onForceLogout = jest.fn()
|
|
21
|
+
|
|
19
22
|
beforeEach(() => {
|
|
20
23
|
jest.clearAllMocks()
|
|
21
24
|
fetchSpy = jest.spyOn(globalThis, 'fetch')
|
|
@@ -24,7 +27,8 @@ beforeEach(() => {
|
|
|
24
27
|
app: 'chat',
|
|
25
28
|
version: '2018-11-01',
|
|
26
29
|
session,
|
|
27
|
-
onTokenExpired
|
|
30
|
+
onTokenExpired,
|
|
31
|
+
onForceLogout,
|
|
28
32
|
})
|
|
29
33
|
clientWithDefaultHeaders = new Client({
|
|
30
34
|
app: 'chat',
|
|
@@ -33,7 +37,8 @@ beforeEach(() => {
|
|
|
33
37
|
'X-Custom-Default-Header': 'important data',
|
|
34
38
|
},
|
|
35
39
|
session,
|
|
36
|
-
onTokenExpired
|
|
40
|
+
onTokenExpired,
|
|
41
|
+
onForceLogout,
|
|
37
42
|
})
|
|
38
43
|
})
|
|
39
44
|
|
|
@@ -184,7 +189,12 @@ describe('get', () => {
|
|
|
184
189
|
})
|
|
185
190
|
|
|
186
191
|
it('throws an error if response is not ok', async () => {
|
|
187
|
-
MockServer.get(
|
|
192
|
+
MockServer.get(
|
|
193
|
+
url,
|
|
194
|
+
{ errors: [{ status: '403', detail: 'Zoinks, your token is borked' }] },
|
|
195
|
+
403,
|
|
196
|
+
{ once: true }
|
|
197
|
+
)
|
|
188
198
|
|
|
189
199
|
await expect(
|
|
190
200
|
client.get({
|
|
@@ -428,6 +438,51 @@ describe('url switching', () => {
|
|
|
428
438
|
})
|
|
429
439
|
})
|
|
430
440
|
|
|
441
|
+
describe('error handling', () => {
|
|
442
|
+
describe('401 errors', () => {
|
|
443
|
+
it('defaults', async () => {
|
|
444
|
+
await test401({ secretWord: '' })
|
|
445
|
+
expect(onTokenExpired).not.toHaveBeenCalled()
|
|
446
|
+
expect(onForceLogout).not.toHaveBeenCalled()
|
|
447
|
+
})
|
|
448
|
+
|
|
449
|
+
it('handles forced logout', async () => {
|
|
450
|
+
await test401({ secretWord: 'CAPUCHIN' })
|
|
451
|
+
expect(onTokenExpired).not.toHaveBeenCalled()
|
|
452
|
+
expect(onForceLogout).toHaveBeenCalled()
|
|
453
|
+
})
|
|
454
|
+
|
|
455
|
+
it('handles token refresh', async () => {
|
|
456
|
+
await test401({ secretWord: 'BABOON' })
|
|
457
|
+
expect(onTokenExpired).toHaveBeenCalled()
|
|
458
|
+
expect(onForceLogout).not.toHaveBeenCalled()
|
|
459
|
+
})
|
|
460
|
+
|
|
461
|
+
const test401 = async ({ secretWord }: { secretWord: string }) => {
|
|
462
|
+
const url = '/records'
|
|
463
|
+
|
|
464
|
+
const expiredTokenResource: Partial<ApiError> = {
|
|
465
|
+
errors: [
|
|
466
|
+
{
|
|
467
|
+
detail: `Zoinks, your token is borked ( ${secretWord} )`,
|
|
468
|
+
title: 'Unauthorized',
|
|
469
|
+
status: '401',
|
|
470
|
+
},
|
|
471
|
+
],
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
MockServer.get(url, expiredTokenResource, 401, { once: true })
|
|
475
|
+
|
|
476
|
+
await expect(
|
|
477
|
+
client.get({
|
|
478
|
+
url,
|
|
479
|
+
data: { fields: { Record: ['id'] } },
|
|
480
|
+
})
|
|
481
|
+
).rejects.toHaveProperty('status', 401)
|
|
482
|
+
}
|
|
483
|
+
})
|
|
484
|
+
})
|
|
485
|
+
|
|
431
486
|
const requestHeadersShouldContain = ({
|
|
432
487
|
headers,
|
|
433
488
|
key,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { renderHook } from '@testing-library/react-native'
|
|
2
2
|
import { useTheme } from '../../hooks'
|
|
3
|
-
import { ChatProvider, CreateChatThemeProps } from '../../contexts'
|
|
3
|
+
import { ChatProvider, CreateChatThemeProps } from '../../contexts/chat_context'
|
|
4
4
|
import React from 'react'
|
|
5
5
|
|
|
6
6
|
let themeProps: CreateChatThemeProps = {
|
|
@@ -7,13 +7,14 @@ import { ChatTheme, defaultTheme, DefaultTheme } from '../utils/theme'
|
|
|
7
7
|
|
|
8
8
|
export type ChatContextValue = {
|
|
9
9
|
token?: OAuthToken
|
|
10
|
+
onForceLogout: () => void
|
|
10
11
|
onTokenExpired: () => void
|
|
11
12
|
theme: ChatTheme
|
|
12
13
|
env?: ENV
|
|
13
14
|
session: Session
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
export interface ChatProviderProps extends Omit<ChatContextValue, 'theme' | 'session'> {
|
|
17
|
+
export interface ChatProviderProps extends Omit<ChatContextValue, 'client' | 'theme' | 'session'> {
|
|
17
18
|
theme: CreateChatThemeProps
|
|
18
19
|
}
|
|
19
20
|
|
|
@@ -21,12 +22,13 @@ export const ChatContext = createContext<ChatContextValue>({
|
|
|
21
22
|
theme: defaultTheme('light'),
|
|
22
23
|
token: undefined,
|
|
23
24
|
env: undefined,
|
|
25
|
+
onForceLogout: () => {},
|
|
24
26
|
onTokenExpired: () => {},
|
|
25
27
|
session: new Session(),
|
|
26
28
|
})
|
|
27
29
|
|
|
28
30
|
export function ChatProvider({ children, value }: { children: any; value: ChatProviderProps }) {
|
|
29
|
-
const { env, token, onTokenExpired } = value
|
|
31
|
+
const { env, token, onTokenExpired, onForceLogout } = value
|
|
30
32
|
const theme = useCreateChatTheme(value.theme || {})
|
|
31
33
|
const session = useMemo(() => new Session({ token, env }), [env, token])
|
|
32
34
|
|
|
@@ -34,6 +36,7 @@ export function ChatProvider({ children, value }: { children: any; value: ChatPr
|
|
|
34
36
|
env,
|
|
35
37
|
token,
|
|
36
38
|
onTokenExpired,
|
|
39
|
+
onForceLogout,
|
|
37
40
|
session,
|
|
38
41
|
theme,
|
|
39
42
|
}
|