@noya-app/noya-api-client-react 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ NoyaAPIProvider: () => NoyaAPIProvider,
25
+ useGeneratedComponentDescription: () => useGeneratedComponentDescription,
26
+ useGeneratedComponentDescriptions: () => useGeneratedComponentDescriptions,
27
+ useGeneratedComponentNames: () => useGeneratedComponentNames,
28
+ useGeneratedPageComponentNames: () => useGeneratedPageComponentNames,
29
+ useGeneratedPageNames: () => useGeneratedPageNames,
30
+ useIsBeta: () => useIsBeta,
31
+ useMetadata: () => useMetadata,
32
+ useNetworkRequests: () => useNetworkRequests,
33
+ useNoyaAssets: () => useNoyaAssets,
34
+ useNoyaBilling: () => useNoyaBilling,
35
+ useNoyaClient: () => useNoyaClient,
36
+ useNoyaClientOrFallback: () => useNoyaClientOrFallback,
37
+ useNoyaCreators: () => useNoyaCreators,
38
+ useNoyaEmailLists: () => useNoyaEmailLists,
39
+ useNoyaFiles: () => useNoyaFiles,
40
+ useNoyaIsOwnFile: () => useNoyaIsOwnFile,
41
+ useNoyaSession: () => useNoyaSession,
42
+ useNoyaTags: () => useNoyaTags,
43
+ useNoyaTools: () => useNoyaTools,
44
+ useNoyaUserData: () => useNoyaUserData,
45
+ useOptionalNoyaClient: () => useOptionalNoyaClient,
46
+ useOptionalNoyaCreators: () => useOptionalNoyaCreators,
47
+ useOptionalNoyaSession: () => useOptionalNoyaSession,
48
+ useOptionalNoyaTags: () => useOptionalNoyaTags,
49
+ useOptionalNoyaTools: () => useOptionalNoyaTools,
50
+ useOptionalNoyaUserData: () => useOptionalNoyaUserData,
51
+ useRandomIcons: () => useRandomIcons,
52
+ useRandomImages: () => useRandomImages
53
+ });
54
+ module.exports = __toCommonJS(src_exports);
55
+ __reExport(src_exports, require("@noya-app/noya-api"), module.exports);
56
+
57
+ // src/react/context.ts
58
+ var import_noya_api = require("@noya-app/noya-api");
59
+ var import_react = require("react");
60
+ var NoyaAPIContext = (0, import_react.createContext)(
61
+ void 0
62
+ );
63
+ var NoyaAPIProvider = NoyaAPIContext.Provider;
64
+ function useNoyaClient() {
65
+ const value = (0, import_react.useContext)(NoyaAPIContext);
66
+ if (!value) {
67
+ throw new Error("Missing NoyaAPIContextValue");
68
+ }
69
+ return value;
70
+ }
71
+ function useOptionalNoyaClient() {
72
+ return (0, import_react.useContext)(NoyaAPIContext);
73
+ }
74
+ function useNoyaClientOrFallback() {
75
+ const value = (0, import_react.useContext)(NoyaAPIContext);
76
+ const memoryClient = (0, import_react.useMemo)(() => {
77
+ return new import_noya_api.NoyaAPI.Client({
78
+ networkClient: new import_noya_api.NoyaAPI.MemoryClient()
79
+ });
80
+ }, []);
81
+ return value ?? memoryClient;
82
+ }
83
+
84
+ // src/react/hooks.ts
85
+ var import_react2 = require("@legendapp/state/react");
86
+ var import_noya_api2 = require("@noya-app/noya-api");
87
+ var import_noya_utils = require("@noya-app/noya-utils");
88
+ var import_react3 = require("react");
89
+ function useNoyaFiles() {
90
+ const client = useNoyaClientOrFallback();
91
+ const files = (0, import_react2.useSelector)(client.files$);
92
+ const session = (0, import_react2.useSelector)(useNoyaClient().session$);
93
+ (0, import_react3.useEffect)(() => {
94
+ if (!session)
95
+ return;
96
+ if (files.loading === "notStarted" || files.loading === "populatedOnServer") {
97
+ client.files.refetch();
98
+ }
99
+ }, [client, files.loading, session]);
100
+ return files;
101
+ }
102
+ function useNoyaIsOwnFile(fileId) {
103
+ const client = useNoyaClientOrFallback();
104
+ const files = (0, import_react2.useSelector)(client.files$);
105
+ const session = (0, import_react2.useSelector)(client.session$);
106
+ const file = files.files.find((file2) => file2.id === fileId);
107
+ return file?.userId === session?.user.id;
108
+ }
109
+ function useNoyaTools(initial) {
110
+ const didInitialize = (0, import_react3.useRef)(false);
111
+ const client = useNoyaClientOrFallback();
112
+ const tools = (0, import_react2.useSelector)(client.tools$);
113
+ (0, import_react3.useEffect)(() => {
114
+ if (didInitialize.current)
115
+ return;
116
+ didInitialize.current = true;
117
+ if (initial) {
118
+ client.tools.setInitial(initial);
119
+ } else {
120
+ client.tools.list();
121
+ }
122
+ }, [client, initial]);
123
+ return tools;
124
+ }
125
+ function useOptionalNoyaTools(initial) {
126
+ const client = useNoyaClientOrFallback();
127
+ const tools = (0, import_react2.useSelector)(client.tools$);
128
+ return (0, import_react3.useMemo)(
129
+ () => tools.loading && initial ? { loading: true, tools: initial } : tools,
130
+ [initial, tools]
131
+ );
132
+ }
133
+ function useNoyaTags() {
134
+ const client = useNoyaClient();
135
+ const tags = (0, import_react2.useSelector)(client.tags$);
136
+ (0, import_react3.useEffect)(() => {
137
+ client.tags.read();
138
+ }, [client]);
139
+ return tags;
140
+ }
141
+ function useOptionalNoyaTags() {
142
+ const client = useNoyaClientOrFallback();
143
+ const tags = (0, import_react2.useSelector)(client.tags$);
144
+ (0, import_react3.useEffect)(() => {
145
+ client.tags.read();
146
+ }, [client]);
147
+ return tags;
148
+ }
149
+ function useNoyaCreators() {
150
+ const client = useNoyaClientOrFallback();
151
+ const creators = (0, import_react2.useSelector)(client.creators$);
152
+ (0, import_react3.useEffect)(() => {
153
+ client.creators.read();
154
+ }, [client]);
155
+ return creators;
156
+ }
157
+ function useOptionalNoyaCreators() {
158
+ const client = useNoyaClientOrFallback();
159
+ const creators = (0, import_react2.useSelector)(client.creators$);
160
+ (0, import_react3.useEffect)(() => {
161
+ client.creators.read();
162
+ }, [client]);
163
+ return creators;
164
+ }
165
+ function useNoyaAssets(fileId) {
166
+ const client = useNoyaClientOrFallback();
167
+ const empty = (0, import_react3.useMemo)(() => ({ assets: [], loading: true }), []);
168
+ const assets = (0, import_react2.useSelector)(
169
+ fileId ? client.assetsByFileId$[fileId] : client.assets$
170
+ );
171
+ return assets ?? empty;
172
+ }
173
+ function useNoyaSession() {
174
+ const session = (0, import_react2.useSelector)(useNoyaClient().session$);
175
+ return session;
176
+ }
177
+ function useOptionalNoyaSession() {
178
+ const session = (0, import_react2.useSelector)(useOptionalNoyaClient()?.session$);
179
+ return session;
180
+ }
181
+ function useNoyaBilling() {
182
+ const billing = (0, import_react2.useSelector)(useNoyaClient().billing$);
183
+ return billing;
184
+ }
185
+ function useNoyaEmailLists() {
186
+ const emailLists = (0, import_react2.useSelector)(useNoyaClient().emailLists$);
187
+ return emailLists;
188
+ }
189
+ function useNoyaUserData() {
190
+ const userData = (0, import_react2.useSelector)(useNoyaClientOrFallback().userData$);
191
+ return userData;
192
+ }
193
+ function useOptionalNoyaUserData() {
194
+ const userData = (0, import_react2.useSelector)(useNoyaClientOrFallback().userData$);
195
+ return userData;
196
+ }
197
+ function useIsBeta() {
198
+ const userData = useOptionalNoyaUserData();
199
+ return userData?.userData?.beta ?? false;
200
+ }
201
+ function useMetadata(key) {
202
+ const { userData } = useNoyaUserData();
203
+ const metadata = userData?.metadata || [];
204
+ const metadataItem = metadata.find((item) => item.key === key);
205
+ return metadataItem?.value;
206
+ }
207
+ function useGeneratedComponentNames(name) {
208
+ const key = name.trim().toLowerCase();
209
+ const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();
210
+ const result = (0, import_react2.useSelector)(
211
+ () => generatedNames$[key].get()
212
+ );
213
+ const loading = (0, import_react2.useSelector)(() => loadingNames$[key].get());
214
+ return (0, import_react3.useMemo)(() => ({ names: result ?? [], loading }), [loading, result]);
215
+ }
216
+ function useGeneratedComponentDescriptions() {
217
+ const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
218
+ const descriptions = (0, import_react2.useSelector)(generatedDescriptions$);
219
+ const loading = (0, import_react2.useSelector)(loadingDescriptions$);
220
+ return (0, import_react3.useMemo)(() => ({ descriptions, loading }), [loading, descriptions]);
221
+ }
222
+ function useGeneratedComponentDescription(name) {
223
+ const key = name.trim().toLowerCase();
224
+ const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
225
+ const description = (0, import_react2.useSelector)(
226
+ () => generatedDescriptions$[key].get()
227
+ );
228
+ const loading = (0, import_react2.useSelector)(() => loadingDescriptions$[key].get());
229
+ return (0, import_react3.useMemo)(() => ({ description, loading }), [loading, description]);
230
+ }
231
+ function useRandomImages() {
232
+ const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();
233
+ const images = (0, import_react2.useSelector)(randomImages$);
234
+ const loading = (0, import_react2.useSelector)(loadingRandomImages$);
235
+ return (0, import_react3.useMemo)(() => ({ images, loading }), [loading, images]);
236
+ }
237
+ function useRandomIcons() {
238
+ const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();
239
+ const icons = (0, import_react2.useSelector)(randomIcons$);
240
+ const loading = (0, import_react2.useSelector)(loadingRandomIcons$);
241
+ return (0, import_react3.useMemo)(() => ({ icons, loading }), [loading, icons]);
242
+ }
243
+ function useNetworkRequests() {
244
+ const { requests$ } = useNoyaClientOrFallback();
245
+ const requests = (0, import_react2.useSelector)(requests$);
246
+ return requests;
247
+ }
248
+ function useGeneratedPageNames() {
249
+ const { generatedPageNames$ } = useNoyaClientOrFallback();
250
+ const names = (0, import_react2.useSelector)(generatedPageNames$);
251
+ const namesWithDefaultsAndTypes = (0, import_react3.useMemo)(() => {
252
+ const rangeArray = (0, import_noya_utils.range)(0, import_noya_api2.GENERATED_PAGE_NAME_COUNT);
253
+ const withDefaults = rangeArray.map((index) => {
254
+ const name = names[index];
255
+ return name ?? { name: `Page ${index + 1}`, loading: true, key: "" };
256
+ });
257
+ return withDefaults.map(
258
+ (name, index) => ({
259
+ ...name,
260
+ index,
261
+ type: "suggestion"
262
+ })
263
+ );
264
+ }, [names]);
265
+ return namesWithDefaultsAndTypes.slice(0, 3);
266
+ }
267
+ function useGeneratedPageComponentNames() {
268
+ const { generatedPageComponentNames$: generatedComponentNames$ } = useNoyaClientOrFallback();
269
+ const names = (0, import_react2.useSelector)(
270
+ generatedComponentNames$
271
+ );
272
+ const namesWithDefaultsAndTypes = (0, import_react3.useMemo)(() => {
273
+ const rangeArray = (0, import_noya_utils.range)(0, import_noya_api2.GENERATED_PAGE_NAME_COUNT);
274
+ const withDefaults = rangeArray.map((index) => {
275
+ const name = names[index];
276
+ return name ?? { name: `Component ${index + 1}`, loading: true, key: "" };
277
+ });
278
+ return withDefaults.map(
279
+ (name, index) => ({
280
+ ...name,
281
+ index,
282
+ type: "suggestion"
283
+ })
284
+ );
285
+ }, [names]);
286
+ return namesWithDefaultsAndTypes.slice(0, 3);
287
+ }
288
+ // Annotate the CommonJS export names for ESM import in node:
289
+ 0 && (module.exports = {
290
+ NoyaAPIProvider,
291
+ useGeneratedComponentDescription,
292
+ useGeneratedComponentDescriptions,
293
+ useGeneratedComponentNames,
294
+ useGeneratedPageComponentNames,
295
+ useGeneratedPageNames,
296
+ useIsBeta,
297
+ useMetadata,
298
+ useNetworkRequests,
299
+ useNoyaAssets,
300
+ useNoyaBilling,
301
+ useNoyaClient,
302
+ useNoyaClientOrFallback,
303
+ useNoyaCreators,
304
+ useNoyaEmailLists,
305
+ useNoyaFiles,
306
+ useNoyaIsOwnFile,
307
+ useNoyaSession,
308
+ useNoyaTags,
309
+ useNoyaTools,
310
+ useNoyaUserData,
311
+ useOptionalNoyaClient,
312
+ useOptionalNoyaCreators,
313
+ useOptionalNoyaSession,
314
+ useOptionalNoyaTags,
315
+ useOptionalNoyaTools,
316
+ useOptionalNoyaUserData,
317
+ useRandomIcons,
318
+ useRandomImages,
319
+ ...require("@noya-app/noya-api")
320
+ });
321
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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: NoyaAPI.DataLoadingState;\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 files;\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"],"mappings":"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","names":["import_react","import_noya_api","file"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,266 @@
1
+ // src/index.ts
2
+ export * from "@noya-app/noya-api";
3
+
4
+ // src/react/context.ts
5
+ import { NoyaAPI } from "@noya-app/noya-api";
6
+ import { createContext, useContext, useMemo } from "react";
7
+ var NoyaAPIContext = createContext(
8
+ void 0
9
+ );
10
+ var NoyaAPIProvider = NoyaAPIContext.Provider;
11
+ function useNoyaClient() {
12
+ const value = useContext(NoyaAPIContext);
13
+ if (!value) {
14
+ throw new Error("Missing NoyaAPIContextValue");
15
+ }
16
+ return value;
17
+ }
18
+ function useOptionalNoyaClient() {
19
+ return useContext(NoyaAPIContext);
20
+ }
21
+ function useNoyaClientOrFallback() {
22
+ const value = useContext(NoyaAPIContext);
23
+ const memoryClient = useMemo(() => {
24
+ return new NoyaAPI.Client({
25
+ networkClient: new NoyaAPI.MemoryClient()
26
+ });
27
+ }, []);
28
+ return value ?? memoryClient;
29
+ }
30
+
31
+ // src/react/hooks.ts
32
+ import { useSelector } from "@legendapp/state/react";
33
+ import { GENERATED_PAGE_NAME_COUNT } from "@noya-app/noya-api";
34
+ import { range } from "@noya-app/noya-utils";
35
+ import { useEffect, useMemo as useMemo2, useRef } from "react";
36
+ function useNoyaFiles() {
37
+ const client = useNoyaClientOrFallback();
38
+ const files = useSelector(client.files$);
39
+ const session = useSelector(useNoyaClient().session$);
40
+ useEffect(() => {
41
+ if (!session)
42
+ return;
43
+ if (files.loading === "notStarted" || files.loading === "populatedOnServer") {
44
+ client.files.refetch();
45
+ }
46
+ }, [client, files.loading, session]);
47
+ return files;
48
+ }
49
+ function useNoyaIsOwnFile(fileId) {
50
+ const client = useNoyaClientOrFallback();
51
+ const files = useSelector(client.files$);
52
+ const session = useSelector(client.session$);
53
+ const file = files.files.find((file2) => file2.id === fileId);
54
+ return file?.userId === session?.user.id;
55
+ }
56
+ function useNoyaTools(initial) {
57
+ const didInitialize = useRef(false);
58
+ const client = useNoyaClientOrFallback();
59
+ const tools = useSelector(client.tools$);
60
+ useEffect(() => {
61
+ if (didInitialize.current)
62
+ return;
63
+ didInitialize.current = true;
64
+ if (initial) {
65
+ client.tools.setInitial(initial);
66
+ } else {
67
+ client.tools.list();
68
+ }
69
+ }, [client, initial]);
70
+ return tools;
71
+ }
72
+ function useOptionalNoyaTools(initial) {
73
+ const client = useNoyaClientOrFallback();
74
+ const tools = useSelector(client.tools$);
75
+ return useMemo2(
76
+ () => tools.loading && initial ? { loading: true, tools: initial } : tools,
77
+ [initial, tools]
78
+ );
79
+ }
80
+ function useNoyaTags() {
81
+ const client = useNoyaClient();
82
+ const tags = useSelector(client.tags$);
83
+ useEffect(() => {
84
+ client.tags.read();
85
+ }, [client]);
86
+ return tags;
87
+ }
88
+ function useOptionalNoyaTags() {
89
+ const client = useNoyaClientOrFallback();
90
+ const tags = useSelector(client.tags$);
91
+ useEffect(() => {
92
+ client.tags.read();
93
+ }, [client]);
94
+ return tags;
95
+ }
96
+ function useNoyaCreators() {
97
+ const client = useNoyaClientOrFallback();
98
+ const creators = useSelector(client.creators$);
99
+ useEffect(() => {
100
+ client.creators.read();
101
+ }, [client]);
102
+ return creators;
103
+ }
104
+ function useOptionalNoyaCreators() {
105
+ const client = useNoyaClientOrFallback();
106
+ const creators = useSelector(client.creators$);
107
+ useEffect(() => {
108
+ client.creators.read();
109
+ }, [client]);
110
+ return creators;
111
+ }
112
+ function useNoyaAssets(fileId) {
113
+ const client = useNoyaClientOrFallback();
114
+ const empty = useMemo2(() => ({ assets: [], loading: true }), []);
115
+ const assets = useSelector(
116
+ fileId ? client.assetsByFileId$[fileId] : client.assets$
117
+ );
118
+ return assets ?? empty;
119
+ }
120
+ function useNoyaSession() {
121
+ const session = useSelector(useNoyaClient().session$);
122
+ return session;
123
+ }
124
+ function useOptionalNoyaSession() {
125
+ const session = useSelector(useOptionalNoyaClient()?.session$);
126
+ return session;
127
+ }
128
+ function useNoyaBilling() {
129
+ const billing = useSelector(useNoyaClient().billing$);
130
+ return billing;
131
+ }
132
+ function useNoyaEmailLists() {
133
+ const emailLists = useSelector(useNoyaClient().emailLists$);
134
+ return emailLists;
135
+ }
136
+ function useNoyaUserData() {
137
+ const userData = useSelector(useNoyaClientOrFallback().userData$);
138
+ return userData;
139
+ }
140
+ function useOptionalNoyaUserData() {
141
+ const userData = useSelector(useNoyaClientOrFallback().userData$);
142
+ return userData;
143
+ }
144
+ function useIsBeta() {
145
+ const userData = useOptionalNoyaUserData();
146
+ return userData?.userData?.beta ?? false;
147
+ }
148
+ function useMetadata(key) {
149
+ const { userData } = useNoyaUserData();
150
+ const metadata = userData?.metadata || [];
151
+ const metadataItem = metadata.find((item) => item.key === key);
152
+ return metadataItem?.value;
153
+ }
154
+ function useGeneratedComponentNames(name) {
155
+ const key = name.trim().toLowerCase();
156
+ const { generatedNames$, loadingNames$ } = useNoyaClientOrFallback();
157
+ const result = useSelector(
158
+ () => generatedNames$[key].get()
159
+ );
160
+ const loading = useSelector(() => loadingNames$[key].get());
161
+ return useMemo2(() => ({ names: result ?? [], loading }), [loading, result]);
162
+ }
163
+ function useGeneratedComponentDescriptions() {
164
+ const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
165
+ const descriptions = useSelector(generatedDescriptions$);
166
+ const loading = useSelector(loadingDescriptions$);
167
+ return useMemo2(() => ({ descriptions, loading }), [loading, descriptions]);
168
+ }
169
+ function useGeneratedComponentDescription(name) {
170
+ const key = name.trim().toLowerCase();
171
+ const { generatedDescriptions$, loadingDescriptions$ } = useNoyaClientOrFallback();
172
+ const description = useSelector(
173
+ () => generatedDescriptions$[key].get()
174
+ );
175
+ const loading = useSelector(() => loadingDescriptions$[key].get());
176
+ return useMemo2(() => ({ description, loading }), [loading, description]);
177
+ }
178
+ function useRandomImages() {
179
+ const { randomImages$, loadingRandomImages$ } = useNoyaClientOrFallback();
180
+ const images = useSelector(randomImages$);
181
+ const loading = useSelector(loadingRandomImages$);
182
+ return useMemo2(() => ({ images, loading }), [loading, images]);
183
+ }
184
+ function useRandomIcons() {
185
+ const { randomIcons$, loadingRandomIcons$ } = useNoyaClientOrFallback();
186
+ const icons = useSelector(randomIcons$);
187
+ const loading = useSelector(loadingRandomIcons$);
188
+ return useMemo2(() => ({ icons, loading }), [loading, icons]);
189
+ }
190
+ function useNetworkRequests() {
191
+ const { requests$ } = useNoyaClientOrFallback();
192
+ const requests = useSelector(requests$);
193
+ return requests;
194
+ }
195
+ function useGeneratedPageNames() {
196
+ const { generatedPageNames$ } = useNoyaClientOrFallback();
197
+ const names = useSelector(generatedPageNames$);
198
+ const namesWithDefaultsAndTypes = useMemo2(() => {
199
+ const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);
200
+ const withDefaults = rangeArray.map((index) => {
201
+ const name = names[index];
202
+ return name ?? { name: `Page ${index + 1}`, loading: true, key: "" };
203
+ });
204
+ return withDefaults.map(
205
+ (name, index) => ({
206
+ ...name,
207
+ index,
208
+ type: "suggestion"
209
+ })
210
+ );
211
+ }, [names]);
212
+ return namesWithDefaultsAndTypes.slice(0, 3);
213
+ }
214
+ function useGeneratedPageComponentNames() {
215
+ const { generatedPageComponentNames$: generatedComponentNames$ } = useNoyaClientOrFallback();
216
+ const names = useSelector(
217
+ generatedComponentNames$
218
+ );
219
+ const namesWithDefaultsAndTypes = useMemo2(() => {
220
+ const rangeArray = range(0, GENERATED_PAGE_NAME_COUNT);
221
+ const withDefaults = rangeArray.map((index) => {
222
+ const name = names[index];
223
+ return name ?? { name: `Component ${index + 1}`, loading: true, key: "" };
224
+ });
225
+ return withDefaults.map(
226
+ (name, index) => ({
227
+ ...name,
228
+ index,
229
+ type: "suggestion"
230
+ })
231
+ );
232
+ }, [names]);
233
+ return namesWithDefaultsAndTypes.slice(0, 3);
234
+ }
235
+ export {
236
+ NoyaAPIProvider,
237
+ useGeneratedComponentDescription,
238
+ useGeneratedComponentDescriptions,
239
+ useGeneratedComponentNames,
240
+ useGeneratedPageComponentNames,
241
+ useGeneratedPageNames,
242
+ useIsBeta,
243
+ useMetadata,
244
+ useNetworkRequests,
245
+ useNoyaAssets,
246
+ useNoyaBilling,
247
+ useNoyaClient,
248
+ useNoyaClientOrFallback,
249
+ useNoyaCreators,
250
+ useNoyaEmailLists,
251
+ useNoyaFiles,
252
+ useNoyaIsOwnFile,
253
+ useNoyaSession,
254
+ useNoyaTags,
255
+ useNoyaTools,
256
+ useNoyaUserData,
257
+ useOptionalNoyaClient,
258
+ useOptionalNoyaCreators,
259
+ useOptionalNoyaSession,
260
+ useOptionalNoyaTags,
261
+ useOptionalNoyaTools,
262
+ useOptionalNoyaUserData,
263
+ useRandomIcons,
264
+ useRandomImages
265
+ };
266
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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: NoyaAPI.DataLoadingState;\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 files;\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"],"mappings":"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","names":["useMemo","file","useMemo"]}
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@noya-app/noya-api-client-react",
3
+ "version": "0.1.19",
4
+ "main": "./dist/index.js",
5
+ "module": "./dist/index.mjs",
6
+ "types": "./dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsup src/index.ts --format cjs,esm --dts --sourcemap",
9
+ "dev": "npm run build -- --watch"
10
+ },
11
+ "dependencies": {
12
+ "@legendapp/state": "^2.1.1",
13
+ "@noya-app/noya-api": "0.1.19",
14
+ "@noya-app/noya-utils": "0.1.2"
15
+ },
16
+ "peerDependencies": {
17
+ "react": "*",
18
+ "react-dom": "*"
19
+ }
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from "@noya-app/noya-api";
2
+ export * from "./react/context";
3
+ export * from "./react/hooks";