Skip to content

Commit eb36650

Browse files
committed
refactor: update user profile handling in AppInitializer and improve fetchFn error handling
1 parent 663d9d4 commit eb36650

4 files changed

Lines changed: 38 additions & 13 deletions

File tree

apps/jetstream-canvas/src/app/core/AppInitializer.tsx

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { logger } from '@jetstream/shared/client-logger';
33
import { getCanvasPreferences, updateCanvasPreferences } from '@jetstream/shared/data';
44
import { useObservable } from '@jetstream/shared/ui-utils';
5-
import { JetstreamEventSaveSoqlQueryFormatOptionsPayload, UserProfileUi } from '@jetstream/types';
5+
import { JetstreamEventSaveSoqlQueryFormatOptionsPayload } from '@jetstream/types';
66
import { AppLoading, fromJetstreamEvents } from '@jetstream/ui-core';
77
import { fromAppState } from '@jetstream/ui/app-state';
88
import { initDexieDb } from '@jetstream/ui/db';
@@ -59,10 +59,18 @@ export const AppInitializer: FunctionComponent<AppInitializerProps> = ({ allowWi
5959
const org = getCanvasOrg();
6060
const preferences = await getCanvasPreferences(org);
6161
if (preferences && Object.keys(preferences).length > 0) {
62-
setUserProfile((prev: UserProfileUi) => ({
63-
...prev,
64-
preferences: { ...prev.preferences, ...preferences },
65-
}));
62+
setUserProfile((prev) => {
63+
if (prev instanceof Promise) {
64+
return prev.then((resolved) => ({
65+
...resolved,
66+
preferences: { ...resolved.preferences, ...preferences },
67+
}));
68+
}
69+
return {
70+
...prev,
71+
preferences: { ...prev.preferences, ...preferences },
72+
};
73+
});
6674
}
6775
} catch (ex) {
6876
logger.error('Error loading canvas preferences', ex);
@@ -78,10 +86,18 @@ export const AppInitializer: FunctionComponent<AppInitializerProps> = ({ allowWi
7886
const org = getCanvasOrg();
7987
const soqlQueryFormatOptions = onSaveSoqlQueryFormatOptions.value;
8088
await updateCanvasPreferences(org, { soqlQueryFormatOptions });
81-
setUserProfile((prev: UserProfileUi) => ({
82-
...prev,
83-
preferences: { ...prev.preferences, soqlQueryFormatOptions },
84-
}));
89+
setUserProfile((prev) => {
90+
if (prev instanceof Promise) {
91+
return prev.then((resolved) => ({
92+
...resolved,
93+
preferences: { ...resolved.preferences, soqlQueryFormatOptions },
94+
}));
95+
}
96+
return {
97+
...prev,
98+
preferences: { ...prev.preferences, soqlQueryFormatOptions },
99+
};
100+
});
85101
} catch (ex) {
86102
logger.error('Error saving query format options', ex);
87103
}

apps/jetstream-canvas/src/controllers/route.utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export function createRoute<TParamsSchema extends z.ZodTypeAny, TBodySchema exte
8181
try {
8282
const data = {
8383
params: params ? params.parse(req.params) : undefined,
84-
body: body && parsedBody ? body.parse(parsedBody) : undefined,
84+
body: body && parsedBody !== undefined ? body.parse(parsedBody) : undefined,
8585
query: query ? query.parse(queryParams) : undefined,
8686
jetstreamConn: req.jetstreamConn,
8787
targetJetstreamConn: req.targetJetstreamConn,

apps/jetstream-canvas/src/utils/api-client.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import { OrgAndApiConnection } from './canvas.types';
77
export const fetchFn: Parameters<typeof getApiRequestFactoryFn>[0] = (url, options) => {
88
return new Promise<Response>((resolve, reject) => {
99
const headers = (options.headers as Record<string, string>) || {};
10+
const contentType = Object.entries(headers).find(([key]) => key.toLowerCase() === 'content-type')?.[1] || 'application/json';
1011
window.Sfdc.canvas.client.ajax(url, {
1112
client: sr.client,
1213
method: options.method,
1314
async: true,
14-
contentType: headers['content-type'] || 'application/json',
15+
contentType,
1516
headers,
1617
data: options.body,
1718
// targetOrigin
@@ -21,8 +22,8 @@ export const fetchFn: Parameters<typeof getApiRequestFactoryFn>[0] = (url, optio
2122
// based on the caller-specified `outputType`, not content-type headers.
2223
resolve(new Response(payload, { status, statusText }));
2324
},
24-
failure: ({ status, statusText }) => {
25-
reject(new Error(`Canvas AJAX failed: ${status} ${statusText}`));
25+
failure: (responseText, xhr) => {
26+
reject(new Error(`Canvas AJAX failed: ${xhr.status} ${responseText}`));
2627
},
2728
});
2829
});

libs/types/src/lib/salesforce/canvas.types.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,14 @@ export interface SfdcCanvasXd {
614614
/** `Sfdc.canvas.client.ajax` settings inferred from defaults + code */
615615
export interface SfdcCanvasClientAjaxSettings {
616616
success: (response: SfdcCanvasClientResponse<any>) => void;
617+
/** Called when the XHR returns a non-2xx/304 status or on network error. */
618+
failure?: (responseText: string, xhr: XMLHttpRequest, config: SfdcCanvasClientAjaxSettings) => void;
619+
/** Called before the request is sent. Return `false` to cancel. */
620+
beforerequest?: () => boolean;
621+
/** Called after success or failure, regardless of outcome. */
622+
complete?: (responseText: string, xhr: XMLHttpRequest, config: SfdcCanvasClientAjaxSettings) => void;
623+
/** The `this` context used when invoking success/failure/complete callbacks. */
624+
context?: any;
617625

618626
client: SfdcCanvasOAuthClient;
619627

0 commit comments

Comments
 (0)