@lasterp/shared 1.0.0-beta.1 → 1.0.0-beta.11

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.
@@ -1,10 +1,84 @@
1
1
  "use client";
2
+ var __create = Object.create;
3
+ var __getProtoOf = Object.getPrototypeOf;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __toESM = (mod, isNodeMode, target) => {
9
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
10
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
11
+ for (let key of __getOwnPropNames(mod))
12
+ if (!__hasOwnProp.call(to, key))
13
+ __defProp(to, key, {
14
+ get: () => mod[key],
15
+ enumerable: true
16
+ });
17
+ return to;
18
+ };
19
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
20
+ var __toCommonJS = (from) => {
21
+ var entry = __moduleCache.get(from), desc;
22
+ if (entry)
23
+ return entry;
24
+ entry = __defProp({}, "__esModule", { value: true });
25
+ if (from && typeof from === "object" || typeof from === "function")
26
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
27
+ get: () => from[key],
28
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
29
+ }));
30
+ __moduleCache.set(from, entry);
31
+ return entry;
32
+ };
33
+ var __export = (target, all) => {
34
+ for (var name in all)
35
+ __defProp(target, name, {
36
+ get: all[name],
37
+ enumerable: true,
38
+ configurable: true,
39
+ set: (newValue) => all[name] = () => newValue
40
+ });
41
+ };
42
+
43
+ // src/index.ts
44
+ var exports_src = {};
45
+ __export(exports_src, {
46
+ useVariantSelector: () => useVariantSelector,
47
+ useSearch: () => useSearch,
48
+ useLocale: () => useLocale,
49
+ useFrappeUpdateDoc: () => useFrappeUpdateDoc,
50
+ useFrappePutCall: () => useFrappePutCall,
51
+ useFrappePrefetchDoc: () => useFrappePrefetchDoc,
52
+ useFrappePostCall: () => useFrappePostCall,
53
+ useFrappeGetMeta: () => useFrappeGetMeta,
54
+ useFrappeGetDocList: () => useFrappeGetDocList,
55
+ useFrappeGetDocCount: () => useFrappeGetDocCount,
56
+ useFrappeGetDoc: () => useFrappeGetDoc,
57
+ useFrappeGetCall: () => useFrappeGetCall,
58
+ useFrappeFileUpload: () => useFrappeFileUpload,
59
+ useFrappeEventListener: () => useFrappeEventListener,
60
+ useFrappeDocumentEventListener: () => useFrappeDocumentEventListener,
61
+ useFrappeDocTypeEventListener: () => useFrappeDocTypeEventListener,
62
+ useFrappeDeleteDoc: () => useFrappeDeleteDoc,
63
+ useFrappeDeleteCall: () => useFrappeDeleteCall,
64
+ useFrappeCreateDoc: () => useFrappeCreateDoc,
65
+ useFrappeAuth: () => useFrappeAuth,
66
+ equalsIgnoreCase: () => equalsIgnoreCase,
67
+ decamelizeKeys: () => import_humps.decamelizeKeys,
68
+ decamelize: () => import_humps.decamelize,
69
+ camelizeKeys: () => import_humps.camelizeKeys,
70
+ camelize: () => import_humps.camelize,
71
+ LocaleProvider: () => LocaleProvider,
72
+ FrappeProvider: () => FrappeProvider,
73
+ FrappeContext: () => FrappeContext
74
+ });
75
+ module.exports = __toCommonJS(exports_src);
2
76
  // src/frappe/provider.tsx
3
- import { useMemo, createContext } from "react";
4
- import { FrappeApp } from "frappe-js-sdk";
77
+ var import_react = require("react");
78
+ var import_frappe_js_sdk = require("frappe-js-sdk");
5
79
 
6
80
  // src/frappe/socket.ts
7
- import io from "socket.io-client";
81
+ var import_socket = __toESM(require("socket.io-client"));
8
82
 
9
83
  class SocketIO {
10
84
  socket_port;
@@ -35,7 +109,7 @@ class SocketIO {
35
109
  this.url = `${this.url}${site_name}`;
36
110
  }
37
111
  this.site_name = site_name;
38
- this.socket = io(`${this.url}`, {
112
+ this.socket = import_socket.default(`${this.url}`, {
39
113
  withCredentials: true,
40
114
  secure: this.protocol === "https",
41
115
  extraHeaders: tokenParams && tokenParams.useToken === true ? {
@@ -46,9 +120,9 @@ class SocketIO {
46
120
  }
47
121
 
48
122
  // src/frappe/provider.tsx
49
- import { jsx } from "react/jsx-runtime";
123
+ var jsx_runtime = require("react/jsx-runtime");
50
124
 
51
- var FrappeContext = createContext(null);
125
+ var FrappeContext = import_react.createContext(null);
52
126
  var FrappeProvider = ({
53
127
  url = "",
54
128
  tokenParams,
@@ -58,8 +132,8 @@ var FrappeProvider = ({
58
132
  children,
59
133
  customHeaders
60
134
  }) => {
61
- const frappeConfig = useMemo(() => {
62
- const frappe = new FrappeApp(url, tokenParams, undefined, customHeaders);
135
+ const config = import_react.useMemo(() => {
136
+ const frappe = new import_frappe_js_sdk.FrappeApp(url, tokenParams, undefined, customHeaders);
63
137
  return {
64
138
  url,
65
139
  tokenParams,
@@ -71,19 +145,19 @@ var FrappeProvider = ({
71
145
  socket: enableSocket ? new SocketIO(url, siteName, socketPort, tokenParams).socket : undefined
72
146
  };
73
147
  }, [url, tokenParams, enableSocket, socketPort, siteName, customHeaders]);
74
- return /* @__PURE__ */ jsx(FrappeContext.Provider, {
75
- value: frappeConfig,
148
+ return /* @__PURE__ */ jsx_runtime.jsx(FrappeContext.Provider, {
149
+ value: config,
76
150
  children
77
151
  });
78
152
  };
79
153
  // src/frappe/hooks/auth.ts
80
- import { useCallback, useContext, useState, useEffect } from "react";
81
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
154
+ var import_react2 = require("react");
155
+ var import_react_query = require("@tanstack/react-query");
82
156
  var useFrappeAuth = () => {
83
- const queryClient = useQueryClient();
84
- const { auth, tokenParams } = useContext(FrappeContext);
85
- const [userID, setUserID] = useState();
86
- const getUserCookie = useCallback(() => {
157
+ const queryClient = import_react_query.useQueryClient();
158
+ const { auth, tokenParams } = import_react2.useContext(FrappeContext);
159
+ const [userID, setUserID] = import_react2.useState();
160
+ const getUserCookie = import_react2.useCallback(() => {
87
161
  const userCookie = document.cookie.split(";").find((c) => c.trim().startsWith("user_id="));
88
162
  if (userCookie) {
89
163
  const userName = userCookie.split("=")[1];
@@ -96,7 +170,7 @@ var useFrappeAuth = () => {
96
170
  setUserID(null);
97
171
  }
98
172
  }, []);
99
- useEffect(() => {
173
+ import_react2.useEffect(() => {
100
174
  if (tokenParams && tokenParams.useToken) {
101
175
  setUserID(null);
102
176
  } else {
@@ -108,7 +182,7 @@ var useFrappeAuth = () => {
108
182
  error,
109
183
  isLoading,
110
184
  isFetching: isValidating
111
- } = useQuery({
185
+ } = import_react_query.useQuery({
112
186
  queryKey: ["currentUser", { tokenParams, userID }],
113
187
  queryFn: () => auth.getLoggedInUser(),
114
188
  enabled: !!(tokenParams?.useToken || userID),
@@ -116,14 +190,14 @@ var useFrappeAuth = () => {
116
190
  refetchOnWindowFocus: false,
117
191
  staleTime: Infinity
118
192
  });
119
- const loginMutation = useMutation({
193
+ const loginMutation = import_react_query.useMutation({
120
194
  mutationFn: (credentials) => auth.loginWithUsernamePassword(credentials),
121
195
  onSuccess: () => {
122
196
  getUserCookie();
123
197
  queryClient.invalidateQueries({ queryKey: ["currentUser"] });
124
198
  }
125
199
  });
126
- const logoutMutation = useMutation({
200
+ const logoutMutation = import_react_query.useMutation({
127
201
  mutationFn: () => auth.logout(),
128
202
  onSuccess: () => {
129
203
  setUserID(null);
@@ -142,8 +216,8 @@ var useFrappeAuth = () => {
142
216
  };
143
217
  };
144
218
  // src/frappe/hooks/call.ts
145
- import { useContext as useContext2 } from "react";
146
- import { useMutation as useMutation2, useQuery as useQuery2 } from "@tanstack/react-query";
219
+ var import_react3 = require("react");
220
+ var import_react_query2 = require("@tanstack/react-query");
147
221
 
148
222
  // src/frappe/utils.ts
149
223
  function encodeQueryData(data) {
@@ -155,11 +229,11 @@ function encodeQueryData(data) {
155
229
 
156
230
  // src/frappe/hooks/call.ts
157
231
  var useFrappeGetCall = (method, params, options, type = "GET") => {
158
- const { call } = useContext2(FrappeContext);
232
+ const { call } = import_react3.useContext(FrappeContext);
159
233
  const urlParams = encodeQueryData(params ?? {});
160
234
  const url = `${method}?${urlParams}`;
161
235
  const queryKey = ["frappeCall", type, method, url];
162
- const { data, error, isLoading, isFetching, refetch } = useQuery2({
236
+ const { data, error, isLoading, isFetching, refetch } = import_react_query2.useQuery({
163
237
  queryKey,
164
238
  queryFn: type === "GET" ? () => call.get(method, params) : () => call.post(method, params),
165
239
  enabled: (options?.enabled ?? true) && !!method,
@@ -175,9 +249,9 @@ var useFrappeGetCall = (method, params, options, type = "GET") => {
175
249
  };
176
250
  };
177
251
  var useFrappeMutation = (method, httpMethod) => {
178
- const { call: frappeCall } = useContext2(FrappeContext);
252
+ const { call: frappeCall } = import_react3.useContext(FrappeContext);
179
253
  const queryKey = ["frappeCall", httpMethod, method];
180
- const { mutateAsync, data, isPending, error, isSuccess, reset } = useMutation2({
254
+ const { mutateAsync, data, isPending, error, isSuccess, reset } = import_react_query2.useMutation({
181
255
  mutationKey: queryKey,
182
256
  mutationFn: (params) => {
183
257
  if (httpMethod === "POST")
@@ -200,12 +274,12 @@ var useFrappePostCall = (method) => useFrappeMutation(method, "POST");
200
274
  var useFrappePutCall = (method) => useFrappeMutation(method, "PUT");
201
275
  var useFrappeDeleteCall = (method) => useFrappeMutation(method, "DELETE");
202
276
  // src/frappe/hooks/count.ts
203
- import { useContext as useContext3 } from "react";
204
- import { useQuery as useQuery3 } from "@tanstack/react-query";
277
+ var import_react4 = require("react");
278
+ var import_react_query3 = require("@tanstack/react-query");
205
279
  var useFrappeGetDocCount = (doctype, filters, debug = false, options) => {
206
- const { url, db } = useContext3(FrappeContext);
280
+ const { url, db } = import_react4.useContext(FrappeContext);
207
281
  const queryKey = ["docCount", url, doctype, filters ?? [], debug];
208
- const { data, error, isLoading, isFetching, refetch } = useQuery3({
282
+ const { data, error, isLoading, isFetching, refetch } = import_react_query3.useQuery({
209
283
  queryKey,
210
284
  queryFn: () => db.getCount(doctype, filters, debug),
211
285
  enabled: !!doctype,
@@ -220,11 +294,11 @@ var useFrappeGetDocCount = (doctype, filters, debug = false, options) => {
220
294
  };
221
295
  };
222
296
  // src/frappe/hooks/create.ts
223
- import { useContext as useContext4 } from "react";
224
- import { useMutation as useMutation3 } from "@tanstack/react-query";
297
+ var import_react5 = require("react");
298
+ var import_react_query4 = require("@tanstack/react-query");
225
299
  var useFrappeCreateDoc = () => {
226
- const { db } = useContext4(FrappeContext);
227
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation3({
300
+ const { db } = import_react5.useContext(FrappeContext);
301
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query4.useMutation({
228
302
  mutationFn: ({ doctype, doc }) => db.createDoc(doctype, doc)
229
303
  });
230
304
  const createDoc = (doctype, doc) => mutateAsync({ doctype, doc });
@@ -237,11 +311,11 @@ var useFrappeCreateDoc = () => {
237
311
  };
238
312
  };
239
313
  // src/frappe/hooks/delete.ts
240
- import { useContext as useContext5 } from "react";
241
- import { useMutation as useMutation4 } from "@tanstack/react-query";
314
+ var import_react6 = require("react");
315
+ var import_react_query5 = require("@tanstack/react-query");
242
316
  var useFrappeDeleteDoc = () => {
243
- const { db } = useContext5(FrappeContext);
244
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation4({
317
+ const { db } = import_react6.useContext(FrappeContext);
318
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query5.useMutation({
245
319
  mutationFn: ({ doctype, docname }) => db.deleteDoc(doctype, docname)
246
320
  });
247
321
  const deleteDoc = (doctype, docname) => mutateAsync({ doctype, docname });
@@ -254,10 +328,10 @@ var useFrappeDeleteDoc = () => {
254
328
  };
255
329
  };
256
330
  // src/frappe/hooks/event.ts
257
- import { useCallback as useCallback2, useContext as useContext6, useState as useState2, useEffect as useEffect2 } from "react";
331
+ var import_react7 = require("react");
258
332
  var useFrappeEventListener = (eventName, callback) => {
259
- const { socket } = useContext6(FrappeContext);
260
- useEffect2(() => {
333
+ const { socket } = import_react7.useContext(FrappeContext);
334
+ import_react7.useEffect(() => {
261
335
  if (socket === undefined) {
262
336
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
263
337
  }
@@ -268,9 +342,9 @@ var useFrappeEventListener = (eventName, callback) => {
268
342
  }, [eventName, callback, socket]);
269
343
  };
270
344
  var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOpenCloseEventsOnMount = true) => {
271
- const { socket } = useContext6(FrappeContext);
272
- const [viewers, setViewers] = useState2([]);
273
- useEffect2(() => {
345
+ const { socket } = import_react7.useContext(FrappeContext);
346
+ const [viewers, setViewers] = import_react7.useState([]);
347
+ import_react7.useEffect(() => {
274
348
  if (socket === undefined) {
275
349
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
276
350
  }
@@ -291,13 +365,13 @@ var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOp
291
365
  };
292
366
  }, [doctype, docname, emitOpenCloseEventsOnMount, socket]);
293
367
  useFrappeEventListener("doc_update", onUpdateCallback);
294
- const emitDocOpen = useCallback2(() => {
368
+ const emitDocOpen = import_react7.useCallback(() => {
295
369
  socket?.emit("doc_open", doctype, docname);
296
370
  }, [doctype, docname, socket]);
297
- const emitDocClose = useCallback2(() => {
371
+ const emitDocClose = import_react7.useCallback(() => {
298
372
  socket?.emit("doc_close", doctype, docname);
299
373
  }, [doctype, docname, socket]);
300
- const onViewerEvent = useCallback2((data) => {
374
+ const onViewerEvent = import_react7.useCallback((data) => {
301
375
  if (data.doctype === doctype && data.docname === docname) {
302
376
  setViewers(data.users);
303
377
  }
@@ -310,8 +384,8 @@ var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOp
310
384
  };
311
385
  };
312
386
  var useFrappeDocTypeEventListener = (doctype, onListUpdateCallback) => {
313
- const { socket } = useContext6(FrappeContext);
314
- useEffect2(() => {
387
+ const { socket } = import_react7.useContext(FrappeContext);
388
+ import_react7.useEffect(() => {
315
389
  if (socket === undefined) {
316
390
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
317
391
  }
@@ -328,18 +402,18 @@ var useFrappeDocTypeEventListener = (doctype, onListUpdateCallback) => {
328
402
  useFrappeEventListener("list_update", onListUpdateCallback);
329
403
  };
330
404
  // src/frappe/hooks/file.ts
331
- import { useContext as useContext7, useState as useState3 } from "react";
332
- import { useMutation as useMutation5 } from "@tanstack/react-query";
405
+ var import_react8 = require("react");
406
+ var import_react_query6 = require("@tanstack/react-query");
333
407
  var useFrappeFileUpload = () => {
334
- const { file } = useContext7(FrappeContext);
335
- const [progress, setProgress] = useState3(0);
408
+ const { file } = import_react8.useContext(FrappeContext);
409
+ const [progress, setProgress] = import_react8.useState(0);
336
410
  const {
337
411
  mutateAsync,
338
412
  isPending,
339
413
  error,
340
414
  isSuccess,
341
415
  reset: resetMutation
342
- } = useMutation5({
416
+ } = import_react_query6.useMutation({
343
417
  mutationFn: ({ f, args, apiPath }) => {
344
418
  setProgress(0);
345
419
  return file.uploadFile(f, args, (completed, total) => {
@@ -366,12 +440,12 @@ var useFrappeFileUpload = () => {
366
440
  };
367
441
  };
368
442
  // src/frappe/hooks/get.ts
369
- import { useContext as useContext8 } from "react";
370
- import { useQuery as useQuery4 } from "@tanstack/react-query";
443
+ var import_react9 = require("react");
444
+ var import_react_query7 = require("@tanstack/react-query");
371
445
  var useFrappeGetDoc = (doctype, name, options) => {
372
- const { url, db } = useContext8(FrappeContext);
446
+ const { url, db } = import_react9.useContext(FrappeContext);
373
447
  const queryKey = ["doc", url, doctype, name];
374
- const { data, error, isLoading, isFetching, refetch } = useQuery4({
448
+ const { data, error, isLoading, isFetching, refetch } = import_react_query7.useQuery({
375
449
  queryKey,
376
450
  queryFn: () => db.getDoc(doctype, name),
377
451
  enabled: !!name,
@@ -387,14 +461,12 @@ var useFrappeGetDoc = (doctype, name, options) => {
387
461
  };
388
462
  };
389
463
  // src/frappe/hooks/list.ts
390
- import { useContext as useContext9 } from "react";
391
- import {
392
- useQuery as useQuery5
393
- } from "@tanstack/react-query";
464
+ var import_react10 = require("react");
465
+ var import_react_query8 = require("@tanstack/react-query");
394
466
  var useFrappeGetDocList = (doctype, args, options) => {
395
- const { url, db } = useContext9(FrappeContext);
467
+ const { url, db } = import_react10.useContext(FrappeContext);
396
468
  const queryKey = ["docList", url, doctype, args ?? null];
397
- const { data, error, isLoading, isFetching, refetch } = useQuery5({
469
+ const { data, error, isLoading, isFetching, refetch } = import_react_query8.useQuery({
398
470
  queryKey,
399
471
  queryFn: () => db.getDocList(doctype, args),
400
472
  ...options
@@ -408,12 +480,12 @@ var useFrappeGetDocList = (doctype, args, options) => {
408
480
  };
409
481
  };
410
482
  // src/frappe/hooks/prefetch.ts
411
- import { useCallback as useCallback3, useContext as useContext10 } from "react";
412
- import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
483
+ var import_react11 = require("react");
484
+ var import_react_query9 = require("@tanstack/react-query");
413
485
  var useFrappePrefetchDoc = (doctype, name, options) => {
414
- const queryClient = useQueryClient2();
415
- const { url, db } = useContext10(FrappeContext);
416
- const preloadDoc = useCallback3(() => {
486
+ const queryClient = import_react_query9.useQueryClient();
487
+ const { url, db } = import_react11.useContext(FrappeContext);
488
+ const preloadDoc = import_react11.useCallback(() => {
417
489
  if (!name)
418
490
  return;
419
491
  const queryKey = ["doc", url, doctype, name];
@@ -426,7 +498,7 @@ var useFrappePrefetchDoc = (doctype, name, options) => {
426
498
  return preloadDoc;
427
499
  };
428
500
  // src/frappe/hooks/search.ts
429
- import { useEffect as useEffect3, useState as useState4 } from "react";
501
+ var import_react12 = require("react");
430
502
  var useSearch = (doctype, text, filters = [], limit = 20, debounce = 250) => {
431
503
  const debouncedText = useDebounce(text, debounce);
432
504
  return useFrappeGetCall("frappe.desk.search.search_link", {
@@ -437,8 +509,8 @@ var useSearch = (doctype, text, filters = [], limit = 20, debounce = 250) => {
437
509
  });
438
510
  };
439
511
  var useDebounce = (value, delay) => {
440
- const [debouncedValue, setDebouncedValue] = useState4(value);
441
- useEffect3(() => {
512
+ const [debouncedValue, setDebouncedValue] = import_react12.useState(value);
513
+ import_react12.useEffect(() => {
442
514
  const handler = setTimeout(() => {
443
515
  setDebouncedValue(value);
444
516
  }, delay);
@@ -449,11 +521,11 @@ var useDebounce = (value, delay) => {
449
521
  return debouncedValue;
450
522
  };
451
523
  // src/frappe/hooks/update.ts
452
- import { useContext as useContext11 } from "react";
453
- import { useMutation as useMutation6 } from "@tanstack/react-query";
524
+ var import_react13 = require("react");
525
+ var import_react_query10 = require("@tanstack/react-query");
454
526
  var useFrappeUpdateDoc = () => {
455
- const { db } = useContext11(FrappeContext);
456
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation6({
527
+ const { db } = import_react13.useContext(FrappeContext);
528
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query10.useMutation({
457
529
  mutationFn: ({ doctype, docname, doc }) => db.updateDoc(doctype, docname, doc)
458
530
  });
459
531
  const updateDoc = (doctype, docname, doc) => mutateAsync({ doctype, docname, doc });
@@ -465,8 +537,29 @@ var useFrappeUpdateDoc = () => {
465
537
  reset
466
538
  };
467
539
  };
540
+ // src/frappe/hooks/meta.ts
541
+ var import_react14 = require("react");
542
+ var import_react_query11 = require("@tanstack/react-query");
543
+ var useFrappeGetMeta = (doctype, options) => {
544
+ const { url, call } = import_react14.useContext(FrappeContext);
545
+ const queryKey = ["meta", url, doctype];
546
+ const { data, error, isLoading, isFetching, refetch } = import_react_query11.useQuery({
547
+ queryKey: ["meta", url, doctype],
548
+ queryFn: () => call.get("lasterp.api.get_meta", { doctype }),
549
+ enabled: !!doctype,
550
+ staleTime: options?.staleTime ?? Infinity,
551
+ retry: options?.retry ?? false
552
+ });
553
+ return {
554
+ data,
555
+ error,
556
+ isLoading,
557
+ isFetching,
558
+ refetch
559
+ };
560
+ };
468
561
  // src/hooks/use-variant-selector/hook.ts
469
- import { useCallback as useCallback4, useMemo as useMemo2, useState as useState5 } from "react";
562
+ var import_react15 = require("react");
470
563
 
471
564
  // src/hooks/use-variant-selector/utils.ts
472
565
  function findVariant(variants, specs, caseInsensitive) {
@@ -499,21 +592,21 @@ function findVariants(variants, specs, caseInsensitive) {
499
592
  // src/hooks/use-variant-selector/hook.ts
500
593
  var useVariantSelector = (props) => {
501
594
  const { variants, attributes, defaultId } = props;
502
- const [selectedSpecs, setSelectedSpecs] = useState5(() => {
595
+ const [selectedSpecs, setSelectedSpecs] = import_react15.useState(() => {
503
596
  if (defaultId) {
504
597
  const variant = variants.find((v) => v.id === defaultId);
505
598
  return variant?.specs || {};
506
599
  }
507
600
  return {};
508
601
  });
509
- const variantId = useMemo2(() => {
602
+ const variantId = import_react15.useMemo(() => {
510
603
  const complete = attributes.every((attr) => selectedSpecs[attr.key]);
511
604
  if (!complete)
512
605
  return;
513
606
  const variant = findVariant(variants, selectedSpecs);
514
607
  return variant?.id;
515
608
  }, [variants, selectedSpecs, attributes]);
516
- const options = useMemo2(() => {
609
+ const options = import_react15.useMemo(() => {
517
610
  const result = {};
518
611
  attributes.forEach((attr, attrIndex) => {
519
612
  const constraints = {};
@@ -536,7 +629,7 @@ var useVariantSelector = (props) => {
536
629
  });
537
630
  return result;
538
631
  }, [variants, attributes, selectedSpecs]);
539
- const onOptionSelect = useCallback4((key, value) => {
632
+ const onOptionSelect = import_react15.useCallback((key, value) => {
540
633
  setSelectedSpecs((prev) => {
541
634
  const newSpecs = { ...prev, [key]: value };
542
635
  const attrIndex = attributes.findIndex((a) => a.key === key);
@@ -570,35 +663,54 @@ var useVariantSelector = (props) => {
570
663
  getOptions: (key) => options[key] || []
571
664
  };
572
665
  };
666
+ // src/locale/provider.tsx
667
+ var import_react16 = require("react");
668
+ var jsx_runtime2 = require("react/jsx-runtime");
669
+ function translate(message, replace, messages = {}) {
670
+ let translated = messages[message] ?? message;
671
+ replace?.forEach((val, i) => {
672
+ translated = translated.replace(`{${i}}`, String(val));
673
+ });
674
+ return translated;
675
+ }
676
+ var LocaleContext = import_react16.createContext((message) => message);
677
+ function LocaleProvider({
678
+ method,
679
+ language,
680
+ storage,
681
+ children
682
+ }) {
683
+ const [messages, setMessages] = import_react16.useState({});
684
+ import_react16.useEffect(() => {
685
+ if (!storage)
686
+ return;
687
+ const key = `locale:${language}`;
688
+ Promise.resolve(storage.getItem(key)).then((cached) => {
689
+ if (cached)
690
+ setMessages(JSON.parse(cached));
691
+ }).catch(() => {});
692
+ }, [language, storage]);
693
+ const { data, isLoading } = useFrappeGetCall(method, { lang: language }, { staleTime: Infinity });
694
+ import_react16.useEffect(() => {
695
+ if (!data?.message)
696
+ return;
697
+ setMessages(data.message);
698
+ storage?.setItem(`locale:${language}`, JSON.stringify(data.message));
699
+ }, [data, language, storage]);
700
+ const __ = import_react16.useCallback((message, replace) => translate(message, replace, messages), [messages]);
701
+ if (isLoading && Object.keys(messages).length === 0)
702
+ return null;
703
+ return /* @__PURE__ */ jsx_runtime2.jsx(LocaleContext.Provider, {
704
+ value: __,
705
+ children
706
+ });
707
+ }
708
+ function useLocale() {
709
+ const __ = import_react16.useContext(LocaleContext);
710
+ return { __ };
711
+ }
573
712
  // src/utils/char.ts
574
- import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
713
+ var import_humps = require("humps");
575
714
  function equalsIgnoreCase(str1, str2) {
576
715
  return str1.localeCompare(str2, undefined, { sensitivity: "accent" }) === 0;
577
716
  }
578
- export {
579
- useVariantSelector,
580
- useSearch,
581
- useFrappeUpdateDoc,
582
- useFrappePutCall,
583
- useFrappePrefetchDoc,
584
- useFrappePostCall,
585
- useFrappeGetDocList,
586
- useFrappeGetDocCount,
587
- useFrappeGetDoc,
588
- useFrappeGetCall,
589
- useFrappeFileUpload,
590
- useFrappeEventListener,
591
- useFrappeDocumentEventListener,
592
- useFrappeDocTypeEventListener,
593
- useFrappeDeleteDoc,
594
- useFrappeDeleteCall,
595
- useFrappeCreateDoc,
596
- useFrappeAuth,
597
- equalsIgnoreCase,
598
- decamelizeKeys,
599
- decamelize,
600
- camelizeKeys,
601
- camelize,
602
- FrappeProvider,
603
- FrappeContext
604
- };
@@ -97,6 +97,15 @@ interface Page {
97
97
  hero?: Hero;
98
98
  blocks: Block[];
99
99
  }
100
+ interface WorkspaceSidebar {
101
+ label: string;
102
+ header_icon: string;
103
+ items: WorkspaceSidebarItem[];
104
+ }
105
+ interface WorkspaceSidebarItem {
106
+ label: string;
107
+ link_to: string;
108
+ }
100
109
  import { FrappeApp, FrappeAuth, FrappeCall } from "frappe-js-sdk";
101
110
  import { FrappeDB } from "frappe-js-sdk/lib/db";
102
111
  import { FrappeFileUpload } from "frappe-js-sdk/lib/file";
@@ -586,6 +595,32 @@ declare const useFrappeUpdateDoc: <T = any>() => {
586
595
  isCompleted: boolean;
587
596
  reset: () => void;
588
597
  };
598
+ interface FrappeMeta {
599
+ fields: FrappeMetaField[];
600
+ permissions: {
601
+ can_select: boolean;
602
+ can_read: boolean;
603
+ can_write: boolean;
604
+ can_create: boolean;
605
+ can_delete: boolean;
606
+ };
607
+ }
608
+ interface FrappeMetaField {
609
+ label: string;
610
+ fieldname: string;
611
+ read_only: boolean;
612
+ set_only_once: boolean;
613
+ }
614
+ declare const useFrappeGetMeta: <FrappeMeta>(doctype: string, options?: {
615
+ staleTime?: number;
616
+ retry?: boolean | number;
617
+ }) => {
618
+ data: FrappeMeta | undefined;
619
+ error: FrappeError | null;
620
+ isLoading: boolean;
621
+ isFetching: boolean;
622
+ refetch: () => void;
623
+ };
589
624
  interface VariantSelectorProps<T extends {
590
625
  id: string;
591
626
  specs: Record<string, string>;
@@ -611,6 +646,19 @@ declare const useVariantSelector: <T extends {
611
646
  id: string;
612
647
  specs: Record<string, string>;
613
648
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
649
+ import { JSX, ReactNode } from "react";
650
+ import { StateStorage } from "zustand/middleware";
651
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
652
+ interface LocaleProviderProps {
653
+ method: string;
654
+ language: string;
655
+ storage?: StateStorage;
656
+ children: ReactNode;
657
+ }
658
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
659
+ declare function useLocale(): {
660
+ __: TranslateFn;
661
+ };
614
662
  interface Category {
615
663
  name: string;
616
664
  }
@@ -644,4 +692,4 @@ interface ProductContext {
644
692
  }
645
693
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
694
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
695
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetMeta, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, WorkspaceSidebarItem, WorkspaceSidebar, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, LocaleProvider, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeMetaField, FrappeMeta, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
@@ -97,6 +97,15 @@ interface Page {
97
97
  hero?: Hero;
98
98
  blocks: Block[];
99
99
  }
100
+ interface WorkspaceSidebar {
101
+ label: string;
102
+ header_icon: string;
103
+ items: WorkspaceSidebarItem[];
104
+ }
105
+ interface WorkspaceSidebarItem {
106
+ label: string;
107
+ link_to: string;
108
+ }
100
109
  import { FrappeApp, FrappeAuth, FrappeCall } from "frappe-js-sdk";
101
110
  import { FrappeDB } from "frappe-js-sdk/lib/db";
102
111
  import { FrappeFileUpload } from "frappe-js-sdk/lib/file";
@@ -586,6 +595,32 @@ declare const useFrappeUpdateDoc: <T = any>() => {
586
595
  isCompleted: boolean;
587
596
  reset: () => void;
588
597
  };
598
+ interface FrappeMeta {
599
+ fields: FrappeMetaField[];
600
+ permissions: {
601
+ can_select: boolean;
602
+ can_read: boolean;
603
+ can_write: boolean;
604
+ can_create: boolean;
605
+ can_delete: boolean;
606
+ };
607
+ }
608
+ interface FrappeMetaField {
609
+ label: string;
610
+ fieldname: string;
611
+ read_only: boolean;
612
+ set_only_once: boolean;
613
+ }
614
+ declare const useFrappeGetMeta: <FrappeMeta>(doctype: string, options?: {
615
+ staleTime?: number;
616
+ retry?: boolean | number;
617
+ }) => {
618
+ data: FrappeMeta | undefined;
619
+ error: FrappeError | null;
620
+ isLoading: boolean;
621
+ isFetching: boolean;
622
+ refetch: () => void;
623
+ };
589
624
  interface VariantSelectorProps<T extends {
590
625
  id: string;
591
626
  specs: Record<string, string>;
@@ -611,6 +646,19 @@ declare const useVariantSelector: <T extends {
611
646
  id: string;
612
647
  specs: Record<string, string>;
613
648
  }>(props: VariantSelectorProps<T>) => VariantSelectorResult;
649
+ import { JSX, ReactNode } from "react";
650
+ import { StateStorage } from "zustand/middleware";
651
+ type TranslateFn = (message: string, replace?: (string | number)[]) => string;
652
+ interface LocaleProviderProps {
653
+ method: string;
654
+ language: string;
655
+ storage?: StateStorage;
656
+ children: ReactNode;
657
+ }
658
+ declare function LocaleProvider({ method, language, storage, children }: LocaleProviderProps): JSX.Element | null;
659
+ declare function useLocale(): {
660
+ __: TranslateFn;
661
+ };
614
662
  interface Category {
615
663
  name: string;
616
664
  }
@@ -644,4 +692,4 @@ interface ProductContext {
644
692
  }
645
693
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
646
694
  declare function equalsIgnoreCase(str1: string, str2: string): boolean;
647
- export { useVariantSelector, useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
695
+ export { useVariantSelector, useSearch, useLocale, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetMeta, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, WorkspaceSidebarItem, WorkspaceSidebar, ViewerEventData, VariantSelectorResult, VariantSelectorProps, VariantSelectorOption, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, ShopContext, SearchResult, ProductVariant, ProductContext, Product, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, LocaleProvider, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeMetaField, FrappeMeta, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Category, Brand, Block };
@@ -58,7 +58,7 @@ var FrappeProvider = ({
58
58
  children,
59
59
  customHeaders
60
60
  }) => {
61
- const frappeConfig = useMemo(() => {
61
+ const config = useMemo(() => {
62
62
  const frappe = new FrappeApp(url, tokenParams, undefined, customHeaders);
63
63
  return {
64
64
  url,
@@ -72,7 +72,7 @@ var FrappeProvider = ({
72
72
  };
73
73
  }, [url, tokenParams, enableSocket, socketPort, siteName, customHeaders]);
74
74
  return /* @__PURE__ */ jsx(FrappeContext.Provider, {
75
- value: frappeConfig,
75
+ value: config,
76
76
  children
77
77
  });
78
78
  };
@@ -465,6 +465,27 @@ var useFrappeUpdateDoc = () => {
465
465
  reset
466
466
  };
467
467
  };
468
+ // src/frappe/hooks/meta.ts
469
+ import { useContext as useContext12 } from "react";
470
+ import { useQuery as useQuery6 } from "@tanstack/react-query";
471
+ var useFrappeGetMeta = (doctype, options) => {
472
+ const { url, call } = useContext12(FrappeContext);
473
+ const queryKey = ["meta", url, doctype];
474
+ const { data, error, isLoading, isFetching, refetch } = useQuery6({
475
+ queryKey: ["meta", url, doctype],
476
+ queryFn: () => call.get("lasterp.api.get_meta", { doctype }),
477
+ enabled: !!doctype,
478
+ staleTime: options?.staleTime ?? Infinity,
479
+ retry: options?.retry ?? false
480
+ });
481
+ return {
482
+ data,
483
+ error,
484
+ isLoading,
485
+ isFetching,
486
+ refetch
487
+ };
488
+ };
468
489
  // src/hooks/use-variant-selector/hook.ts
469
490
  import { useCallback as useCallback4, useMemo as useMemo2, useState as useState5 } from "react";
470
491
 
@@ -570,6 +591,58 @@ var useVariantSelector = (props) => {
570
591
  getOptions: (key) => options[key] || []
571
592
  };
572
593
  };
594
+ // src/locale/provider.tsx
595
+ import {
596
+ createContext as createContext2,
597
+ useCallback as useCallback5,
598
+ useContext as useContext13,
599
+ useEffect as useEffect4,
600
+ useState as useState6
601
+ } from "react";
602
+ import { jsx as jsx2 } from "react/jsx-runtime";
603
+ function translate(message, replace, messages = {}) {
604
+ let translated = messages[message] ?? message;
605
+ replace?.forEach((val, i) => {
606
+ translated = translated.replace(`{${i}}`, String(val));
607
+ });
608
+ return translated;
609
+ }
610
+ var LocaleContext = createContext2((message) => message);
611
+ function LocaleProvider({
612
+ method,
613
+ language,
614
+ storage,
615
+ children
616
+ }) {
617
+ const [messages, setMessages] = useState6({});
618
+ useEffect4(() => {
619
+ if (!storage)
620
+ return;
621
+ const key = `locale:${language}`;
622
+ Promise.resolve(storage.getItem(key)).then((cached) => {
623
+ if (cached)
624
+ setMessages(JSON.parse(cached));
625
+ }).catch(() => {});
626
+ }, [language, storage]);
627
+ const { data, isLoading } = useFrappeGetCall(method, { lang: language }, { staleTime: Infinity });
628
+ useEffect4(() => {
629
+ if (!data?.message)
630
+ return;
631
+ setMessages(data.message);
632
+ storage?.setItem(`locale:${language}`, JSON.stringify(data.message));
633
+ }, [data, language, storage]);
634
+ const __ = useCallback5((message, replace) => translate(message, replace, messages), [messages]);
635
+ if (isLoading && Object.keys(messages).length === 0)
636
+ return null;
637
+ return /* @__PURE__ */ jsx2(LocaleContext.Provider, {
638
+ value: __,
639
+ children
640
+ });
641
+ }
642
+ function useLocale() {
643
+ const __ = useContext13(LocaleContext);
644
+ return { __ };
645
+ }
573
646
  // src/utils/char.ts
574
647
  import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
575
648
  function equalsIgnoreCase(str1, str2) {
@@ -578,10 +651,12 @@ function equalsIgnoreCase(str1, str2) {
578
651
  export {
579
652
  useVariantSelector,
580
653
  useSearch,
654
+ useLocale,
581
655
  useFrappeUpdateDoc,
582
656
  useFrappePutCall,
583
657
  useFrappePrefetchDoc,
584
658
  useFrappePostCall,
659
+ useFrappeGetMeta,
585
660
  useFrappeGetDocList,
586
661
  useFrappeGetDocCount,
587
662
  useFrappeGetDoc,
@@ -599,6 +674,7 @@ export {
599
674
  decamelize,
600
675
  camelizeKeys,
601
676
  camelize,
677
+ LocaleProvider,
602
678
  FrappeProvider,
603
679
  FrappeContext
604
680
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lasterp/shared",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.11",
4
4
  "description": "Shared repo for webapp and native app",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -20,38 +20,32 @@
20
20
  "typescript": "^5.9.3"
21
21
  },
22
22
  "peerDependencies": {
23
+ "@tanstack/react-query": "^5.90.21",
23
24
  "react": ">=18.0.0",
24
25
  "react-dom": ">=18.0.0",
25
- "typescript": ">=4.5.0",
26
- "@tanstack/react-query": "^5.90.21",
27
- "@logto/react": "^4.0.13",
28
- "@logto/rn": "^1.1.0"
26
+ "typescript": ">=4.5.0"
29
27
  },
30
28
  "peerDependenciesMeta": {
31
29
  "typescript": {
32
30
  "optional": true
33
- },
34
- "@logto/react": {
35
- "optional": true
36
- },
37
- "@logto/rn": {
38
- "optional": true
39
31
  }
40
32
  },
41
33
  "type": "module",
42
34
  "exports": {
43
35
  ".": {
44
- "node": "./dist/node/index.js",
45
- "rn": "./dist/rn/index.js",
46
- "default": "./dist/node/index.js"
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js",
38
+ "require": "./dist/index.cjs"
47
39
  },
48
40
  "./package.json": "./package.json"
49
41
  },
50
42
  "module": "./dist/index.js",
43
+ "main": "./dist/index.cjs",
51
44
  "types": "./dist/index.d.ts",
52
45
  "dependencies": {
53
46
  "frappe-js-sdk": "^1.12.0",
54
47
  "humps": "^2.0.1",
55
- "socket.io-client": "^4.8.3"
48
+ "socket.io-client": "^4.8.3",
49
+ "zustand": "^5.0.11"
56
50
  }
57
51
  }