@noya-app/noya-api-client-react 0.1.24 → 0.1.25

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.
@@ -6,13 +6,13 @@
6
6
  CLI Target: esnext
7
7
  CJS Build start
8
8
  ESM Build start
9
- ESM dist/index.mjs 8.81 KB
10
- ESM dist/index.mjs.map 15.57 KB
11
- ESM ⚡️ Build success in 17ms
12
- CJS dist/index.js 12.58 KB
13
- CJS dist/index.js.map 15.81 KB
14
- CJS ⚡️ Build success in 17ms
9
+ CJS dist/index.js 14.95 KB
10
+ CJS dist/index.js.map 19.34 KB
11
+ CJS ⚡️ Build success in 20ms
12
+ ESM dist/index.mjs 10.78 KB
13
+ ESM dist/index.mjs.map 19.08 KB
14
+ ESM ⚡️ Build success in 20ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 4014ms
17
- DTS dist/index.d.ts 9.53 KB
18
- DTS dist/index.d.mts 9.53 KB
16
+ DTS ⚡️ Build success in 4388ms
17
+ DTS dist/index.d.ts 10.92 KB
18
+ DTS dist/index.d.mts 10.92 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @noya-app/noya-api-client-react
2
2
 
3
+ ## 0.1.25
4
+
5
+ ### Patch Changes
6
+
7
+ - 50fc1a8: Bump packages
8
+ - Updated dependencies [50fc1a8]
9
+ - @noya-app/observable-react@0.1.15
10
+ - @noya-app/noya-api@0.1.25
11
+
3
12
  ## 0.1.24
4
13
 
5
14
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -194,6 +194,12 @@ declare function useNoyaBilling(): {
194
194
  } & {
195
195
  loading: boolean;
196
196
  };
197
+ declare function useNoyaWorkspaceBilling(workspaceId: string): {
198
+ portalUrl?: string | null;
199
+ subscriptions: any[];
200
+ availableProducts: any[];
201
+ loading: boolean;
202
+ };
197
203
  declare function useNoyaEmailLists(): {
198
204
  emailLists: {
199
205
  name: string;
@@ -347,5 +353,47 @@ declare function useNoyaPersonalAccessTokens(): {
347
353
  }[];
348
354
  loading: boolean;
349
355
  };
356
+ declare function useNoyaWorkspaces(): {
357
+ workspaces: {
358
+ name: string;
359
+ id: string;
360
+ createdAt: string;
361
+ updatedAt: string;
362
+ members: {
363
+ id: string;
364
+ role: "OWNER" | "ADMIN" | "MEMBER";
365
+ user: {
366
+ name: string | null;
367
+ id: string;
368
+ image: string | null;
369
+ email: string | null;
370
+ };
371
+ createdAt: string;
372
+ userId: string;
373
+ updatedAt: string;
374
+ workspaceId: string;
375
+ }[];
376
+ }[];
377
+ loading: boolean;
378
+ };
379
+ declare function useNoyaWorkspaceInvitations(workspaceId: string): {
380
+ invitations: {
381
+ id: string;
382
+ role: "OWNER" | "ADMIN" | "MEMBER";
383
+ email: string;
384
+ token: string;
385
+ createdAt: string;
386
+ updatedAt: string;
387
+ workspaceId: string;
388
+ invitedById: string;
389
+ acceptedAt: string | null;
390
+ expiresAt: string | null;
391
+ }[];
392
+ loading: boolean;
393
+ };
394
+ declare function useNoyaOwnedFileVersions(fileId: string): {
395
+ fileVersions: NoyaAPI.FileVersion[];
396
+ loading: NoyaAPI.DataLoadingState;
397
+ };
350
398
 
351
- export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaPersonalAccessTokens, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTools, useNoyaUserData, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
399
+ export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaOwnedFileVersions, useNoyaPersonalAccessTokens, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
package/dist/index.d.ts CHANGED
@@ -194,6 +194,12 @@ declare function useNoyaBilling(): {
194
194
  } & {
195
195
  loading: boolean;
196
196
  };
197
+ declare function useNoyaWorkspaceBilling(workspaceId: string): {
198
+ portalUrl?: string | null;
199
+ subscriptions: any[];
200
+ availableProducts: any[];
201
+ loading: boolean;
202
+ };
197
203
  declare function useNoyaEmailLists(): {
198
204
  emailLists: {
199
205
  name: string;
@@ -347,5 +353,47 @@ declare function useNoyaPersonalAccessTokens(): {
347
353
  }[];
348
354
  loading: boolean;
349
355
  };
356
+ declare function useNoyaWorkspaces(): {
357
+ workspaces: {
358
+ name: string;
359
+ id: string;
360
+ createdAt: string;
361
+ updatedAt: string;
362
+ members: {
363
+ id: string;
364
+ role: "OWNER" | "ADMIN" | "MEMBER";
365
+ user: {
366
+ name: string | null;
367
+ id: string;
368
+ image: string | null;
369
+ email: string | null;
370
+ };
371
+ createdAt: string;
372
+ userId: string;
373
+ updatedAt: string;
374
+ workspaceId: string;
375
+ }[];
376
+ }[];
377
+ loading: boolean;
378
+ };
379
+ declare function useNoyaWorkspaceInvitations(workspaceId: string): {
380
+ invitations: {
381
+ id: string;
382
+ role: "OWNER" | "ADMIN" | "MEMBER";
383
+ email: string;
384
+ token: string;
385
+ createdAt: string;
386
+ updatedAt: string;
387
+ workspaceId: string;
388
+ invitedById: string;
389
+ acceptedAt: string | null;
390
+ expiresAt: string | null;
391
+ }[];
392
+ loading: boolean;
393
+ };
394
+ declare function useNoyaOwnedFileVersions(fileId: string): {
395
+ fileVersions: NoyaAPI.FileVersion[];
396
+ loading: NoyaAPI.DataLoadingState;
397
+ };
350
398
 
351
- export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaPersonalAccessTokens, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTools, useNoyaUserData, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
399
+ export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaOwnedFileVersions, useNoyaPersonalAccessTokens, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
package/dist/index.js CHANGED
@@ -39,6 +39,7 @@ __export(src_exports, {
39
39
  useNoyaEmailLists: () => useNoyaEmailLists,
40
40
  useNoyaFiles: () => useNoyaFiles,
41
41
  useNoyaIsOwnFile: () => useNoyaIsOwnFile,
42
+ useNoyaOwnedFileVersions: () => useNoyaOwnedFileVersions,
42
43
  useNoyaPersonalAccessTokens: () => useNoyaPersonalAccessTokens,
43
44
  useNoyaSession: () => useNoyaSession,
44
45
  useNoyaSite: () => useNoyaSite,
@@ -46,6 +47,9 @@ __export(src_exports, {
46
47
  useNoyaTags: () => useNoyaTags,
47
48
  useNoyaTools: () => useNoyaTools,
48
49
  useNoyaUserData: () => useNoyaUserData,
50
+ useNoyaWorkspaceBilling: () => useNoyaWorkspaceBilling,
51
+ useNoyaWorkspaceInvitations: () => useNoyaWorkspaceInvitations,
52
+ useNoyaWorkspaces: () => useNoyaWorkspaces,
49
53
  useOptionalNoyaClient: () => useOptionalNoyaClient,
50
54
  useOptionalNoyaCreators: () => useOptionalNoyaCreators,
51
55
  useOptionalNoyaSession: () => useOptionalNoyaSession,
@@ -89,6 +93,7 @@ function useNoyaClientOrFallback() {
89
93
  var import_react2 = require("@legendapp/state/react");
90
94
  var import_noya_api2 = require("@noya-app/noya-api");
91
95
  var import_noya_utils = require("@noya-app/noya-utils");
96
+ var import_observable_react = require("@noya-app/observable-react");
92
97
  var import_react3 = require("react");
93
98
  function useNoyaFiles() {
94
99
  const client = useNoyaClientOrFallback();
@@ -187,6 +192,24 @@ function useNoyaBilling() {
187
192
  const billing = (0, import_react2.useSelector)(useNoyaClient().billing$);
188
193
  return billing;
189
194
  }
195
+ function useNoyaWorkspaceBilling(workspaceId) {
196
+ const client = useNoyaClientOrFallback();
197
+ const workspaceBilling = (0, import_react2.useSelector)(
198
+ useNoyaClient().workspaceBilling$.billingByWorkspaceId[workspaceId]
199
+ );
200
+ const hasFetchedWorkspaceBilling = workspaceBilling?.loading === false && workspaceBilling?.availableProducts.length > 0;
201
+ (0, import_react3.useEffect)(() => {
202
+ if (!hasFetchedWorkspaceBilling) {
203
+ client.workspaces.getBilling(workspaceId);
204
+ }
205
+ }, [client, hasFetchedWorkspaceBilling, workspaceId]);
206
+ return workspaceBilling || {
207
+ subscriptions: [],
208
+ availableProducts: [],
209
+ portalUrl: void 0,
210
+ loading: true
211
+ };
212
+ }
190
213
  function useNoyaEmailLists() {
191
214
  const emailLists = (0, import_react2.useSelector)(useNoyaClient().emailLists$);
192
215
  return emailLists;
@@ -310,6 +333,44 @@ function useNoyaPersonalAccessTokens() {
310
333
  const tokens = (0, import_react2.useSelector)(useNoyaClientOrFallback().personalAccessTokens$);
311
334
  return tokens;
312
335
  }
336
+ function useNoyaWorkspaces() {
337
+ const workspaces = (0, import_react2.useSelector)(useNoyaClient().workspaces$);
338
+ return workspaces;
339
+ }
340
+ function useNoyaWorkspaceInvitations(workspaceId) {
341
+ const client = useNoyaClientOrFallback();
342
+ const workspaceInvitations = (0, import_react2.useSelector)(
343
+ useNoyaClient().workspaceInvitations$.invitationsByWorkspaceId[workspaceId]
344
+ );
345
+ const fallback = (0, import_react3.useMemo)(
346
+ () => ({
347
+ invitations: [],
348
+ loading: true
349
+ }),
350
+ []
351
+ );
352
+ (0, import_react3.useEffect)(() => {
353
+ if (!workspaceInvitations) {
354
+ client.workspaces.getInvitations(workspaceId);
355
+ }
356
+ }, [client, workspaceId, workspaceInvitations]);
357
+ return workspaceInvitations || fallback;
358
+ }
359
+ var emptyObservedFileVersions = {
360
+ fileVersions: [],
361
+ loading: "notStarted"
362
+ };
363
+ function useNoyaOwnedFileVersions(fileId) {
364
+ const client = useNoyaClientOrFallback();
365
+ const path = (0, import_react3.useMemo)(() => [fileId], [fileId]);
366
+ const fileVersions = (0, import_observable_react.useObservable)(client.ownedFileVersions$, path);
367
+ (0, import_react3.useEffect)(() => {
368
+ if (!fileVersions || fileVersions.loading === "notStarted") {
369
+ client.fileVersions.refetch({ fileId, type: "owned" });
370
+ }
371
+ }, [client, fileId, fileVersions, fileVersions?.loading]);
372
+ return fileVersions ?? emptyObservedFileVersions;
373
+ }
313
374
  // Annotate the CommonJS export names for ESM import in node:
314
375
  0 && (module.exports = {
315
376
  NoyaAPIProvider,
@@ -330,6 +391,7 @@ function useNoyaPersonalAccessTokens() {
330
391
  useNoyaEmailLists,
331
392
  useNoyaFiles,
332
393
  useNoyaIsOwnFile,
394
+ useNoyaOwnedFileVersions,
333
395
  useNoyaPersonalAccessTokens,
334
396
  useNoyaSession,
335
397
  useNoyaSite,
@@ -337,6 +399,9 @@ function useNoyaPersonalAccessTokens() {
337
399
  useNoyaTags,
338
400
  useNoyaTools,
339
401
  useNoyaUserData,
402
+ useNoyaWorkspaceBilling,
403
+ useNoyaWorkspaceInvitations,
404
+ useNoyaWorkspaces,
340
405
  useOptionalNoyaClient,
341
406
  useOptionalNoyaCreators,
342
407
  useOptionalNoyaSession,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/react/context.ts","../src/react/hooks.ts"],"sourcesContent":["export * from \"@noya-app/noya-api\";\nexport * from \"./react/context\";\nexport * from \"./react/hooks\";\n","import { NoyaAPI } from \"@noya-app/noya-api\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype NoyaAPIContextValue = NoyaAPI.Client;\n\nconst NoyaAPIContext = createContext<NoyaAPIContextValue | undefined>(\n undefined\n);\n\nexport const NoyaAPIProvider: React.Provider<NoyaAPIContextValue | undefined> =\n NoyaAPIContext.Provider;\n\nexport function useNoyaClient(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n if (!value) {\n throw new Error(\"Missing NoyaAPIContextValue\");\n }\n\n return value;\n}\n\nexport function useOptionalNoyaClient(): NoyaAPIContextValue | undefined {\n return useContext(NoyaAPIContext);\n}\n\n/**\n * If there's no client, fallback to a memory client.\n * We do this to safely render content when logged out (e.g. when sharing).\n */\nexport function useNoyaClientOrFallback(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n const memoryClient = useMemo(() => {\n return new NoyaAPI.Client({\n networkClient: new NoyaAPI.MemoryClient(),\n });\n }, []);\n\n return value ?? memoryClient;\n}\n","import { useSelector } from \"@legendapp/state/react\";\nimport { GENERATED_PAGE_NAME_COUNT, NoyaAPI } from \"@noya-app/noya-api\";\nimport { range } from \"@noya-app/noya-utils\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport {\n useNoyaClient,\n useNoyaClientOrFallback,\n useOptionalNoyaClient,\n} from \"./context\";\n\nexport function useNoyaFiles(): {\n files: NoyaAPI.File[];\n loading: boolean;\n} {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(useNoyaClient().session$);\n\n useEffect(() => {\n if (!session) return;\n\n if (\n files.loading === \"notStarted\" ||\n files.loading === \"populatedOnServer\"\n ) {\n client.files.refetch();\n }\n }, [client, files.loading, session]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n };\n}\n\nexport function useNoyaIsOwnFile(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(client.session$);\n const file = files.files.find((file) => file.id === fileId);\n return file?.userId === session?.user.id;\n}\n\nexport function useNoyaTools(initial?: NoyaAPI.Tool[]) {\n const didInitialize = useRef(false);\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n if (initial) {\n client.tools.setInitial(initial);\n } else {\n client.tools.list();\n }\n }, [client, initial]);\n return tools;\n}\n\nexport function useOptionalNoyaTools(initial?: NoyaAPI.Tool[]) {\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n return useMemo(\n () =>\n tools.loading && initial ? { loading: true, tools: initial } : tools,\n [initial, tools]\n );\n}\n\nexport function useNoyaTags() {\n const client = useNoyaClient();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useOptionalNoyaTags() {\n const client = useNoyaClientOrFallback();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useOptionalNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useNoyaAssets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ assets: [], loading: true }), []);\n const assets = useSelector(\n fileId ? client.assetsByFileId$[fileId] : client.assets$\n );\n return assets ?? empty;\n}\n\nexport function useNoyaSession() {\n const session = useSelector(useNoyaClient().session$);\n return session;\n}\n\nexport function useOptionalNoyaSession() {\n const session = useSelector(useOptionalNoyaClient()?.session$);\n return session;\n}\n\nexport function useNoyaBilling() {\n const billing = useSelector(useNoyaClient().billing$);\n return billing;\n}\n\nexport function useNoyaEmailLists() {\n const emailLists = useSelector(useNoyaClient().emailLists$);\n return emailLists;\n}\n\nexport function useNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useOptionalNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useIsBeta() {\n const userData = useOptionalNoyaUserData();\n return userData?.userData?.beta ?? false;\n}\n\nexport function useMetadata<T extends NoyaAPI.Json>(key: string) {\n const { userData } = useNoyaUserData();\n const metadata = userData?.metadata || [];\n const metadataItem = metadata.find((item) => item.key === key);\n return metadataItem?.value as T | undefined;\n}\n\nexport function useGeneratedComponentNames(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();\n const result = useSelector(\n () => generatedNames$[key].get() as NoyaAPI.GeneratedName[] | undefined\n );\n const loading = useSelector(() => loadingNames$[key].get());\n return useMemo(() => ({ names: result ?? [], loading }), [loading, result]);\n}\n\nexport function useGeneratedComponentDescriptions() {\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const descriptions = useSelector(generatedDescriptions$);\n const loading = useSelector(loadingDescriptions$);\n return useMemo(() => ({ descriptions, loading }), [loading, descriptions]);\n}\n\nexport function useGeneratedComponentDescription(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const description = useSelector(\n () => generatedDescriptions$[key].get() as string | undefined\n );\n const loading = useSelector(() => loadingDescriptions$[key].get());\n return useMemo(() => ({ description, loading }), [loading, description]);\n}\n\nexport function useRandomImages() {\n const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();\n const images = useSelector(randomImages$);\n const loading = useSelector(loadingRandomImages$);\n return useMemo(() => ({ images, loading }), [loading, images]);\n}\n\nexport function useRandomIcons() {\n const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();\n const icons = useSelector(randomIcons$);\n const loading = useSelector(loadingRandomIcons$);\n return useMemo(() => ({ icons, loading }), [loading, icons]);\n}\n\nexport function useNetworkRequests() {\n const { requests$ } = useNoyaClientOrFallback();\n const requests = useSelector(requests$) as NoyaAPI.RequestSnapshot[];\n return requests;\n}\n\nexport type EnhancedGeneratedPageName = NoyaAPI.GeneratedName & {\n index: number;\n type: \"suggestion\";\n};\n\nexport function useGeneratedPageNames(): EnhancedGeneratedPageName[] {\n const { generatedPageNames$ } = useNoyaClientOrFallback();\n const names = useSelector(generatedPageNames$) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Page ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useGeneratedPageComponentNames(): EnhancedGeneratedPageName[] {\n const { generatedPageComponentNames$: generatedComponentNames$ } =\n useNoyaClientOrFallback();\n const names = useSelector(\n generatedComponentNames$\n ) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Component ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useNoyaSites() {\n const sites = useSelector(useNoyaClientOrFallback().sites$);\n return sites;\n}\n\nexport function useNoyaDeployments() {\n const deployments = useSelector(useNoyaClientOrFallback().deployments$);\n return deployments;\n}\n\nexport function useNoyaSite(siteId: string) {\n const { sites } = useNoyaSites();\n const site = sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw new Error(`Site ${siteId} not found`);\n }\n\n return { site };\n}\n\nexport function useNoyaPersonalAccessTokens() {\n const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);\n return tokens;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAc,+BAAd;;;ACAA,sBAAwB;AACxB,mBAAmD;AAInD,IAAM,qBAAiB;AAAA,EACrB;AACF;AAEO,IAAM,kBACX,eAAe;AAEV,SAAS,gBAAqC;AACnD,QAAM,YAAQ,yBAAW,cAAc;AAEvC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,6BAA6B;AAAA,EAC/C;AAEA,SAAO;AACT;AAEO,SAAS,wBAAyD;AACvE,aAAO,yBAAW,cAAc;AAClC;AAMO,SAAS,0BAA+C;AAC7D,QAAM,YAAQ,yBAAW,cAAc;AAEvC,QAAM,mBAAe,sBAAQ,MAAM;AACjC,WAAO,IAAI,wBAAQ,OAAO;AAAA,MACxB,eAAe,IAAI,wBAAQ,aAAa;AAAA,IAC1C,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,SAAS;AAClB;;;ACxCA,IAAAA,gBAA4B;AAC5B,IAAAC,mBAAmD;AACnD,wBAAsB;AACtB,IAAAD,gBAA2C;AAOpC,SAAS,eAGd;AACA,QAAM,SAAS,wBAAwB;AACvC,QAAM,YAAQ,2BAAY,OAAO,MAAM;AACvC,QAAM,cAAU,2BAAY,cAAc,EAAE,QAAQ;AAEpD,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AAEd,QACE,MAAM,YAAY,gBAClB,MAAM,YAAY,qBAClB;AACA,aAAO,MAAM,QAAQ;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,QAAQ,MAAM,SAAS,OAAO,CAAC;AAEnC,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,SAAS,EACP,MAAM,YAAY,oBAClB,MAAM,YAAY;AAAA,EAEtB;AACF;AAEO,SAAS,iBAAiB,QAAiB;AAChD,QAAM,SAAS,wBAAwB;AACvC,QAAM,YAAQ,2BAAY,OAAO,MAAM;AACvC,QAAM,cAAU,2BAAY,OAAO,QAAQ;AAC3C,QAAM,OAAO,MAAM,MAAM,KAAK,CAACE,UAASA,MAAK,OAAO,MAAM;AAC1D,SAAO,MAAM,WAAW,SAAS,KAAK;AACxC;AAEO,SAAS,aAAa,SAA0B;AACrD,QAAM,oBAAgB,sBAAO,KAAK;AAClC,QAAM,SAAS,wBAAwB;AACvC,QAAM,YAAQ,2BAAY,OAAO,MAAM;AACvC,+BAAU,MAAM;AACd,QAAI,cAAc,QAAS;AAC3B,kBAAc,UAAU;AAExB,QAAI,SAAS;AACX,aAAO,MAAM,WAAW,OAAO;AAAA,IACjC,OAAO;AACL,aAAO,MAAM,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AACpB,SAAO;AACT;AAEO,SAAS,qBAAqB,SAA0B;AAC7D,QAAM,SAAS,wBAAwB;AACvC,QAAM,YAAQ,2BAAY,OAAO,MAAM;AACvC,aAAO;AAAA,IACL,MACE,MAAM,WAAW,UAAU,EAAE,SAAS,MAAM,OAAO,QAAQ,IAAI;AAAA,IACjE,CAAC,SAAS,KAAK;AAAA,EACjB;AACF;AAEO,SAAS,cAAc;AAC5B,QAAM,SAAS,cAAc;AAC7B,QAAM,WAAO,2BAAY,OAAO,KAAK;AACrC,+BAAU,MAAM;AACd,WAAO,KAAK,KAAK;AAAA,EACnB,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AAEO,SAAS,sBAAsB;AACpC,QAAM,SAAS,wBAAwB;AACvC,QAAM,WAAO,2BAAY,OAAO,KAAK;AACrC,+BAAU,MAAM;AACd,WAAO,KAAK,KAAK;AAAA,EACnB,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AAEO,SAAS,kBAAkB;AAChC,QAAM,SAAS,wBAAwB;AACvC,QAAM,eAAW,2BAAY,OAAO,SAAS;AAC7C,+BAAU,MAAM;AACd,WAAO,SAAS,KAAK;AAAA,EACvB,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AAEO,SAAS,0BAA0B;AACxC,QAAM,SAAS,wBAAwB;AACvC,QAAM,eAAW,2BAAY,OAAO,SAAS;AAC7C,+BAAU,MAAM;AACd,WAAO,SAAS,KAAK;AAAA,EACvB,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AAEO,SAAS,cAAc,QAAiB;AAC7C,QAAM,SAAS,wBAAwB;AACvC,QAAM,YAAQ,uBAAQ,OAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC,CAAC;AAC/D,QAAM,aAAS;AAAA,IACb,SAAS,OAAO,gBAAgB,MAAM,IAAI,OAAO;AAAA,EACnD;AACA,SAAO,UAAU;AACnB;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAU,2BAAY,cAAc,EAAE,QAAQ;AACpD,SAAO;AACT;AAEO,SAAS,yBAAyB;AACvC,QAAM,cAAU,2BAAY,sBAAsB,GAAG,QAAQ;AAC7D,SAAO;AACT;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAU,2BAAY,cAAc,EAAE,QAAQ;AACpD,SAAO;AACT;AAEO,SAAS,oBAAoB;AAClC,QAAM,iBAAa,2BAAY,cAAc,EAAE,WAAW;AAC1D,SAAO;AACT;AAEO,SAAS,kBAAkB;AAChC,QAAM,eAAW,2BAAY,wBAAwB,EAAE,SAAS;AAChE,SAAO;AACT;AAEO,SAAS,0BAA0B;AACxC,QAAM,eAAW,2BAAY,wBAAwB,EAAE,SAAS;AAChE,SAAO;AACT;AAEO,SAAS,YAAY;AAC1B,QAAM,WAAW,wBAAwB;AACzC,SAAO,UAAU,UAAU,QAAQ;AACrC;AAEO,SAAS,YAAoC,KAAa;AAC/D,QAAM,EAAE,SAAS,IAAI,gBAAgB;AACrC,QAAM,WAAW,UAAU,YAAY,CAAC;AACxC,QAAM,eAAe,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,GAAG;AAC7D,SAAO,cAAc;AACvB;AAEO,SAAS,2BAA2B,MAAc;AACvD,QAAM,MAAM,KAAK,KAAK,EAAE,YAAY;AACpC,QAAM,EAAE,iBAAiB,cAAc,IAAI,wBAAwB;AACnE,QAAM,aAAS;AAAA,IACb,MAAM,gBAAgB,GAAG,EAAE,IAAI;AAAA,EACjC;AACA,QAAM,cAAU,2BAAY,MAAM,cAAc,GAAG,EAAE,IAAI,CAAC;AAC1D,aAAO,uBAAQ,OAAO,EAAE,OAAO,UAAU,CAAC,GAAG,QAAQ,IAAI,CAAC,SAAS,MAAM,CAAC;AAC5E;AAEO,SAAS,oCAAoC;AAClD,QAAM,EAAE,wBAAwB,qBAAqB,IACnD,wBAAwB;AAC1B,QAAM,mBAAe,2BAAY,sBAAsB;AACvD,QAAM,cAAU,2BAAY,oBAAoB;AAChD,aAAO,uBAAQ,OAAO,EAAE,cAAc,QAAQ,IAAI,CAAC,SAAS,YAAY,CAAC;AAC3E;AAEO,SAAS,iCAAiC,MAAc;AAC7D,QAAM,MAAM,KAAK,KAAK,EAAE,YAAY;AACpC,QAAM,EAAE,wBAAwB,qBAAqB,IACnD,wBAAwB;AAC1B,QAAM,kBAAc;AAAA,IAClB,MAAM,uBAAuB,GAAG,EAAE,IAAI;AAAA,EACxC;AACA,QAAM,cAAU,2BAAY,MAAM,qBAAqB,GAAG,EAAE,IAAI,CAAC;AACjE,aAAO,uBAAQ,OAAO,EAAE,aAAa,QAAQ,IAAI,CAAC,SAAS,WAAW,CAAC;AACzE;AAEO,SAAS,kBAAkB;AAChC,QAAM,EAAE,eAAe,qBAAqB,IAAI,wBAAwB;AACxE,QAAM,aAAS,2BAAY,aAAa;AACxC,QAAM,cAAU,2BAAY,oBAAoB;AAChD,aAAO,uBAAQ,OAAO,EAAE,QAAQ,QAAQ,IAAI,CAAC,SAAS,MAAM,CAAC;AAC/D;AAEO,SAAS,iBAAiB;AAC/B,QAAM,EAAE,cAAc,oBAAoB,IAAI,wBAAwB;AACtE,QAAM,YAAQ,2BAAY,YAAY;AACtC,QAAM,cAAU,2BAAY,mBAAmB;AAC/C,aAAO,uBAAQ,OAAO,EAAE,OAAO,QAAQ,IAAI,CAAC,SAAS,KAAK,CAAC;AAC7D;AAEO,SAAS,qBAAqB;AACnC,QAAM,EAAE,UAAU,IAAI,wBAAwB;AAC9C,QAAM,eAAW,2BAAY,SAAS;AACtC,SAAO;AACT;AAOO,SAAS,wBAAqD;AACnE,QAAM,EAAE,oBAAoB,IAAI,wBAAwB;AACxD,QAAM,YAAQ,2BAAY,mBAAmB;AAE7C,QAAM,gCAA4B,uBAAQ,MAAM;AAC9C,UAAM,iBAAa,yBAAM,GAAG,0CAAyB;AAGrD,UAAM,eAAe,WAAW,IAAI,CAAC,UAAiC;AACpE,YAAM,OAAO,MAAM,KAAK;AACxB,aAAO,QAAQ,EAAE,MAAM,QAAQ,QAAQ,CAAC,IAAI,SAAS,MAAM,KAAK,GAAG;AAAA,IACrE,CAAC;AAED,WAAO,aAAa;AAAA,MAClB,CAAC,MAAM,WAAsC;AAAA,QAC3C,GAAG;AAAA,QACH;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,0BAA0B,MAAM,GAAG,CAAC;AAC7C;AAEO,SAAS,iCAA8D;AAC5E,QAAM,EAAE,8BAA8B,yBAAyB,IAC7D,wBAAwB;AAC1B,QAAM,YAAQ;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,gCAA4B,uBAAQ,MAAM;AAC9C,UAAM,iBAAa,yBAAM,GAAG,0CAAyB;AAGrD,UAAM,eAAe,WAAW,IAAI,CAAC,UAAiC;AACpE,YAAM,OAAO,MAAM,KAAK;AACxB,aAAO,QAAQ,EAAE,MAAM,aAAa,QAAQ,CAAC,IAAI,SAAS,MAAM,KAAK,GAAG;AAAA,IAC1E,CAAC;AAED,WAAO,aAAa;AAAA,MAClB,CAAC,MAAM,WAAsC;AAAA,QAC3C,GAAG;AAAA,QACH;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,0BAA0B,MAAM,GAAG,CAAC;AAC7C;AAEO,SAAS,eAAe;AAC7B,QAAM,YAAQ,2BAAY,wBAAwB,EAAE,MAAM;AAC1D,SAAO;AACT;AAEO,SAAS,qBAAqB;AACnC,QAAM,kBAAc,2BAAY,wBAAwB,EAAE,YAAY;AACtE,SAAO;AACT;AAEO,SAAS,YAAY,QAAgB;AAC1C,QAAM,EAAE,MAAM,IAAI,aAAa;AAC/B,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAE9C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,QAAQ,MAAM,YAAY;AAAA,EAC5C;AAEA,SAAO,EAAE,KAAK;AAChB;AAEO,SAAS,8BAA8B;AAC5C,QAAM,aAAS,2BAAY,wBAAwB,EAAE,qBAAqB;AAC1E,SAAO;AACT;","names":["import_react","import_noya_api","file"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/react/context.ts","../src/react/hooks.ts"],"sourcesContent":["export * from \"@noya-app/noya-api\";\nexport * from \"./react/context\";\nexport * from \"./react/hooks\";\n","import { NoyaAPI } from \"@noya-app/noya-api\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype NoyaAPIContextValue = NoyaAPI.Client;\n\nconst NoyaAPIContext = createContext<NoyaAPIContextValue | undefined>(\n undefined\n);\n\nexport const NoyaAPIProvider: React.Provider<NoyaAPIContextValue | undefined> =\n NoyaAPIContext.Provider;\n\nexport function useNoyaClient(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n if (!value) {\n throw new Error(\"Missing NoyaAPIContextValue\");\n }\n\n return value;\n}\n\nexport function useOptionalNoyaClient(): NoyaAPIContextValue | undefined {\n return useContext(NoyaAPIContext);\n}\n\n/**\n * If there's no client, fallback to a memory client.\n * We do this to safely render content when logged out (e.g. when sharing).\n */\nexport function useNoyaClientOrFallback(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n const memoryClient = useMemo(() => {\n return new NoyaAPI.Client({\n networkClient: new NoyaAPI.MemoryClient(),\n });\n }, []);\n\n return value ?? memoryClient;\n}\n","import { useSelector } from \"@legendapp/state/react\";\nimport { GENERATED_PAGE_NAME_COUNT, NoyaAPI } from \"@noya-app/noya-api\";\nimport { range } from \"@noya-app/noya-utils\";\nimport { useObservable } from \"@noya-app/observable-react\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport {\n useNoyaClient,\n useNoyaClientOrFallback,\n useOptionalNoyaClient,\n} from \"./context\";\n\nexport function useNoyaFiles(): {\n files: NoyaAPI.File[];\n loading: boolean;\n} {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(useNoyaClient().session$);\n\n useEffect(() => {\n if (!session) return;\n\n if (\n files.loading === \"notStarted\" ||\n files.loading === \"populatedOnServer\"\n ) {\n client.files.refetch();\n }\n }, [client, files.loading, session]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n };\n}\n\nexport function useNoyaIsOwnFile(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(client.session$);\n const file = files.files.find((file) => file.id === fileId);\n return file?.userId === session?.user.id;\n}\n\nexport function useNoyaTools(initial?: NoyaAPI.Tool[]) {\n const didInitialize = useRef(false);\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n if (initial) {\n client.tools.setInitial(initial);\n } else {\n client.tools.list();\n }\n }, [client, initial]);\n return tools;\n}\n\nexport function useOptionalNoyaTools(initial?: NoyaAPI.Tool[]) {\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n return useMemo(\n () =>\n tools.loading && initial ? { loading: true, tools: initial } : tools,\n [initial, tools]\n );\n}\n\nexport function useNoyaTags() {\n const client = useNoyaClient();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useOptionalNoyaTags() {\n const client = useNoyaClientOrFallback();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useOptionalNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useNoyaAssets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ assets: [], loading: true }), []);\n const assets = useSelector(\n fileId ? client.assetsByFileId$[fileId] : client.assets$\n );\n return assets ?? empty;\n}\n\nexport function useNoyaSession() {\n const session = useSelector(useNoyaClient().session$);\n return session;\n}\n\nexport function useOptionalNoyaSession() {\n const session = useSelector(useOptionalNoyaClient()?.session$);\n return session;\n}\n\nexport function useNoyaBilling() {\n const billing = useSelector(useNoyaClient().billing$);\n return billing;\n}\n\nexport function useNoyaWorkspaceBilling(workspaceId: string) {\n const client = useNoyaClientOrFallback();\n const workspaceBilling = useSelector(\n useNoyaClient().workspaceBilling$.billingByWorkspaceId[workspaceId]\n );\n\n // Workspace billing will always have products, but will be empty until the billing is fetched\n const hasFetchedWorkspaceBilling =\n workspaceBilling?.loading === false &&\n workspaceBilling?.availableProducts.length > 0;\n\n useEffect(() => {\n if (!hasFetchedWorkspaceBilling) {\n client.workspaces.getBilling(workspaceId);\n }\n }, [client, hasFetchedWorkspaceBilling, workspaceId]);\n\n return (\n workspaceBilling || {\n subscriptions: [],\n availableProducts: [],\n portalUrl: undefined,\n loading: true,\n }\n );\n}\n\nexport function useNoyaEmailLists() {\n const emailLists = useSelector(useNoyaClient().emailLists$);\n return emailLists;\n}\n\nexport function useNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useOptionalNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useIsBeta() {\n const userData = useOptionalNoyaUserData();\n return userData?.userData?.beta ?? false;\n}\n\nexport function useMetadata<T extends NoyaAPI.Json>(key: string) {\n const { userData } = useNoyaUserData();\n const metadata = userData?.metadata || [];\n const metadataItem = metadata.find((item) => item.key === key);\n return metadataItem?.value as T | undefined;\n}\n\nexport function useGeneratedComponentNames(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();\n const result = useSelector(\n () => generatedNames$[key].get() as NoyaAPI.GeneratedName[] | undefined\n );\n const loading = useSelector(() => loadingNames$[key].get());\n return useMemo(() => ({ names: result ?? [], loading }), [loading, result]);\n}\n\nexport function useGeneratedComponentDescriptions() {\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const descriptions = useSelector(generatedDescriptions$);\n const loading = useSelector(loadingDescriptions$);\n return useMemo(() => ({ descriptions, loading }), [loading, descriptions]);\n}\n\nexport function useGeneratedComponentDescription(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const description = useSelector(\n () => generatedDescriptions$[key].get() as string | undefined\n );\n const loading = useSelector(() => loadingDescriptions$[key].get());\n return useMemo(() => ({ description, loading }), [loading, description]);\n}\n\nexport function useRandomImages() {\n const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();\n const images = useSelector(randomImages$);\n const loading = useSelector(loadingRandomImages$);\n return useMemo(() => ({ images, loading }), [loading, images]);\n}\n\nexport function useRandomIcons() {\n const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();\n const icons = useSelector(randomIcons$);\n const loading = useSelector(loadingRandomIcons$);\n return useMemo(() => ({ icons, loading }), [loading, icons]);\n}\n\nexport function useNetworkRequests() {\n const { requests$ } = useNoyaClientOrFallback();\n const requests = useSelector(requests$) as NoyaAPI.RequestSnapshot[];\n return requests;\n}\n\nexport type EnhancedGeneratedPageName = NoyaAPI.GeneratedName & {\n index: number;\n type: \"suggestion\";\n};\n\nexport function useGeneratedPageNames(): EnhancedGeneratedPageName[] {\n const { generatedPageNames$ } = useNoyaClientOrFallback();\n const names = useSelector(generatedPageNames$) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Page ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useGeneratedPageComponentNames(): EnhancedGeneratedPageName[] {\n const { generatedPageComponentNames$: generatedComponentNames$ } =\n useNoyaClientOrFallback();\n const names = useSelector(\n generatedComponentNames$\n ) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Component ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useNoyaSites() {\n const sites = useSelector(useNoyaClientOrFallback().sites$);\n return sites;\n}\n\nexport function useNoyaDeployments() {\n const deployments = useSelector(useNoyaClientOrFallback().deployments$);\n return deployments;\n}\n\nexport function useNoyaSite(siteId: string) {\n const { sites } = useNoyaSites();\n const site = sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw new Error(`Site ${siteId} not found`);\n }\n\n return { site };\n}\n\nexport function useNoyaPersonalAccessTokens() {\n const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);\n return tokens;\n}\n\nexport function useNoyaWorkspaces() {\n const workspaces = useSelector(useNoyaClient().workspaces$);\n return workspaces;\n}\n\nexport function useNoyaWorkspaceInvitations(workspaceId: string) {\n const client = useNoyaClientOrFallback();\n const workspaceInvitations = useSelector(\n useNoyaClient().workspaceInvitations$.invitationsByWorkspaceId[workspaceId]\n );\n\n const fallback = useMemo(\n () => ({\n invitations: [],\n loading: true as const,\n }),\n []\n );\n\n useEffect(() => {\n if (!workspaceInvitations) {\n client.workspaces.getInvitations(workspaceId);\n }\n }, [client, workspaceId, workspaceInvitations]);\n\n return workspaceInvitations || fallback;\n}\n\nconst emptyObservedFileVersions: {\n fileVersions: NoyaAPI.FileVersion[];\n loading: NoyaAPI.DataLoadingState;\n} = {\n fileVersions: [],\n loading: \"notStarted\",\n};\n\nexport function useNoyaOwnedFileVersions(fileId: string): {\n fileVersions: NoyaAPI.FileVersion[];\n loading: NoyaAPI.DataLoadingState;\n} {\n const client = useNoyaClientOrFallback();\n const path = useMemo(() => [fileId] as [string], [fileId]);\n const fileVersions = useObservable(client.ownedFileVersions$, path);\n\n useEffect(() => {\n if (!fileVersions || fileVersions.loading === \"notStarted\") {\n client.fileVersions.refetch({ fileId, type: \"owned\" });\n }\n }, [client, fileId, fileVersions, fileVersions?.loading]);\n\n return fileVersions ?? emptyObservedFileVersions;\n}\n"],"mappings":"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","names":["import_react","import_noya_api","file"]}
package/dist/index.mjs CHANGED
@@ -32,6 +32,7 @@ function useNoyaClientOrFallback() {
32
32
  import { useSelector } from "@legendapp/state/react";
33
33
  import { GENERATED_PAGE_NAME_COUNT } from "@noya-app/noya-api";
34
34
  import { range } from "@noya-app/noya-utils";
35
+ import { useObservable } from "@noya-app/observable-react";
35
36
  import { useEffect, useMemo as useMemo2, useRef } from "react";
36
37
  function useNoyaFiles() {
37
38
  const client = useNoyaClientOrFallback();
@@ -130,6 +131,24 @@ function useNoyaBilling() {
130
131
  const billing = useSelector(useNoyaClient().billing$);
131
132
  return billing;
132
133
  }
134
+ function useNoyaWorkspaceBilling(workspaceId) {
135
+ const client = useNoyaClientOrFallback();
136
+ const workspaceBilling = useSelector(
137
+ useNoyaClient().workspaceBilling$.billingByWorkspaceId[workspaceId]
138
+ );
139
+ const hasFetchedWorkspaceBilling = workspaceBilling?.loading === false && workspaceBilling?.availableProducts.length > 0;
140
+ useEffect(() => {
141
+ if (!hasFetchedWorkspaceBilling) {
142
+ client.workspaces.getBilling(workspaceId);
143
+ }
144
+ }, [client, hasFetchedWorkspaceBilling, workspaceId]);
145
+ return workspaceBilling || {
146
+ subscriptions: [],
147
+ availableProducts: [],
148
+ portalUrl: void 0,
149
+ loading: true
150
+ };
151
+ }
133
152
  function useNoyaEmailLists() {
134
153
  const emailLists = useSelector(useNoyaClient().emailLists$);
135
154
  return emailLists;
@@ -253,6 +272,44 @@ function useNoyaPersonalAccessTokens() {
253
272
  const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);
254
273
  return tokens;
255
274
  }
275
+ function useNoyaWorkspaces() {
276
+ const workspaces = useSelector(useNoyaClient().workspaces$);
277
+ return workspaces;
278
+ }
279
+ function useNoyaWorkspaceInvitations(workspaceId) {
280
+ const client = useNoyaClientOrFallback();
281
+ const workspaceInvitations = useSelector(
282
+ useNoyaClient().workspaceInvitations$.invitationsByWorkspaceId[workspaceId]
283
+ );
284
+ const fallback = useMemo2(
285
+ () => ({
286
+ invitations: [],
287
+ loading: true
288
+ }),
289
+ []
290
+ );
291
+ useEffect(() => {
292
+ if (!workspaceInvitations) {
293
+ client.workspaces.getInvitations(workspaceId);
294
+ }
295
+ }, [client, workspaceId, workspaceInvitations]);
296
+ return workspaceInvitations || fallback;
297
+ }
298
+ var emptyObservedFileVersions = {
299
+ fileVersions: [],
300
+ loading: "notStarted"
301
+ };
302
+ function useNoyaOwnedFileVersions(fileId) {
303
+ const client = useNoyaClientOrFallback();
304
+ const path = useMemo2(() => [fileId], [fileId]);
305
+ const fileVersions = useObservable(client.ownedFileVersions$, path);
306
+ useEffect(() => {
307
+ if (!fileVersions || fileVersions.loading === "notStarted") {
308
+ client.fileVersions.refetch({ fileId, type: "owned" });
309
+ }
310
+ }, [client, fileId, fileVersions, fileVersions?.loading]);
311
+ return fileVersions ?? emptyObservedFileVersions;
312
+ }
256
313
  export {
257
314
  NoyaAPIProvider,
258
315
  useGeneratedComponentDescription,
@@ -272,6 +329,7 @@ export {
272
329
  useNoyaEmailLists,
273
330
  useNoyaFiles,
274
331
  useNoyaIsOwnFile,
332
+ useNoyaOwnedFileVersions,
275
333
  useNoyaPersonalAccessTokens,
276
334
  useNoyaSession,
277
335
  useNoyaSite,
@@ -279,6 +337,9 @@ export {
279
337
  useNoyaTags,
280
338
  useNoyaTools,
281
339
  useNoyaUserData,
340
+ useNoyaWorkspaceBilling,
341
+ useNoyaWorkspaceInvitations,
342
+ useNoyaWorkspaces,
282
343
  useOptionalNoyaClient,
283
344
  useOptionalNoyaCreators,
284
345
  useOptionalNoyaSession,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/react/context.ts","../src/react/hooks.ts"],"sourcesContent":["export * from \"@noya-app/noya-api\";\nexport * from \"./react/context\";\nexport * from \"./react/hooks\";\n","import { NoyaAPI } from \"@noya-app/noya-api\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype NoyaAPIContextValue = NoyaAPI.Client;\n\nconst NoyaAPIContext = createContext<NoyaAPIContextValue | undefined>(\n undefined\n);\n\nexport const NoyaAPIProvider: React.Provider<NoyaAPIContextValue | undefined> =\n NoyaAPIContext.Provider;\n\nexport function useNoyaClient(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n if (!value) {\n throw new Error(\"Missing NoyaAPIContextValue\");\n }\n\n return value;\n}\n\nexport function useOptionalNoyaClient(): NoyaAPIContextValue | undefined {\n return useContext(NoyaAPIContext);\n}\n\n/**\n * If there's no client, fallback to a memory client.\n * We do this to safely render content when logged out (e.g. when sharing).\n */\nexport function useNoyaClientOrFallback(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n const memoryClient = useMemo(() => {\n return new NoyaAPI.Client({\n networkClient: new NoyaAPI.MemoryClient(),\n });\n }, []);\n\n return value ?? memoryClient;\n}\n","import { useSelector } from \"@legendapp/state/react\";\nimport { GENERATED_PAGE_NAME_COUNT, NoyaAPI } from \"@noya-app/noya-api\";\nimport { range } from \"@noya-app/noya-utils\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport {\n useNoyaClient,\n useNoyaClientOrFallback,\n useOptionalNoyaClient,\n} from \"./context\";\n\nexport function useNoyaFiles(): {\n files: NoyaAPI.File[];\n loading: boolean;\n} {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(useNoyaClient().session$);\n\n useEffect(() => {\n if (!session) return;\n\n if (\n files.loading === \"notStarted\" ||\n files.loading === \"populatedOnServer\"\n ) {\n client.files.refetch();\n }\n }, [client, files.loading, session]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n };\n}\n\nexport function useNoyaIsOwnFile(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(client.session$);\n const file = files.files.find((file) => file.id === fileId);\n return file?.userId === session?.user.id;\n}\n\nexport function useNoyaTools(initial?: NoyaAPI.Tool[]) {\n const didInitialize = useRef(false);\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n if (initial) {\n client.tools.setInitial(initial);\n } else {\n client.tools.list();\n }\n }, [client, initial]);\n return tools;\n}\n\nexport function useOptionalNoyaTools(initial?: NoyaAPI.Tool[]) {\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n return useMemo(\n () =>\n tools.loading && initial ? { loading: true, tools: initial } : tools,\n [initial, tools]\n );\n}\n\nexport function useNoyaTags() {\n const client = useNoyaClient();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useOptionalNoyaTags() {\n const client = useNoyaClientOrFallback();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useOptionalNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useNoyaAssets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ assets: [], loading: true }), []);\n const assets = useSelector(\n fileId ? client.assetsByFileId$[fileId] : client.assets$\n );\n return assets ?? empty;\n}\n\nexport function useNoyaSession() {\n const session = useSelector(useNoyaClient().session$);\n return session;\n}\n\nexport function useOptionalNoyaSession() {\n const session = useSelector(useOptionalNoyaClient()?.session$);\n return session;\n}\n\nexport function useNoyaBilling() {\n const billing = useSelector(useNoyaClient().billing$);\n return billing;\n}\n\nexport function useNoyaEmailLists() {\n const emailLists = useSelector(useNoyaClient().emailLists$);\n return emailLists;\n}\n\nexport function useNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useOptionalNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useIsBeta() {\n const userData = useOptionalNoyaUserData();\n return userData?.userData?.beta ?? false;\n}\n\nexport function useMetadata<T extends NoyaAPI.Json>(key: string) {\n const { userData } = useNoyaUserData();\n const metadata = userData?.metadata || [];\n const metadataItem = metadata.find((item) => item.key === key);\n return metadataItem?.value as T | undefined;\n}\n\nexport function useGeneratedComponentNames(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();\n const result = useSelector(\n () => generatedNames$[key].get() as NoyaAPI.GeneratedName[] | undefined\n );\n const loading = useSelector(() => loadingNames$[key].get());\n return useMemo(() => ({ names: result ?? [], loading }), [loading, result]);\n}\n\nexport function useGeneratedComponentDescriptions() {\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const descriptions = useSelector(generatedDescriptions$);\n const loading = useSelector(loadingDescriptions$);\n return useMemo(() => ({ descriptions, loading }), [loading, descriptions]);\n}\n\nexport function useGeneratedComponentDescription(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const description = useSelector(\n () => generatedDescriptions$[key].get() as string | undefined\n );\n const loading = useSelector(() => loadingDescriptions$[key].get());\n return useMemo(() => ({ description, loading }), [loading, description]);\n}\n\nexport function useRandomImages() {\n const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();\n const images = useSelector(randomImages$);\n const loading = useSelector(loadingRandomImages$);\n return useMemo(() => ({ images, loading }), [loading, images]);\n}\n\nexport function useRandomIcons() {\n const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();\n const icons = useSelector(randomIcons$);\n const loading = useSelector(loadingRandomIcons$);\n return useMemo(() => ({ icons, loading }), [loading, icons]);\n}\n\nexport function useNetworkRequests() {\n const { requests$ } = useNoyaClientOrFallback();\n const requests = useSelector(requests$) as NoyaAPI.RequestSnapshot[];\n return requests;\n}\n\nexport type EnhancedGeneratedPageName = NoyaAPI.GeneratedName & {\n index: number;\n type: \"suggestion\";\n};\n\nexport function useGeneratedPageNames(): EnhancedGeneratedPageName[] {\n const { generatedPageNames$ } = useNoyaClientOrFallback();\n const names = useSelector(generatedPageNames$) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Page ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useGeneratedPageComponentNames(): EnhancedGeneratedPageName[] {\n const { generatedPageComponentNames$: generatedComponentNames$ } =\n useNoyaClientOrFallback();\n const names = useSelector(\n generatedComponentNames$\n ) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Component ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useNoyaSites() {\n const sites = useSelector(useNoyaClientOrFallback().sites$);\n return sites;\n}\n\nexport function useNoyaDeployments() {\n const deployments = useSelector(useNoyaClientOrFallback().deployments$);\n return deployments;\n}\n\nexport function useNoyaSite(siteId: string) {\n const { sites } = useNoyaSites();\n const site = sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw new Error(`Site ${siteId} not found`);\n }\n\n return { site };\n}\n\nexport function useNoyaPersonalAccessTokens() {\n const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);\n return tokens;\n}\n"],"mappings":"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","names":["useMemo","file","useMemo"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/react/context.ts","../src/react/hooks.ts"],"sourcesContent":["export * from \"@noya-app/noya-api\";\nexport * from \"./react/context\";\nexport * from \"./react/hooks\";\n","import { NoyaAPI } from \"@noya-app/noya-api\";\nimport { createContext, useContext, useMemo } from \"react\";\n\ntype NoyaAPIContextValue = NoyaAPI.Client;\n\nconst NoyaAPIContext = createContext<NoyaAPIContextValue | undefined>(\n undefined\n);\n\nexport const NoyaAPIProvider: React.Provider<NoyaAPIContextValue | undefined> =\n NoyaAPIContext.Provider;\n\nexport function useNoyaClient(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n if (!value) {\n throw new Error(\"Missing NoyaAPIContextValue\");\n }\n\n return value;\n}\n\nexport function useOptionalNoyaClient(): NoyaAPIContextValue | undefined {\n return useContext(NoyaAPIContext);\n}\n\n/**\n * If there's no client, fallback to a memory client.\n * We do this to safely render content when logged out (e.g. when sharing).\n */\nexport function useNoyaClientOrFallback(): NoyaAPIContextValue {\n const value = useContext(NoyaAPIContext);\n\n const memoryClient = useMemo(() => {\n return new NoyaAPI.Client({\n networkClient: new NoyaAPI.MemoryClient(),\n });\n }, []);\n\n return value ?? memoryClient;\n}\n","import { useSelector } from \"@legendapp/state/react\";\nimport { GENERATED_PAGE_NAME_COUNT, NoyaAPI } from \"@noya-app/noya-api\";\nimport { range } from \"@noya-app/noya-utils\";\nimport { useObservable } from \"@noya-app/observable-react\";\nimport { useEffect, useMemo, useRef } from \"react\";\nimport {\n useNoyaClient,\n useNoyaClientOrFallback,\n useOptionalNoyaClient,\n} from \"./context\";\n\nexport function useNoyaFiles(): {\n files: NoyaAPI.File[];\n loading: boolean;\n} {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(useNoyaClient().session$);\n\n useEffect(() => {\n if (!session) return;\n\n if (\n files.loading === \"notStarted\" ||\n files.loading === \"populatedOnServer\"\n ) {\n client.files.refetch();\n }\n }, [client, files.loading, session]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n };\n}\n\nexport function useNoyaIsOwnFile(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const files = useSelector(client.files$);\n const session = useSelector(client.session$);\n const file = files.files.find((file) => file.id === fileId);\n return file?.userId === session?.user.id;\n}\n\nexport function useNoyaTools(initial?: NoyaAPI.Tool[]) {\n const didInitialize = useRef(false);\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n if (initial) {\n client.tools.setInitial(initial);\n } else {\n client.tools.list();\n }\n }, [client, initial]);\n return tools;\n}\n\nexport function useOptionalNoyaTools(initial?: NoyaAPI.Tool[]) {\n const client = useNoyaClientOrFallback();\n const tools = useSelector(client.tools$);\n return useMemo(\n () =>\n tools.loading && initial ? { loading: true, tools: initial } : tools,\n [initial, tools]\n );\n}\n\nexport function useNoyaTags() {\n const client = useNoyaClient();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useOptionalNoyaTags() {\n const client = useNoyaClientOrFallback();\n const tags = useSelector(client.tags$);\n useEffect(() => {\n client.tags.read();\n }, [client]);\n return tags;\n}\n\nexport function useNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useOptionalNoyaCreators() {\n const client = useNoyaClientOrFallback();\n const creators = useSelector(client.creators$);\n useEffect(() => {\n client.creators.read();\n }, [client]);\n return creators;\n}\n\nexport function useNoyaAssets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ assets: [], loading: true }), []);\n const assets = useSelector(\n fileId ? client.assetsByFileId$[fileId] : client.assets$\n );\n return assets ?? empty;\n}\n\nexport function useNoyaSession() {\n const session = useSelector(useNoyaClient().session$);\n return session;\n}\n\nexport function useOptionalNoyaSession() {\n const session = useSelector(useOptionalNoyaClient()?.session$);\n return session;\n}\n\nexport function useNoyaBilling() {\n const billing = useSelector(useNoyaClient().billing$);\n return billing;\n}\n\nexport function useNoyaWorkspaceBilling(workspaceId: string) {\n const client = useNoyaClientOrFallback();\n const workspaceBilling = useSelector(\n useNoyaClient().workspaceBilling$.billingByWorkspaceId[workspaceId]\n );\n\n // Workspace billing will always have products, but will be empty until the billing is fetched\n const hasFetchedWorkspaceBilling =\n workspaceBilling?.loading === false &&\n workspaceBilling?.availableProducts.length > 0;\n\n useEffect(() => {\n if (!hasFetchedWorkspaceBilling) {\n client.workspaces.getBilling(workspaceId);\n }\n }, [client, hasFetchedWorkspaceBilling, workspaceId]);\n\n return (\n workspaceBilling || {\n subscriptions: [],\n availableProducts: [],\n portalUrl: undefined,\n loading: true,\n }\n );\n}\n\nexport function useNoyaEmailLists() {\n const emailLists = useSelector(useNoyaClient().emailLists$);\n return emailLists;\n}\n\nexport function useNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useOptionalNoyaUserData() {\n const userData = useSelector(useNoyaClientOrFallback().userData$);\n return userData;\n}\n\nexport function useIsBeta() {\n const userData = useOptionalNoyaUserData();\n return userData?.userData?.beta ?? false;\n}\n\nexport function useMetadata<T extends NoyaAPI.Json>(key: string) {\n const { userData } = useNoyaUserData();\n const metadata = userData?.metadata || [];\n const metadataItem = metadata.find((item) => item.key === key);\n return metadataItem?.value as T | undefined;\n}\n\nexport function useGeneratedComponentNames(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();\n const result = useSelector(\n () => generatedNames$[key].get() as NoyaAPI.GeneratedName[] | undefined\n );\n const loading = useSelector(() => loadingNames$[key].get());\n return useMemo(() => ({ names: result ?? [], loading }), [loading, result]);\n}\n\nexport function useGeneratedComponentDescriptions() {\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const descriptions = useSelector(generatedDescriptions$);\n const loading = useSelector(loadingDescriptions$);\n return useMemo(() => ({ descriptions, loading }), [loading, descriptions]);\n}\n\nexport function useGeneratedComponentDescription(name: string) {\n const key = name.trim().toLowerCase();\n const { generatedDescriptions$, loadingDescriptions$ } =\n useNoyaClientOrFallback();\n const description = useSelector(\n () => generatedDescriptions$[key].get() as string | undefined\n );\n const loading = useSelector(() => loadingDescriptions$[key].get());\n return useMemo(() => ({ description, loading }), [loading, description]);\n}\n\nexport function useRandomImages() {\n const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();\n const images = useSelector(randomImages$);\n const loading = useSelector(loadingRandomImages$);\n return useMemo(() => ({ images, loading }), [loading, images]);\n}\n\nexport function useRandomIcons() {\n const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();\n const icons = useSelector(randomIcons$);\n const loading = useSelector(loadingRandomIcons$);\n return useMemo(() => ({ icons, loading }), [loading, icons]);\n}\n\nexport function useNetworkRequests() {\n const { requests$ } = useNoyaClientOrFallback();\n const requests = useSelector(requests$) as NoyaAPI.RequestSnapshot[];\n return requests;\n}\n\nexport type EnhancedGeneratedPageName = NoyaAPI.GeneratedName & {\n index: number;\n type: \"suggestion\";\n};\n\nexport function useGeneratedPageNames(): EnhancedGeneratedPageName[] {\n const { generatedPageNames$ } = useNoyaClientOrFallback();\n const names = useSelector(generatedPageNames$) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Page ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useGeneratedPageComponentNames(): EnhancedGeneratedPageName[] {\n const { generatedPageComponentNames$: generatedComponentNames$ } =\n useNoyaClientOrFallback();\n const names = useSelector(\n generatedComponentNames$\n ) as NoyaAPI.GeneratedName[];\n\n const namesWithDefaultsAndTypes = useMemo(() => {\n const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);\n\n // Fill any empty slots with default names in the 'loading' state\n const withDefaults = rangeArray.map((index): NoyaAPI.GeneratedName => {\n const name = names[index];\n return name ?? { name: `Component ${index + 1}`, loading: true, key: \"\" };\n });\n\n return withDefaults.map(\n (name, index): EnhancedGeneratedPageName => ({\n ...name,\n index,\n type: \"suggestion\",\n })\n );\n }, [names]);\n\n // Take the first 3\n return namesWithDefaultsAndTypes.slice(0, 3);\n}\n\nexport function useNoyaSites() {\n const sites = useSelector(useNoyaClientOrFallback().sites$);\n return sites;\n}\n\nexport function useNoyaDeployments() {\n const deployments = useSelector(useNoyaClientOrFallback().deployments$);\n return deployments;\n}\n\nexport function useNoyaSite(siteId: string) {\n const { sites } = useNoyaSites();\n const site = sites.find((s) => s.id === siteId);\n\n if (!site) {\n throw new Error(`Site ${siteId} not found`);\n }\n\n return { site };\n}\n\nexport function useNoyaPersonalAccessTokens() {\n const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);\n return tokens;\n}\n\nexport function useNoyaWorkspaces() {\n const workspaces = useSelector(useNoyaClient().workspaces$);\n return workspaces;\n}\n\nexport function useNoyaWorkspaceInvitations(workspaceId: string) {\n const client = useNoyaClientOrFallback();\n const workspaceInvitations = useSelector(\n useNoyaClient().workspaceInvitations$.invitationsByWorkspaceId[workspaceId]\n );\n\n const fallback = useMemo(\n () => ({\n invitations: [],\n loading: true as const,\n }),\n []\n );\n\n useEffect(() => {\n if (!workspaceInvitations) {\n client.workspaces.getInvitations(workspaceId);\n }\n }, [client, workspaceId, workspaceInvitations]);\n\n return workspaceInvitations || fallback;\n}\n\nconst emptyObservedFileVersions: {\n fileVersions: NoyaAPI.FileVersion[];\n loading: NoyaAPI.DataLoadingState;\n} = {\n fileVersions: [],\n loading: \"notStarted\",\n};\n\nexport function useNoyaOwnedFileVersions(fileId: string): {\n fileVersions: NoyaAPI.FileVersion[];\n loading: NoyaAPI.DataLoadingState;\n} {\n const client = useNoyaClientOrFallback();\n const path = useMemo(() => [fileId] as [string], [fileId]);\n const fileVersions = useObservable(client.ownedFileVersions$, path);\n\n useEffect(() => {\n if (!fileVersions || fileVersions.loading === \"notStarted\") {\n client.fileVersions.refetch({ fileId, type: \"owned\" });\n }\n }, [client, fileId, fileVersions, fileVersions?.loading]);\n\n return fileVersions ?? emptyObservedFileVersions;\n}\n"],"mappings":"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","names":["useMemo","file","useMemo"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noya-app/noya-api-client-react",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -10,8 +10,10 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@legendapp/state": "^2.1.1",
13
- "@noya-app/noya-api": "0.1.24",
14
- "@noya-app/noya-utils": "0.1.3"
13
+ "@noya-app/noya-api": "0.1.25",
14
+ "@noya-app/noya-utils": "0.1.3",
15
+ "@noya-app/observable": "0.1.5",
16
+ "@noya-app/observable-react": "0.1.15"
15
17
  },
16
18
  "peerDependencies": {
17
19
  "react": "*",
@@ -1,6 +1,7 @@
1
1
  import { useSelector } from "@legendapp/state/react";
2
2
  import { GENERATED_PAGE_NAME_COUNT, NoyaAPI } from "@noya-app/noya-api";
3
3
  import { range } from "@noya-app/noya-utils";
4
+ import { useObservable } from "@noya-app/observable-react";
4
5
  import { useEffect, useMemo, useRef } from "react";
5
6
  import {
6
7
  useNoyaClient,
@@ -131,6 +132,33 @@ export function useNoyaBilling() {
131
132
  return billing;
132
133
  }
133
134
 
135
+ export function useNoyaWorkspaceBilling(workspaceId: string) {
136
+ const client = useNoyaClientOrFallback();
137
+ const workspaceBilling = useSelector(
138
+ useNoyaClient().workspaceBilling$.billingByWorkspaceId[workspaceId]
139
+ );
140
+
141
+ // Workspace billing will always have products, but will be empty until the billing is fetched
142
+ const hasFetchedWorkspaceBilling =
143
+ workspaceBilling?.loading === false &&
144
+ workspaceBilling?.availableProducts.length > 0;
145
+
146
+ useEffect(() => {
147
+ if (!hasFetchedWorkspaceBilling) {
148
+ client.workspaces.getBilling(workspaceId);
149
+ }
150
+ }, [client, hasFetchedWorkspaceBilling, workspaceId]);
151
+
152
+ return (
153
+ workspaceBilling || {
154
+ subscriptions: [],
155
+ availableProducts: [],
156
+ portalUrl: undefined,
157
+ loading: true,
158
+ }
159
+ );
160
+ }
161
+
134
162
  export function useNoyaEmailLists() {
135
163
  const emailLists = useSelector(useNoyaClient().emailLists$);
136
164
  return emailLists;
@@ -292,3 +320,56 @@ export function useNoyaPersonalAccessTokens() {
292
320
  const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);
293
321
  return tokens;
294
322
  }
323
+
324
+ export function useNoyaWorkspaces() {
325
+ const workspaces = useSelector(useNoyaClient().workspaces$);
326
+ return workspaces;
327
+ }
328
+
329
+ export function useNoyaWorkspaceInvitations(workspaceId: string) {
330
+ const client = useNoyaClientOrFallback();
331
+ const workspaceInvitations = useSelector(
332
+ useNoyaClient().workspaceInvitations$.invitationsByWorkspaceId[workspaceId]
333
+ );
334
+
335
+ const fallback = useMemo(
336
+ () => ({
337
+ invitations: [],
338
+ loading: true as const,
339
+ }),
340
+ []
341
+ );
342
+
343
+ useEffect(() => {
344
+ if (!workspaceInvitations) {
345
+ client.workspaces.getInvitations(workspaceId);
346
+ }
347
+ }, [client, workspaceId, workspaceInvitations]);
348
+
349
+ return workspaceInvitations || fallback;
350
+ }
351
+
352
+ const emptyObservedFileVersions: {
353
+ fileVersions: NoyaAPI.FileVersion[];
354
+ loading: NoyaAPI.DataLoadingState;
355
+ } = {
356
+ fileVersions: [],
357
+ loading: "notStarted",
358
+ };
359
+
360
+ export function useNoyaOwnedFileVersions(fileId: string): {
361
+ fileVersions: NoyaAPI.FileVersion[];
362
+ loading: NoyaAPI.DataLoadingState;
363
+ } {
364
+ const client = useNoyaClientOrFallback();
365
+ const path = useMemo(() => [fileId] as [string], [fileId]);
366
+ const fileVersions = useObservable(client.ownedFileVersions$, path);
367
+
368
+ useEffect(() => {
369
+ if (!fileVersions || fileVersions.loading === "notStarted") {
370
+ client.fileVersions.refetch({ fileId, type: "owned" });
371
+ }
372
+ }, [client, fileId, fileVersions, fileVersions?.loading]);
373
+
374
+ return fileVersions ?? emptyObservedFileVersions;
375
+ }