@fctc/interface-logic 4.4.0 → 4.4.2

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 CHANGED
@@ -53,6 +53,58 @@ var UriConstants = /* @__PURE__ */ ((UriConstants2) => {
53
53
  // src/utils/format.ts
54
54
  import moment from "moment";
55
55
 
56
+ // src/constants/model/model-constant.ts
57
+ var LoadDataModel = /* @__PURE__ */ ((LoadDataModel2) => {
58
+ LoadDataModel2["ACCOUNT_CASH_ROUNDING"] = "account.cash.rounding";
59
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION"] = "account.fiscal.position";
60
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION_TAX"] = "account.fiscal.position.tax";
61
+ LoadDataModel2["ACCOUNT_TAX"] = "account.tax";
62
+ LoadDataModel2["ACCOUNT_TAX_GROUP"] = "account.tax.group";
63
+ LoadDataModel2["DECIMAL_PRECISION"] = "decimal.precision";
64
+ LoadDataModel2["IR_MODULE_MODULE"] = "ir.module.module";
65
+ LoadDataModel2["IR_UI_VIEW"] = "ir.ui.view";
66
+ LoadDataModel2["POS_BILL"] = "pos.bill";
67
+ LoadDataModel2["POS_CATEGORY"] = "pos.category";
68
+ LoadDataModel2["POS_CONFIG"] = "pos.config";
69
+ LoadDataModel2["POS_NOTE"] = "pos.note";
70
+ LoadDataModel2["POS_ORDER"] = "pos.order";
71
+ LoadDataModel2["POS_ORDER_LINE"] = "pos.order.line";
72
+ LoadDataModel2["POS_PACK_OPERATION_LOT"] = "pos.pack.operation.lot";
73
+ LoadDataModel2["POS_PAYMENT"] = "pos.payment";
74
+ LoadDataModel2["POS_PAYMENT_METHOD"] = "pos.payment.method";
75
+ LoadDataModel2["POS_PRINTER"] = "pos.printer";
76
+ LoadDataModel2["POS_SESSION"] = "pos.session";
77
+ LoadDataModel2["POS_PREPARATION_DISPLAY_DISPLAY"] = "pos_preparation_display.display";
78
+ LoadDataModel2["PRODUCT_ATTRIBUTE"] = "product.attribute";
79
+ LoadDataModel2["PRODUCT_ATTRIBUTE_CUSTOM_VALUE"] = "product.attribute.custom.value";
80
+ LoadDataModel2["PRODUCT_CATEGORY"] = "product.category";
81
+ LoadDataModel2["PRODUCT_COMBO"] = "product.combo";
82
+ LoadDataModel2["PRODUCT_COMBO_ITEM"] = "product.combo.item";
83
+ LoadDataModel2["PRODUCT_PACKAGING"] = "product.packaging";
84
+ LoadDataModel2["PRODUCT_PRICELIST"] = "product.pricelist";
85
+ LoadDataModel2["PRODUCT_PRICELIST_ITEM"] = "product.pricelist.item";
86
+ LoadDataModel2["PRODUCT_PRODUCT"] = "product.product";
87
+ LoadDataModel2["PRODUCT_TAG"] = "product.tag";
88
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_LINE"] = "product.template.attribute.line";
89
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_VALUE"] = "product.template.attribute.value";
90
+ LoadDataModel2["RES_COMPANY"] = "res.company";
91
+ LoadDataModel2["RES_COUNTRY"] = "res.country";
92
+ LoadDataModel2["RES_COUNTRY_STATE"] = "res.country.state";
93
+ LoadDataModel2["RES_CURRENCY"] = "res.currency";
94
+ LoadDataModel2["RES_LANG"] = "res.lang";
95
+ LoadDataModel2["RES_PARTNER"] = "res.partner";
96
+ LoadDataModel2["RES_USERS"] = "res.users";
97
+ LoadDataModel2["STOCK_PICKING_TYPE"] = "stock.picking.type";
98
+ LoadDataModel2["UOM_CATEGORY"] = "uom.category";
99
+ LoadDataModel2["UOM_UOM"] = "uom.uom";
100
+ LoadDataModel2["LOYALTY_PROGRAM"] = "loyalty.program";
101
+ LoadDataModel2["LOYALTY_RULE"] = "loyalty.rule";
102
+ LoadDataModel2["RESTAURANT_TABLE"] = "restaurant.table";
103
+ LoadDataModel2["RESTAURANT_FLOOR"] = "restaurant.floor";
104
+ LoadDataModel2["POS_MAKE_PAYMENT"] = "pos.make.payment";
105
+ return LoadDataModel2;
106
+ })(LoadDataModel || {});
107
+
56
108
  // src/constants/widget/widget-avatar-constant.ts
57
109
  var WIDGETAVATAR = /* @__PURE__ */ ((WIDGETAVATAR2) => {
58
110
  WIDGETAVATAR2["many2one_avatar_user"] = "many2one_avatar_user";
@@ -2203,13 +2255,6 @@ function cleanObject(obj) {
2203
2255
  }
2204
2256
  return result;
2205
2257
  }
2206
- var extractIdFromDomain = (domain) => {
2207
- if (!domain || !Array.isArray(domain)) return null;
2208
- const idCond = domain.find(
2209
- ([field, operator]) => field === "id" && operator === "="
2210
- );
2211
- return idCond ? Number(idCond[2]) : null;
2212
- };
2213
2258
 
2214
2259
  // src/provider/react-query-provider.tsx
2215
2260
  import { useState as useState2 } from "react";
@@ -2262,7 +2307,7 @@ var initialState2 = {
2262
2307
  lang: "vi_VN",
2263
2308
  tz: "Asia/Saigon"
2264
2309
  },
2265
- isLocalMode: false
2310
+ isSupaMode: false
2266
2311
  };
2267
2312
  var envSlice = createSlice2({
2268
2313
  name: "env",
@@ -2877,6 +2922,15 @@ var ServiceContext = createContext2(null);
2877
2922
  import { useEffect as useEffect3 } from "react";
2878
2923
  import { Fragment as Fragment2, jsx as jsx7 } from "react/jsx-runtime";
2879
2924
 
2925
+ // src/provider/supabase-provider.tsx
2926
+ import { createContext as createContext3, useContext as useContext3, useMemo } from "react";
2927
+ import { createClient } from "@supabase/supabase-js";
2928
+ import { jsx as jsx8 } from "react/jsx-runtime";
2929
+ var SupabaseContext = createContext3(null);
2930
+ var useSupabaseOptional = () => {
2931
+ return useContext3(SupabaseContext);
2932
+ };
2933
+
2880
2934
  // src/services/action-service/index.ts
2881
2935
  function useActionService() {
2882
2936
  const { env } = useEnv();
@@ -5081,544 +5135,7 @@ var getASessionService = (env) => {
5081
5135
 
5082
5136
  // src/services/pos-service/add-entity.ts
5083
5137
  import { useCallback as useCallback13 } from "react";
5084
-
5085
- // src/services/filesystem-service/file-service.ts
5086
- import { Directory, Encoding, Filesystem } from "@capacitor/filesystem";
5087
- var fileService = {
5088
- read: async (path) => {
5089
- try {
5090
- const res = await Filesystem.readFile({
5091
- path,
5092
- directory: Directory.Data,
5093
- encoding: Encoding.UTF8
5094
- });
5095
- if (typeof res.data === "string") return res.data;
5096
- if (res.data instanceof Blob) return await res.data.text();
5097
- return null;
5098
- } catch {
5099
- return null;
5100
- }
5101
- },
5102
- write: async (path, data) => {
5103
- await Filesystem.writeFile({
5104
- path,
5105
- data,
5106
- directory: Directory.Data,
5107
- encoding: Encoding.UTF8,
5108
- recursive: true
5109
- });
5110
- },
5111
- writeAtomic: async (path, data) => {
5112
- const tempPath = path + ".tmp";
5113
- await Filesystem.writeFile({
5114
- path: tempPath,
5115
- data,
5116
- directory: Directory.Data,
5117
- encoding: Encoding.UTF8,
5118
- recursive: true
5119
- });
5120
- try {
5121
- await Filesystem.deleteFile({
5122
- path,
5123
- directory: Directory.Data
5124
- });
5125
- } catch {
5126
- }
5127
- await Filesystem.rename({
5128
- from: tempPath,
5129
- to: path,
5130
- directory: Directory.Data
5131
- });
5132
- },
5133
- delete: async (path) => {
5134
- try {
5135
- await Filesystem.deleteFile({
5136
- path,
5137
- directory: Directory.Data
5138
- });
5139
- } catch {
5140
- }
5141
- },
5142
- exists: async (path) => {
5143
- try {
5144
- await Filesystem.stat({
5145
- path,
5146
- directory: Directory.Data
5147
- });
5148
- return true;
5149
- } catch {
5150
- return false;
5151
- }
5152
- },
5153
- mkdir: async (path) => {
5154
- try {
5155
- await Filesystem.mkdir({
5156
- path,
5157
- directory: Directory.Data,
5158
- recursive: true
5159
- });
5160
- } catch (e) {
5161
- if (!String(e?.message).includes("Exists")) {
5162
- throw e;
5163
- }
5164
- }
5165
- },
5166
- list: async (path) => {
5167
- return Filesystem.readdir({
5168
- path,
5169
- directory: Directory.Data
5170
- });
5171
- },
5172
- getUri: async (path) => {
5173
- return Filesystem.getUri({
5174
- path,
5175
- directory: Directory.Data
5176
- });
5177
- }
5178
- };
5179
-
5180
- // src/services/filesystem-service/json-worker.ts
5181
- function createWorkerBlob() {
5182
- const workerCode = `
5183
- self.addEventListener("message", async (ev) => {
5184
- const { id, cmd, payload } = ev.data;
5185
- try {
5186
- if (cmd === "parse") {
5187
- const parsed = JSON.parse(payload);
5188
- self.postMessage({ id, ok: true, result: parsed });
5189
- } else if (cmd === "stringify") {
5190
- const str = JSON.stringify(payload);
5191
- self.postMessage({ id, ok: true, result: str });
5192
- }
5193
- } catch (err) {
5194
- self.postMessage({ id, ok: false, error: err?.message || String(err) });
5195
- }
5196
- });
5197
- `;
5198
- const blob = new Blob([workerCode], { type: "application/javascript" });
5199
- return URL.createObjectURL(blob);
5200
- }
5201
- function spawnParseWorker(raw) {
5202
- return new Promise((resolve, reject) => {
5203
- const workerUrl = createWorkerBlob();
5204
- const worker = new Worker(workerUrl);
5205
- const id = Math.random().toString(36).slice(2);
5206
- worker.onmessage = (ev) => {
5207
- const { ok, result, error } = ev.data;
5208
- if (ok) {
5209
- resolve(result);
5210
- } else {
5211
- reject(new Error(error));
5212
- }
5213
- URL.revokeObjectURL(workerUrl);
5214
- worker.terminate();
5215
- };
5216
- worker.onerror = (err) => {
5217
- reject(err);
5218
- URL.revokeObjectURL(workerUrl);
5219
- worker.terminate();
5220
- };
5221
- worker.postMessage({ id, cmd: "parse", payload: raw });
5222
- });
5223
- }
5224
- function spawnStringifyWorker(obj) {
5225
- return new Promise((resolve, reject) => {
5226
- const workerUrl = createWorkerBlob();
5227
- const worker = new Worker(workerUrl);
5228
- worker.onmessage = (ev) => {
5229
- const { ok, result, error } = ev.data;
5230
- if (ok) resolve(result);
5231
- else reject(new Error(error));
5232
- URL.revokeObjectURL(workerUrl);
5233
- worker.terminate();
5234
- };
5235
- worker.onerror = (err) => {
5236
- reject(err);
5237
- URL.revokeObjectURL(workerUrl);
5238
- worker.terminate();
5239
- };
5240
- worker.postMessage({ cmd: "stringify", payload: obj });
5241
- });
5242
- }
5243
-
5244
- // src/services/filesystem-service/manifest.ts
5245
- var MANIFEST_PATH = "pos/manifest.json";
5246
- var MANIFEST_BAK_PATH = "pos/manifest.bak.json";
5247
- async function writeManifest(manifest) {
5248
- const oldRaw = await fileService.read(MANIFEST_PATH);
5249
- if (oldRaw !== null) {
5250
- await fileService.writeAtomic(MANIFEST_BAK_PATH, oldRaw);
5251
- }
5252
- await fileService.writeAtomic(MANIFEST_PATH, JSON.stringify(manifest));
5253
- try {
5254
- await fileService.delete(MANIFEST_BAK_PATH);
5255
- } catch {
5256
- }
5257
- }
5258
-
5259
- // src/services/filesystem-service/import-snapshot.ts
5260
- var DATA_DIR = "pos";
5261
- var MODELS_DIR = `${DATA_DIR}/models`;
5262
- var MODELS_META_DIR = `${DATA_DIR}/models_meta`;
5263
- var importSnapshot = async ({ data, onProgress }) => {
5264
- onProgress?.(1, "Parsing snapshot");
5265
- const parsed = await spawnParseWorker(data);
5266
- const modelNames = Object.keys(parsed);
5267
- const total = modelNames.length;
5268
- const manifest = { version: (/* @__PURE__ */ new Date()).toISOString(), models: {} };
5269
- const TMP_PREFIX = `pos/data/tmp_import_${Date.now()}`;
5270
- await fileService.writeAtomic(`${TMP_PREFIX}/.marker`, "1");
5271
- let i = 0;
5272
- for (const model of modelNames) {
5273
- i++;
5274
- onProgress?.(
5275
- Math.round(i / total * 100),
5276
- `Processing ${model} (${i}/${total})`
5277
- );
5278
- const block = parsed[model];
5279
- const dataPart = block?.data ?? block ?? [];
5280
- const fields = block?.fields ?? [];
5281
- const relations = block?.relations ?? {};
5282
- const serialized = await spawnStringifyWorker(dataPart);
5283
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5284
- await fileService.writeAtomic(tmpModelPath, serialized);
5285
- const meta = {
5286
- fields,
5287
- relations,
5288
- count: Array.isArray(dataPart) ? dataPart.length : 0,
5289
- writtenAt: (/* @__PURE__ */ new Date()).toISOString()
5290
- };
5291
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5292
- await fileService.writeAtomic(tmpMetaPath, JSON.stringify(meta));
5293
- manifest.models[model] = {
5294
- file: `${MODELS_DIR}/${encodeURIComponent(model)}.json`,
5295
- metaFile: `${MODELS_META_DIR}/${encodeURIComponent(model)}.meta.json`,
5296
- count: meta.count,
5297
- updatedAt: meta.writtenAt
5298
- };
5299
- }
5300
- onProgress?.(95, "Committing import (moving files)");
5301
- for (const model of modelNames) {
5302
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5303
- const finalModelPath = `${MODELS_DIR}/${encodeURIComponent(model)}.json`;
5304
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5305
- const finalMetaPath = `${MODELS_META_DIR}/${encodeURIComponent(
5306
- model
5307
- )}.meta.json`;
5308
- const tmpRaw = await fileService.read(tmpModelPath);
5309
- if (tmpRaw !== null) await fileService.writeAtomic(finalModelPath, tmpRaw);
5310
- const tmpMetaRaw = await fileService.read(tmpMetaPath);
5311
- if (tmpMetaRaw !== null)
5312
- await fileService.writeAtomic(finalMetaPath, tmpMetaRaw);
5313
- onProgress?.(
5314
- 95 + Math.round(
5315
- (Object.keys(manifest.models).indexOf(model) + 1) / modelNames.length * 5
5316
- ),
5317
- `Committed ${model}`
5318
- );
5319
- }
5320
- await writeManifest(manifest);
5321
- try {
5322
- for (const model of modelNames) {
5323
- await fileService.delete(
5324
- `${TMP_PREFIX}/${encodeURIComponent(model)}.json`
5325
- );
5326
- await fileService.delete(
5327
- `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`
5328
- );
5329
- }
5330
- await fileService.delete(`${TMP_PREFIX}/.marker`);
5331
- } catch (e) {
5332
- console.log("Failed to cleanup tmp import files:", e);
5333
- }
5334
- onProgress?.(100, "Import complete");
5335
- return manifest;
5336
- };
5337
- var import_snapshot_default = importSnapshot;
5338
-
5339
- // src/services/filesystem-service/memory-cache.ts
5340
- var MemoryCache = class {
5341
- map = /* @__PURE__ */ new Map();
5342
- get(k) {
5343
- const e = this.map.get(k);
5344
- if (!e) return null;
5345
- if (e.ttl && Date.now() - e.t > e.ttl) {
5346
- this.map.delete(k);
5347
- return null;
5348
- }
5349
- return e.value;
5350
- }
5351
- set(k, v, ttl = 5 * 60 * 1e3) {
5352
- this.map.set(k, { value: v, t: Date.now(), ttl });
5353
- }
5354
- del(k) {
5355
- this.map.delete(k);
5356
- }
5357
- clear() {
5358
- this.map.clear();
5359
- }
5360
- };
5361
- var memoryCache = new MemoryCache();
5362
-
5363
- // src/services/filesystem-service/model-loader.ts
5364
- var MODELS_DIR2 = "pos/models";
5365
- var MODELS_META_DIR2 = "pos/models_meta";
5366
- async function loadModelData(modelName, includeMeta = true) {
5367
- const key = `model:${modelName}:meta:${includeMeta}`;
5368
- const cached = memoryCache.get(key);
5369
- if (cached) return cached;
5370
- const dataPath = `${MODELS_DIR2}/${encodeURIComponent(modelName)}.json`;
5371
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5372
- modelName
5373
- )}.meta.json`;
5374
- const rawData = await fileService.read(dataPath);
5375
- if (!rawData) return null;
5376
- const parsedData = await spawnParseWorker(rawData);
5377
- const data = Array.isArray(parsedData) ? parsedData : [];
5378
- if (!includeMeta) {
5379
- const result2 = { data };
5380
- memoryCache.set(key, result2, 1e3 * 60 * 60);
5381
- return result2;
5382
- }
5383
- const rawMeta = await fileService.read(metaPath);
5384
- let fields = [];
5385
- let relations = {};
5386
- if (rawMeta) {
5387
- const parsedMeta = await spawnParseWorker(rawMeta);
5388
- fields = parsedMeta?.fields ?? [];
5389
- relations = parsedMeta?.relations ?? {};
5390
- }
5391
- const result = {
5392
- data,
5393
- fields,
5394
- relations
5395
- };
5396
- memoryCache.set(key, result, 1e3 * 60 * 60);
5397
- return result;
5398
- }
5399
- async function loadData(includeMeta = true) {
5400
- try {
5401
- const listResult = await fileService.list(MODELS_DIR2);
5402
- if (!listResult || !Array.isArray(listResult.files)) {
5403
- console.log("No models found");
5404
- return {};
5405
- }
5406
- const result = {};
5407
- for (const file of listResult.files) {
5408
- if (file.type !== "file") continue;
5409
- if (!file.name.endsWith(".json")) continue;
5410
- const fileName = file.name;
5411
- const modelName = fileName.replace(/\.json$/, "");
5412
- const dataPath = `${MODELS_DIR2}/${fileName}`;
5413
- const rawData = await fileService.read(dataPath);
5414
- if (!rawData) continue;
5415
- const parsedData = await spawnParseWorker(rawData);
5416
- const data = Array.isArray(parsedData) ? parsedData : [];
5417
- if (!includeMeta) {
5418
- result[modelName] = { data };
5419
- continue;
5420
- }
5421
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5422
- modelName
5423
- )}.meta.json`;
5424
- const rawMeta = await fileService.read(metaPath);
5425
- let fields = [];
5426
- let relations = {};
5427
- if (rawMeta) {
5428
- const parsedMeta = await spawnParseWorker(rawMeta);
5429
- fields = parsedMeta?.fields ?? [];
5430
- relations = parsedMeta?.relations ?? {};
5431
- }
5432
- result[modelName] = {
5433
- data,
5434
- fields,
5435
- relations
5436
- };
5437
- }
5438
- return result;
5439
- } catch (error) {
5440
- console.error("Error loading data:", error);
5441
- throw error;
5442
- }
5443
- }
5444
-
5445
- // src/services/filesystem-service/snapshot-helper.ts
5446
- var createEmptySnapshot = () => {
5447
- return {
5448
- data: []
5449
- };
5450
- };
5451
- var generateNextId = (existingIds, startFrom = 1) => {
5452
- if (!existingIds || existingIds.length === 0) {
5453
- return startFrom;
5454
- }
5455
- const maxId = Math.max(...existingIds, startFrom - 1);
5456
- return maxId + 1;
5457
- };
5458
- var loadSnapshot = async ({
5459
- modelName
5460
- }) => {
5461
- try {
5462
- const snapshot = await loadModelData(modelName);
5463
- if (!snapshot || typeof snapshot !== "object") {
5464
- console.warn("invalid snapshot, creating new one");
5465
- return createEmptySnapshot();
5466
- }
5467
- return {
5468
- data: Array.isArray(snapshot.data) ? snapshot.data : []
5469
- };
5470
- } catch (error) {
5471
- console.error("Failed to load snapshot:", error);
5472
- return createEmptySnapshot();
5473
- }
5474
- };
5475
- var getExistingIds = (snapshot) => {
5476
- return snapshot.data.map((order) => order.id).filter((id) => typeof id === "number");
5477
- };
5478
- var saveSnapshot = async ({
5479
- snapshot,
5480
- modelName
5481
- }) => {
5482
- try {
5483
- await import_snapshot_default({
5484
- data: JSON.stringify({
5485
- [modelName]: snapshot
5486
- })
5487
- });
5488
- return true;
5489
- } catch (error) {
5490
- console.error("failed to save snapshot:", error);
5491
- return false;
5492
- }
5493
- };
5494
- var addRecordResponseHandler = ({
5495
- modelName,
5496
- id,
5497
- data
5498
- }) => {
5499
- if (modelName === "restaurant.floor" /* RESTAURANT_FLOOR */ || modelName === "res.partner" /* RES_PARTNER */) {
5500
- return [[id, ""]];
5501
- }
5502
- return data;
5503
- };
5504
-
5505
- // src/services/filesystem-service/model-repository.ts
5506
- var ModelRepository = class {
5507
- getAll = async ({ modelName }) => {
5508
- try {
5509
- const snapshot = await loadSnapshot({
5510
- modelName
5511
- });
5512
- return snapshot.data;
5513
- } catch (error) {
5514
- console.error("failed to get all records:", error);
5515
- return [];
5516
- }
5517
- };
5518
- getRecord = async ({
5519
- id,
5520
- modelName
5521
- }) => {
5522
- try {
5523
- const snapshot = await loadSnapshot({
5524
- modelName
5525
- });
5526
- return snapshot.data.find((record) => record.id === id) || null;
5527
- } catch (error) {
5528
- console.error("failed to get record:", error);
5529
- return null;
5530
- }
5531
- };
5532
- addRecord = async ({
5533
- newRecord,
5534
- modelName
5535
- }) => {
5536
- try {
5537
- const snapshot = await loadSnapshot({
5538
- modelName
5539
- });
5540
- const existingIds = getExistingIds(snapshot);
5541
- const newId = generateNextId(existingIds, snapshot.data.length);
5542
- snapshot.data.push({
5543
- ...newRecord,
5544
- id: newId
5545
- });
5546
- const saved = await saveSnapshot({
5547
- snapshot,
5548
- modelName
5549
- });
5550
- if (!saved) {
5551
- console.error("failed to add new record");
5552
- return [];
5553
- }
5554
- console.log("lib data:", snapshot.data);
5555
- const response = addRecordResponseHandler({
5556
- id: newId,
5557
- modelName,
5558
- data: snapshot.data
5559
- });
5560
- return response;
5561
- } catch (error) {
5562
- console.error("failed to add new record:", error);
5563
- return [];
5564
- }
5565
- };
5566
- updateRecord = async ({
5567
- id,
5568
- update,
5569
- modelName
5570
- }) => {
5571
- try {
5572
- const snapshot = await loadSnapshot({
5573
- modelName
5574
- });
5575
- const index = snapshot.data.findIndex((record) => record.id === id);
5576
- if (index === -1) {
5577
- console.error(`record with id ${id} not found`);
5578
- return false;
5579
- }
5580
- snapshot.data[index] = {
5581
- ...snapshot.data[index],
5582
- ...update
5583
- };
5584
- return await saveSnapshot({
5585
- snapshot,
5586
- modelName
5587
- });
5588
- } catch (error) {
5589
- console.error("error updating record:", error);
5590
- return false;
5591
- }
5592
- };
5593
- deleteRecord = async ({
5594
- id,
5595
- modelName
5596
- }) => {
5597
- try {
5598
- const snapshot = await loadSnapshot({
5599
- modelName
5600
- });
5601
- const before = snapshot.data.length;
5602
- snapshot.data = snapshot.data.filter((record) => record.id !== id);
5603
- if (snapshot.data.length === before) {
5604
- console.error(`record with id ${id} not found`);
5605
- return false;
5606
- }
5607
- return await saveSnapshot({
5608
- snapshot,
5609
- modelName
5610
- });
5611
- } catch (error) {
5612
- console.error("error deleting record:", error);
5613
- return false;
5614
- }
5615
- };
5616
- };
5617
-
5618
- // src/services/pos-service/add-entity.ts
5619
5138
  var addEntityService = (env) => {
5620
- const isLocalMode = env?.isLocalMode;
5621
- const repo = new ModelRepository();
5622
5139
  const addEntity = useCallback13(
5623
5140
  ({
5624
5141
  model,
@@ -5627,12 +5144,6 @@ var addEntityService = (env) => {
5627
5144
  service,
5628
5145
  isCreateEndpoint = false
5629
5146
  }) => {
5630
- if (isLocalMode) {
5631
- return repo.addRecord({
5632
- newRecord: values,
5633
- modelName: model
5634
- });
5635
- }
5636
5147
  const jsonData = {
5637
5148
  model,
5638
5149
  values
@@ -5649,7 +5160,7 @@ var addEntityService = (env) => {
5649
5160
  service
5650
5161
  );
5651
5162
  },
5652
- [env, isLocalMode]
5163
+ [env]
5653
5164
  );
5654
5165
  return {
5655
5166
  addEntity
@@ -5771,8 +5282,6 @@ var createEInvoiceService = (env) => {
5771
5282
  // src/services/pos-service/create-entity.ts
5772
5283
  import { useCallback as useCallback17 } from "react";
5773
5284
  var createEntityService = (env) => {
5774
- const isLocalMode = env?.isLocalMode;
5775
- const repo = new ModelRepository();
5776
5285
  const createEntity = useCallback17(
5777
5286
  ({
5778
5287
  model,
@@ -5780,12 +5289,6 @@ var createEntityService = (env) => {
5780
5289
  xNode,
5781
5290
  service
5782
5291
  }) => {
5783
- if (isLocalMode) {
5784
- return repo.addRecord({
5785
- newRecord: args[0],
5786
- modelName: model
5787
- });
5788
- }
5789
5292
  const jsonData = {
5790
5293
  model,
5791
5294
  method: "create" /* CREATE */,
@@ -5803,7 +5306,7 @@ var createEntityService = (env) => {
5803
5306
  service
5804
5307
  );
5805
5308
  },
5806
- [env, isLocalMode]
5309
+ [env]
5807
5310
  );
5808
5311
  return {
5809
5312
  createEntity
@@ -5888,8 +5391,6 @@ var createSessionService = (env) => {
5888
5391
  // src/services/pos-service/delete-entity.ts
5889
5392
  import { useCallback as useCallback20 } from "react";
5890
5393
  var deleteEntityService = (env) => {
5891
- const isLocalMode = env?.isLocalMode;
5892
- const repo = new ModelRepository();
5893
5394
  const deleteEntity = useCallback20(
5894
5395
  ({
5895
5396
  model,
@@ -5898,14 +5399,6 @@ var deleteEntityService = (env) => {
5898
5399
  service,
5899
5400
  method
5900
5401
  }) => {
5901
- if (isLocalMode) {
5902
- const id = ids[0];
5903
- if (!id) return;
5904
- return repo.deleteRecord({
5905
- modelName: model,
5906
- id
5907
- });
5908
- }
5909
5402
  const jsonData = {
5910
5403
  model,
5911
5404
  ids,
@@ -5923,7 +5416,7 @@ var deleteEntityService = (env) => {
5923
5416
  service
5924
5417
  );
5925
5418
  },
5926
- [env, isLocalMode]
5419
+ [env]
5927
5420
  );
5928
5421
  return {
5929
5422
  deleteEntity
@@ -6000,8 +5493,6 @@ var getCurrentUserService = (env) => {
6000
5493
  // src/services/pos-service/get-list.ts
6001
5494
  import { useCallback as useCallback23 } from "react";
6002
5495
  var getListService = (env) => {
6003
- const isLocalMode = env?.isLocalMode;
6004
- const repo = new ModelRepository();
6005
5496
  const getList = useCallback23(
6006
5497
  async ({
6007
5498
  model,
@@ -6012,12 +5503,6 @@ var getListService = (env) => {
6012
5503
  offset,
6013
5504
  limit
6014
5505
  }) => {
6015
- if (isLocalMode) {
6016
- const data = await repo.getAll({
6017
- modelName: model
6018
- });
6019
- return data;
6020
- }
6021
5506
  const jsonData = {
6022
5507
  model,
6023
5508
  method: "web_search_read" /* WEB_SEARCH_READ */,
@@ -6040,7 +5525,7 @@ var getListService = (env) => {
6040
5525
  service
6041
5526
  );
6042
5527
  },
6043
- [env, isLocalMode]
5528
+ [env]
6044
5529
  );
6045
5530
  return {
6046
5531
  getList
@@ -6369,8 +5854,24 @@ var handleClosingSessionService = (env) => {
6369
5854
 
6370
5855
  // src/services/pos-service/load-data-pos-session.ts
6371
5856
  import { useCallback as useCallback32 } from "react";
5857
+ var MODEL_TO_TABLE = {
5858
+ ["account.tax" /* ACCOUNT_TAX */]: "account_taxes",
5859
+ ["res.company" /* RES_COMPANY */]: "companies",
5860
+ ["res.partner" /* RES_PARTNER */]: "customers",
5861
+ ["res.users" /* RES_USERS */]: "employees",
5862
+ ["loyalty.program" /* LOYALTY_PROGRAM */]: "loyalty_programs",
5863
+ ["loyalty.rule" /* LOYALTY_RULE */]: "loyalty_rules",
5864
+ ["pos.order.line" /* POS_ORDER_LINE */]: "order_lines",
5865
+ ["pos.order" /* POS_ORDER */]: "orders",
5866
+ ["pos.payment.method" /* POS_PAYMENT_METHOD */]: "payment_methods",
5867
+ ["pos.payment" /* POS_PAYMENT */]: "payments",
5868
+ ["product.category" /* PRODUCT_CATEGORY */]: "product_categories",
5869
+ ["product.product" /* PRODUCT_PRODUCT */]: "products",
5870
+ ["restaurant.floor" /* RESTAURANT_FLOOR */]: "restaurant_floors",
5871
+ ["restaurant.table" /* RESTAURANT_TABLE */]: "restaurant_tables"
5872
+ };
6372
5873
  var loadDataPosSessionService = (env) => {
6373
- const isLocalMode = env?.isLocalMode;
5874
+ const supabase = useSupabaseOptional();
6374
5875
  const loadDataPosSession = useCallback32(
6375
5876
  async ({
6376
5877
  model,
@@ -6381,10 +5882,6 @@ var loadDataPosSessionService = (env) => {
6381
5882
  modelsToLoad = [],
6382
5883
  searchParams
6383
5884
  }) => {
6384
- if (isLocalMode) {
6385
- const data = await loadData();
6386
- return data;
6387
- }
6388
5885
  const jsonData = {
6389
5886
  model,
6390
5887
  method: "load_data" /* LOAD_DATA */,
@@ -6411,10 +5908,67 @@ var loadDataPosSessionService = (env) => {
6411
5908
  service
6412
5909
  );
6413
5910
  },
6414
- [env, isLocalMode]
5911
+ [env]
6415
5912
  );
5913
+ const loadDataPosSessionSupabase = useCallback32(async () => {
5914
+ try {
5915
+ const allModels = Object.values(LoadDataModel);
5916
+ const promises = allModels.map(async (modelName) => {
5917
+ const tableName = MODEL_TO_TABLE[modelName];
5918
+ if (!tableName) {
5919
+ return {
5920
+ modelName,
5921
+ data: [],
5922
+ fields: {},
5923
+ relations: {}
5924
+ };
5925
+ }
5926
+ if (!supabase) {
5927
+ return {
5928
+ modelName,
5929
+ data: [],
5930
+ fields: {},
5931
+ relations: {}
5932
+ };
5933
+ }
5934
+ const { data, error } = await supabase.from(tableName).select("*");
5935
+ if (error) {
5936
+ console.error(`Error loading ${modelName}:`, error);
5937
+ return {
5938
+ modelName,
5939
+ data: [],
5940
+ fields: {},
5941
+ relations: {}
5942
+ };
5943
+ }
5944
+ return {
5945
+ modelName,
5946
+ data: data || [],
5947
+ fields: {},
5948
+ relations: {}
5949
+ };
5950
+ });
5951
+ const results = await Promise.all(promises);
5952
+ const response = results.reduce(
5953
+ (acc, { modelName, data, fields, relations }) => {
5954
+ acc[modelName] = {
5955
+ data,
5956
+ fields,
5957
+ relations
5958
+ };
5959
+ return acc;
5960
+ },
5961
+ {}
5962
+ );
5963
+ return response;
5964
+ } catch (error) {
5965
+ console.error("Error loading data from Supabase:", error);
5966
+ return {};
5967
+ }
5968
+ }, [supabase]);
6416
5969
  return {
6417
- loadDataPosSession
5970
+ loadDataPosSession,
5971
+ loadDataPosSessionSupabase
6418
5972
  };
6419
5973
  };
6420
5974
 
@@ -6636,8 +6190,6 @@ var updateClosedSessionService = (env) => {
6636
6190
  // src/services/pos-service/update-entity.ts
6637
6191
  import { useCallback as useCallback39 } from "react";
6638
6192
  var updateEntityService = (env) => {
6639
- const isLocalMode = env?.isLocalMode;
6640
- const repo = new ModelRepository();
6641
6193
  const updateEntity = useCallback39(
6642
6194
  ({
6643
6195
  model,
@@ -6647,15 +6199,6 @@ var updateEntityService = (env) => {
6647
6199
  xNode,
6648
6200
  service
6649
6201
  }) => {
6650
- if (isLocalMode) {
6651
- const id = extractIdFromDomain(domain);
6652
- if (!id) return;
6653
- return repo.updateRecord({
6654
- update: values,
6655
- modelName: model,
6656
- id
6657
- });
6658
- }
6659
6202
  const jsonData = {
6660
6203
  model,
6661
6204
  domain,
@@ -6673,7 +6216,7 @@ var updateEntityService = (env) => {
6673
6216
  service
6674
6217
  );
6675
6218
  },
6676
- [env, isLocalMode]
6219
+ [env]
6677
6220
  );
6678
6221
  return {
6679
6222
  updateEntity
@@ -6799,50 +6342,6 @@ var usePosService = () => {
6799
6342
  return service;
6800
6343
  };
6801
6344
 
6802
- // src/services/filesystem-service/init-snapshot.ts
6803
- var isSnapshotReady = async () => {
6804
- try {
6805
- const raw = await fileService.read("pos/manifest.json");
6806
- if (!raw) return false;
6807
- const manifest = JSON.parse(raw);
6808
- if (!manifest.models || typeof manifest.models !== "object") {
6809
- return false;
6810
- }
6811
- const modelEntries = Object.values(manifest.models);
6812
- if (modelEntries.length === 0) return false;
6813
- const firstModel = modelEntries[0];
6814
- if (!firstModel.file) return false;
6815
- const modelExists = await fileService.exists(firstModel.file);
6816
- return modelExists;
6817
- } catch {
6818
- return false;
6819
- }
6820
- };
6821
- async function initSnapshot(onProgress) {
6822
- const ready = await isSnapshotReady();
6823
- if (ready) {
6824
- console.log("skip initialization.");
6825
- return;
6826
- }
6827
- console.log("initializing from data.json...");
6828
- const jsonData = await fetch("/data.json").then((r) => r.text());
6829
- if (!jsonData) {
6830
- console.error("cannot load data.json");
6831
- return;
6832
- }
6833
- await import_snapshot_default({
6834
- data: jsonData,
6835
- onProgress
6836
- });
6837
- }
6838
-
6839
- // src/services/filesystem-service/index.ts
6840
- var useFileSystemService = () => {
6841
- return {
6842
- initSnapshot
6843
- };
6844
- };
6845
-
6846
6345
  // src/hooks/auth/use-forgot-password.ts
6847
6346
  var useForgotPassword = () => {
6848
6347
  const { forgotPassword } = useAuthService();
@@ -8731,8 +8230,9 @@ var use_handle_closing_session_default = useHandleClosingSession;
8731
8230
  import { useMutation as useMutation77 } from "@tanstack/react-query";
8732
8231
  var useLoadDataPosSession = () => {
8733
8232
  const pos = usePosService();
8233
+ const { env } = useEnv();
8734
8234
  return useMutation77({
8735
- mutationFn: pos.loadDataPosSession
8235
+ mutationFn: env.isSupaMode ? pos.loadDataPosSessionSupabase : pos.loadDataPosSession
8736
8236
  });
8737
8237
  };
8738
8238
  var use_load_data_pos_session_default = useLoadDataPosSession;
@@ -8817,21 +8317,11 @@ var useUpdateOrderStatus = () => {
8817
8317
  };
8818
8318
  var use_update_order_status_default = useUpdateOrderStatus;
8819
8319
 
8820
- // src/hooks/pos/use-init-snapshot.ts
8821
- import { useMutation as useMutation86 } from "@tanstack/react-query";
8822
- var useInitSnapshot = () => {
8823
- const fileSystem = useFileSystemService();
8824
- return useMutation86({
8825
- mutationFn: fileSystem.initSnapshot
8826
- });
8827
- };
8828
- var use_init_snapshot_default = useInitSnapshot;
8829
-
8830
8320
  // src/hooks/pos/use-complete-current-stage.ts
8831
- import { useMutation as useMutation87 } from "@tanstack/react-query";
8321
+ import { useMutation as useMutation86 } from "@tanstack/react-query";
8832
8322
  var useCompleteCurrentStage = () => {
8833
8323
  const pos = usePosService();
8834
- return useMutation87({
8324
+ return useMutation86({
8835
8325
  mutationFn: pos.completeCurrentStage
8836
8326
  });
8837
8327
  };
@@ -8910,7 +8400,6 @@ export {
8910
8400
  use_handle_close_session_default as useHandleCloseSession,
8911
8401
  use_handle_closing_detail_session_default as useHandleClosingDetailSession,
8912
8402
  use_handle_closing_session_default as useHandleClosingSession,
8913
- use_init_snapshot_default as useInitSnapshot,
8914
8403
  use_isvalid_token_default as useIsValidToken,
8915
8404
  use_load_action_default as useLoadAction,
8916
8405
  use_load_data_pos_session_default as useLoadDataPosSession,