@basedash/embed 0.1.0

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/dist/index.js ADDED
@@ -0,0 +1,129 @@
1
+ // src/embed.ts
2
+ var DEFAULT_BASEDASH_URL = "https://charts.basedash.com";
3
+ var EMBED_QUERY_PARAMS = {
4
+ theme: "theme",
5
+ hideOrgName: "hide_org_name",
6
+ hideChat: "hide_chat",
7
+ hideDashboards: "hide_dashboards",
8
+ hideInsights: "hide_insights",
9
+ hideAutomations: "hide_automations",
10
+ hideSuggestedPrompts: "hide_suggested_prompts"
11
+ };
12
+ var DEFAULT_EMBED_OPTIONS = {
13
+ theme: "auto",
14
+ hideOrgName: false,
15
+ hideChat: false,
16
+ hideDashboards: false,
17
+ hideInsights: false,
18
+ hideAutomations: false,
19
+ hideSuggestedPrompts: false
20
+ };
21
+ var CHAT_EMBED_OPTIONS = {
22
+ ...DEFAULT_EMBED_OPTIONS,
23
+ hideOrgName: true,
24
+ hideDashboards: true,
25
+ hideInsights: true,
26
+ hideAutomations: true
27
+ };
28
+ var DASHBOARDS_EMBED_OPTIONS = {
29
+ ...DEFAULT_EMBED_OPTIONS,
30
+ hideOrgName: true,
31
+ hideChat: true,
32
+ hideInsights: true,
33
+ hideAutomations: true
34
+ };
35
+ var INSIGHTS_EMBED_OPTIONS = {
36
+ ...DEFAULT_EMBED_OPTIONS,
37
+ hideOrgName: true,
38
+ hideChat: true,
39
+ hideDashboards: true,
40
+ hideAutomations: true
41
+ };
42
+ var AUTOMATIONS_EMBED_OPTIONS = {
43
+ ...DEFAULT_EMBED_OPTIONS,
44
+ hideOrgName: true,
45
+ hideChat: true,
46
+ hideDashboards: true,
47
+ hideInsights: true
48
+ };
49
+ function buildEmbedUrl({
50
+ token,
51
+ options,
52
+ instanceUrl = DEFAULT_BASEDASH_URL
53
+ }) {
54
+ assertNonEmpty(token, "token");
55
+ const url = createInstanceUrl(instanceUrl, "api/sso/jwt");
56
+ const resolvedOptions = {
57
+ theme: options?.theme ?? DEFAULT_EMBED_OPTIONS.theme,
58
+ hideOrgName: options?.hideOrgName ?? DEFAULT_EMBED_OPTIONS.hideOrgName,
59
+ hideChat: options?.hideChat ?? DEFAULT_EMBED_OPTIONS.hideChat,
60
+ hideDashboards: options?.hideDashboards ?? DEFAULT_EMBED_OPTIONS.hideDashboards,
61
+ hideInsights: options?.hideInsights ?? DEFAULT_EMBED_OPTIONS.hideInsights,
62
+ hideAutomations: options?.hideAutomations ?? DEFAULT_EMBED_OPTIONS.hideAutomations,
63
+ hideSuggestedPrompts: options?.hideSuggestedPrompts ?? DEFAULT_EMBED_OPTIONS.hideSuggestedPrompts
64
+ };
65
+ url.searchParams.set("jwt", token);
66
+ url.searchParams.set(EMBED_QUERY_PARAMS.theme, resolvedOptions.theme);
67
+ url.searchParams.set(
68
+ EMBED_QUERY_PARAMS.hideOrgName,
69
+ String(resolvedOptions.hideOrgName)
70
+ );
71
+ url.searchParams.set(
72
+ EMBED_QUERY_PARAMS.hideChat,
73
+ String(resolvedOptions.hideChat)
74
+ );
75
+ url.searchParams.set(
76
+ EMBED_QUERY_PARAMS.hideDashboards,
77
+ String(resolvedOptions.hideDashboards)
78
+ );
79
+ url.searchParams.set(
80
+ EMBED_QUERY_PARAMS.hideInsights,
81
+ String(resolvedOptions.hideInsights)
82
+ );
83
+ url.searchParams.set(
84
+ EMBED_QUERY_PARAMS.hideAutomations,
85
+ String(resolvedOptions.hideAutomations)
86
+ );
87
+ url.searchParams.set(
88
+ EMBED_QUERY_PARAMS.hideSuggestedPrompts,
89
+ String(resolvedOptions.hideSuggestedPrompts)
90
+ );
91
+ return url.toString();
92
+ }
93
+ function buildSharedDashboardUrl({
94
+ publicSharingLinkId,
95
+ filterToken,
96
+ instanceUrl = DEFAULT_BASEDASH_URL
97
+ }) {
98
+ assertNonEmpty(publicSharingLinkId, "publicSharingLinkId");
99
+ const path = filterToken ? `shared/${encodeURIComponent(publicSharingLinkId)}/${encodeURIComponent(
100
+ filterToken
101
+ )}` : `shared/${encodeURIComponent(publicSharingLinkId)}`;
102
+ return createInstanceUrl(instanceUrl, path).toString();
103
+ }
104
+ function createInstanceUrl(instanceUrl, path) {
105
+ let baseUrl;
106
+ try {
107
+ baseUrl = new URL(instanceUrl);
108
+ } catch {
109
+ throw new TypeError(`instanceUrl must be a valid URL: ${instanceUrl}`);
110
+ }
111
+ if (baseUrl.protocol !== "https:" && baseUrl.protocol !== "http:") {
112
+ throw new TypeError("instanceUrl must use http or https");
113
+ }
114
+ baseUrl.search = "";
115
+ baseUrl.hash = "";
116
+ if (!baseUrl.pathname.endsWith("/")) {
117
+ baseUrl.pathname += "/";
118
+ }
119
+ return new URL(path, baseUrl);
120
+ }
121
+ function assertNonEmpty(value, name) {
122
+ if (value.trim().length === 0) {
123
+ throw new TypeError(`${name} must not be empty`);
124
+ }
125
+ }
126
+
127
+ export { AUTOMATIONS_EMBED_OPTIONS, CHAT_EMBED_OPTIONS, DASHBOARDS_EMBED_OPTIONS, DEFAULT_BASEDASH_URL, DEFAULT_EMBED_OPTIONS, EMBED_QUERY_PARAMS, INSIGHTS_EMBED_OPTIONS, buildEmbedUrl, buildSharedDashboardUrl };
128
+ //# sourceMappingURL=index.js.map
129
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embed.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export const DEFAULT_BASEDASH_URL = \"https://charts.basedash.com\";\n\nexport const EMBED_QUERY_PARAMS = {\n theme: \"theme\",\n hideOrgName: \"hide_org_name\",\n hideChat: \"hide_chat\",\n hideDashboards: \"hide_dashboards\",\n hideInsights: \"hide_insights\",\n hideAutomations: \"hide_automations\",\n hideSuggestedPrompts: \"hide_suggested_prompts\",\n} as const;\n\nexport type BasedashTheme = \"light\" | \"dark\" | \"auto\";\n\nexport type BasedashRole = \"ADMIN\" | \"MEMBER\";\n\nexport interface EmbedUser {\n email: string;\n firstName?: string;\n lastName?: string;\n role?: BasedashRole;\n /**\n * Reserved for future group synchronization support in Basedash.\n */\n groups?: string[];\n}\n\nexport interface EmbedOptions {\n theme?: BasedashTheme;\n hideOrgName?: boolean;\n hideChat?: boolean;\n hideDashboards?: boolean;\n hideInsights?: boolean;\n hideAutomations?: boolean;\n hideSuggestedPrompts?: boolean;\n}\n\nexport interface BuildEmbedUrlOptions {\n token: string;\n options?: EmbedOptions;\n /**\n * Override this when embedding a self-hosted Basedash instance.\n *\n * @default \"https://charts.basedash.com\"\n */\n instanceUrl?: string;\n}\n\nexport interface BuildSharedDashboardUrlOptions {\n publicSharingLinkId: string;\n /**\n * A token created with `createDashboardFilterToken` from\n * `@basedash/embed/server`.\n */\n filterToken?: string;\n /**\n * Override this when embedding a self-hosted Basedash instance.\n *\n * @default \"https://charts.basedash.com\"\n */\n instanceUrl?: string;\n}\n\nexport const DEFAULT_EMBED_OPTIONS = {\n theme: \"auto\",\n hideOrgName: false,\n hideChat: false,\n hideDashboards: false,\n hideInsights: false,\n hideAutomations: false,\n hideSuggestedPrompts: false,\n} as const satisfies Required<EmbedOptions>;\n\nexport const CHAT_EMBED_OPTIONS = {\n ...DEFAULT_EMBED_OPTIONS,\n hideOrgName: true,\n hideDashboards: true,\n hideInsights: true,\n hideAutomations: true,\n} as const satisfies Required<EmbedOptions>;\n\nexport const DASHBOARDS_EMBED_OPTIONS = {\n ...DEFAULT_EMBED_OPTIONS,\n hideOrgName: true,\n hideChat: true,\n hideInsights: true,\n hideAutomations: true,\n} as const satisfies Required<EmbedOptions>;\n\nexport const INSIGHTS_EMBED_OPTIONS = {\n ...DEFAULT_EMBED_OPTIONS,\n hideOrgName: true,\n hideChat: true,\n hideDashboards: true,\n hideAutomations: true,\n} as const satisfies Required<EmbedOptions>;\n\nexport const AUTOMATIONS_EMBED_OPTIONS = {\n ...DEFAULT_EMBED_OPTIONS,\n hideOrgName: true,\n hideChat: true,\n hideDashboards: true,\n hideInsights: true,\n} as const satisfies Required<EmbedOptions>;\n\nexport function buildEmbedUrl({\n token,\n options,\n instanceUrl = DEFAULT_BASEDASH_URL,\n}: BuildEmbedUrlOptions): string {\n assertNonEmpty(token, \"token\");\n\n const url = createInstanceUrl(instanceUrl, \"api/sso/jwt\");\n const resolvedOptions: Required<EmbedOptions> = {\n theme: options?.theme ?? DEFAULT_EMBED_OPTIONS.theme,\n hideOrgName:\n options?.hideOrgName ?? DEFAULT_EMBED_OPTIONS.hideOrgName,\n hideChat: options?.hideChat ?? DEFAULT_EMBED_OPTIONS.hideChat,\n hideDashboards:\n options?.hideDashboards ?? DEFAULT_EMBED_OPTIONS.hideDashboards,\n hideInsights:\n options?.hideInsights ?? DEFAULT_EMBED_OPTIONS.hideInsights,\n hideAutomations:\n options?.hideAutomations ?? DEFAULT_EMBED_OPTIONS.hideAutomations,\n hideSuggestedPrompts:\n options?.hideSuggestedPrompts ??\n DEFAULT_EMBED_OPTIONS.hideSuggestedPrompts,\n };\n\n url.searchParams.set(\"jwt\", token);\n url.searchParams.set(EMBED_QUERY_PARAMS.theme, resolvedOptions.theme);\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideOrgName,\n String(resolvedOptions.hideOrgName),\n );\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideChat,\n String(resolvedOptions.hideChat),\n );\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideDashboards,\n String(resolvedOptions.hideDashboards),\n );\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideInsights,\n String(resolvedOptions.hideInsights),\n );\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideAutomations,\n String(resolvedOptions.hideAutomations),\n );\n url.searchParams.set(\n EMBED_QUERY_PARAMS.hideSuggestedPrompts,\n String(resolvedOptions.hideSuggestedPrompts),\n );\n\n return url.toString();\n}\n\nexport function buildSharedDashboardUrl({\n publicSharingLinkId,\n filterToken,\n instanceUrl = DEFAULT_BASEDASH_URL,\n}: BuildSharedDashboardUrlOptions): string {\n assertNonEmpty(publicSharingLinkId, \"publicSharingLinkId\");\n\n const path = filterToken\n ? `shared/${encodeURIComponent(publicSharingLinkId)}/${encodeURIComponent(\n filterToken,\n )}`\n : `shared/${encodeURIComponent(publicSharingLinkId)}`;\n\n return createInstanceUrl(instanceUrl, path).toString();\n}\n\nfunction createInstanceUrl(instanceUrl: string, path: string): URL {\n let baseUrl: URL;\n\n try {\n baseUrl = new URL(instanceUrl);\n } catch {\n throw new TypeError(`instanceUrl must be a valid URL: ${instanceUrl}`);\n }\n\n if (baseUrl.protocol !== \"https:\" && baseUrl.protocol !== \"http:\") {\n throw new TypeError(\"instanceUrl must use http or https\");\n }\n\n baseUrl.search = \"\";\n baseUrl.hash = \"\";\n if (!baseUrl.pathname.endsWith(\"/\")) {\n baseUrl.pathname += \"/\";\n }\n\n return new URL(path, baseUrl);\n}\n\nfunction assertNonEmpty(value: string, name: string): void {\n if (value.trim().length === 0) {\n throw new TypeError(`${name} must not be empty`);\n }\n}\n"]}
package/dist/react.cjs ADDED
@@ -0,0 +1,486 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/react/index.tsx
7
+
8
+ // src/embed.ts
9
+ var DEFAULT_BASEDASH_URL = "https://charts.basedash.com";
10
+ var EMBED_QUERY_PARAMS = {
11
+ theme: "theme",
12
+ hideOrgName: "hide_org_name",
13
+ hideChat: "hide_chat",
14
+ hideDashboards: "hide_dashboards",
15
+ hideInsights: "hide_insights",
16
+ hideAutomations: "hide_automations",
17
+ hideSuggestedPrompts: "hide_suggested_prompts"
18
+ };
19
+ var DEFAULT_EMBED_OPTIONS = {
20
+ theme: "auto",
21
+ hideOrgName: false,
22
+ hideChat: false,
23
+ hideDashboards: false,
24
+ hideInsights: false,
25
+ hideAutomations: false,
26
+ hideSuggestedPrompts: false
27
+ };
28
+ var CHAT_EMBED_OPTIONS = {
29
+ ...DEFAULT_EMBED_OPTIONS,
30
+ hideOrgName: true,
31
+ hideDashboards: true,
32
+ hideInsights: true,
33
+ hideAutomations: true
34
+ };
35
+ var DASHBOARDS_EMBED_OPTIONS = {
36
+ ...DEFAULT_EMBED_OPTIONS,
37
+ hideOrgName: true,
38
+ hideChat: true,
39
+ hideInsights: true,
40
+ hideAutomations: true
41
+ };
42
+ var INSIGHTS_EMBED_OPTIONS = {
43
+ ...DEFAULT_EMBED_OPTIONS,
44
+ hideOrgName: true,
45
+ hideChat: true,
46
+ hideDashboards: true,
47
+ hideAutomations: true
48
+ };
49
+ var AUTOMATIONS_EMBED_OPTIONS = {
50
+ ...DEFAULT_EMBED_OPTIONS,
51
+ hideOrgName: true,
52
+ hideChat: true,
53
+ hideDashboards: true,
54
+ hideInsights: true
55
+ };
56
+ function buildEmbedUrl({
57
+ token,
58
+ options,
59
+ instanceUrl = DEFAULT_BASEDASH_URL
60
+ }) {
61
+ assertNonEmpty(token, "token");
62
+ const url = createInstanceUrl(instanceUrl, "api/sso/jwt");
63
+ const resolvedOptions = {
64
+ theme: options?.theme ?? DEFAULT_EMBED_OPTIONS.theme,
65
+ hideOrgName: options?.hideOrgName ?? DEFAULT_EMBED_OPTIONS.hideOrgName,
66
+ hideChat: options?.hideChat ?? DEFAULT_EMBED_OPTIONS.hideChat,
67
+ hideDashboards: options?.hideDashboards ?? DEFAULT_EMBED_OPTIONS.hideDashboards,
68
+ hideInsights: options?.hideInsights ?? DEFAULT_EMBED_OPTIONS.hideInsights,
69
+ hideAutomations: options?.hideAutomations ?? DEFAULT_EMBED_OPTIONS.hideAutomations,
70
+ hideSuggestedPrompts: options?.hideSuggestedPrompts ?? DEFAULT_EMBED_OPTIONS.hideSuggestedPrompts
71
+ };
72
+ url.searchParams.set("jwt", token);
73
+ url.searchParams.set(EMBED_QUERY_PARAMS.theme, resolvedOptions.theme);
74
+ url.searchParams.set(
75
+ EMBED_QUERY_PARAMS.hideOrgName,
76
+ String(resolvedOptions.hideOrgName)
77
+ );
78
+ url.searchParams.set(
79
+ EMBED_QUERY_PARAMS.hideChat,
80
+ String(resolvedOptions.hideChat)
81
+ );
82
+ url.searchParams.set(
83
+ EMBED_QUERY_PARAMS.hideDashboards,
84
+ String(resolvedOptions.hideDashboards)
85
+ );
86
+ url.searchParams.set(
87
+ EMBED_QUERY_PARAMS.hideInsights,
88
+ String(resolvedOptions.hideInsights)
89
+ );
90
+ url.searchParams.set(
91
+ EMBED_QUERY_PARAMS.hideAutomations,
92
+ String(resolvedOptions.hideAutomations)
93
+ );
94
+ url.searchParams.set(
95
+ EMBED_QUERY_PARAMS.hideSuggestedPrompts,
96
+ String(resolvedOptions.hideSuggestedPrompts)
97
+ );
98
+ return url.toString();
99
+ }
100
+ function buildSharedDashboardUrl({
101
+ publicSharingLinkId,
102
+ filterToken,
103
+ instanceUrl = DEFAULT_BASEDASH_URL
104
+ }) {
105
+ assertNonEmpty(publicSharingLinkId, "publicSharingLinkId");
106
+ const path = filterToken ? `shared/${encodeURIComponent(publicSharingLinkId)}/${encodeURIComponent(
107
+ filterToken
108
+ )}` : `shared/${encodeURIComponent(publicSharingLinkId)}`;
109
+ return createInstanceUrl(instanceUrl, path).toString();
110
+ }
111
+ function createInstanceUrl(instanceUrl, path) {
112
+ let baseUrl;
113
+ try {
114
+ baseUrl = new URL(instanceUrl);
115
+ } catch {
116
+ throw new TypeError(`instanceUrl must be a valid URL: ${instanceUrl}`);
117
+ }
118
+ if (baseUrl.protocol !== "https:" && baseUrl.protocol !== "http:") {
119
+ throw new TypeError("instanceUrl must use http or https");
120
+ }
121
+ baseUrl.search = "";
122
+ baseUrl.hash = "";
123
+ if (!baseUrl.pathname.endsWith("/")) {
124
+ baseUrl.pathname += "/";
125
+ }
126
+ return new URL(path, baseUrl);
127
+ }
128
+ function assertNonEmpty(value, name) {
129
+ if (value.trim().length === 0) {
130
+ throw new TypeError(`${name} must not be empty`);
131
+ }
132
+ }
133
+ var BasedashContext = react.createContext(null);
134
+ function BasedashProvider({
135
+ children,
136
+ token: tokenProp,
137
+ fetchToken,
138
+ instanceUrl = DEFAULT_BASEDASH_URL,
139
+ theme = "auto"
140
+ }) {
141
+ const fetchTokenRef = react.useRef(fetchToken);
142
+ const hasFetchedRef = react.useRef(false);
143
+ const requestIdRef = react.useRef(0);
144
+ const [state, setState] = react.useState(
145
+ () => tokenProp === void 0 ? { token: void 0, status: "loading", error: void 0 } : {
146
+ token: validateToken(tokenProp),
147
+ status: "ready",
148
+ error: void 0
149
+ }
150
+ );
151
+ react.useEffect(() => {
152
+ fetchTokenRef.current = fetchToken;
153
+ }, [fetchToken]);
154
+ const refreshToken = react.useCallback(async () => {
155
+ if (tokenProp !== void 0) {
156
+ const token = validateToken(tokenProp);
157
+ setState({ token, status: "ready", error: void 0 });
158
+ return token;
159
+ }
160
+ const tokenLoader = fetchTokenRef.current;
161
+ if (tokenLoader === void 0) {
162
+ throw new Error(
163
+ "BasedashProvider requires either token or fetchToken to be set"
164
+ );
165
+ }
166
+ const requestId = ++requestIdRef.current;
167
+ setState((current) => ({
168
+ token: current.token,
169
+ status: "loading",
170
+ error: void 0
171
+ }));
172
+ try {
173
+ const token = validateToken(await tokenLoader());
174
+ if (requestId === requestIdRef.current) {
175
+ setState({ token, status: "ready", error: void 0 });
176
+ }
177
+ return token;
178
+ } catch (error) {
179
+ const resolvedError = toError(error);
180
+ if (requestId === requestIdRef.current) {
181
+ setState({
182
+ token: void 0,
183
+ status: "error",
184
+ error: resolvedError
185
+ });
186
+ }
187
+ throw resolvedError;
188
+ }
189
+ }, [tokenProp]);
190
+ react.useEffect(() => {
191
+ if (tokenProp !== void 0) {
192
+ setState({
193
+ token: validateToken(tokenProp),
194
+ status: "ready",
195
+ error: void 0
196
+ });
197
+ hasFetchedRef.current = false;
198
+ return;
199
+ }
200
+ if (!hasFetchedRef.current) {
201
+ hasFetchedRef.current = true;
202
+ void refreshToken().catch(() => {
203
+ });
204
+ }
205
+ }, [refreshToken, tokenProp]);
206
+ const value = react.useMemo(
207
+ () => ({
208
+ ...state,
209
+ instanceUrl,
210
+ theme,
211
+ refreshToken
212
+ }),
213
+ [instanceUrl, refreshToken, state, theme]
214
+ );
215
+ return /* @__PURE__ */ jsxRuntime.jsx(BasedashContext.Provider, { value, children });
216
+ }
217
+ function useBasedash() {
218
+ const context = react.useContext(BasedashContext);
219
+ if (context === null) {
220
+ throw new Error("useBasedash must be used inside a BasedashProvider");
221
+ }
222
+ return context;
223
+ }
224
+ var BasedashApp = react.forwardRef(
225
+ function BasedashApp2({
226
+ token,
227
+ instanceUrl,
228
+ theme,
229
+ hideOrgName,
230
+ hideChat,
231
+ hideDashboards,
232
+ hideInsights,
233
+ hideAutomations,
234
+ hideSuggestedPrompts,
235
+ title = "Basedash",
236
+ ...frameProps
237
+ }, ref) {
238
+ return /* @__PURE__ */ jsxRuntime.jsx(
239
+ AuthenticatedBasedashFrame,
240
+ {
241
+ ref,
242
+ token,
243
+ instanceUrl,
244
+ options: {
245
+ theme,
246
+ hideOrgName,
247
+ hideChat,
248
+ hideDashboards,
249
+ hideInsights,
250
+ hideAutomations,
251
+ hideSuggestedPrompts
252
+ },
253
+ title,
254
+ ...frameProps
255
+ }
256
+ );
257
+ }
258
+ );
259
+ var BasedashChat = react.forwardRef(
260
+ function BasedashChat2({
261
+ token,
262
+ instanceUrl,
263
+ theme,
264
+ hideOrgName,
265
+ hideSuggestedPrompts,
266
+ title = "Basedash chat",
267
+ ...frameProps
268
+ }, ref) {
269
+ return /* @__PURE__ */ jsxRuntime.jsx(
270
+ AuthenticatedBasedashFrame,
271
+ {
272
+ ref,
273
+ token,
274
+ instanceUrl,
275
+ options: {
276
+ ...CHAT_EMBED_OPTIONS,
277
+ theme: theme ?? CHAT_EMBED_OPTIONS.theme,
278
+ hideOrgName: hideOrgName ?? CHAT_EMBED_OPTIONS.hideOrgName,
279
+ hideSuggestedPrompts: hideSuggestedPrompts ?? CHAT_EMBED_OPTIONS.hideSuggestedPrompts
280
+ },
281
+ title,
282
+ ...frameProps
283
+ }
284
+ );
285
+ }
286
+ );
287
+ var BasedashDashboards = react.forwardRef(function BasedashDashboards2({
288
+ token,
289
+ instanceUrl,
290
+ theme,
291
+ hideOrgName,
292
+ title = "Basedash dashboards",
293
+ ...frameProps
294
+ }, ref) {
295
+ return /* @__PURE__ */ jsxRuntime.jsx(
296
+ AuthenticatedBasedashFrame,
297
+ {
298
+ ref,
299
+ token,
300
+ instanceUrl,
301
+ options: {
302
+ ...DASHBOARDS_EMBED_OPTIONS,
303
+ theme: theme ?? DASHBOARDS_EMBED_OPTIONS.theme,
304
+ hideOrgName: hideOrgName ?? DASHBOARDS_EMBED_OPTIONS.hideOrgName
305
+ },
306
+ title,
307
+ ...frameProps
308
+ }
309
+ );
310
+ });
311
+ var BasedashInsights = react.forwardRef(function BasedashInsights2({
312
+ token,
313
+ instanceUrl,
314
+ theme,
315
+ hideOrgName,
316
+ title = "Basedash insights",
317
+ ...frameProps
318
+ }, ref) {
319
+ return /* @__PURE__ */ jsxRuntime.jsx(
320
+ AuthenticatedBasedashFrame,
321
+ {
322
+ ref,
323
+ token,
324
+ instanceUrl,
325
+ options: {
326
+ ...INSIGHTS_EMBED_OPTIONS,
327
+ theme: theme ?? INSIGHTS_EMBED_OPTIONS.theme,
328
+ hideOrgName: hideOrgName ?? INSIGHTS_EMBED_OPTIONS.hideOrgName
329
+ },
330
+ title,
331
+ ...frameProps
332
+ }
333
+ );
334
+ });
335
+ var BasedashAutomations = react.forwardRef(function BasedashAutomations2({
336
+ token,
337
+ instanceUrl,
338
+ theme,
339
+ hideOrgName,
340
+ title = "Basedash automations",
341
+ ...frameProps
342
+ }, ref) {
343
+ return /* @__PURE__ */ jsxRuntime.jsx(
344
+ AuthenticatedBasedashFrame,
345
+ {
346
+ ref,
347
+ token,
348
+ instanceUrl,
349
+ options: {
350
+ ...AUTOMATIONS_EMBED_OPTIONS,
351
+ theme: theme ?? AUTOMATIONS_EMBED_OPTIONS.theme,
352
+ hideOrgName: hideOrgName ?? AUTOMATIONS_EMBED_OPTIONS.hideOrgName
353
+ },
354
+ title,
355
+ ...frameProps
356
+ }
357
+ );
358
+ });
359
+ var BasedashSharedDashboard = react.forwardRef(function BasedashSharedDashboard2({
360
+ publicSharingLinkId,
361
+ filterToken,
362
+ instanceUrl,
363
+ title = "Basedash dashboard",
364
+ ...frameProps
365
+ }, ref) {
366
+ const src = buildSharedDashboardUrl({
367
+ publicSharingLinkId,
368
+ filterToken,
369
+ instanceUrl
370
+ });
371
+ return /* @__PURE__ */ jsxRuntime.jsx(BasedashFrame, { ref, src, title, ...frameProps });
372
+ });
373
+ var AuthenticatedBasedashFrame = react.forwardRef(function AuthenticatedBasedashFrame2({
374
+ token: tokenProp,
375
+ instanceUrl: instanceUrlProp,
376
+ options,
377
+ errorFallback,
378
+ ...frameProps
379
+ }, ref) {
380
+ const context = react.useContext(BasedashContext);
381
+ const token = tokenProp ?? context?.token;
382
+ const instanceUrl = instanceUrlProp ?? context?.instanceUrl ?? DEFAULT_BASEDASH_URL;
383
+ const theme = options.theme ?? context?.theme ?? "auto";
384
+ if (token === void 0) {
385
+ if (context === null) {
386
+ throw new Error(
387
+ "Authenticated Basedash embeds require a token prop or BasedashProvider"
388
+ );
389
+ }
390
+ if (context.status === "error" && context.error !== void 0) {
391
+ if (errorFallback === void 0) {
392
+ throw context.error;
393
+ }
394
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: typeof errorFallback === "function" ? errorFallback(context.error) : errorFallback });
395
+ }
396
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: frameProps.loadingFallback ?? null });
397
+ }
398
+ const src = buildEmbedUrl({
399
+ token,
400
+ instanceUrl,
401
+ options: {
402
+ ...options,
403
+ theme
404
+ }
405
+ });
406
+ return /* @__PURE__ */ jsxRuntime.jsx(BasedashFrame, { ref, src, ...frameProps });
407
+ });
408
+ var BasedashFrame = react.forwardRef(function BasedashFrame2({
409
+ src,
410
+ className,
411
+ style,
412
+ iframeProps,
413
+ loadingFallback,
414
+ title = "Basedash"
415
+ }, ref) {
416
+ const [loaded, setLoaded] = react.useState(false);
417
+ react.useEffect(() => {
418
+ setLoaded(false);
419
+ }, [src]);
420
+ return /* @__PURE__ */ jsxRuntime.jsxs(
421
+ "div",
422
+ {
423
+ className,
424
+ style: {
425
+ position: "relative",
426
+ width: "100%",
427
+ height: "100%",
428
+ ...style
429
+ },
430
+ children: [
431
+ !loaded && loadingFallback !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(
432
+ "div",
433
+ {
434
+ "aria-hidden": "true",
435
+ style: {
436
+ position: "absolute",
437
+ inset: 0
438
+ },
439
+ children: loadingFallback
440
+ }
441
+ ) : null,
442
+ /* @__PURE__ */ jsxRuntime.jsx(
443
+ "iframe",
444
+ {
445
+ ...iframeProps,
446
+ ref,
447
+ src,
448
+ title,
449
+ allow: iframeProps?.allow ?? "clipboard-write",
450
+ loading: iframeProps?.loading ?? "eager",
451
+ onLoad: (event) => {
452
+ setLoaded(true);
453
+ iframeProps?.onLoad?.(event);
454
+ },
455
+ style: {
456
+ width: "100%",
457
+ height: "100%",
458
+ border: 0,
459
+ ...iframeProps?.style
460
+ }
461
+ }
462
+ )
463
+ ]
464
+ }
465
+ );
466
+ });
467
+ function validateToken(token) {
468
+ if (token.trim().length === 0) {
469
+ throw new TypeError("Basedash token must not be empty");
470
+ }
471
+ return token;
472
+ }
473
+ function toError(error) {
474
+ return error instanceof Error ? error : new Error(String(error));
475
+ }
476
+
477
+ exports.BasedashApp = BasedashApp;
478
+ exports.BasedashAutomations = BasedashAutomations;
479
+ exports.BasedashChat = BasedashChat;
480
+ exports.BasedashDashboards = BasedashDashboards;
481
+ exports.BasedashInsights = BasedashInsights;
482
+ exports.BasedashProvider = BasedashProvider;
483
+ exports.BasedashSharedDashboard = BasedashSharedDashboard;
484
+ exports.useBasedash = useBasedash;
485
+ //# sourceMappingURL=react.cjs.map
486
+ //# sourceMappingURL=react.cjs.map