@bsuite/theme 0.4.1 → 0.4.2
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.
|
@@ -47,5 +47,5 @@ export interface BrandingProviderProps {
|
|
|
47
47
|
*/
|
|
48
48
|
applyPersistedOnMount?: boolean;
|
|
49
49
|
}
|
|
50
|
-
export declare function BrandingProvider({ children, supabaseClient, brand, applyPersistedOnMount, }: BrandingProviderProps): import("react
|
|
50
|
+
export declare function BrandingProvider({ children, supabaseClient, brand, applyPersistedOnMount, }: BrandingProviderProps): import("react").JSX.Element;
|
|
51
51
|
//# sourceMappingURL=BrandingProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandingProvider.d.ts","sourceRoot":"","sources":["../../src/react/BrandingProvider.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAO3D,eAAO,MAAM,oBAAoB,2BAA2B,CAAA;AAC5D,eAAO,MAAM,sBAAsB,kCAAkC,CAAA;AAErE,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,eAAO,MAAM,eAAe,2DAA6D,CAAA;AAEzF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE9C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAA;IACnB,2DAA2D;IAC3D,cAAc,EAAE,cAAc,CAAA;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AA+KD,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,KAAgB,EAChB,qBAA4B,GAC7B,EAAE,qBAAqB
|
|
1
|
+
{"version":3,"file":"BrandingProvider.d.ts","sourceRoot":"","sources":["../../src/react/BrandingProvider.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAO3D,eAAO,MAAM,oBAAoB,2BAA2B,CAAA;AAC5D,eAAO,MAAM,sBAAsB,kCAAkC,CAAA;AAErE,yDAAyD;AACzD,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED,eAAO,MAAM,eAAe,2DAA6D,CAAA;AAEzF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE9C,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAA;IACnB,2DAA2D;IAC3D,cAAc,EAAE,cAAc,CAAA;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AA+KD,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,cAAc,EACd,KAAgB,EAChB,qBAA4B,GAC7B,EAAE,qBAAqB,+BA4GvB"}
|
|
@@ -214,6 +214,9 @@ export function BrandingProvider({ children, supabaseClient, brand = 'bsuite', a
|
|
|
214
214
|
const [isLoading, setIsLoading] = useState(brand !== 'braden');
|
|
215
215
|
const [error, setError] = useState(null);
|
|
216
216
|
const channelRef = useRef(null);
|
|
217
|
+
// True when the last fetch was skipped (or failed) for lack of a session —
|
|
218
|
+
// the SIGNED_IN listener uses this to refetch exactly once when auth lands.
|
|
219
|
+
const needsAuthedRefetchRef = useRef(false);
|
|
217
220
|
// ── Braden short-circuit ──────────────────────────────────────────────────
|
|
218
221
|
// Braden corporate uses static CSS from @bsuite/theme/braden-css — no runtime
|
|
219
222
|
// tenant overrides needed. Skip all Supabase calls entirely.
|
|
@@ -230,6 +233,18 @@ export function BrandingProvider({ children, supabaseClient, brand = 'bsuite', a
|
|
|
230
233
|
setIsLoading(true);
|
|
231
234
|
setError(null);
|
|
232
235
|
try {
|
|
236
|
+
// branding_json_for_tenant is granted to `authenticated` only — calling
|
|
237
|
+
// it in anon context is a guaranteed PostgREST 401 (42501). Consumers
|
|
238
|
+
// can mount this provider before session hydration completes (or on
|
|
239
|
+
// genuinely public pages); skip the RPC and let defaults stand. The
|
|
240
|
+
// SIGNED_IN listener below refetches once auth arrives.
|
|
241
|
+
const { data: sessionData } = await supabaseClient.auth.getSession();
|
|
242
|
+
if (!sessionData.session) {
|
|
243
|
+
needsAuthedRefetchRef.current = true;
|
|
244
|
+
setIsLoading(false);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
needsAuthedRefetchRef.current = false;
|
|
233
248
|
const { data, error: rpcError } = await supabaseClient.rpc('branding_json_for_tenant');
|
|
234
249
|
if (rpcError)
|
|
235
250
|
throw new Error(rpcError.message);
|
|
@@ -261,6 +276,19 @@ export function BrandingProvider({ children, supabaseClient, brand = 'bsuite', a
|
|
|
261
276
|
useEffect(() => {
|
|
262
277
|
void fetchBranding();
|
|
263
278
|
}, [fetchBranding]);
|
|
279
|
+
// Refetch once when a session arrives after an anon-skipped mount (session
|
|
280
|
+
// hydration race). Deferred via setTimeout: onAuthStateChange callbacks run
|
|
281
|
+
// while supabase-js holds the auth lock, and fetchBranding calls
|
|
282
|
+
// getSession() — invoking it inline would self-deadlock (see the suite-wide
|
|
283
|
+
// "never await supabase calls inside onAuthStateChange" rule).
|
|
284
|
+
useEffect(() => {
|
|
285
|
+
const { data: { subscription } } = supabaseClient.auth.onAuthStateChange((event) => {
|
|
286
|
+
if (event === 'SIGNED_IN' && needsAuthedRefetchRef.current) {
|
|
287
|
+
setTimeout(() => { void fetchBranding(); }, 0);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
return () => { subscription.unsubscribe(); };
|
|
291
|
+
}, [supabaseClient, fetchBranding]);
|
|
264
292
|
// Subscribe to Realtime tenant row changes
|
|
265
293
|
useEffect(() => {
|
|
266
294
|
if (!isBrandingEnabled())
|
|
@@ -11,5 +11,5 @@ export interface ThemeProviderProps {
|
|
|
11
11
|
*/
|
|
12
12
|
storageKey?: string;
|
|
13
13
|
}
|
|
14
|
-
export declare function ThemeProvider({ children, defaultTheme, storageKey, }: ThemeProviderProps): import("react
|
|
14
|
+
export declare function ThemeProvider({ children, defaultTheme, storageKey, }: ThemeProviderProps): import("react").JSX.Element;
|
|
15
15
|
//# sourceMappingURL=ThemeProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/react/ThemeProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAyC,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAExG,eAAO,MAAM,YAAY,wDAA0D,CAAA;AAEnF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAA;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AA6BD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAuB,EACvB,UAA8B,GAC/B,EAAE,kBAAkB
|
|
1
|
+
{"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../src/react/ThemeProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAyC,KAAK,iBAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AAExG,eAAO,MAAM,YAAY,wDAA0D,CAAA;AAEnF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAA;IACnB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AA6BD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,YAAuB,EACvB,UAA8B,GAC/B,EAAE,kBAAkB,+BA4DpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsuite/theme",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"publishConfig": {
|
|
@@ -61,18 +61,18 @@
|
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@supabase/supabase-js": "^2.
|
|
64
|
+
"@supabase/supabase-js": "^2.108.1",
|
|
65
65
|
"@testing-library/jest-dom": "^6.9.1",
|
|
66
66
|
"@testing-library/react": "^16.3.2",
|
|
67
|
-
"@types/node": "^
|
|
68
|
-
"@types/react": "^19.2.
|
|
67
|
+
"@types/node": "^25.9.2",
|
|
68
|
+
"@types/react": "^19.2.17",
|
|
69
69
|
"@types/react-dom": "^19.2.3",
|
|
70
|
-
"@vitejs/plugin-react": "^6.0.
|
|
70
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
71
71
|
"jsdom": "^29.1.1",
|
|
72
|
-
"react": "^19.2.
|
|
73
|
-
"react-dom": "^19.2.
|
|
74
|
-
"typescript": "~
|
|
75
|
-
"vite": "^8.0.
|
|
76
|
-
"vitest": "^4.1.
|
|
72
|
+
"react": "^19.2.7",
|
|
73
|
+
"react-dom": "^19.2.7",
|
|
74
|
+
"typescript": "~6.0.3",
|
|
75
|
+
"vite": "^8.0.16",
|
|
76
|
+
"vitest": "^4.1.8"
|
|
77
77
|
}
|
|
78
78
|
}
|