@noya-app/noya-api-client-react 0.1.29 → 0.1.31

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
- CJS dist/index.js 15.68 KB
10
- CJS dist/index.js.map 20.42 KB
11
- CJS ⚡️ Build success in 41ms
12
- ESM dist/index.mjs 11.40 KB
13
- ESM dist/index.mjs.map 20.16 KB
14
- ESM ⚡️ Build success in 42ms
9
+ ESM dist/index.mjs 12.09 KB
10
+ ESM dist/index.mjs.map 21.47 KB
11
+ ESM ⚡️ Build success in 67ms
12
+ CJS dist/index.js 16.50 KB
13
+ CJS dist/index.js.map 21.74 KB
14
+ CJS ⚡️ Build success in 67ms
15
15
  DTS Build start
16
- DTS ⚡️ Build success in 7053ms
17
- DTS dist/index.d.ts 12.00 KB
18
- DTS dist/index.d.mts 12.00 KB
16
+ DTS ⚡️ Build success in 5621ms
17
+ DTS dist/index.d.ts 12.27 KB
18
+ DTS dist/index.d.mts 12.27 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @noya-app/noya-api-client-react
2
2
 
3
+ ## 0.1.31
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [aa6fbab]
8
+ - @noya-app/observable-react@0.1.17
9
+ - @noya-app/observable@0.1.7
10
+ - @noya-app/noya-api@0.1.31
11
+
12
+ ## 0.1.30
13
+
14
+ ### Patch Changes
15
+
16
+ - a7cf080: Bump packages
17
+ - Updated dependencies [a7cf080]
18
+ - @noya-app/observable@0.1.6
19
+ - @noya-app/noya-api@0.1.30
20
+ - @noya-app/observable-react@0.1.16
21
+
3
22
  ## 0.1.29
4
23
 
5
24
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -14,6 +14,7 @@ declare function useNoyaClientOrFallback(): NoyaAPIContextValue;
14
14
  declare function useNoyaFiles(): {
15
15
  files: NoyaAPI.File[];
16
16
  loading: boolean;
17
+ reload: () => Promise<void>;
17
18
  };
18
19
  declare function useNoyaIsOwnFile(fileId?: string): boolean;
19
20
  declare function useNoyaTools(initial?: NoyaAPI.Tool[]): {
@@ -121,6 +122,15 @@ declare function useNoyaAssets(fileId?: string): {
121
122
  }[];
122
123
  loading: boolean;
123
124
  };
125
+ declare function useNoyaSecrets(fileId?: string): {
126
+ secrets: {
127
+ name: string;
128
+ id: string;
129
+ stableId: string;
130
+ fileId: string;
131
+ }[];
132
+ loading: boolean;
133
+ };
124
134
  declare function useNoyaSession(): {
125
135
  user: {
126
136
  name: string | null;
@@ -394,6 +404,7 @@ declare function useNoyaWorkspaceInvitations(workspaceId: string): {
394
404
  declare function useNoyaOwnedFileVersions(fileId: string): {
395
405
  fileVersions: NoyaAPI.FileVersion[];
396
406
  loading: NoyaAPI.DataLoadingState;
407
+ reload: () => Promise<void>;
397
408
  };
398
409
  declare function useNoyaTemplates(): {
399
410
  templates: {
@@ -436,4 +447,4 @@ declare function useNoyaTemplates(): {
436
447
  loading: boolean;
437
448
  };
438
449
 
439
- 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, useNoyaTemplates, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
450
+ export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaOwnedFileVersions, useNoyaPersonalAccessTokens, useNoyaSecrets, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTemplates, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
package/dist/index.d.ts CHANGED
@@ -14,6 +14,7 @@ declare function useNoyaClientOrFallback(): NoyaAPIContextValue;
14
14
  declare function useNoyaFiles(): {
15
15
  files: NoyaAPI.File[];
16
16
  loading: boolean;
17
+ reload: () => Promise<void>;
17
18
  };
18
19
  declare function useNoyaIsOwnFile(fileId?: string): boolean;
19
20
  declare function useNoyaTools(initial?: NoyaAPI.Tool[]): {
@@ -121,6 +122,15 @@ declare function useNoyaAssets(fileId?: string): {
121
122
  }[];
122
123
  loading: boolean;
123
124
  };
125
+ declare function useNoyaSecrets(fileId?: string): {
126
+ secrets: {
127
+ name: string;
128
+ id: string;
129
+ stableId: string;
130
+ fileId: string;
131
+ }[];
132
+ loading: boolean;
133
+ };
124
134
  declare function useNoyaSession(): {
125
135
  user: {
126
136
  name: string | null;
@@ -394,6 +404,7 @@ declare function useNoyaWorkspaceInvitations(workspaceId: string): {
394
404
  declare function useNoyaOwnedFileVersions(fileId: string): {
395
405
  fileVersions: NoyaAPI.FileVersion[];
396
406
  loading: NoyaAPI.DataLoadingState;
407
+ reload: () => Promise<void>;
397
408
  };
398
409
  declare function useNoyaTemplates(): {
399
410
  templates: {
@@ -436,4 +447,4 @@ declare function useNoyaTemplates(): {
436
447
  loading: boolean;
437
448
  };
438
449
 
439
- 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, useNoyaTemplates, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
450
+ export { type EnhancedGeneratedPageName, NoyaAPIProvider, useGeneratedComponentDescription, useGeneratedComponentDescriptions, useGeneratedComponentNames, useGeneratedPageComponentNames, useGeneratedPageNames, useIsBeta, useMetadata, useNetworkRequests, useNoyaAssets, useNoyaBilling, useNoyaClient, useNoyaClientOrFallback, useNoyaCreators, useNoyaDeployments, useNoyaEmailLists, useNoyaFiles, useNoyaIsOwnFile, useNoyaOwnedFileVersions, useNoyaPersonalAccessTokens, useNoyaSecrets, useNoyaSession, useNoyaSite, useNoyaSites, useNoyaTags, useNoyaTemplates, useNoyaTools, useNoyaUserData, useNoyaWorkspaceBilling, useNoyaWorkspaceInvitations, useNoyaWorkspaces, useOptionalNoyaClient, useOptionalNoyaCreators, useOptionalNoyaSession, useOptionalNoyaTags, useOptionalNoyaTools, useOptionalNoyaUserData, useRandomIcons, useRandomImages };
package/dist/index.js CHANGED
@@ -41,6 +41,7 @@ __export(src_exports, {
41
41
  useNoyaIsOwnFile: () => useNoyaIsOwnFile,
42
42
  useNoyaOwnedFileVersions: () => useNoyaOwnedFileVersions,
43
43
  useNoyaPersonalAccessTokens: () => useNoyaPersonalAccessTokens,
44
+ useNoyaSecrets: () => useNoyaSecrets,
44
45
  useNoyaSession: () => useNoyaSession,
45
46
  useNoyaSite: () => useNoyaSite,
46
47
  useNoyaSites: () => useNoyaSites,
@@ -106,9 +107,13 @@ function useNoyaFiles() {
106
107
  client.files.refetch();
107
108
  }
108
109
  }, [client, files.loading, session]);
110
+ const reload = (0, import_react3.useCallback)(() => {
111
+ return client.files.refetch();
112
+ }, [client]);
109
113
  return {
110
114
  files: files.files,
111
- loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer")
115
+ loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer"),
116
+ reload
112
117
  };
113
118
  }
114
119
  function useNoyaIsOwnFile(fileId) {
@@ -181,6 +186,14 @@ function useNoyaAssets(fileId) {
181
186
  );
182
187
  return assets ?? empty;
183
188
  }
189
+ function useNoyaSecrets(fileId) {
190
+ const client = useNoyaClientOrFallback();
191
+ const empty = (0, import_react3.useMemo)(() => ({ secrets: [], loading: true }), []);
192
+ const secrets = (0, import_react2.useSelector)(
193
+ fileId ? client.secretsByFileId$[fileId] : client.secrets$
194
+ );
195
+ return secrets ?? empty;
196
+ }
184
197
  function useNoyaSession() {
185
198
  const session = (0, import_react2.useSelector)(useNoyaClient().session$);
186
199
  return session;
@@ -336,8 +349,9 @@ function useNoyaPersonalAccessTokens() {
336
349
  }
337
350
  function useNoyaWorkspaces() {
338
351
  const client = useNoyaClientOrFallback();
339
- const workspaces = (0, import_react2.useSelector)(useNoyaClient().workspaces$);
340
- const fetchWorkspaces = !workspaces.workspaces.length;
352
+ const workspaces = (0, import_react2.useSelector)(client.workspaces$);
353
+ const session = (0, import_react2.useSelector)(client.session$);
354
+ const fetchWorkspaces = !workspaces.workspaces.length && session;
341
355
  (0, import_react3.useEffect)(() => {
342
356
  if (fetchWorkspaces) {
343
357
  client.workspaces.read();
@@ -377,7 +391,16 @@ function useNoyaOwnedFileVersions(fileId) {
377
391
  client.fileVersions.refetch({ fileId, type: "owned" });
378
392
  }
379
393
  }, [client, fileId, fileVersions, fileVersions?.loading]);
380
- return fileVersions ?? emptyObservedFileVersions;
394
+ const reload = (0, import_react3.useCallback)(() => {
395
+ return client.fileVersions.refetch({ fileId, type: "owned" });
396
+ }, [client, fileId]);
397
+ const result = (0, import_react3.useMemo)(() => {
398
+ return {
399
+ ...fileVersions ?? emptyObservedFileVersions,
400
+ reload
401
+ };
402
+ }, [fileVersions, reload]);
403
+ return result;
381
404
  }
382
405
  function useNoyaTemplates() {
383
406
  const client = useNoyaClientOrFallback();
@@ -414,6 +437,7 @@ function useNoyaTemplates() {
414
437
  useNoyaIsOwnFile,
415
438
  useNoyaOwnedFileVersions,
416
439
  useNoyaPersonalAccessTokens,
440
+ useNoyaSecrets,
417
441
  useNoyaSession,
418
442
  useNoyaSite,
419
443
  useNoyaSites,
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 { 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 client = useNoyaClientOrFallback();\n const workspaces = useSelector(useNoyaClient().workspaces$);\n const fetchWorkspaces = !workspaces.workspaces.length;\n\n useEffect(() => {\n if (fetchWorkspaces) {\n client.workspaces.read();\n }\n }, [client, fetchWorkspaces]);\n\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\nexport function useNoyaTemplates() {\n const client = useNoyaClientOrFallback();\n const { templates, loading } = useSelector(client.templates$);\n\n useEffect(() => {\n if (loading === \"notStarted\" || loading === \"populatedOnServer\") {\n client.templates.read();\n }\n }, [client, loading]);\n\n return {\n templates,\n loading: !(loading === \"loadedInClient\" || loading === \"populatedOnServer\"),\n };\n}\n"],"mappings":"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","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 { useCallback, 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 reload: () => Promise<void>;\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 const reload = useCallback(() => {\n return client.files.refetch();\n }, [client]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n reload,\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 useNoyaSecrets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ secrets: [], loading: true }), []);\n const secrets = useSelector(\n fileId ? client.secretsByFileId$[fileId] : client.secrets$\n );\n return secrets ?? 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 client = useNoyaClientOrFallback();\n const workspaces = useSelector(client.workspaces$);\n const session = useSelector(client.session$);\n const fetchWorkspaces = !workspaces.workspaces.length && session;\n\n useEffect(() => {\n if (fetchWorkspaces) {\n client.workspaces.read();\n }\n }, [client, fetchWorkspaces]);\n\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 reload: () => Promise<void>;\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 const reload = useCallback(() => {\n return client.fileVersions.refetch({ fileId, type: \"owned\" });\n }, [client, fileId]);\n\n const result = useMemo(() => {\n return {\n ...(fileVersions ?? emptyObservedFileVersions),\n reload,\n };\n }, [fileVersions, reload]);\n\n return result;\n}\n\nexport function useNoyaTemplates() {\n const client = useNoyaClientOrFallback();\n const { templates, loading } = useSelector(client.templates$);\n\n useEffect(() => {\n if (loading === \"notStarted\" || loading === \"populatedOnServer\") {\n client.templates.read();\n }\n }, [client, loading]);\n\n return {\n templates,\n loading: !(loading === \"loadedInClient\" || loading === \"populatedOnServer\"),\n };\n}\n"],"mappings":"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","names":["import_react","import_noya_api","file"]}
package/dist/index.mjs CHANGED
@@ -33,7 +33,7 @@ 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
35
  import { useObservable } from "@noya-app/observable-react";
36
- import { useEffect, useMemo as useMemo2, useRef } from "react";
36
+ import { useCallback, useEffect, useMemo as useMemo2, useRef } from "react";
37
37
  function useNoyaFiles() {
38
38
  const client = useNoyaClientOrFallback();
39
39
  const files = useSelector(client.files$);
@@ -44,9 +44,13 @@ function useNoyaFiles() {
44
44
  client.files.refetch();
45
45
  }
46
46
  }, [client, files.loading, session]);
47
+ const reload = useCallback(() => {
48
+ return client.files.refetch();
49
+ }, [client]);
47
50
  return {
48
51
  files: files.files,
49
- loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer")
52
+ loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer"),
53
+ reload
50
54
  };
51
55
  }
52
56
  function useNoyaIsOwnFile(fileId) {
@@ -119,6 +123,14 @@ function useNoyaAssets(fileId) {
119
123
  );
120
124
  return assets ?? empty;
121
125
  }
126
+ function useNoyaSecrets(fileId) {
127
+ const client = useNoyaClientOrFallback();
128
+ const empty = useMemo2(() => ({ secrets: [], loading: true }), []);
129
+ const secrets = useSelector(
130
+ fileId ? client.secretsByFileId$[fileId] : client.secrets$
131
+ );
132
+ return secrets ?? empty;
133
+ }
122
134
  function useNoyaSession() {
123
135
  const session = useSelector(useNoyaClient().session$);
124
136
  return session;
@@ -274,8 +286,9 @@ function useNoyaPersonalAccessTokens() {
274
286
  }
275
287
  function useNoyaWorkspaces() {
276
288
  const client = useNoyaClientOrFallback();
277
- const workspaces = useSelector(useNoyaClient().workspaces$);
278
- const fetchWorkspaces = !workspaces.workspaces.length;
289
+ const workspaces = useSelector(client.workspaces$);
290
+ const session = useSelector(client.session$);
291
+ const fetchWorkspaces = !workspaces.workspaces.length && session;
279
292
  useEffect(() => {
280
293
  if (fetchWorkspaces) {
281
294
  client.workspaces.read();
@@ -315,7 +328,16 @@ function useNoyaOwnedFileVersions(fileId) {
315
328
  client.fileVersions.refetch({ fileId, type: "owned" });
316
329
  }
317
330
  }, [client, fileId, fileVersions, fileVersions?.loading]);
318
- return fileVersions ?? emptyObservedFileVersions;
331
+ const reload = useCallback(() => {
332
+ return client.fileVersions.refetch({ fileId, type: "owned" });
333
+ }, [client, fileId]);
334
+ const result = useMemo2(() => {
335
+ return {
336
+ ...fileVersions ?? emptyObservedFileVersions,
337
+ reload
338
+ };
339
+ }, [fileVersions, reload]);
340
+ return result;
319
341
  }
320
342
  function useNoyaTemplates() {
321
343
  const client = useNoyaClientOrFallback();
@@ -351,6 +373,7 @@ export {
351
373
  useNoyaIsOwnFile,
352
374
  useNoyaOwnedFileVersions,
353
375
  useNoyaPersonalAccessTokens,
376
+ useNoyaSecrets,
354
377
  useNoyaSession,
355
378
  useNoyaSite,
356
379
  useNoyaSites,
@@ -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 { 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 client = useNoyaClientOrFallback();\n const workspaces = useSelector(useNoyaClient().workspaces$);\n const fetchWorkspaces = !workspaces.workspaces.length;\n\n useEffect(() => {\n if (fetchWorkspaces) {\n client.workspaces.read();\n }\n }, [client, fetchWorkspaces]);\n\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\nexport function useNoyaTemplates() {\n const client = useNoyaClientOrFallback();\n const { templates, loading } = useSelector(client.templates$);\n\n useEffect(() => {\n if (loading === \"notStarted\" || loading === \"populatedOnServer\") {\n client.templates.read();\n }\n }, [client, loading]);\n\n return {\n templates,\n loading: !(loading === \"loadedInClient\" || loading === \"populatedOnServer\"),\n };\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 { useCallback, 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 reload: () => Promise<void>;\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 const reload = useCallback(() => {\n return client.files.refetch();\n }, [client]);\n\n return {\n files: files.files,\n loading: !(\n files.loading === \"loadedInClient\" ||\n files.loading === \"populatedOnServer\"\n ),\n reload,\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 useNoyaSecrets(fileId?: string) {\n const client = useNoyaClientOrFallback();\n const empty = useMemo(() => ({ secrets: [], loading: true }), []);\n const secrets = useSelector(\n fileId ? client.secretsByFileId$[fileId] : client.secrets$\n );\n return secrets ?? 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 client = useNoyaClientOrFallback();\n const workspaces = useSelector(client.workspaces$);\n const session = useSelector(client.session$);\n const fetchWorkspaces = !workspaces.workspaces.length && session;\n\n useEffect(() => {\n if (fetchWorkspaces) {\n client.workspaces.read();\n }\n }, [client, fetchWorkspaces]);\n\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 reload: () => Promise<void>;\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 const reload = useCallback(() => {\n return client.fileVersions.refetch({ fileId, type: \"owned\" });\n }, [client, fileId]);\n\n const result = useMemo(() => {\n return {\n ...(fileVersions ?? emptyObservedFileVersions),\n reload,\n };\n }, [fileVersions, reload]);\n\n return result;\n}\n\nexport function useNoyaTemplates() {\n const client = useNoyaClientOrFallback();\n const { templates, loading } = useSelector(client.templates$);\n\n useEffect(() => {\n if (loading === \"notStarted\" || loading === \"populatedOnServer\") {\n client.templates.read();\n }\n }, [client, loading]);\n\n return {\n templates,\n loading: !(loading === \"loadedInClient\" || loading === \"populatedOnServer\"),\n };\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.29",
3
+ "version": "0.1.31",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -10,10 +10,10 @@
10
10
  },
11
11
  "dependencies": {
12
12
  "@legendapp/state": "^2.1.1",
13
- "@noya-app/noya-api": "0.1.29",
13
+ "@noya-app/noya-api": "0.1.31",
14
14
  "@noya-app/noya-utils": "0.1.5",
15
- "@noya-app/observable": "0.1.5",
16
- "@noya-app/observable-react": "0.1.15"
15
+ "@noya-app/observable": "0.1.7",
16
+ "@noya-app/observable-react": "0.1.17"
17
17
  },
18
18
  "peerDependencies": {
19
19
  "react": "*",
@@ -2,7 +2,7 @@ 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
4
  import { useObservable } from "@noya-app/observable-react";
5
- import { useEffect, useMemo, useRef } from "react";
5
+ import { useCallback, useEffect, useMemo, useRef } from "react";
6
6
  import {
7
7
  useNoyaClient,
8
8
  useNoyaClientOrFallback,
@@ -12,6 +12,7 @@ import {
12
12
  export function useNoyaFiles(): {
13
13
  files: NoyaAPI.File[];
14
14
  loading: boolean;
15
+ reload: () => Promise<void>;
15
16
  } {
16
17
  const client = useNoyaClientOrFallback();
17
18
  const files = useSelector(client.files$);
@@ -28,12 +29,17 @@ export function useNoyaFiles(): {
28
29
  }
29
30
  }, [client, files.loading, session]);
30
31
 
32
+ const reload = useCallback(() => {
33
+ return client.files.refetch();
34
+ }, [client]);
35
+
31
36
  return {
32
37
  files: files.files,
33
38
  loading: !(
34
39
  files.loading === "loadedInClient" ||
35
40
  files.loading === "populatedOnServer"
36
41
  ),
42
+ reload,
37
43
  };
38
44
  }
39
45
 
@@ -117,6 +123,15 @@ export function useNoyaAssets(fileId?: string) {
117
123
  return assets ?? empty;
118
124
  }
119
125
 
126
+ export function useNoyaSecrets(fileId?: string) {
127
+ const client = useNoyaClientOrFallback();
128
+ const empty = useMemo(() => ({ secrets: [], loading: true }), []);
129
+ const secrets = useSelector(
130
+ fileId ? client.secretsByFileId$[fileId] : client.secrets$
131
+ );
132
+ return secrets ?? empty;
133
+ }
134
+
120
135
  export function useNoyaSession() {
121
136
  const session = useSelector(useNoyaClient().session$);
122
137
  return session;
@@ -323,8 +338,9 @@ export function useNoyaPersonalAccessTokens() {
323
338
 
324
339
  export function useNoyaWorkspaces() {
325
340
  const client = useNoyaClientOrFallback();
326
- const workspaces = useSelector(useNoyaClient().workspaces$);
327
- const fetchWorkspaces = !workspaces.workspaces.length;
341
+ const workspaces = useSelector(client.workspaces$);
342
+ const session = useSelector(client.session$);
343
+ const fetchWorkspaces = !workspaces.workspaces.length && session;
328
344
 
329
345
  useEffect(() => {
330
346
  if (fetchWorkspaces) {
@@ -369,6 +385,7 @@ const emptyObservedFileVersions: {
369
385
  export function useNoyaOwnedFileVersions(fileId: string): {
370
386
  fileVersions: NoyaAPI.FileVersion[];
371
387
  loading: NoyaAPI.DataLoadingState;
388
+ reload: () => Promise<void>;
372
389
  } {
373
390
  const client = useNoyaClientOrFallback();
374
391
  const path = useMemo(() => [fileId] as [string], [fileId]);
@@ -380,7 +397,18 @@ export function useNoyaOwnedFileVersions(fileId: string): {
380
397
  }
381
398
  }, [client, fileId, fileVersions, fileVersions?.loading]);
382
399
 
383
- return fileVersions ?? emptyObservedFileVersions;
400
+ const reload = useCallback(() => {
401
+ return client.fileVersions.refetch({ fileId, type: "owned" });
402
+ }, [client, fileId]);
403
+
404
+ const result = useMemo(() => {
405
+ return {
406
+ ...(fileVersions ?? emptyObservedFileVersions),
407
+ reload,
408
+ };
409
+ }, [fileVersions, reload]);
410
+
411
+ return result;
384
412
  }
385
413
 
386
414
  export function useNoyaTemplates() {