@noya-app/noya-api-client-react 0.1.23 → 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.
- package/.turbo/turbo-build.log +9 -9
- package/CHANGELOG.md +17 -0
- package/dist/index.d.mts +49 -1
- package/dist/index.d.ts +49 -1
- package/dist/index.js +66 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +62 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -3
- package/src/react/hooks.ts +84 -2
package/.turbo/turbo-build.log
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
[34mCLI[39m Target: esnext
|
|
7
7
|
[34mCJS[39m Build start
|
|
8
8
|
[34mESM[39m Build start
|
|
9
|
-
[32mCJS[39m [1mdist/index.js [22m[
|
|
10
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
11
|
-
[32mCJS[39m ⚡️ Build success in
|
|
12
|
-
[32mESM[39m [1mdist/index.mjs [22m[
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
14
|
-
[32mESM[39m ⚡️ Build success in
|
|
9
|
+
[32mCJS[39m [1mdist/index.js [22m[32m14.95 KB[39m
|
|
10
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m19.34 KB[39m
|
|
11
|
+
[32mCJS[39m ⚡️ Build success in 20ms
|
|
12
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m10.78 KB[39m
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m19.08 KB[39m
|
|
14
|
+
[32mESM[39m ⚡️ Build success in 20ms
|
|
15
15
|
DTS Build start
|
|
16
|
-
DTS ⚡️ Build success in
|
|
17
|
-
DTS dist/index.d.ts
|
|
18
|
-
DTS dist/index.d.mts
|
|
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,22 @@
|
|
|
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
|
+
|
|
12
|
+
## 0.1.24
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 0a1b9c2: Bump versions
|
|
17
|
+
- Updated dependencies [0a1b9c2]
|
|
18
|
+
- @noya-app/noya-api@0.1.24
|
|
19
|
+
|
|
3
20
|
## 0.1.23
|
|
4
21
|
|
|
5
22
|
### 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();
|
|
@@ -102,7 +107,7 @@ function useNoyaFiles() {
|
|
|
102
107
|
}, [client, files.loading, session]);
|
|
103
108
|
return {
|
|
104
109
|
files: files.files,
|
|
105
|
-
loading: files.loading === "loadedInClient" || files.loading === "populatedOnServer"
|
|
110
|
+
loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer")
|
|
106
111
|
};
|
|
107
112
|
}
|
|
108
113
|
function useNoyaIsOwnFile(fileId) {
|
|
@@ -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\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":["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();
|
|
@@ -45,7 +46,7 @@ function useNoyaFiles() {
|
|
|
45
46
|
}, [client, files.loading, session]);
|
|
46
47
|
return {
|
|
47
48
|
files: files.files,
|
|
48
|
-
loading: files.loading === "loadedInClient" || files.loading === "populatedOnServer"
|
|
49
|
+
loading: !(files.loading === "loadedInClient" || files.loading === "populatedOnServer")
|
|
49
50
|
};
|
|
50
51
|
}
|
|
51
52
|
function useNoyaIsOwnFile(fileId) {
|
|
@@ -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,
|
package/dist/index.mjs.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\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.
|
|
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.
|
|
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": "*",
|
package/src/react/hooks.ts
CHANGED
|
@@ -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,
|
|
@@ -29,9 +30,10 @@ export function useNoyaFiles(): {
|
|
|
29
30
|
|
|
30
31
|
return {
|
|
31
32
|
files: files.files,
|
|
32
|
-
loading:
|
|
33
|
+
loading: !(
|
|
33
34
|
files.loading === "loadedInClient" ||
|
|
34
|
-
files.loading === "populatedOnServer"
|
|
35
|
+
files.loading === "populatedOnServer"
|
|
36
|
+
),
|
|
35
37
|
};
|
|
36
38
|
}
|
|
37
39
|
|
|
@@ -130,6 +132,33 @@ export function useNoyaBilling() {
|
|
|
130
132
|
return billing;
|
|
131
133
|
}
|
|
132
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
|
+
|
|
133
162
|
export function useNoyaEmailLists() {
|
|
134
163
|
const emailLists = useSelector(useNoyaClient().emailLists$);
|
|
135
164
|
return emailLists;
|
|
@@ -291,3 +320,56 @@ export function useNoyaPersonalAccessTokens() {
|
|
|
291
320
|
const tokens = useSelector(useNoyaClientOrFallback().personalAccessTokens$);
|
|
292
321
|
return tokens;
|
|
293
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
|
+
}
|