@lasterp/shared 1.0.0-beta.2 → 1.0.0-beta.21

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,126 @@
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
+ screenFormSchema: () => screenFormSchema,
67
+ modelFormSchema: () => modelFormSchema,
68
+ itemFormSchema: () => itemFormSchema,
69
+ equalsIgnoreCase: () => equalsIgnoreCase,
70
+ decamelizeKeys: () => import_humps.decamelizeKeys,
71
+ decamelize: () => import_humps.decamelize,
72
+ colourFormSchema: () => colourFormSchema,
73
+ camelizeKeys: () => import_humps.camelizeKeys,
74
+ camelize: () => import_humps.camelize,
75
+ LocaleProvider: () => LocaleProvider,
76
+ FrappeProvider: () => FrappeProvider,
77
+ FrappeContext: () => FrappeContext,
78
+ ATTRIBUTES: () => ATTRIBUTES
79
+ });
80
+ module.exports = __toCommonJS(exports_src);
81
+ // src/catalog/schema.ts
82
+ var import_zod = require("zod");
83
+ var ATTRIBUTES = ["Colour", "Storage", "Memory", "Screen"];
84
+ var colourFormSchema = import_zod.z.object({
85
+ color: import_zod.z.string().min(1, "Color is required"),
86
+ color_hex: import_zod.z.string().optional(),
87
+ color_system: import_zod.z.string().optional(),
88
+ color_system_hex: import_zod.z.string().optional(),
89
+ images: import_zod.z.array(import_zod.z.string()).default([])
90
+ });
91
+ var screenFormSchema = import_zod.z.object({
92
+ screen: import_zod.z.string().min(1, "Screen is required"),
93
+ height: import_zod.z.number().positive().optional(),
94
+ width: import_zod.z.number().positive().optional(),
95
+ weight: import_zod.z.number().positive().optional()
96
+ });
97
+ var modelFormSchema = import_zod.z.object({
98
+ model: import_zod.z.string().min(1, "Model is required"),
99
+ sim_card_type: import_zod.z.string().optional(),
100
+ connectivity: import_zod.z.array(import_zod.z.string())
101
+ });
102
+ var itemFormSchema = import_zod.z.object({
103
+ item_code: import_zod.z.string().min(1, "Item is required"),
104
+ item_group: import_zod.z.string().optional(),
105
+ brand: import_zod.z.string().optional(),
106
+ os: import_zod.z.string().optional(),
107
+ release_year: import_zod.z.number().int().min(1900).max(2100).optional(),
108
+ attributes: import_zod.z.array(import_zod.z.enum(ATTRIBUTES)),
109
+ colours: import_zod.z.array(colourFormSchema),
110
+ storages: import_zod.z.array(import_zod.z.string()),
111
+ memories: import_zod.z.array(import_zod.z.string()),
112
+ screens: import_zod.z.array(screenFormSchema),
113
+ models: import_zod.z.array(modelFormSchema),
114
+ width: import_zod.z.number().positive().optional(),
115
+ height: import_zod.z.number().positive().optional(),
116
+ weight: import_zod.z.number().positive().optional()
117
+ });
2
118
  // src/frappe/provider.tsx
3
- import { useMemo, createContext } from "react";
4
- import { FrappeApp } from "frappe-js-sdk";
119
+ var import_react = require("react");
120
+ var import_frappe_js_sdk = require("frappe-js-sdk");
5
121
 
6
122
  // src/frappe/socket.ts
7
- import io from "socket.io-client";
123
+ var import_socket = __toESM(require("socket.io-client"));
8
124
 
9
125
  class SocketIO {
10
126
  socket_port;
@@ -35,7 +151,7 @@ class SocketIO {
35
151
  this.url = `${this.url}${site_name}`;
36
152
  }
37
153
  this.site_name = site_name;
38
- this.socket = io(`${this.url}`, {
154
+ this.socket = import_socket.default(`${this.url}`, {
39
155
  withCredentials: true,
40
156
  secure: this.protocol === "https",
41
157
  extraHeaders: tokenParams && tokenParams.useToken === true ? {
@@ -46,9 +162,9 @@ class SocketIO {
46
162
  }
47
163
 
48
164
  // src/frappe/provider.tsx
49
- import { jsx } from "react/jsx-runtime";
165
+ var jsx_runtime = require("react/jsx-runtime");
50
166
 
51
- var FrappeContext = createContext(null);
167
+ var FrappeContext = import_react.createContext(null);
52
168
  var FrappeProvider = ({
53
169
  url = "",
54
170
  tokenParams,
@@ -58,8 +174,8 @@ var FrappeProvider = ({
58
174
  children,
59
175
  customHeaders
60
176
  }) => {
61
- const frappeConfig = useMemo(() => {
62
- const frappe = new FrappeApp(url, tokenParams, undefined, customHeaders);
177
+ const config = import_react.useMemo(() => {
178
+ const frappe = new import_frappe_js_sdk.FrappeApp(url, tokenParams, undefined, customHeaders);
63
179
  return {
64
180
  url,
65
181
  tokenParams,
@@ -71,19 +187,19 @@ var FrappeProvider = ({
71
187
  socket: enableSocket ? new SocketIO(url, siteName, socketPort, tokenParams).socket : undefined
72
188
  };
73
189
  }, [url, tokenParams, enableSocket, socketPort, siteName, customHeaders]);
74
- return /* @__PURE__ */ jsx(FrappeContext.Provider, {
75
- value: frappeConfig,
190
+ return /* @__PURE__ */ jsx_runtime.jsx(FrappeContext.Provider, {
191
+ value: config,
76
192
  children
77
193
  });
78
194
  };
79
195
  // src/frappe/hooks/auth.ts
80
- import { useCallback, useContext, useState, useEffect } from "react";
81
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
196
+ var import_react2 = require("react");
197
+ var import_react_query = require("@tanstack/react-query");
82
198
  var useFrappeAuth = () => {
83
- const queryClient = useQueryClient();
84
- const { auth, tokenParams } = useContext(FrappeContext);
85
- const [userID, setUserID] = useState();
86
- const getUserCookie = useCallback(() => {
199
+ const queryClient = import_react_query.useQueryClient();
200
+ const { auth, tokenParams } = import_react2.useContext(FrappeContext);
201
+ const [userID, setUserID] = import_react2.useState();
202
+ const getUserCookie = import_react2.useCallback(() => {
87
203
  const userCookie = document.cookie.split(";").find((c) => c.trim().startsWith("user_id="));
88
204
  if (userCookie) {
89
205
  const userName = userCookie.split("=")[1];
@@ -96,7 +212,7 @@ var useFrappeAuth = () => {
96
212
  setUserID(null);
97
213
  }
98
214
  }, []);
99
- useEffect(() => {
215
+ import_react2.useEffect(() => {
100
216
  if (tokenParams && tokenParams.useToken) {
101
217
  setUserID(null);
102
218
  } else {
@@ -108,7 +224,7 @@ var useFrappeAuth = () => {
108
224
  error,
109
225
  isLoading,
110
226
  isFetching: isValidating
111
- } = useQuery({
227
+ } = import_react_query.useQuery({
112
228
  queryKey: ["currentUser", { tokenParams, userID }],
113
229
  queryFn: () => auth.getLoggedInUser(),
114
230
  enabled: !!(tokenParams?.useToken || userID),
@@ -116,14 +232,14 @@ var useFrappeAuth = () => {
116
232
  refetchOnWindowFocus: false,
117
233
  staleTime: Infinity
118
234
  });
119
- const loginMutation = useMutation({
235
+ const loginMutation = import_react_query.useMutation({
120
236
  mutationFn: (credentials) => auth.loginWithUsernamePassword(credentials),
121
237
  onSuccess: () => {
122
238
  getUserCookie();
123
239
  queryClient.invalidateQueries({ queryKey: ["currentUser"] });
124
240
  }
125
241
  });
126
- const logoutMutation = useMutation({
242
+ const logoutMutation = import_react_query.useMutation({
127
243
  mutationFn: () => auth.logout(),
128
244
  onSuccess: () => {
129
245
  setUserID(null);
@@ -142,8 +258,8 @@ var useFrappeAuth = () => {
142
258
  };
143
259
  };
144
260
  // src/frappe/hooks/call.ts
145
- import { useContext as useContext2 } from "react";
146
- import { useMutation as useMutation2, useQuery as useQuery2 } from "@tanstack/react-query";
261
+ var import_react3 = require("react");
262
+ var import_react_query2 = require("@tanstack/react-query");
147
263
 
148
264
  // src/frappe/utils.ts
149
265
  function encodeQueryData(data) {
@@ -155,13 +271,21 @@ function encodeQueryData(data) {
155
271
 
156
272
  // src/frappe/hooks/call.ts
157
273
  var useFrappeGetCall = (method, params, options, type = "GET") => {
158
- const { call } = useContext2(FrappeContext);
274
+ const { call } = import_react3.useContext(FrappeContext);
159
275
  const urlParams = encodeQueryData(params ?? {});
160
276
  const url = `${method}?${urlParams}`;
161
277
  const queryKey = ["frappeCall", type, method, url];
162
- const { data, error, isLoading, isFetching, refetch } = useQuery2({
278
+ const { data, error, isLoading, isFetching, refetch } = import_react_query2.useQuery({
163
279
  queryKey,
164
- queryFn: type === "GET" ? () => call.get(method, params) : () => call.post(method, params),
280
+ queryFn: async () => {
281
+ if (type === "GET") {
282
+ const response = await call.get(method, params);
283
+ return response.message;
284
+ } else {
285
+ const response = await call.post(method, params);
286
+ return response.message;
287
+ }
288
+ },
165
289
  enabled: (options?.enabled ?? true) && !!method,
166
290
  staleTime: options?.staleTime,
167
291
  retry: options?.retry ?? false
@@ -175,9 +299,9 @@ var useFrappeGetCall = (method, params, options, type = "GET") => {
175
299
  };
176
300
  };
177
301
  var useFrappeMutation = (method, httpMethod) => {
178
- const { call: frappeCall } = useContext2(FrappeContext);
302
+ const { call: frappeCall } = import_react3.useContext(FrappeContext);
179
303
  const queryKey = ["frappeCall", httpMethod, method];
180
- const { mutateAsync, data, isPending, error, isSuccess, reset } = useMutation2({
304
+ const { mutateAsync, data, isPending, error, isSuccess, reset } = import_react_query2.useMutation({
181
305
  mutationKey: queryKey,
182
306
  mutationFn: (params) => {
183
307
  if (httpMethod === "POST")
@@ -200,12 +324,12 @@ var useFrappePostCall = (method) => useFrappeMutation(method, "POST");
200
324
  var useFrappePutCall = (method) => useFrappeMutation(method, "PUT");
201
325
  var useFrappeDeleteCall = (method) => useFrappeMutation(method, "DELETE");
202
326
  // src/frappe/hooks/count.ts
203
- import { useContext as useContext3 } from "react";
204
- import { useQuery as useQuery3 } from "@tanstack/react-query";
327
+ var import_react4 = require("react");
328
+ var import_react_query3 = require("@tanstack/react-query");
205
329
  var useFrappeGetDocCount = (doctype, filters, debug = false, options) => {
206
- const { url, db } = useContext3(FrappeContext);
330
+ const { url, db } = import_react4.useContext(FrappeContext);
207
331
  const queryKey = ["docCount", url, doctype, filters ?? [], debug];
208
- const { data, error, isLoading, isFetching, refetch } = useQuery3({
332
+ const { data, error, isLoading, isFetching, refetch } = import_react_query3.useQuery({
209
333
  queryKey,
210
334
  queryFn: () => db.getCount(doctype, filters, debug),
211
335
  enabled: !!doctype,
@@ -220,11 +344,11 @@ var useFrappeGetDocCount = (doctype, filters, debug = false, options) => {
220
344
  };
221
345
  };
222
346
  // src/frappe/hooks/create.ts
223
- import { useContext as useContext4 } from "react";
224
- import { useMutation as useMutation3 } from "@tanstack/react-query";
347
+ var import_react5 = require("react");
348
+ var import_react_query4 = require("@tanstack/react-query");
225
349
  var useFrappeCreateDoc = () => {
226
- const { db } = useContext4(FrappeContext);
227
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation3({
350
+ const { db } = import_react5.useContext(FrappeContext);
351
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query4.useMutation({
228
352
  mutationFn: ({ doctype, doc }) => db.createDoc(doctype, doc)
229
353
  });
230
354
  const createDoc = (doctype, doc) => mutateAsync({ doctype, doc });
@@ -237,11 +361,11 @@ var useFrappeCreateDoc = () => {
237
361
  };
238
362
  };
239
363
  // src/frappe/hooks/delete.ts
240
- import { useContext as useContext5 } from "react";
241
- import { useMutation as useMutation4 } from "@tanstack/react-query";
364
+ var import_react6 = require("react");
365
+ var import_react_query5 = require("@tanstack/react-query");
242
366
  var useFrappeDeleteDoc = () => {
243
- const { db } = useContext5(FrappeContext);
244
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation4({
367
+ const { db } = import_react6.useContext(FrappeContext);
368
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query5.useMutation({
245
369
  mutationFn: ({ doctype, docname }) => db.deleteDoc(doctype, docname)
246
370
  });
247
371
  const deleteDoc = (doctype, docname) => mutateAsync({ doctype, docname });
@@ -254,10 +378,10 @@ var useFrappeDeleteDoc = () => {
254
378
  };
255
379
  };
256
380
  // src/frappe/hooks/event.ts
257
- import { useCallback as useCallback2, useContext as useContext6, useState as useState2, useEffect as useEffect2 } from "react";
381
+ var import_react7 = require("react");
258
382
  var useFrappeEventListener = (eventName, callback) => {
259
- const { socket } = useContext6(FrappeContext);
260
- useEffect2(() => {
383
+ const { socket } = import_react7.useContext(FrappeContext);
384
+ import_react7.useEffect(() => {
261
385
  if (socket === undefined) {
262
386
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
263
387
  }
@@ -268,9 +392,9 @@ var useFrappeEventListener = (eventName, callback) => {
268
392
  }, [eventName, callback, socket]);
269
393
  };
270
394
  var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOpenCloseEventsOnMount = true) => {
271
- const { socket } = useContext6(FrappeContext);
272
- const [viewers, setViewers] = useState2([]);
273
- useEffect2(() => {
395
+ const { socket } = import_react7.useContext(FrappeContext);
396
+ const [viewers, setViewers] = import_react7.useState([]);
397
+ import_react7.useEffect(() => {
274
398
  if (socket === undefined) {
275
399
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
276
400
  }
@@ -291,13 +415,13 @@ var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOp
291
415
  };
292
416
  }, [doctype, docname, emitOpenCloseEventsOnMount, socket]);
293
417
  useFrappeEventListener("doc_update", onUpdateCallback);
294
- const emitDocOpen = useCallback2(() => {
418
+ const emitDocOpen = import_react7.useCallback(() => {
295
419
  socket?.emit("doc_open", doctype, docname);
296
420
  }, [doctype, docname, socket]);
297
- const emitDocClose = useCallback2(() => {
421
+ const emitDocClose = import_react7.useCallback(() => {
298
422
  socket?.emit("doc_close", doctype, docname);
299
423
  }, [doctype, docname, socket]);
300
- const onViewerEvent = useCallback2((data) => {
424
+ const onViewerEvent = import_react7.useCallback((data) => {
301
425
  if (data.doctype === doctype && data.docname === docname) {
302
426
  setViewers(data.users);
303
427
  }
@@ -310,8 +434,8 @@ var useFrappeDocumentEventListener = (doctype, docname, onUpdateCallback, emitOp
310
434
  };
311
435
  };
312
436
  var useFrappeDocTypeEventListener = (doctype, onListUpdateCallback) => {
313
- const { socket } = useContext6(FrappeContext);
314
- useEffect2(() => {
437
+ const { socket } = import_react7.useContext(FrappeContext);
438
+ import_react7.useEffect(() => {
315
439
  if (socket === undefined) {
316
440
  console.warn("Socket is not enabled. Please enable socket in FrappeProvider.");
317
441
  }
@@ -328,18 +452,18 @@ var useFrappeDocTypeEventListener = (doctype, onListUpdateCallback) => {
328
452
  useFrappeEventListener("list_update", onListUpdateCallback);
329
453
  };
330
454
  // src/frappe/hooks/file.ts
331
- import { useContext as useContext7, useState as useState3 } from "react";
332
- import { useMutation as useMutation5 } from "@tanstack/react-query";
455
+ var import_react8 = require("react");
456
+ var import_react_query6 = require("@tanstack/react-query");
333
457
  var useFrappeFileUpload = () => {
334
- const { file } = useContext7(FrappeContext);
335
- const [progress, setProgress] = useState3(0);
458
+ const { file } = import_react8.useContext(FrappeContext);
459
+ const [progress, setProgress] = import_react8.useState(0);
336
460
  const {
337
461
  mutateAsync,
338
462
  isPending,
339
463
  error,
340
464
  isSuccess,
341
465
  reset: resetMutation
342
- } = useMutation5({
466
+ } = import_react_query6.useMutation({
343
467
  mutationFn: ({ f, args, apiPath }) => {
344
468
  setProgress(0);
345
469
  return file.uploadFile(f, args, (completed, total) => {
@@ -366,15 +490,15 @@ var useFrappeFileUpload = () => {
366
490
  };
367
491
  };
368
492
  // src/frappe/hooks/get.ts
369
- import { useContext as useContext8 } from "react";
370
- import { useQuery as useQuery4 } from "@tanstack/react-query";
493
+ var import_react9 = require("react");
494
+ var import_react_query7 = require("@tanstack/react-query");
371
495
  var useFrappeGetDoc = (doctype, name, options) => {
372
- const { url, db } = useContext8(FrappeContext);
496
+ const { url, db } = import_react9.useContext(FrappeContext);
373
497
  const queryKey = ["doc", url, doctype, name];
374
- const { data, error, isLoading, isFetching, refetch } = useQuery4({
498
+ const { data, error, isLoading, isFetching, refetch } = import_react_query7.useQuery({
375
499
  queryKey,
376
500
  queryFn: () => db.getDoc(doctype, name),
377
- enabled: !!name,
501
+ enabled: options?.enabled ?? true,
378
502
  staleTime: options?.staleTime ?? 5 * 60 * 1000,
379
503
  retry: options?.retry ?? false
380
504
  });
@@ -387,14 +511,12 @@ var useFrappeGetDoc = (doctype, name, options) => {
387
511
  };
388
512
  };
389
513
  // src/frappe/hooks/list.ts
390
- import { useContext as useContext9 } from "react";
391
- import {
392
- useQuery as useQuery5
393
- } from "@tanstack/react-query";
514
+ var import_react10 = require("react");
515
+ var import_react_query8 = require("@tanstack/react-query");
394
516
  var useFrappeGetDocList = (doctype, args, options) => {
395
- const { url, db } = useContext9(FrappeContext);
517
+ const { url, db } = import_react10.useContext(FrappeContext);
396
518
  const queryKey = ["docList", url, doctype, args ?? null];
397
- const { data, error, isLoading, isFetching, refetch } = useQuery5({
519
+ const { data, error, isLoading, isFetching, refetch } = import_react_query8.useQuery({
398
520
  queryKey,
399
521
  queryFn: () => db.getDocList(doctype, args),
400
522
  ...options
@@ -408,12 +530,12 @@ var useFrappeGetDocList = (doctype, args, options) => {
408
530
  };
409
531
  };
410
532
  // src/frappe/hooks/prefetch.ts
411
- import { useCallback as useCallback3, useContext as useContext10 } from "react";
412
- import { useQueryClient as useQueryClient2 } from "@tanstack/react-query";
533
+ var import_react11 = require("react");
534
+ var import_react_query9 = require("@tanstack/react-query");
413
535
  var useFrappePrefetchDoc = (doctype, name, options) => {
414
- const queryClient = useQueryClient2();
415
- const { url, db } = useContext10(FrappeContext);
416
- const preloadDoc = useCallback3(() => {
536
+ const queryClient = import_react_query9.useQueryClient();
537
+ const { url, db } = import_react11.useContext(FrappeContext);
538
+ const preloadDoc = import_react11.useCallback(() => {
417
539
  if (!name)
418
540
  return;
419
541
  const queryKey = ["doc", url, doctype, name];
@@ -426,7 +548,7 @@ var useFrappePrefetchDoc = (doctype, name, options) => {
426
548
  return preloadDoc;
427
549
  };
428
550
  // src/frappe/hooks/search.ts
429
- import { useEffect as useEffect3, useState as useState4 } from "react";
551
+ var import_react12 = require("react");
430
552
  var useSearch = (doctype, text, filters = [], limit = 20, debounce = 250) => {
431
553
  const debouncedText = useDebounce(text, debounce);
432
554
  return useFrappeGetCall("frappe.desk.search.search_link", {
@@ -437,8 +559,8 @@ var useSearch = (doctype, text, filters = [], limit = 20, debounce = 250) => {
437
559
  });
438
560
  };
439
561
  var useDebounce = (value, delay) => {
440
- const [debouncedValue, setDebouncedValue] = useState4(value);
441
- useEffect3(() => {
562
+ const [debouncedValue, setDebouncedValue] = import_react12.useState(value);
563
+ import_react12.useEffect(() => {
442
564
  const handler = setTimeout(() => {
443
565
  setDebouncedValue(value);
444
566
  }, delay);
@@ -449,11 +571,11 @@ var useDebounce = (value, delay) => {
449
571
  return debouncedValue;
450
572
  };
451
573
  // src/frappe/hooks/update.ts
452
- import { useContext as useContext11 } from "react";
453
- import { useMutation as useMutation6 } from "@tanstack/react-query";
574
+ var import_react13 = require("react");
575
+ var import_react_query10 = require("@tanstack/react-query");
454
576
  var useFrappeUpdateDoc = () => {
455
- const { db } = useContext11(FrappeContext);
456
- const { mutateAsync, isPending, error, isSuccess, reset } = useMutation6({
577
+ const { db } = import_react13.useContext(FrappeContext);
578
+ const { mutateAsync, isPending, error, isSuccess, reset } = import_react_query10.useMutation({
457
579
  mutationFn: ({ doctype, docname, doc }) => db.updateDoc(doctype, docname, doc)
458
580
  });
459
581
  const updateDoc = (doctype, docname, doc) => mutateAsync({ doctype, docname, doc });
@@ -465,8 +587,31 @@ var useFrappeUpdateDoc = () => {
465
587
  reset
466
588
  };
467
589
  };
590
+ // src/frappe/hooks/meta.ts
591
+ var import_react14 = require("react");
592
+ var import_react_query11 = require("@tanstack/react-query");
593
+ var useFrappeGetMeta = (doctype, options) => {
594
+ const { url, call } = import_react14.useContext(FrappeContext);
595
+ const { data, error, isLoading, isFetching, refetch } = import_react_query11.useQuery({
596
+ queryKey: ["meta", url, doctype],
597
+ queryFn: async () => {
598
+ const response = await call.get("lasterp.api.get_meta", { doctype });
599
+ return response.message;
600
+ },
601
+ enabled: !!doctype,
602
+ staleTime: options?.staleTime ?? Infinity,
603
+ retry: options?.retry ?? false
604
+ });
605
+ return {
606
+ data,
607
+ error,
608
+ isLoading,
609
+ isFetching,
610
+ refetch
611
+ };
612
+ };
468
613
  // src/hooks/use-variant-selector/hook.ts
469
- import { useCallback as useCallback4, useMemo as useMemo2, useState as useState5 } from "react";
614
+ var import_react15 = require("react");
470
615
 
471
616
  // src/hooks/use-variant-selector/utils.ts
472
617
  function findVariant(variants, specs, caseInsensitive) {
@@ -499,21 +644,21 @@ function findVariants(variants, specs, caseInsensitive) {
499
644
  // src/hooks/use-variant-selector/hook.ts
500
645
  var useVariantSelector = (props) => {
501
646
  const { variants, attributes, defaultId } = props;
502
- const [selectedSpecs, setSelectedSpecs] = useState5(() => {
647
+ const [selectedSpecs, setSelectedSpecs] = import_react15.useState(() => {
503
648
  if (defaultId) {
504
649
  const variant = variants.find((v) => v.id === defaultId);
505
650
  return variant?.specs || {};
506
651
  }
507
652
  return {};
508
653
  });
509
- const variantId = useMemo2(() => {
654
+ const variantId = import_react15.useMemo(() => {
510
655
  const complete = attributes.every((attr) => selectedSpecs[attr.key]);
511
656
  if (!complete)
512
657
  return;
513
658
  const variant = findVariant(variants, selectedSpecs);
514
659
  return variant?.id;
515
660
  }, [variants, selectedSpecs, attributes]);
516
- const options = useMemo2(() => {
661
+ const options = import_react15.useMemo(() => {
517
662
  const result = {};
518
663
  attributes.forEach((attr, attrIndex) => {
519
664
  const constraints = {};
@@ -536,7 +681,7 @@ var useVariantSelector = (props) => {
536
681
  });
537
682
  return result;
538
683
  }, [variants, attributes, selectedSpecs]);
539
- const onOptionSelect = useCallback4((key, value) => {
684
+ const onOptionSelect = import_react15.useCallback((key, value) => {
540
685
  setSelectedSpecs((prev) => {
541
686
  const newSpecs = { ...prev, [key]: value };
542
687
  const attrIndex = attributes.findIndex((a) => a.key === key);
@@ -570,84 +715,54 @@ var useVariantSelector = (props) => {
570
715
  getOptions: (key) => options[key] || []
571
716
  };
572
717
  };
573
- // src/utils/char.ts
574
- import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
575
- function equalsIgnoreCase(str1, str2) {
576
- return str1.localeCompare(str2, undefined, { sensitivity: "accent" }) === 0;
718
+ // src/locale/provider.tsx
719
+ var import_react16 = require("react");
720
+ var jsx_runtime2 = require("react/jsx-runtime");
721
+ function translate(message, replace, messages = {}) {
722
+ let translated = messages[message] ?? message;
723
+ replace?.forEach((val, i) => {
724
+ translated = translated.replace(`{${i}}`, String(val));
725
+ });
726
+ return translated;
577
727
  }
578
- // src/context/server-provider.rn.tsx
579
- import {
580
- useCallback as useCallback5,
581
- useEffect as useEffect4,
582
- useRef
583
- } from "react";
584
- import { useLogto } from "@logto/rn";
585
- import { jsx as jsx2 } from "react/jsx-runtime";
586
- var TOKEN_STALE_MS = 50 * 60 * 1000;
587
- function ServerProvider({
588
- frappeUrl,
589
- siteName,
590
- resource,
728
+ var LocaleContext = import_react16.createContext((message) => message);
729
+ function LocaleProvider({
730
+ method,
731
+ language,
732
+ storage,
591
733
  children
592
734
  }) {
593
- const { getAccessToken, isAuthenticated } = useLogto();
594
- const tokenRef = useRef("");
595
- const fetchedAtRef = useRef(0);
596
- const isRefreshingRef = useRef(false);
597
- const refresh = useCallback5(async () => {
598
- const token = await getAccessToken(resource);
599
- if (token) {
600
- tokenRef.current = token;
601
- fetchedAtRef.current = Date.now();
602
- }
603
- }, [getAccessToken, resource]);
604
- useEffect4(() => {
605
- if (isAuthenticated)
606
- refresh();
607
- }, [isAuthenticated, refresh]);
608
- const getToken = useCallback5(() => {
609
- if (!isRefreshingRef.current && fetchedAtRef.current > 0 && Date.now() - fetchedAtRef.current > TOKEN_STALE_MS) {
610
- isRefreshingRef.current = true;
611
- refresh().finally(() => {
612
- isRefreshingRef.current = false;
613
- });
614
- }
615
- return tokenRef.current;
616
- }, [refresh]);
617
- return /* @__PURE__ */ jsx2(FrappeProvider, {
618
- url: frappeUrl,
619
- siteName,
620
- customHeaders: siteName ? { "X-Frappe-Site-Name": siteName } : undefined,
621
- enableSocket: false,
622
- tokenParams: { useToken: true, token: getToken, type: "Bearer" },
735
+ const [messages, setMessages] = import_react16.useState({});
736
+ import_react16.useEffect(() => {
737
+ if (!storage)
738
+ return;
739
+ const key = `locale:${language}`;
740
+ Promise.resolve(storage.getItem(key)).then((cached) => {
741
+ if (cached)
742
+ setMessages(JSON.parse(cached));
743
+ }).catch(() => {});
744
+ }, [language, storage]);
745
+ const { data, isLoading } = useFrappeGetCall(method, { lang: language }, { staleTime: Infinity });
746
+ import_react16.useEffect(() => {
747
+ if (!data)
748
+ return;
749
+ setMessages(data);
750
+ storage?.setItem(`locale:${language}`, JSON.stringify(data));
751
+ }, [data, language, storage]);
752
+ const __ = import_react16.useCallback((message, replace) => translate(message, replace, messages), [messages]);
753
+ if (isLoading && Object.keys(messages).length === 0)
754
+ return null;
755
+ return /* @__PURE__ */ jsx_runtime2.jsx(LocaleContext.Provider, {
756
+ value: __,
623
757
  children
624
758
  });
625
759
  }
626
- export {
627
- useVariantSelector,
628
- useSearch,
629
- useFrappeUpdateDoc,
630
- useFrappePutCall,
631
- useFrappePrefetchDoc,
632
- useFrappePostCall,
633
- useFrappeGetDocList,
634
- useFrappeGetDocCount,
635
- useFrappeGetDoc,
636
- useFrappeGetCall,
637
- useFrappeFileUpload,
638
- useFrappeEventListener,
639
- useFrappeDocumentEventListener,
640
- useFrappeDocTypeEventListener,
641
- useFrappeDeleteDoc,
642
- useFrappeDeleteCall,
643
- useFrappeCreateDoc,
644
- useFrappeAuth,
645
- equalsIgnoreCase,
646
- decamelizeKeys,
647
- decamelize,
648
- camelizeKeys,
649
- camelize,
650
- ServerProvider,
651
- FrappeProvider,
652
- FrappeContext
653
- };
760
+ function useLocale() {
761
+ const __ = import_react16.useContext(LocaleContext);
762
+ return { __ };
763
+ }
764
+ // src/utils/char.ts
765
+ var import_humps = require("humps");
766
+ function equalsIgnoreCase(str1, str2) {
767
+ return str1.localeCompare(str2, undefined, { sensitivity: "accent" }) === 0;
768
+ }