tek-wallet 0.0.805 → 0.0.806

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.
@@ -5,6 +5,7 @@ export type EventHandler = (messageEvent: Transaction, showActivities?: ShowActi
5
5
  export type EventHandlerHookType = {
6
6
  transactionHandler: EventHandler;
7
7
  walletInfoHandler: EventHandler;
8
+ updateData: (transaction?: Transaction, showActivities?: ShowActivities) => void;
8
9
  };
9
10
  export declare const useEventHandler: () => EventHandlerHookType;
10
11
  export {};
@@ -11,9 +11,7 @@ var Formatter_1 = __importDefault(require("../components/ui/Formatter"));
11
11
  var Text_1 = __importDefault(require("../components/ui/Text"));
12
12
  var useWallet_1 = __importDefault(require("./useWallet"));
13
13
  var useEventHandler = function () {
14
- var _a = (0, useWallet_1.default)(), updateLockToken = _a.updateLockToken, updateReceiveExternalToken = _a.updateReceiveExternalToken, updateReceiveInternalToken = _a.updateReceiveInternalToken, updateSendInternalToken = _a.updateSendInternalToken, updateSwapTokens = _a.updateSwapTokens, updateWalletDetail = _a.updateWalletDetail, updateWithdrawToken = _a.updateWithdrawToken, updateLockedToken = _a.updateLockedToken,
15
- // updateActivities,
16
- insertActivities = _a.insertActivities;
14
+ var _a = (0, useWallet_1.default)(), updateLockToken = _a.updateLockToken, updateReceiveExternalToken = _a.updateReceiveExternalToken, updateReceiveInternalToken = _a.updateReceiveInternalToken, updateSendInternalToken = _a.updateSendInternalToken, updateSwapTokens = _a.updateSwapTokens, updateWalletDetail = _a.updateWalletDetail, updateWithdrawToken = _a.updateWithdrawToken, updateLockedToken = _a.updateLockedToken, insertActivities = _a.insertActivities, refreshAllActivities = _a.refreshAllActivities;
17
15
  var updateData = (0, react_1.useCallback)(function (transaction, showActivities) {
18
16
  updateWithdrawToken();
19
17
  updateSendInternalToken();
@@ -24,8 +22,12 @@ var useEventHandler = function () {
24
22
  updateLockedToken();
25
23
  showActivities === null || showActivities === void 0 ? void 0 : showActivities();
26
24
  updateWalletDetail();
27
- // updateActivities();
28
- insertActivities(transaction);
25
+ if (transaction) {
26
+ insertActivities(transaction);
27
+ }
28
+ else {
29
+ refreshAllActivities();
30
+ }
29
31
  }, [
30
32
  updateWalletDetail,
31
33
  updateWithdrawToken,
@@ -35,8 +37,8 @@ var useEventHandler = function () {
35
37
  updateSwapTokens,
36
38
  updateLockToken,
37
39
  updateLockedToken,
38
- // updateActivities,
39
40
  insertActivities,
41
+ refreshAllActivities,
40
42
  ]);
41
43
  var transactionHandler = function (messageEvent, showActivities) {
42
44
  var _a, _b, _c;
@@ -83,6 +85,6 @@ var useEventHandler = function () {
83
85
  return undefined;
84
86
  updateData(messageEvent);
85
87
  };
86
- return { transactionHandler: transactionHandler, walletInfoHandler: walletInfoHandler };
88
+ return { transactionHandler: transactionHandler, walletInfoHandler: walletInfoHandler, updateData: updateData };
87
89
  };
88
90
  exports.useEventHandler = useEventHandler;
@@ -0,0 +1,7 @@
1
+ type Fn<T = any> = () => Promise<T> | T;
2
+ export declare function useRefetchOnFocus<T = any>(fetcher: Fn<T>, opts?: {
3
+ minIntervalMs?: number;
4
+ onError?: (e: unknown) => void;
5
+ enabled?: boolean;
6
+ }): void;
7
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ // useRefetchOnFocus.ts
3
+ "use client";
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ var __generator = (this && this.__generator) || function (thisArg, body) {
14
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
15
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
16
+ function verb(n) { return function (v) { return step([n, v]); }; }
17
+ function step(op) {
18
+ if (f) throw new TypeError("Generator is already executing.");
19
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
20
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
21
+ if (y = 0, t) op = [op[0] & 2, t.value];
22
+ switch (op[0]) {
23
+ case 0: case 1: t = op; break;
24
+ case 4: _.label++; return { value: op[1], done: false };
25
+ case 5: _.label++; y = op[1]; op = [0]; continue;
26
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
27
+ default:
28
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
29
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
30
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
31
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
32
+ if (t[2]) _.ops.pop();
33
+ _.trys.pop(); continue;
34
+ }
35
+ op = body.call(thisArg, _);
36
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
37
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
38
+ }
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.useRefetchOnFocus = useRefetchOnFocus;
42
+ var react_1 = require("react");
43
+ function useRefetchOnFocus(fetcher, opts) {
44
+ var _this = this;
45
+ var _a = opts || {}, _b = _a.minIntervalMs, minIntervalMs = _b === void 0 ? 1500 : _b, onError = _a.onError, _c = _a.enabled, enabled = _c === void 0 ? true : _c;
46
+ var lastRunRef = (0, react_1.useRef)(0);
47
+ var inFlightRef = (0, react_1.useRef)(false);
48
+ var abortRef = (0, react_1.useRef)(null);
49
+ // Sử dụng useCallback để tránh re-render không cần thiết
50
+ var tryRefetch = (0, react_1.useCallback)(function () { return __awaiter(_this, void 0, void 0, function () {
51
+ var now, e_1;
52
+ var _a;
53
+ return __generator(this, function (_b) {
54
+ switch (_b.label) {
55
+ case 0:
56
+ now = Date.now();
57
+ // Kiểm tra điều kiện refetch
58
+ if (document.hidden) {
59
+ console.warn("📱 Document is hidden, skipping refetch");
60
+ return [2 /*return*/];
61
+ }
62
+ if (inFlightRef.current) {
63
+ console.warn("⏳ Request in flight, skipping");
64
+ return [2 /*return*/];
65
+ }
66
+ if (now - lastRunRef.current < minIntervalMs) {
67
+ console.warn("🕒 Too soon since last fetch, skipping");
68
+ return [2 /*return*/];
69
+ }
70
+ inFlightRef.current = true;
71
+ lastRunRef.current = now;
72
+ // Hủy request cũ (nếu có)
73
+ if (abortRef.current) {
74
+ console.warn("🚫 Aborting previous request");
75
+ abortRef.current.abort();
76
+ }
77
+ abortRef.current = new AbortController();
78
+ _b.label = 1;
79
+ case 1:
80
+ _b.trys.push([1, 3, 4, 5]);
81
+ console.warn("🔄 Refetching data...");
82
+ return [4 /*yield*/, fetcher()];
83
+ case 2:
84
+ _b.sent();
85
+ console.warn("✅ Refetch completed");
86
+ return [3 /*break*/, 5];
87
+ case 3:
88
+ e_1 = _b.sent();
89
+ // Chỉ xử lý lỗi nếu không phải do abort
90
+ if (!((_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.signal.aborted)) {
91
+ console.error("❌ Refetch error:", e_1);
92
+ onError === null || onError === void 0 ? void 0 : onError(e_1);
93
+ }
94
+ else {
95
+ console.warn("🛑 Request was aborted");
96
+ }
97
+ return [3 /*break*/, 5];
98
+ case 4:
99
+ inFlightRef.current = false;
100
+ return [7 /*endfinally*/];
101
+ case 5: return [2 /*return*/];
102
+ }
103
+ });
104
+ }); }, [minIntervalMs, fetcher, onError]);
105
+ (0, react_1.useEffect)(function () {
106
+ if (!enabled) {
107
+ console.warn("🔌 useRefetchOnFocus is disabled");
108
+ return;
109
+ }
110
+ console.warn("🎯 Setting up visibility and focus listeners");
111
+ var handleVisibilityChange = function () {
112
+ console.warn("👀 Visibility changed - hidden:", document.hidden, "state:", document.visibilityState);
113
+ // Refetch khi tab trở thành visible
114
+ if (document.visibilityState === "visible") {
115
+ console.warn("🔄 Tab became visible, triggering refetch");
116
+ tryRefetch();
117
+ }
118
+ };
119
+ var handleFocus = function () {
120
+ console.warn("🎯 Window focused, triggering refetch");
121
+ tryRefetch();
122
+ };
123
+ // Đăng ký event listeners
124
+ document.addEventListener("visibilitychange", handleVisibilityChange);
125
+ window.addEventListener("focus", handleFocus);
126
+ // Cleanup function - QUAN TRỌNG: bỏ comment và sửa lại
127
+ return function () {
128
+ console.warn("🧹 Cleaning up event listeners");
129
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
130
+ window.removeEventListener("focus", handleFocus);
131
+ // Hủy request đang chạy khi unmount
132
+ if (abortRef.current) {
133
+ abortRef.current.abort();
134
+ }
135
+ };
136
+ }, [enabled, tryRefetch]); // Thêm tryRefetch vào dependencies
137
+ // Debug: log khi hook được mount/unmount
138
+ (0, react_1.useEffect)(function () {
139
+ console.warn("🔌 useRefetchOnFocus mounted with enabled:", enabled);
140
+ return function () {
141
+ console.warn("🔌 useRefetchOnFocus unmounted");
142
+ };
143
+ }, [enabled]);
144
+ }
@@ -116,6 +116,9 @@ exports.initialActivities = {
116
116
  refreshActivities: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
117
117
  return [2 /*return*/];
118
118
  }); }); },
119
+ refreshAllActivities: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
120
+ return [2 /*return*/];
121
+ }); }); },
119
122
  };
120
123
  exports.ActivitiesContext = react_1.default.createContext(exports.initialActivities);
121
124
  function ActivitiesProvider(_a) {
@@ -315,6 +318,30 @@ function ActivitiesProvider(_a) {
315
318
  }
316
319
  });
317
320
  }); }, [isInitPasscode, activities]);
321
+ var refreshAllActivities = (0, react_1.useCallback)(function () { return __awaiter(_this, void 0, void 0, function () {
322
+ var allTypeSlugs, _i, allTypeSlugs_1, slug;
323
+ return __generator(this, function (_a) {
324
+ switch (_a.label) {
325
+ case 0:
326
+ allTypeSlugs = activityTypes === null || activityTypes === void 0 ? void 0 : activityTypes.map(function (type) { return type.slug; });
327
+ if (!allTypeSlugs)
328
+ return [2 /*return*/];
329
+ _i = 0, allTypeSlugs_1 = allTypeSlugs;
330
+ _a.label = 1;
331
+ case 1:
332
+ if (!(_i < allTypeSlugs_1.length)) return [3 /*break*/, 4];
333
+ slug = allTypeSlugs_1[_i];
334
+ return [4 /*yield*/, refreshActivities(slug)];
335
+ case 2:
336
+ _a.sent();
337
+ _a.label = 3;
338
+ case 3:
339
+ _i++;
340
+ return [3 /*break*/, 1];
341
+ case 4: return [2 /*return*/];
342
+ }
343
+ });
344
+ }); }, [activityTypes, refreshActivities]);
318
345
  (0, react_1.useEffect)(function () {
319
346
  if (!isInitPasscode)
320
347
  return;
@@ -330,6 +357,7 @@ function ActivitiesProvider(_a) {
330
357
  loadActivities: loadActivities,
331
358
  refreshActivities: refreshActivities,
332
359
  insertActivities: insertActivities,
360
+ refreshAllActivities: refreshAllActivities,
333
361
  }, children: children }));
334
362
  }
335
363
  exports.default = ActivitiesProvider;
@@ -9,6 +9,7 @@ export interface ActivitiesProviderDataType {
9
9
  loadOutActivityType: Partial<Record<TransactionSlug, boolean>>;
10
10
  insertActivities: (activity: Transaction) => void;
11
11
  refreshActivities: (slug: TransactionSlug) => Promise<void>;
12
+ refreshAllActivities: () => Promise<void>;
12
13
  }
13
14
  export type Activities = Partial<Record<TransactionSlug, Transaction[]>>;
14
15
  export interface ActivityTypes extends TransactionType {
@@ -24,8 +24,9 @@ var TekWalletProvider_1 = require("../TekWalletProvider");
24
24
  var useCustomRouter_1 = __importDefault(require("../../hooks/useCustomRouter"));
25
25
  var type_1 = require("../../services/axios/get-activities-service/type");
26
26
  var components_1 = require("../../components");
27
+ var useRefetchOnWindowFocused_1 = require("../../hooks/useRefetchOnWindowFocused");
27
28
  function EventHandlerProvider(props) {
28
- var _a = (0, useEventHandler_1.useEventHandler)(), transactionHandler = _a.transactionHandler, walletInfoHandler = _a.walletInfoHandler;
29
+ var _a = (0, useEventHandler_1.useEventHandler)(), transactionHandler = _a.transactionHandler, walletInfoHandler = _a.walletInfoHandler, updateData = _a.updateData;
29
30
  var _b = (0, useRealtime_1.default)(), pushNotification = _b.pushNotification, transaction = _b.transaction, walletHandlerInfo = _b.walletHandlerInfo;
30
31
  var router = (0, useCustomRouter_1.default)();
31
32
  var options = (0, TekWalletProvider_1.useWalletSetup)().options;
@@ -52,6 +53,15 @@ function EventHandlerProvider(props) {
52
53
  (0, react_1.useEffect)(function () {
53
54
  walletInfoHandler === null || walletInfoHandler === void 0 ? void 0 : walletInfoHandler(walletHandlerInfo);
54
55
  }, [walletHandlerInfo]);
56
+ (0, useRefetchOnWindowFocused_1.useRefetchOnFocus)(function () {
57
+ updateData();
58
+ }, {
59
+ minIntervalMs: 1500,
60
+ onError: function (error) {
61
+ console.error("🚀 ~ useEffect ~ error:", error);
62
+ },
63
+ enabled: true,
64
+ });
55
65
  return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: props.children });
56
66
  }
57
67
  exports.default = EventHandlerProvider;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tek-wallet",
3
- "version": "0.0.805",
3
+ "version": "0.0.806",
4
4
  "description": "A custom React provider with TypeScript support",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",