@fctc/widget-logic 5.3.7-beta.16 → 5.3.7-beta.18

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/hooks.mjs ADDED
@@ -0,0 +1,958 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+
19
+ // src/hooks.ts
20
+ import {
21
+ useModel,
22
+ useButton,
23
+ useChangeStatus,
24
+ useDelete,
25
+ useDeleteComment,
26
+ useDuplicateRecord,
27
+ useExecuteImport,
28
+ useExportExcel,
29
+ useForgotPassword,
30
+ useForgotPasswordSSO,
31
+ useGet2FAMethods,
32
+ useGetAccessByCode,
33
+ useGetActionDetail,
34
+ useGetAll,
35
+ useGetCalendar,
36
+ useGetComment,
37
+ useGetCompanyInfo,
38
+ useGetConversionRate,
39
+ useGetCurrency,
40
+ useGetCurrentCompany,
41
+ useGetDetail,
42
+ useGetFieldExport,
43
+ useGetFieldOnChange,
44
+ useGetFileExcel,
45
+ useGetFormView,
46
+ useGetGroups,
47
+ useGetListCompany,
48
+ useGetListData,
49
+ useGetListMyBankAccount,
50
+ useGetMenu,
51
+ useGetPrintReport,
52
+ useGetProGressBar,
53
+ useGetProfile,
54
+ useGetProvider,
55
+ useGetResequence,
56
+ useGetSelection,
57
+ useGetUser,
58
+ useGetView,
59
+ useGrantAccess,
60
+ useIsValidToken,
61
+ useLoadAction,
62
+ useLoadMessage,
63
+ useLoginCredential,
64
+ useLoginSocial,
65
+ useLogout,
66
+ useOdooDataTransform,
67
+ useOnChangeForm,
68
+ useParsePreview,
69
+ usePrint,
70
+ useRemoveRow,
71
+ useRemoveTotpSetup,
72
+ useRequestSetupTotp,
73
+ useResetPassword,
74
+ useResetPasswordSSO,
75
+ useRunAction,
76
+ useSave,
77
+ useSendComment,
78
+ useSettingsWebRead2fa,
79
+ useSignInSSO,
80
+ useSwitchLocale,
81
+ useUpdatePassword,
82
+ useUploadFile,
83
+ useUploadFileExcel,
84
+ useUploadIdFile,
85
+ useUploadImage,
86
+ useValidateActionToken,
87
+ useVerify2FA,
88
+ useVerifyTotp,
89
+ useAddEntity,
90
+ useChangeOrderPreparationState,
91
+ useCheckPayment,
92
+ useCreateEntity,
93
+ useCreatePosConfig,
94
+ useCreateSession,
95
+ useDeleteEntity,
96
+ useGenSerialNumber,
97
+ useGeneratePaymentQrInfo,
98
+ useGetASession,
99
+ useGetExternalTabs,
100
+ useGetList,
101
+ useGetOrderLine,
102
+ useReadGroup,
103
+ useGetPinCode
104
+ } from "@fctc/interface-logic/hooks";
105
+
106
+ // src/hooks/core/use-app-provider.tsx
107
+ import { createContext, useContext, useMemo as useMemo4 } from "react";
108
+
109
+ // src/hooks/core/use-menu.ts
110
+ import { useState as useState2 } from "react";
111
+
112
+ // src/hooks/core/use-call-action.ts
113
+ import { useCallback, useState } from "react";
114
+
115
+ // src/provider.ts
116
+ var provider_exports = {};
117
+ __reExport(provider_exports, provider_star);
118
+ import * as provider_star from "@fctc/interface-logic/provider";
119
+
120
+ // src/hooks/core/use-call-action.ts
121
+ var useCallAction = () => {
122
+ const { env } = (0, provider_exports.useEnv)();
123
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
124
+ const queryLoadAction = useLoadAction2();
125
+ const queryRunAction = useRunAction2();
126
+ const [actionData, setActionData] = useState(
127
+ void 0
128
+ );
129
+ const callAction = useCallback(
130
+ async ({
131
+ aid,
132
+ service,
133
+ xNode,
134
+ context
135
+ }) => {
136
+ try {
137
+ const menuContext = {
138
+ ...env?.context,
139
+ ...context
140
+ };
141
+ const loadRes = await queryLoadAction.mutateAsync({
142
+ idAction: aid,
143
+ context: menuContext,
144
+ service,
145
+ xNode
146
+ });
147
+ if (loadRes?.result?.type === "ir.actions.server") {
148
+ const runRes = await queryRunAction.mutateAsync({
149
+ idAction: aid,
150
+ context: menuContext,
151
+ service,
152
+ xNode
153
+ });
154
+ setActionData(runRes?.result);
155
+ return runRes?.result;
156
+ } else {
157
+ setActionData(loadRes?.result);
158
+ return loadRes?.result;
159
+ }
160
+ } catch (err) {
161
+ console.error("callAction error:", err);
162
+ return void 0;
163
+ }
164
+ },
165
+ [env?.context?.lang]
166
+ );
167
+ return [actionData, callAction];
168
+ };
169
+
170
+ // src/utils.ts
171
+ var utils_exports = {};
172
+ __export(utils_exports, {
173
+ STORAGES: () => STORAGES,
174
+ countSum: () => countSum,
175
+ guessTypeFromUrl: () => guessTypeFromUrl,
176
+ isObjectEmpty: () => isObjectEmpty,
177
+ languages: () => languages,
178
+ mergeButtons: () => mergeButtons,
179
+ setStorageItemAsync: () => setStorageItemAsync,
180
+ useStorageState: () => useStorageState
181
+ });
182
+
183
+ // src/utils/constants.ts
184
+ var languages = [
185
+ { id: "vi_VN", name: "VIE" },
186
+ { id: "en_US", name: "ENG" }
187
+ ];
188
+
189
+ // src/utils/function.ts
190
+ import { useCallback as useCallback2, useEffect, useReducer } from "react";
191
+ var countSum = (data, field) => {
192
+ if (!data || !field) return 0;
193
+ return data.reduce(
194
+ (total, item) => total + (item?.[`${field}_count`] || 0),
195
+ 0
196
+ );
197
+ };
198
+ var isObjectEmpty = (obj) => {
199
+ return Object.keys(obj).length === 0;
200
+ };
201
+ function mergeButtons(fields) {
202
+ const buttons = fields?.filter((f) => f.type_co === "button");
203
+ const others = fields?.filter((f) => f.type_co !== "button");
204
+ if (buttons?.length) {
205
+ others.push({
206
+ type_co: "buttons",
207
+ buttons
208
+ });
209
+ }
210
+ return others;
211
+ }
212
+ var STORAGES = {
213
+ TOKEN: "accessToken",
214
+ USER_INFO: "USER_INFO"
215
+ };
216
+ function useAsyncState(initialValue = [true, null]) {
217
+ return useReducer(
218
+ (_state, action = null) => [false, action],
219
+ initialValue
220
+ );
221
+ }
222
+ async function setStorageItemAsync(key, value) {
223
+ try {
224
+ if (value === null) {
225
+ localStorage.removeItem(key);
226
+ } else {
227
+ localStorage.setItem(key, value);
228
+ }
229
+ } catch (e) {
230
+ console.error("Local storage is unavailable:", e);
231
+ }
232
+ }
233
+ function useStorageState(key) {
234
+ const [state, setState] = useAsyncState();
235
+ useEffect(() => {
236
+ try {
237
+ const storedValue = localStorage.getItem(key);
238
+ setState(storedValue);
239
+ } catch (e) {
240
+ console.error("Local storage is unavailable:", e);
241
+ }
242
+ }, [key]);
243
+ const setValue = useCallback2(
244
+ (value) => {
245
+ setState(value);
246
+ setStorageItemAsync(key, value);
247
+ },
248
+ [key]
249
+ );
250
+ return [state, setValue];
251
+ }
252
+ var guessTypeFromUrl = (url) => {
253
+ const ext = url.split(".").pop()?.toLowerCase();
254
+ if (!ext) return null;
255
+ const map = {
256
+ jpg: "image/jpeg",
257
+ jpeg: "image/jpeg",
258
+ png: "image/png",
259
+ webp: "image/webp",
260
+ gif: "image/gif",
261
+ svg: "image/svg+xml",
262
+ bmp: "image/bmp",
263
+ tiff: "image/tiff",
264
+ pdf: "application/pdf",
265
+ zip: "application/zip",
266
+ rar: "application/x-rar-compressed",
267
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
268
+ xls: "application/vnd.ms-excel",
269
+ mp4: "video/mp4",
270
+ mov: "video/quicktime"
271
+ };
272
+ return map[ext] || null;
273
+ };
274
+
275
+ // src/utils.ts
276
+ __reExport(utils_exports, utils_star);
277
+ import * as utils_star from "@fctc/interface-logic/utils";
278
+
279
+ // src/hooks/core/use-menu.ts
280
+ var useMenu = ({
281
+ context,
282
+ specification,
283
+ domain,
284
+ defaultService
285
+ }) => {
286
+ const { useGetMenu: useGetMenu2 } = (0, provider_exports.useService)();
287
+ const [action, callAction] = useCallAction();
288
+ const [service, setService] = useState2("");
289
+ const [xNode, setXNode] = useState2("");
290
+ const menuData = useGetMenu2(
291
+ context,
292
+ specification,
293
+ !!context && !isObjectEmpty(context) && !!context?.uid && !!context?.lang,
294
+ domain,
295
+ defaultService
296
+ );
297
+ const [menuId, setMenuId] = useState2(void 0);
298
+ const handleChangeMenu = async ({
299
+ menu,
300
+ service: service2,
301
+ xNode: xNode2,
302
+ context: context2
303
+ }) => {
304
+ const aidMenu = menu?.action?.external_xml_id || menu?.action?.id?.id;
305
+ if (menu) {
306
+ setMenuId(menu.id?.toString() ?? "");
307
+ }
308
+ if (aidMenu) {
309
+ const actionResponse = await callAction({
310
+ aid: aidMenu,
311
+ service: service2 ?? "",
312
+ xNode: xNode2,
313
+ context: context2
314
+ });
315
+ setService(service2 ?? "");
316
+ setXNode(xNode2 ?? "");
317
+ return actionResponse;
318
+ }
319
+ };
320
+ return {
321
+ ...menuData,
322
+ service,
323
+ xNode,
324
+ data: menuData?.data,
325
+ action: { handleChangeMenu },
326
+ state: { menuId, action },
327
+ context,
328
+ isLoading: menuData.isLoading,
329
+ isError: menuData.isError,
330
+ error: menuData.error,
331
+ refetch: menuData.refetch
332
+ };
333
+ };
334
+
335
+ // src/hooks/core/use-detail.ts
336
+ import { useQuery } from "@tanstack/react-query";
337
+ import { useEffect as useEffect2 } from "react";
338
+ var useDetail = (sub) => {
339
+ const { setUserInfo, env } = (0, provider_exports.useEnv)();
340
+ const { useGetDetail: useGetDetail2 } = (0, provider_exports.useService)();
341
+ const fetchGetDetail = useGetDetail2();
342
+ const userDetailQuery = useQuery({
343
+ queryKey: ["userDetailQuery", sub],
344
+ queryFn: () => {
345
+ return fetchGetDetail.mutateAsync({
346
+ model: "res.users",
347
+ ids: [sub],
348
+ specification: { image_256: {} },
349
+ service: env?.default_service
350
+ });
351
+ },
352
+ enabled: !!sub
353
+ });
354
+ useEffect2(() => {
355
+ if (userDetailQuery.data) {
356
+ const userPicture = userDetailQuery.data;
357
+ setUserInfo({ ...env?.user, image: userPicture?.[0]?.image_256 });
358
+ }
359
+ }, [userDetailQuery.isFetched]);
360
+ return { ...userDetailQuery };
361
+ };
362
+
363
+ // src/hooks/core/use-profile.ts
364
+ import { useQuery as useQuery2 } from "@tanstack/react-query";
365
+ import { useEffect as useEffect3, useMemo } from "react";
366
+ var useProfile = ({
367
+ service,
368
+ i18n
369
+ }) => {
370
+ const { setUid, setLang, setUserInfo, env } = (0, provider_exports.useEnv)();
371
+ const { useGetProfile: useGetProfile2 } = (0, provider_exports.useService)();
372
+ const getProfile = useGetProfile2(service);
373
+ const userInfoQuery = useQuery2({
374
+ queryKey: ["userInfo"],
375
+ queryFn: () => getProfile.mutateAsync(),
376
+ enabled: isObjectEmpty(env?.user)
377
+ });
378
+ useEffect3(() => {
379
+ if (userInfoQuery.data) {
380
+ const userInfo = userInfoQuery.data;
381
+ utils_exports.sessionStorageUtils.setXNode(userInfo?.x_node);
382
+ setUid(userInfo?.sub);
383
+ setUserInfo(userInfo);
384
+ const userLocale = languages.find((lang) => lang?.id === userInfo?.locale);
385
+ setLang(userLocale?.id);
386
+ i18n.changeLanguage(userLocale?.id.split("_")[0]);
387
+ }
388
+ }, [userInfoQuery.isFetched]);
389
+ const context = useMemo(() => {
390
+ if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
391
+ return {
392
+ uid: Number(userInfoQuery.data.sub),
393
+ lang: String(userInfoQuery.data.locale),
394
+ tz: "Asia/Saigon"
395
+ };
396
+ }
397
+ return void 0;
398
+ }, [userInfoQuery.isFetched]);
399
+ if (userInfoQuery.isLoading || !userInfoQuery.data) {
400
+ return null;
401
+ }
402
+ return {
403
+ ...userInfoQuery,
404
+ context
405
+ };
406
+ };
407
+
408
+ // src/hooks/core/use-user.ts
409
+ var useUser = ({ service, i18n }) => {
410
+ const userProfile = useProfile({ service, i18n });
411
+ const userDetail = useDetail(userProfile?.data?.sub);
412
+ return { userProfile, userDetail, context: userProfile?.context };
413
+ };
414
+
415
+ // src/hooks/core/use-view-v2.ts
416
+ import { useMemo as useMemo2 } from "react";
417
+ var useViewV2 = ({
418
+ action,
419
+ context,
420
+ aid,
421
+ service,
422
+ xNode
423
+ }) => {
424
+ const { useGetView: useGetView2 } = (0, provider_exports.useService)();
425
+ const viewParams = useMemo2(() => {
426
+ if (!action || !action?.res_model) {
427
+ return void 0;
428
+ }
429
+ const actionResult = action;
430
+ return {
431
+ aid,
432
+ model: String(actionResult?.res_model),
433
+ views: [
434
+ ...Array.isArray(actionResult?.views) ? actionResult?.views.map(
435
+ (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
436
+ ) : [],
437
+ [
438
+ Array.isArray(actionResult?.search_view_id) ? actionResult?.search_view_id[0] : actionResult?.search_view_id,
439
+ "search"
440
+ ]
441
+ ],
442
+ context,
443
+ id: isNaN(Number(aid)) ? action?.id : aid,
444
+ service,
445
+ xNode
446
+ };
447
+ }, [action, context, aid]);
448
+ const view = useGetView2({
449
+ viewParams: viewParams ?? {},
450
+ enabled: !!viewParams
451
+ });
452
+ return {
453
+ ...view,
454
+ context
455
+ };
456
+ };
457
+
458
+ // src/hooks/core/use-company.ts
459
+ import { useQuery as useQuery3 } from "@tanstack/react-query";
460
+ import { useEffect as useEffect4, useMemo as useMemo3 } from "react";
461
+ var useCompany = ({ service }) => {
462
+ const { setCompanies, setDefaultCompany, env } = (0, provider_exports.useEnv)();
463
+ const { useGetCurrentCompany: useGetCurrentCompany2, useGetCompanyInfo: useGetCompanyInfo2 } = (0, provider_exports.useService)();
464
+ const getCurrentCompany = useGetCurrentCompany2();
465
+ const fetchCurrentCompany = async () => {
466
+ return await getCurrentCompany.mutateAsync({
467
+ service
468
+ });
469
+ };
470
+ const currentCompany = useQuery3({
471
+ queryKey: ["currentCompany"],
472
+ queryFn: fetchCurrentCompany,
473
+ enabled: !!env?.defaultCompany
474
+ });
475
+ const current_company_id = useMemo3(() => {
476
+ return currentCompany.data?.current_company_id;
477
+ }, [currentCompany.data]);
478
+ useEffect4(() => {
479
+ if (current_company_id) {
480
+ const companyIDs = [current_company_id];
481
+ setCompanies(companyIDs);
482
+ }
483
+ }, [current_company_id]);
484
+ const getCompanyInfo = useGetCompanyInfo2();
485
+ const companyInfo = useQuery3({
486
+ queryKey: ["companyInfoQuery", current_company_id],
487
+ queryFn: () => getCompanyInfo.mutateAsync({
488
+ service,
489
+ id: Number(current_company_id)
490
+ }),
491
+ enabled: !!current_company_id
492
+ });
493
+ useEffect4(() => {
494
+ if (companyInfo.data) {
495
+ const companyInfoData = companyInfo.data;
496
+ if (companyInfoData?.length) {
497
+ setDefaultCompany(companyInfoData[0]);
498
+ }
499
+ }
500
+ }, [companyInfo.data]);
501
+ if (!companyInfo?.data || !currentCompany?.data) return;
502
+ return {
503
+ currentCompany: { ...currentCompany },
504
+ companyInfo: { ...companyInfo }
505
+ };
506
+ };
507
+
508
+ // src/hooks/core/use-app-provider.tsx
509
+ import { jsx } from "react/jsx-runtime";
510
+ var AppProviderInitialValue = {
511
+ user: {},
512
+ company: {},
513
+ action: {},
514
+ menu: {},
515
+ view: {}
516
+ };
517
+ var ReactContext = createContext(AppProviderInitialValue);
518
+ var AppProvider = ({
519
+ children,
520
+ menuParams,
521
+ aid,
522
+ i18n
523
+ }) => {
524
+ const { env } = (0, provider_exports.useEnv)();
525
+ const user = useUser({ service: env.default_service, i18n });
526
+ const company = useCompany({ service: env.default_service });
527
+ const menuContext = useMemo4(() => {
528
+ return (0, utils_exports.combineContexts)([
529
+ {
530
+ ...user?.context,
531
+ ...!isObjectEmpty(env?.user) ? { lang: env?.context?.lang } : {},
532
+ ...menuParams?.context ?? {}
533
+ }
534
+ ]);
535
+ }, [user?.context, company?.companyInfo?.isFetched, env?.context?.lang]);
536
+ const menu = useMenu({
537
+ context: {
538
+ ...menuContext
539
+ },
540
+ specification: menuParams?.specification,
541
+ domain: menuParams?.domain,
542
+ defaultService: env.default_service
543
+ });
544
+ const action = useMemo4(() => {
545
+ return menu?.state?.action;
546
+ }, [menu?.state?.action, env?.context?.lang]);
547
+ const viewContext = useMemo4(() => {
548
+ return (0, utils_exports.combineContexts)([
549
+ menuContext,
550
+ { ...(0, utils_exports.evalJSONContext)(action?.context) }
551
+ ]);
552
+ }, [menuContext, action?.context, env?.context?.lang]);
553
+ const view = useViewV2({
554
+ action,
555
+ context: viewContext,
556
+ aid,
557
+ service: menu?.service,
558
+ xNode: menu?.xNode
559
+ });
560
+ return /* @__PURE__ */ jsx(
561
+ ReactContext.Provider,
562
+ {
563
+ value: {
564
+ user,
565
+ company,
566
+ menu,
567
+ action,
568
+ view
569
+ },
570
+ children
571
+ }
572
+ );
573
+ };
574
+ var useAppProvider = () => {
575
+ const context = useContext(ReactContext);
576
+ if (!context) {
577
+ return AppProviderInitialValue;
578
+ }
579
+ return context;
580
+ };
581
+
582
+ // src/hooks/core/use-config.ts
583
+ import { useEffect as useEffect5 } from "react";
584
+ var useConfig = ({
585
+ envConfig,
586
+ config,
587
+ localStorageUtils,
588
+ sessionStorageUtils: sessionStorageUtils2
589
+ }) => {
590
+ const { setupEnv, setEnvFile } = (0, provider_exports.useEnv)();
591
+ useEffect5(() => {
592
+ try {
593
+ setupEnv({
594
+ baseUrl: envConfig.baseUrl,
595
+ config: envConfig.config,
596
+ default_service: "",
597
+ localStorageUtils: localStorageUtils && localStorageUtils(),
598
+ sessionStorageUtils: localStorageUtils && sessionStorageUtils2()
599
+ });
600
+ setEnvFile(config);
601
+ } catch (error) {
602
+ console.error("Error loading env or config:", error);
603
+ }
604
+ }, [envConfig, config]);
605
+ return { envConfig, config };
606
+ };
607
+
608
+ // src/hooks/core/use-get-action.ts
609
+ var useGetAction = ({
610
+ aid,
611
+ context
612
+ }) => {
613
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
614
+ const queryLoadAction = useLoadAction2();
615
+ const queryRunAction = useRunAction2();
616
+ const handleActionResult = (data) => {
617
+ if (data && data.result && data.result.views && Array.isArray(data.result.views) && data.result.views.length > 0) {
618
+ }
619
+ };
620
+ const onLoadAction = () => {
621
+ queryLoadAction.mutate(
622
+ {
623
+ idAction: aid,
624
+ context
625
+ },
626
+ {
627
+ onSuccess: (data) => {
628
+ if (data?.result?.type === "ir.actions.act_window") {
629
+ handleActionResult(data);
630
+ } else if (data?.result?.type === "ir.actions.server") {
631
+ queryRunAction.mutate(
632
+ {
633
+ idAction: aid,
634
+ context
635
+ },
636
+ {
637
+ onSuccess: handleActionResult
638
+ }
639
+ );
640
+ }
641
+ }
642
+ }
643
+ );
644
+ };
645
+ return {
646
+ onLoadAction
647
+ };
648
+ };
649
+
650
+ // src/hooks/core/use-get-specification.ts
651
+ import { useMemo as useMemo5 } from "react";
652
+ var useGetSpecification = ({
653
+ model,
654
+ viewData,
655
+ fields
656
+ }) => {
657
+ const baseModel = useMemo5(
658
+ () => ({
659
+ name: String(model),
660
+ view: viewData,
661
+ fields
662
+ }),
663
+ [model, viewData, fields]
664
+ );
665
+ const initModel = useModel();
666
+ const modelInstance = useMemo5(() => {
667
+ if (viewData) {
668
+ return initModel.initModel(baseModel);
669
+ }
670
+ return null;
671
+ }, [baseModel, viewData, model]);
672
+ const specification = useMemo5(() => {
673
+ if (modelInstance) {
674
+ return modelInstance.getSpecification();
675
+ }
676
+ return null;
677
+ }, [modelInstance, model]);
678
+ return { specification };
679
+ };
680
+
681
+ // src/hooks/core/use-list-data.ts
682
+ import { useMemo as useMemo6, useState as useState5 } from "react";
683
+
684
+ // src/hooks/utils/use-debounce.ts
685
+ import { useEffect as useEffect6, useState as useState3 } from "react";
686
+ function useDebounce(value, delay) {
687
+ const [debouncedValue, setDebouncedValue] = useState3(value);
688
+ useEffect6(() => {
689
+ const handler = setTimeout(() => {
690
+ setDebouncedValue(value);
691
+ }, delay);
692
+ return () => {
693
+ clearTimeout(handler);
694
+ };
695
+ }, [value, delay]);
696
+ return [debouncedValue];
697
+ }
698
+
699
+ // src/hooks/utils/use-get-rowids.ts
700
+ import { useCallback as useCallback3, useEffect as useEffect7, useRef, useState as useState4 } from "react";
701
+ var useGetRowIds = (tableRef) => {
702
+ function isElementVisible(el) {
703
+ const style = window.getComputedStyle(el);
704
+ return style.display !== "none" && style.visibility !== "hidden" && style.opacity !== "0";
705
+ }
706
+ function arraysAreEqual(a, b) {
707
+ if (a.length !== b.length) return false;
708
+ if (a.length === 0 && b.length === 0) return true;
709
+ const setA = new Set(a);
710
+ const setB = new Set(b);
711
+ if (setA.size !== setB.size) return false;
712
+ for (const val of setA) {
713
+ if (!setB.has(val)) return false;
714
+ }
715
+ return true;
716
+ }
717
+ const [rowIds, setRowIds] = useState4([]);
718
+ const lastRowIdsRef = useRef([]);
719
+ const updateVisibleRowIds = useCallback3(() => {
720
+ const table = tableRef.current;
721
+ if (!table) return;
722
+ const rows = table.querySelectorAll("tr[data-row-id]");
723
+ const ids = [];
724
+ rows.forEach((row) => {
725
+ const el = row;
726
+ if (isElementVisible(el)) {
727
+ const id = el.getAttribute("data-row-id");
728
+ if (id) ids.push(id);
729
+ }
730
+ });
731
+ const uniqueIds = Array.from(new Set(ids));
732
+ if (!arraysAreEqual(lastRowIdsRef.current, uniqueIds)) {
733
+ lastRowIdsRef.current = uniqueIds;
734
+ setRowIds(uniqueIds);
735
+ }
736
+ }, [tableRef]);
737
+ useEffect7(() => {
738
+ const table = tableRef.current;
739
+ if (!table) return;
740
+ const mutationObserver = new MutationObserver(() => {
741
+ updateVisibleRowIds();
742
+ });
743
+ mutationObserver.observe(table, {
744
+ childList: true,
745
+ subtree: true,
746
+ attributes: true,
747
+ attributeFilter: ["style", "class"]
748
+ });
749
+ const resizeObserver = new ResizeObserver(() => {
750
+ updateVisibleRowIds();
751
+ });
752
+ resizeObserver.observe(table);
753
+ const handleScroll = () => updateVisibleRowIds();
754
+ table.addEventListener("scroll", handleScroll, true);
755
+ updateVisibleRowIds();
756
+ return () => {
757
+ mutationObserver.disconnect();
758
+ resizeObserver.disconnect();
759
+ table.removeEventListener("scroll", handleScroll, true);
760
+ };
761
+ }, [updateVisibleRowIds, tableRef?.current]);
762
+ return { rowIds, refresh: updateVisibleRowIds };
763
+ };
764
+
765
+ // src/hooks/core/use-list-data.ts
766
+ var useListData = ({
767
+ action,
768
+ context,
769
+ viewData,
770
+ model,
771
+ service,
772
+ xNode,
773
+ mode,
774
+ limit = 10
775
+ }) => {
776
+ const { useGetListData: useGetListData2 } = (0, provider_exports.useService)();
777
+ const [page, setPage] = useState5(0);
778
+ const [pageLimit, setPageLimit] = useState5(limit);
779
+ const [groupByList, setGroupByList] = useState5(null);
780
+ const [domain, setDomain] = useState5(null);
781
+ const [order, setOrder] = useState5("");
782
+ const [selectedRowKeys, setSelectedRowKeys] = useState5([]);
783
+ const [debouncedPage] = useDebounce(page, 500);
784
+ const [debouncedDomain] = useDebounce(domain, 500);
785
+ const { specification } = useGetSpecification({
786
+ model,
787
+ viewData,
788
+ fields: mode === "kanban" ? viewData?.views?.kanban?.fields : viewData?.views?.list?.fields
789
+ });
790
+ const listDataProps = useMemo6(() => {
791
+ if (!viewData || !action || !context) {
792
+ return null;
793
+ }
794
+ const domainParse = domain ? [...domain] : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, utils_exports.evalJSONDomain)(action?.domain, context) : [];
795
+ const limit2 = pageLimit;
796
+ const offset = debouncedPage * pageLimit;
797
+ const fields = typeof groupByList === "object" ? groupByList?.fields : void 0;
798
+ const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
799
+ const sort = order ?? (0, utils_exports.formatSortingString)(
800
+ (mode === "kanban" ? viewData?.views?.kanban : viewData?.views?.list)?.default_order
801
+ ) ?? "";
802
+ return {
803
+ model: action?.res_model,
804
+ specification,
805
+ domain: domainParse,
806
+ limit: limit2,
807
+ offset,
808
+ fields,
809
+ groupby,
810
+ context,
811
+ sort,
812
+ mode
813
+ };
814
+ }, [
815
+ action,
816
+ groupByList,
817
+ order,
818
+ debouncedPage,
819
+ pageLimit,
820
+ debouncedDomain,
821
+ context,
822
+ model
823
+ ]);
824
+ const list = useGetListData2(
825
+ { ...listDataProps },
826
+ [
827
+ listDataProps?.domain,
828
+ listDataProps?.groupby,
829
+ listDataProps?.limit,
830
+ listDataProps?.offset,
831
+ listDataProps?.sort,
832
+ listDataProps?.context,
833
+ listDataProps?.specification,
834
+ listDataProps?.mode
835
+ ],
836
+ !!listDataProps && !!specification && !isObjectEmpty(specification) && !!domain,
837
+ service,
838
+ xNode
839
+ );
840
+ return {
841
+ ...list,
842
+ state: {
843
+ specification,
844
+ page,
845
+ order,
846
+ domain: listDataProps?.domain,
847
+ pageLimit,
848
+ groupByList,
849
+ selectedRowKeys,
850
+ setPage,
851
+ setOrder,
852
+ setDomain,
853
+ setPageLimit,
854
+ setGroupByList,
855
+ setSelectedRowKeys
856
+ }
857
+ };
858
+ };
859
+ export {
860
+ AppProvider,
861
+ useAddEntity,
862
+ useAppProvider,
863
+ useButton,
864
+ useCallAction,
865
+ useChangeOrderPreparationState,
866
+ useChangeStatus,
867
+ useCheckPayment,
868
+ useCompany,
869
+ useConfig,
870
+ useCreateEntity,
871
+ useCreatePosConfig,
872
+ useCreateSession,
873
+ useDebounce,
874
+ useDelete,
875
+ useDeleteComment,
876
+ useDeleteEntity,
877
+ useDetail,
878
+ useDuplicateRecord,
879
+ useExecuteImport,
880
+ useExportExcel,
881
+ useForgotPassword,
882
+ useForgotPasswordSSO,
883
+ useGenSerialNumber,
884
+ useGeneratePaymentQrInfo,
885
+ useGet2FAMethods,
886
+ useGetASession,
887
+ useGetAccessByCode,
888
+ useGetAction,
889
+ useGetActionDetail,
890
+ useGetAll,
891
+ useGetCalendar,
892
+ useGetComment,
893
+ useGetCompanyInfo,
894
+ useGetConversionRate,
895
+ useGetCurrency,
896
+ useGetCurrentCompany,
897
+ useGetDetail,
898
+ useGetExternalTabs,
899
+ useGetFieldExport,
900
+ useGetFieldOnChange,
901
+ useGetFileExcel,
902
+ useGetFormView,
903
+ useGetGroups,
904
+ useGetList,
905
+ useGetListCompany,
906
+ useGetListData,
907
+ useGetListMyBankAccount,
908
+ useGetMenu,
909
+ useGetOrderLine,
910
+ useGetPinCode,
911
+ useGetPrintReport,
912
+ useGetProGressBar,
913
+ useGetProfile,
914
+ useGetProvider,
915
+ useGetResequence,
916
+ useGetRowIds,
917
+ useGetSelection,
918
+ useGetSpecification,
919
+ useGetUser,
920
+ useGetView,
921
+ useGrantAccess,
922
+ useIsValidToken,
923
+ useListData,
924
+ useLoadAction,
925
+ useLoadMessage,
926
+ useLoginCredential,
927
+ useLoginSocial,
928
+ useLogout,
929
+ useMenu,
930
+ useModel,
931
+ useOdooDataTransform,
932
+ useOnChangeForm,
933
+ useParsePreview,
934
+ usePrint,
935
+ useProfile,
936
+ useReadGroup,
937
+ useRemoveRow,
938
+ useRemoveTotpSetup,
939
+ useRequestSetupTotp,
940
+ useResetPassword,
941
+ useResetPasswordSSO,
942
+ useRunAction,
943
+ useSave,
944
+ useSendComment,
945
+ useSettingsWebRead2fa,
946
+ useSignInSSO,
947
+ useSwitchLocale,
948
+ useUpdatePassword,
949
+ useUploadFile,
950
+ useUploadFileExcel,
951
+ useUploadIdFile,
952
+ useUploadImage,
953
+ useUser,
954
+ useValidateActionToken,
955
+ useVerify2FA,
956
+ useVerifyTotp,
957
+ useViewV2
958
+ };