@grupalia/rn-ui-kit 1.4.0 → 1.5.0
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/lib/commonjs/UIKitProvider.js +4 -0
- package/lib/commonjs/UIKitProvider.js.map +1 -1
- package/lib/commonjs/clock.js +146 -0
- package/lib/commonjs/clock.js.map +1 -0
- package/lib/commonjs/hooks/useTimezonedDate.js +5 -2
- package/lib/commonjs/hooks/useTimezonedDate.js.map +1 -1
- package/lib/commonjs/index.js +12 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/timeConstants.js +2 -1
- package/lib/commonjs/utils/timeConstants.js.map +1 -1
- package/lib/module/UIKitProvider.js +5 -1
- package/lib/module/UIKitProvider.js.map +1 -1
- package/lib/module/clock.js +135 -0
- package/lib/module/clock.js.map +1 -0
- package/lib/module/hooks/useTimezonedDate.js +5 -2
- package/lib/module/hooks/useTimezonedDate.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/timeConstants.js +2 -1
- package/lib/module/utils/timeConstants.js.map +1 -1
- package/lib/typescript/commonjs/UIKitProvider.d.ts +2 -0
- package/lib/typescript/commonjs/UIKitProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/__tests__/clock.test.d.ts +2 -0
- package/lib/typescript/commonjs/__tests__/clock.test.d.ts.map +1 -0
- package/lib/typescript/commonjs/clock.d.ts +59 -0
- package/lib/typescript/commonjs/clock.d.ts.map +1 -0
- package/lib/typescript/commonjs/hooks/useTimezonedDate.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/timeConstants.d.ts +2 -1
- package/lib/typescript/commonjs/utils/timeConstants.d.ts.map +1 -1
- package/lib/typescript/module/UIKitProvider.d.ts +2 -0
- package/lib/typescript/module/UIKitProvider.d.ts.map +1 -1
- package/lib/typescript/module/__tests__/clock.test.d.ts +2 -0
- package/lib/typescript/module/__tests__/clock.test.d.ts.map +1 -0
- package/lib/typescript/module/clock.d.ts +59 -0
- package/lib/typescript/module/clock.d.ts.map +1 -0
- package/lib/typescript/module/hooks/useTimezonedDate.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/utils/timeConstants.d.ts +2 -1
- package/lib/typescript/module/utils/timeConstants.d.ts.map +1 -1
- package/package.json +5 -3
|
@@ -7,6 +7,7 @@ exports.UIKitProvider = UIKitProvider;
|
|
|
7
7
|
exports.useTimezone = useTimezone;
|
|
8
8
|
exports.useUIKitConfig = useUIKitConfig;
|
|
9
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _clock = require("./clock");
|
|
10
11
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
11
12
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
12
13
|
const UIKitContext = /*#__PURE__*/(0, _react.createContext)({
|
|
@@ -23,6 +24,9 @@ function UIKitProvider({
|
|
|
23
24
|
const contextValue = _react.default.useMemo(() => ({
|
|
24
25
|
config
|
|
25
26
|
}), [config]);
|
|
27
|
+
(0, _react.useEffect)(() => {
|
|
28
|
+
(0, _clock.setClockConfig)(config.clock);
|
|
29
|
+
}, [config.clock]);
|
|
26
30
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(UIKitContext.Provider, {
|
|
27
31
|
value: contextValue,
|
|
28
32
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","UIKitContext","createContext","config","internetConnection","undefined","appVersionCheck","timezone","UIKitProvider","children","contextValue","React","useMemo","jsx","Provider","value","useUIKitConfig","context","useContext","Error","useTimezone"],"sourceRoot":"../../src","sources":["UIKitProvider.tsx"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_clock","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","UIKitContext","createContext","config","internetConnection","undefined","appVersionCheck","timezone","UIKitProvider","children","contextValue","React","useMemo","useEffect","setClockConfig","clock","jsx","Provider","value","useUIKitConfig","context","useContext","Error","useTimezone"],"sourceRoot":"../../src","sources":["UIKitProvider.tsx"],"mappings":";;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAIA,IAAAC,MAAA,GAAAD,OAAA;AAAsD,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAetD,MAAMkB,YAAY,gBAAG,IAAAC,oBAAa,EAAmB;EACnDC,MAAM,EAAE;IACNC,kBAAkB,EAAEC,SAAS;IAC7BC,eAAe,EAAED,SAAS;IAC1BE,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC;AAOK,SAASC,aAAaA,CAAC;EAAEC,QAAQ;EAAEN;AAA2B,CAAC,EAAE;EACtE,MAAMO,YAAY,GAAGC,cAAK,CAACC,OAAO,CAAC,OAAO;IAAET;EAAO,CAAC,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEhE,IAAAU,gBAAS,EAAC,MAAM;IACd,IAAAC,qBAAc,EAACX,MAAM,CAACY,KAAK,CAAC;EAC9B,CAAC,EAAE,CAACZ,MAAM,CAACY,KAAK,CAAC,CAAC;EAElB,oBACE,IAAAlC,WAAA,CAAAmC,GAAA,EAACf,YAAY,CAACgB,QAAQ;IAACC,KAAK,EAAER,YAAa;IAAAD,QAAA,EACxCA;EAAQ,CACY,CAAC;AAE5B;AAEO,SAASU,cAAcA,CAAA,EAAgB;EAC5C,MAAMC,OAAO,GAAG,IAAAC,iBAAU,EAACpB,YAAY,CAAC;EACxC,IAAI,CAACmB,OAAO,EAAE;IACZ,MAAM,IAAIE,KAAK,CAAC,oDAAoD,CAAC;EACvE;EACA,OAAOF,OAAO,CAACjB,MAAM;AACvB;AAEO,SAASoB,WAAWA,CAAA,EAAW;EACpC,MAAMpB,MAAM,GAAGgB,cAAc,CAAC,CAAC;EAE/B,OAAOhB,MAAM,CAACI,QAAQ;AACxB","ignoreList":[]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.driftBucket = driftBucket;
|
|
7
|
+
exports.getClockOffsetMs = getClockOffsetMs;
|
|
8
|
+
exports.pruneDriftSamples = pruneDriftSamples;
|
|
9
|
+
exports.recordDriftSample = recordDriftSample;
|
|
10
|
+
exports.resetClockStateForTesting = resetClockStateForTesting;
|
|
11
|
+
exports.selectDriftEstimate = selectDriftEstimate;
|
|
12
|
+
exports.serverNow = serverNow;
|
|
13
|
+
exports.setClockConfig = setClockConfig;
|
|
14
|
+
exports.useClockStore = void 0;
|
|
15
|
+
var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
|
|
16
|
+
var _zustand = require("zustand");
|
|
17
|
+
var _middleware = require("zustand/middleware");
|
|
18
|
+
var _log = _interopRequireDefault(require("./utils/log"));
|
|
19
|
+
var _timeConstants = require("./utils/timeConstants");
|
|
20
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
21
|
+
/**
|
|
22
|
+
*
|
|
23
|
+
* Some devices have a wrong UTC epoch even when the displayed clock looks right (manual clock
|
|
24
|
+
* set under a wrong GMT offset). The consumer app's response interceptor feeds
|
|
25
|
+
* `recordDriftSample` with the server time of every response; `getClockOffsetMs`/`serverNow`
|
|
26
|
+
* expose the corrected "now". Both are plain functions so they work outside React
|
|
27
|
+
* (interceptors, linking config).
|
|
28
|
+
*
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const MAX_RTT_MS = 5 * _timeConstants.MS_IN_A_SECOND;
|
|
32
|
+
const NOISE_FLOOR_MS = 2 * _timeConstants.MS_IN_A_SECOND;
|
|
33
|
+
const SAMPLE_WINDOW_MS = 5 * _timeConstants.MS_IN_A_MINUTE;
|
|
34
|
+
const APPLY_THRESHOLD_MS = 30 * _timeConstants.MS_IN_A_SECOND;
|
|
35
|
+
const MAX_PLAUSIBLE_OFFSET_MS = 12 * _timeConstants.MS_IN_A_HOUR;
|
|
36
|
+
const STALE_AFTER_MS = 7 * _timeConstants.MS_IN_A_DAY;
|
|
37
|
+
const FRESHNESS_WRITE_INTERVAL_MS = _timeConstants.MS_IN_A_HOUR;
|
|
38
|
+
const useClockStore = exports.useClockStore = (0, _zustand.create)()((0, _middleware.persist)(set => ({
|
|
39
|
+
offsetMs: 0,
|
|
40
|
+
measuredAtMs: 0,
|
|
41
|
+
setOffset: (offsetMs, measuredAtMs) => set({
|
|
42
|
+
offsetMs,
|
|
43
|
+
measuredAtMs
|
|
44
|
+
})
|
|
45
|
+
}), {
|
|
46
|
+
name: 'clock-store',
|
|
47
|
+
storage: (0, _middleware.createJSONStorage)(() => _asyncStorage.default)
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
// Raw samples are kept in memory only: after a restart the clock may have been changed, so
|
|
51
|
+
// samples from a previous session are not trustworthy.
|
|
52
|
+
let samples = [];
|
|
53
|
+
let clockConfig;
|
|
54
|
+
let hasReportedImplausibleSample = false;
|
|
55
|
+
|
|
56
|
+
/** Wired by UIKitProvider; not part of the public API. */
|
|
57
|
+
function setClockConfig(config) {
|
|
58
|
+
clockConfig = config;
|
|
59
|
+
}
|
|
60
|
+
function driftBucket(offsetMs) {
|
|
61
|
+
const absOffsetMs = Math.abs(offsetMs);
|
|
62
|
+
if (absOffsetMs < NOISE_FLOOR_MS) return 'none';
|
|
63
|
+
if (absOffsetMs < APPLY_THRESHOLD_MS) return '<30s';
|
|
64
|
+
if (absOffsetMs < 5 * _timeConstants.MS_IN_A_MINUTE) return '30s-5m';
|
|
65
|
+
if (absOffsetMs < _timeConstants.MINUTES_IN_A_HOUR * _timeConstants.MS_IN_A_MINUTE) return '5m-1h';
|
|
66
|
+
return '>1h';
|
|
67
|
+
}
|
|
68
|
+
function pruneDriftSamples(driftSamples, nowMs) {
|
|
69
|
+
return driftSamples.filter(sample => {
|
|
70
|
+
const ageMs = nowMs - sample.atMs;
|
|
71
|
+
return ageMs >= 0 && ageMs < SAMPLE_WINDOW_MS;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The lowest-RTT sample in the window carries the least network-asymmetry error, so it wins.
|
|
77
|
+
* Offsets below the noise floor are reported as 0.
|
|
78
|
+
*/
|
|
79
|
+
function selectDriftEstimate(driftSamples) {
|
|
80
|
+
if (driftSamples.length === 0) return null;
|
|
81
|
+
const best = driftSamples.reduce((a, b) => b.rttMs < a.rttMs ? b : a);
|
|
82
|
+
return {
|
|
83
|
+
...best,
|
|
84
|
+
offsetMs: Math.abs(best.offsetMs) < NOISE_FLOOR_MS ? 0 : best.offsetMs
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function recordDriftSample(rawOffsetMs, rttMs) {
|
|
88
|
+
// A slow round trip makes the travel-time compensation too uncertain to be a useful sample,
|
|
89
|
+
// and a negative one means the clock was changed while the request was in flight.
|
|
90
|
+
if (rttMs < 0 || rttMs > MAX_RTT_MS) return;
|
|
91
|
+
const atMs = Date.now();
|
|
92
|
+
const offsetMs = Math.round(rawOffsetMs / _timeConstants.MS_IN_A_SECOND) * _timeConstants.MS_IN_A_SECOND;
|
|
93
|
+
if (Math.abs(offsetMs) > MAX_PLAUSIBLE_OFFSET_MS) {
|
|
94
|
+
if (!hasReportedImplausibleSample) {
|
|
95
|
+
hasReportedImplausibleSample = true;
|
|
96
|
+
(0, _log.default)('clock', `discarded implausible drift sample: ${offsetMs}ms`);
|
|
97
|
+
clockConfig?.onImplausibleSample?.(offsetMs);
|
|
98
|
+
}
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
samples = [...pruneDriftSamples(samples, atMs), {
|
|
102
|
+
offsetMs,
|
|
103
|
+
rttMs,
|
|
104
|
+
atMs
|
|
105
|
+
}];
|
|
106
|
+
const estimate = selectDriftEstimate(samples);
|
|
107
|
+
if (!estimate) return;
|
|
108
|
+
const {
|
|
109
|
+
offsetMs: storedOffsetMs,
|
|
110
|
+
measuredAtMs
|
|
111
|
+
} = useClockStore.getState();
|
|
112
|
+
const estimateChanged = estimate.offsetMs !== storedOffsetMs;
|
|
113
|
+
const freshnessExpired = atMs - measuredAtMs > FRESHNESS_WRITE_INTERVAL_MS;
|
|
114
|
+
if (estimateChanged || freshnessExpired) {
|
|
115
|
+
useClockStore.getState().setOffset(estimate.offsetMs, atMs);
|
|
116
|
+
}
|
|
117
|
+
if (driftBucket(estimate.offsetMs) !== driftBucket(storedOffsetMs)) {
|
|
118
|
+
(0, _log.default)('clock', `drift estimate is now ${estimate.offsetMs}ms (${driftBucket(estimate.offsetMs)})`);
|
|
119
|
+
clockConfig?.onDriftEstimateChange?.(estimate.offsetMs, estimate.rttMs);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function getClockOffsetMs() {
|
|
123
|
+
if (clockConfig?.applyCorrection === false) return 0;
|
|
124
|
+
const {
|
|
125
|
+
offsetMs,
|
|
126
|
+
measuredAtMs
|
|
127
|
+
} = useClockStore.getState();
|
|
128
|
+
if (Math.abs(offsetMs) < APPLY_THRESHOLD_MS) return 0;
|
|
129
|
+
if (Date.now() - measuredAtMs > STALE_AFTER_MS) return 0;
|
|
130
|
+
return offsetMs;
|
|
131
|
+
}
|
|
132
|
+
function serverNow() {
|
|
133
|
+
return new Date(Date.now() + getClockOffsetMs());
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Test helper: clears module state that would otherwise leak between examples. */
|
|
137
|
+
function resetClockStateForTesting() {
|
|
138
|
+
samples = [];
|
|
139
|
+
clockConfig = undefined;
|
|
140
|
+
hasReportedImplausibleSample = false;
|
|
141
|
+
useClockStore.setState({
|
|
142
|
+
offsetMs: 0,
|
|
143
|
+
measuredAtMs: 0
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_asyncStorage","_interopRequireDefault","require","_zustand","_middleware","_log","_timeConstants","e","__esModule","default","MAX_RTT_MS","MS_IN_A_SECOND","NOISE_FLOOR_MS","SAMPLE_WINDOW_MS","MS_IN_A_MINUTE","APPLY_THRESHOLD_MS","MAX_PLAUSIBLE_OFFSET_MS","MS_IN_A_HOUR","STALE_AFTER_MS","MS_IN_A_DAY","FRESHNESS_WRITE_INTERVAL_MS","useClockStore","exports","create","persist","set","offsetMs","measuredAtMs","setOffset","name","storage","createJSONStorage","AsyncStorage","samples","clockConfig","hasReportedImplausibleSample","setClockConfig","config","driftBucket","absOffsetMs","Math","abs","MINUTES_IN_A_HOUR","pruneDriftSamples","driftSamples","nowMs","filter","sample","ageMs","atMs","selectDriftEstimate","length","best","reduce","a","b","rttMs","recordDriftSample","rawOffsetMs","Date","now","round","log","onImplausibleSample","estimate","storedOffsetMs","getState","estimateChanged","freshnessExpired","onDriftEstimateChange","getClockOffsetMs","applyCorrection","serverNow","resetClockStateForTesting","undefined","setState"],"sourceRoot":"../../src","sources":["clock.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useTimezonedDate = useTimezonedDate;
|
|
7
7
|
var _tz = require("@date-fns/tz");
|
|
8
8
|
var _react = require("react");
|
|
9
|
+
var _clock = require("../clock");
|
|
9
10
|
var _UIKitProvider = require("../UIKitProvider");
|
|
10
11
|
var _log = _interopRequireDefault(require("../utils/log"));
|
|
11
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -111,9 +112,11 @@ function useTimezonedDate() {
|
|
|
111
112
|
* @returns TZDate instance that works with all date-fns functions
|
|
112
113
|
*/
|
|
113
114
|
const tz = (0, _react.useCallback)(date => {
|
|
114
|
-
// Use appropriate timezone - real name if device is correct, generic offset if corrupted
|
|
115
|
+
// Use appropriate timezone - real name if device is correct, generic offset if corrupted.
|
|
116
|
+
// "Now" gets the measured server-clock offset applied (a no-op unless the app opted into
|
|
117
|
+
// clock.applyCorrection); explicit dates are data and are never shifted.
|
|
115
118
|
if (date === undefined) {
|
|
116
|
-
return _tz.TZDate.tz(appropriateTimezone);
|
|
119
|
+
return _tz.TZDate.tz(appropriateTimezone, new Date(Date.now() + (0, _clock.getClockOffsetMs)()));
|
|
117
120
|
}
|
|
118
121
|
if (date instanceof Date) {
|
|
119
122
|
return _tz.TZDate.tz(appropriateTimezone, date);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_tz","require","_react","_UIKitProvider","_log","_interopRequireDefault","e","__esModule","default","TIMEZONE_OFFSET_MAP","offsetToGenericTimezone","offset","offsetInMinutes","Math","abs","hourNum","floor","isWestOfGreenwich","etcSign","isDeviceTimezoneMappingCorrect","timezoneName","expectedOffsetInMinutes","deviceTestDate","TZDate","tz","deviceOffsetInMinutes","getTimezoneOffset","undefined","getAppropriateTimezone","log","useTimezonedDate","timezone","useTimezone","appropriateTimezone","useMemo","useCallback","date","Date","fromWallClock","fields","year","month","day","hour","minute","second","millisecond","fromDateString","split","Number"],"sourceRoot":"../../../src","sources":["hooks/useTimezonedDate.ts"],"mappings":";;;;;;AAAA,IAAAA,GAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,
|
|
1
|
+
{"version":3,"names":["_tz","require","_react","_clock","_UIKitProvider","_log","_interopRequireDefault","e","__esModule","default","TIMEZONE_OFFSET_MAP","offsetToGenericTimezone","offset","offsetInMinutes","Math","abs","hourNum","floor","isWestOfGreenwich","etcSign","isDeviceTimezoneMappingCorrect","timezoneName","expectedOffsetInMinutes","deviceTestDate","TZDate","tz","deviceOffsetInMinutes","getTimezoneOffset","undefined","getAppropriateTimezone","log","useTimezonedDate","timezone","useTimezone","appropriateTimezone","useMemo","useCallback","date","Date","now","getClockOffsetMs","fromWallClock","fields","year","month","day","hour","minute","second","millisecond","fromDateString","split","Number"],"sourceRoot":"../../../src","sources":["hooks/useTimezonedDate.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -57,6 +57,18 @@ var _backgroundColors = _interopRequireDefault(require("./styles/background-colo
|
|
|
57
57
|
var _foregroundColors = _interopRequireDefault(require("./styles/foreground-colors"));
|
|
58
58
|
var _utilityColors = _interopRequireDefault(require("./styles/utility-colors"));
|
|
59
59
|
var _colors = _interopRequireDefault(require("./styles/colors"));
|
|
60
|
+
var _clock = require("./clock");
|
|
61
|
+
Object.keys(_clock).forEach(function (key) {
|
|
62
|
+
if (key === "default" || key === "__esModule") return;
|
|
63
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
64
|
+
if (key in exports && exports[key] === _clock[key]) return;
|
|
65
|
+
Object.defineProperty(exports, key, {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
get: function () {
|
|
68
|
+
return _clock[key];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
60
72
|
var _hooks = require("./hooks");
|
|
61
73
|
Object.keys(_hooks).forEach(function (key) {
|
|
62
74
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_components","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_preset","_interopRequireDefault","_backgroundColors","_foregroundColors","_utilityColors","_colors","_hooks","_UIKitProvider","_utils","_types","_jobRun","_createQueryKeys","_createResourceApi","_queriesFor","_line","e","__esModule","default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,WAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,WAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAb,WAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAC,sBAAA,CAAAd,OAAA;AACA,IAAAe,iBAAA,GAAAD,sBAAA,CAAAd,OAAA;AACA,IAAAgB,iBAAA,GAAAF,sBAAA,CAAAd,OAAA;AACA,IAAAiB,cAAA,GAAAH,sBAAA,CAAAd,OAAA;AACA,IAAAkB,OAAA,GAAAJ,sBAAA,CAAAd,OAAA;AACA,IAAAmB,MAAA,GAAAnB,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAiB,MAAA,EAAAhB,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAe,MAAA,CAAAf,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAO,MAAA,CAAAf,GAAA;IAAA;EAAA;AAAA;AACA,IAAAgB,
|
|
1
|
+
{"version":3,"names":["_components","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_preset","_interopRequireDefault","_backgroundColors","_foregroundColors","_utilityColors","_colors","_clock","_hooks","_UIKitProvider","_utils","_types","_jobRun","_createQueryKeys","_createResourceApi","_queriesFor","_line","e","__esModule","default"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.SECONDS_IN_A_MINUTE = exports.MS_IN_A_WEEK = exports.MS_IN_A_SECOND = exports.MS_IN_A_MINUTE = exports.MS_IN_A_DAY = exports.MINUTES_IN_A_HOUR = exports.HOURS_IN_A_DAY = exports.DAYS_IN_A_WEEK = void 0;
|
|
6
|
+
exports.SECONDS_IN_A_MINUTE = exports.MS_IN_A_WEEK = exports.MS_IN_A_SECOND = exports.MS_IN_A_MINUTE = exports.MS_IN_A_HOUR = exports.MS_IN_A_DAY = exports.MINUTES_IN_A_HOUR = exports.HOURS_IN_A_DAY = exports.DAYS_IN_A_WEEK = void 0;
|
|
7
7
|
const MS_IN_A_SECOND = exports.MS_IN_A_SECOND = 1_000;
|
|
8
8
|
const HOURS_IN_A_DAY = exports.HOURS_IN_A_DAY = 24;
|
|
9
9
|
const MINUTES_IN_A_HOUR = exports.MINUTES_IN_A_HOUR = 60;
|
|
@@ -11,5 +11,6 @@ const SECONDS_IN_A_MINUTE = exports.SECONDS_IN_A_MINUTE = 60;
|
|
|
11
11
|
const DAYS_IN_A_WEEK = exports.DAYS_IN_A_WEEK = 7;
|
|
12
12
|
const MS_IN_A_DAY = exports.MS_IN_A_DAY = MS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_A_HOUR * HOURS_IN_A_DAY;
|
|
13
13
|
const MS_IN_A_MINUTE = exports.MS_IN_A_MINUTE = MS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
|
|
14
|
+
const MS_IN_A_HOUR = exports.MS_IN_A_HOUR = MS_IN_A_MINUTE * MINUTES_IN_A_HOUR;
|
|
14
15
|
const MS_IN_A_WEEK = exports.MS_IN_A_WEEK = MS_IN_A_DAY * DAYS_IN_A_WEEK;
|
|
15
16
|
//# sourceMappingURL=timeConstants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MS_IN_A_SECOND","exports","HOURS_IN_A_DAY","MINUTES_IN_A_HOUR","SECONDS_IN_A_MINUTE","DAYS_IN_A_WEEK","MS_IN_A_DAY","MS_IN_A_MINUTE","MS_IN_A_WEEK"],"sourceRoot":"../../../src","sources":["utils/timeConstants.ts"],"mappings":";;;;;;AAAA,MAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG,KAAK;AAC5B,MAAME,cAAc,GAAAD,OAAA,CAAAC,cAAA,GAAG,EAAE;AACzB,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAG,EAAE;AAC5B,MAAMC,mBAAmB,GAAAH,OAAA,CAAAG,mBAAA,GAAG,EAAE;AAC9B,MAAMC,cAAc,GAAAJ,OAAA,CAAAI,cAAA,GAAG,CAAC;AACxB,MAAMC,WAAW,GAAAL,OAAA,CAAAK,WAAA,GAAGN,cAAc,GAAGI,mBAAmB,GAAGD,iBAAiB,GAAGD,cAAc;AAC7F,MAAMK,cAAc,GAAAN,OAAA,CAAAM,cAAA,GAAGP,cAAc,GAAGI,mBAAmB;AAC3D,MAAMI,YAAY,GAAAP,OAAA,CAAAO,YAAA,
|
|
1
|
+
{"version":3,"names":["MS_IN_A_SECOND","exports","HOURS_IN_A_DAY","MINUTES_IN_A_HOUR","SECONDS_IN_A_MINUTE","DAYS_IN_A_WEEK","MS_IN_A_DAY","MS_IN_A_MINUTE","MS_IN_A_HOUR","MS_IN_A_WEEK"],"sourceRoot":"../../../src","sources":["utils/timeConstants.ts"],"mappings":";;;;;;AAAA,MAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG,KAAK;AAC5B,MAAME,cAAc,GAAAD,OAAA,CAAAC,cAAA,GAAG,EAAE;AACzB,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAG,EAAE;AAC5B,MAAMC,mBAAmB,GAAAH,OAAA,CAAAG,mBAAA,GAAG,EAAE;AAC9B,MAAMC,cAAc,GAAAJ,OAAA,CAAAI,cAAA,GAAG,CAAC;AACxB,MAAMC,WAAW,GAAAL,OAAA,CAAAK,WAAA,GAAGN,cAAc,GAAGI,mBAAmB,GAAGD,iBAAiB,GAAGD,cAAc;AAC7F,MAAMK,cAAc,GAAAN,OAAA,CAAAM,cAAA,GAAGP,cAAc,GAAGI,mBAAmB;AAC3D,MAAMI,YAAY,GAAAP,OAAA,CAAAO,YAAA,GAAGD,cAAc,GAAGJ,iBAAiB;AACvD,MAAMM,YAAY,GAAAR,OAAA,CAAAQ,YAAA,GAAGH,WAAW,GAAGD,cAAc","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import React, { createContext, useContext } from 'react';
|
|
3
|
+
import React, { createContext, useContext, useEffect } from 'react';
|
|
4
|
+
import { setClockConfig } from "./clock.js";
|
|
4
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
6
|
const UIKitContext = /*#__PURE__*/createContext({
|
|
6
7
|
config: {
|
|
@@ -16,6 +17,9 @@ export function UIKitProvider({
|
|
|
16
17
|
const contextValue = React.useMemo(() => ({
|
|
17
18
|
config
|
|
18
19
|
}), [config]);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
setClockConfig(config.clock);
|
|
22
|
+
}, [config.clock]);
|
|
19
23
|
return /*#__PURE__*/_jsx(UIKitContext.Provider, {
|
|
20
24
|
value: contextValue,
|
|
21
25
|
children: children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","useContext","jsx","_jsx","UIKitContext","config","internetConnection","undefined","appVersionCheck","timezone","UIKitProvider","children","contextValue","useMemo","Provider","value","useUIKitConfig","context","Error","useTimezone"],"sourceRoot":"../../src","sources":["UIKitProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,
|
|
1
|
+
{"version":3,"names":["React","createContext","useContext","useEffect","setClockConfig","jsx","_jsx","UIKitContext","config","internetConnection","undefined","appVersionCheck","timezone","UIKitProvider","children","contextValue","useMemo","clock","Provider","value","useUIKitConfig","context","Error","useTimezone"],"sourceRoot":"../../src","sources":["UIKitProvider.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IACVC,aAAa,EAAEC,UAAU,EAAEC,SAAS,QAC/B,OAAO;AAEd,SAAsBC,cAAc,QAAQ,YAAS;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAetD,MAAMC,YAAY,gBAAGN,aAAa,CAAmB;EACnDO,MAAM,EAAE;IACNC,kBAAkB,EAAEC,SAAS;IAC7BC,eAAe,EAAED,SAAS;IAC1BE,QAAQ,EAAE;EACZ;AACF,CAAC,CAAC;AAOF,OAAO,SAASC,aAAaA,CAAC;EAAEC,QAAQ;EAAEN;AAA2B,CAAC,EAAE;EACtE,MAAMO,YAAY,GAAGf,KAAK,CAACgB,OAAO,CAAC,OAAO;IAAER;EAAO,CAAC,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEhEL,SAAS,CAAC,MAAM;IACdC,cAAc,CAACI,MAAM,CAACS,KAAK,CAAC;EAC9B,CAAC,EAAE,CAACT,MAAM,CAACS,KAAK,CAAC,CAAC;EAElB,oBACEX,IAAA,CAACC,YAAY,CAACW,QAAQ;IAACC,KAAK,EAAEJ,YAAa;IAAAD,QAAA,EACxCA;EAAQ,CACY,CAAC;AAE5B;AAEA,OAAO,SAASM,cAAcA,CAAA,EAAgB;EAC5C,MAAMC,OAAO,GAAGnB,UAAU,CAACK,YAAY,CAAC;EACxC,IAAI,CAACc,OAAO,EAAE;IACZ,MAAM,IAAIC,KAAK,CAAC,oDAAoD,CAAC;EACvE;EACA,OAAOD,OAAO,CAACb,MAAM;AACvB;AAEA,OAAO,SAASe,WAAWA,CAAA,EAAW;EACpC,MAAMf,MAAM,GAAGY,cAAc,CAAC,CAAC;EAE/B,OAAOZ,MAAM,CAACI,QAAQ;AACxB","ignoreList":[]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
4
|
+
import { create } from 'zustand';
|
|
5
|
+
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
6
|
+
import log from "./utils/log.js";
|
|
7
|
+
import { MINUTES_IN_A_HOUR, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_SECOND, MS_IN_A_HOUR } from "./utils/timeConstants.js";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* Some devices have a wrong UTC epoch even when the displayed clock looks right (manual clock
|
|
12
|
+
* set under a wrong GMT offset). The consumer app's response interceptor feeds
|
|
13
|
+
* `recordDriftSample` with the server time of every response; `getClockOffsetMs`/`serverNow`
|
|
14
|
+
* expose the corrected "now". Both are plain functions so they work outside React
|
|
15
|
+
* (interceptors, linking config).
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const MAX_RTT_MS = 5 * MS_IN_A_SECOND;
|
|
20
|
+
const NOISE_FLOOR_MS = 2 * MS_IN_A_SECOND;
|
|
21
|
+
const SAMPLE_WINDOW_MS = 5 * MS_IN_A_MINUTE;
|
|
22
|
+
const APPLY_THRESHOLD_MS = 30 * MS_IN_A_SECOND;
|
|
23
|
+
const MAX_PLAUSIBLE_OFFSET_MS = 12 * MS_IN_A_HOUR;
|
|
24
|
+
const STALE_AFTER_MS = 7 * MS_IN_A_DAY;
|
|
25
|
+
const FRESHNESS_WRITE_INTERVAL_MS = MS_IN_A_HOUR;
|
|
26
|
+
const useClockStore = create()(persist(set => ({
|
|
27
|
+
offsetMs: 0,
|
|
28
|
+
measuredAtMs: 0,
|
|
29
|
+
setOffset: (offsetMs, measuredAtMs) => set({
|
|
30
|
+
offsetMs,
|
|
31
|
+
measuredAtMs
|
|
32
|
+
})
|
|
33
|
+
}), {
|
|
34
|
+
name: 'clock-store',
|
|
35
|
+
storage: createJSONStorage(() => AsyncStorage)
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
// Raw samples are kept in memory only: after a restart the clock may have been changed, so
|
|
39
|
+
// samples from a previous session are not trustworthy.
|
|
40
|
+
let samples = [];
|
|
41
|
+
let clockConfig;
|
|
42
|
+
let hasReportedImplausibleSample = false;
|
|
43
|
+
|
|
44
|
+
/** Wired by UIKitProvider; not part of the public API. */
|
|
45
|
+
export function setClockConfig(config) {
|
|
46
|
+
clockConfig = config;
|
|
47
|
+
}
|
|
48
|
+
export function driftBucket(offsetMs) {
|
|
49
|
+
const absOffsetMs = Math.abs(offsetMs);
|
|
50
|
+
if (absOffsetMs < NOISE_FLOOR_MS) return 'none';
|
|
51
|
+
if (absOffsetMs < APPLY_THRESHOLD_MS) return '<30s';
|
|
52
|
+
if (absOffsetMs < 5 * MS_IN_A_MINUTE) return '30s-5m';
|
|
53
|
+
if (absOffsetMs < MINUTES_IN_A_HOUR * MS_IN_A_MINUTE) return '5m-1h';
|
|
54
|
+
return '>1h';
|
|
55
|
+
}
|
|
56
|
+
export function pruneDriftSamples(driftSamples, nowMs) {
|
|
57
|
+
return driftSamples.filter(sample => {
|
|
58
|
+
const ageMs = nowMs - sample.atMs;
|
|
59
|
+
return ageMs >= 0 && ageMs < SAMPLE_WINDOW_MS;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* The lowest-RTT sample in the window carries the least network-asymmetry error, so it wins.
|
|
65
|
+
* Offsets below the noise floor are reported as 0.
|
|
66
|
+
*/
|
|
67
|
+
export function selectDriftEstimate(driftSamples) {
|
|
68
|
+
if (driftSamples.length === 0) return null;
|
|
69
|
+
const best = driftSamples.reduce((a, b) => b.rttMs < a.rttMs ? b : a);
|
|
70
|
+
return {
|
|
71
|
+
...best,
|
|
72
|
+
offsetMs: Math.abs(best.offsetMs) < NOISE_FLOOR_MS ? 0 : best.offsetMs
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export function recordDriftSample(rawOffsetMs, rttMs) {
|
|
76
|
+
// A slow round trip makes the travel-time compensation too uncertain to be a useful sample,
|
|
77
|
+
// and a negative one means the clock was changed while the request was in flight.
|
|
78
|
+
if (rttMs < 0 || rttMs > MAX_RTT_MS) return;
|
|
79
|
+
const atMs = Date.now();
|
|
80
|
+
const offsetMs = Math.round(rawOffsetMs / MS_IN_A_SECOND) * MS_IN_A_SECOND;
|
|
81
|
+
if (Math.abs(offsetMs) > MAX_PLAUSIBLE_OFFSET_MS) {
|
|
82
|
+
if (!hasReportedImplausibleSample) {
|
|
83
|
+
hasReportedImplausibleSample = true;
|
|
84
|
+
log('clock', `discarded implausible drift sample: ${offsetMs}ms`);
|
|
85
|
+
clockConfig?.onImplausibleSample?.(offsetMs);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
samples = [...pruneDriftSamples(samples, atMs), {
|
|
90
|
+
offsetMs,
|
|
91
|
+
rttMs,
|
|
92
|
+
atMs
|
|
93
|
+
}];
|
|
94
|
+
const estimate = selectDriftEstimate(samples);
|
|
95
|
+
if (!estimate) return;
|
|
96
|
+
const {
|
|
97
|
+
offsetMs: storedOffsetMs,
|
|
98
|
+
measuredAtMs
|
|
99
|
+
} = useClockStore.getState();
|
|
100
|
+
const estimateChanged = estimate.offsetMs !== storedOffsetMs;
|
|
101
|
+
const freshnessExpired = atMs - measuredAtMs > FRESHNESS_WRITE_INTERVAL_MS;
|
|
102
|
+
if (estimateChanged || freshnessExpired) {
|
|
103
|
+
useClockStore.getState().setOffset(estimate.offsetMs, atMs);
|
|
104
|
+
}
|
|
105
|
+
if (driftBucket(estimate.offsetMs) !== driftBucket(storedOffsetMs)) {
|
|
106
|
+
log('clock', `drift estimate is now ${estimate.offsetMs}ms (${driftBucket(estimate.offsetMs)})`);
|
|
107
|
+
clockConfig?.onDriftEstimateChange?.(estimate.offsetMs, estimate.rttMs);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
export function getClockOffsetMs() {
|
|
111
|
+
if (clockConfig?.applyCorrection === false) return 0;
|
|
112
|
+
const {
|
|
113
|
+
offsetMs,
|
|
114
|
+
measuredAtMs
|
|
115
|
+
} = useClockStore.getState();
|
|
116
|
+
if (Math.abs(offsetMs) < APPLY_THRESHOLD_MS) return 0;
|
|
117
|
+
if (Date.now() - measuredAtMs > STALE_AFTER_MS) return 0;
|
|
118
|
+
return offsetMs;
|
|
119
|
+
}
|
|
120
|
+
export function serverNow() {
|
|
121
|
+
return new Date(Date.now() + getClockOffsetMs());
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Test helper: clears module state that would otherwise leak between examples. */
|
|
125
|
+
export function resetClockStateForTesting() {
|
|
126
|
+
samples = [];
|
|
127
|
+
clockConfig = undefined;
|
|
128
|
+
hasReportedImplausibleSample = false;
|
|
129
|
+
useClockStore.setState({
|
|
130
|
+
offsetMs: 0,
|
|
131
|
+
measuredAtMs: 0
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export { useClockStore };
|
|
135
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["AsyncStorage","create","persist","createJSONStorage","log","MINUTES_IN_A_HOUR","MS_IN_A_DAY","MS_IN_A_MINUTE","MS_IN_A_SECOND","MS_IN_A_HOUR","MAX_RTT_MS","NOISE_FLOOR_MS","SAMPLE_WINDOW_MS","APPLY_THRESHOLD_MS","MAX_PLAUSIBLE_OFFSET_MS","STALE_AFTER_MS","FRESHNESS_WRITE_INTERVAL_MS","useClockStore","set","offsetMs","measuredAtMs","setOffset","name","storage","samples","clockConfig","hasReportedImplausibleSample","setClockConfig","config","driftBucket","absOffsetMs","Math","abs","pruneDriftSamples","driftSamples","nowMs","filter","sample","ageMs","atMs","selectDriftEstimate","length","best","reduce","a","b","rttMs","recordDriftSample","rawOffsetMs","Date","now","round","onImplausibleSample","estimate","storedOffsetMs","getState","estimateChanged","freshnessExpired","onDriftEstimateChange","getClockOffsetMs","applyCorrection","serverNow","resetClockStateForTesting","undefined","setState"],"sourceRoot":"../../src","sources":["clock.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { TZDate } from '@date-fns/tz';
|
|
4
4
|
import { useCallback, useMemo } from 'react';
|
|
5
|
+
import { getClockOffsetMs } from "../clock.js";
|
|
5
6
|
import { useTimezone } from "../UIKitProvider.js";
|
|
6
7
|
import log from "../utils/log.js";
|
|
7
8
|
|
|
@@ -107,9 +108,11 @@ export function useTimezonedDate() {
|
|
|
107
108
|
* @returns TZDate instance that works with all date-fns functions
|
|
108
109
|
*/
|
|
109
110
|
const tz = useCallback(date => {
|
|
110
|
-
// Use appropriate timezone - real name if device is correct, generic offset if corrupted
|
|
111
|
+
// Use appropriate timezone - real name if device is correct, generic offset if corrupted.
|
|
112
|
+
// "Now" gets the measured server-clock offset applied (a no-op unless the app opted into
|
|
113
|
+
// clock.applyCorrection); explicit dates are data and are never shifted.
|
|
111
114
|
if (date === undefined) {
|
|
112
|
-
return TZDate.tz(appropriateTimezone);
|
|
115
|
+
return TZDate.tz(appropriateTimezone, new Date(Date.now() + getClockOffsetMs()));
|
|
113
116
|
}
|
|
114
117
|
if (date instanceof Date) {
|
|
115
118
|
return TZDate.tz(appropriateTimezone, date);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TZDate","useCallback","useMemo","useTimezone","log","TIMEZONE_OFFSET_MAP","offsetToGenericTimezone","offset","offsetInMinutes","Math","abs","hourNum","floor","isWestOfGreenwich","etcSign","isDeviceTimezoneMappingCorrect","timezoneName","expectedOffsetInMinutes","deviceTestDate","tz","deviceOffsetInMinutes","getTimezoneOffset","undefined","getAppropriateTimezone","useTimezonedDate","timezone","appropriateTimezone","date","Date","fromWallClock","fields","year","month","day","hour","minute","second","millisecond","fromDateString","split","Number"],"sourceRoot":"../../../src","sources":["hooks/useTimezonedDate.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,cAAc;AACrC,SAASC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAE5C,SAASC,WAAW,QAAQ,qBAAkB;AAC9C,OAAOC,GAAG,MAAM,iBAAc;;AAE9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,mBAA2C,GAAG;EAClD,qBAAqB,EAAE;AACzB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,SAASC,uBAAuBA,CAACC,MAAc,EAAU;EACvD,MAAMC,eAAe,GAAGC,IAAI,CAACC,GAAG,CAACH,MAAM,CAAC;EACxC,MAAMI,OAAO,GAAGF,IAAI,CAACG,KAAK,CAACJ,eAAe,GAAG,EAAE,CAAC;EAEhD,IAAIG,OAAO,KAAK,CAAC,EAAE;IACjB,OAAO,KAAK;EACd;EAEA,MAAME,iBAAiB,GAAGN,MAAM,GAAG,CAAC;EACpC;EACA,MAAMO,OAAO,GAAGD,iBAAiB,GAAG,GAAG,GAAG,GAAG;EAC7C,OAAO,UAAUC,OAAO,GAAGH,OAAO,EAAE;AACtC;;AAEA;AACA;AACA;AACA;AACA,SAASI,8BAA8BA,CAACC,YAAoB,EAAW;EACrE,MAAMC,uBAAuB,GAAGZ,mBAAmB,CAACW,YAAY,CAAC;EACjE,MAAME,cAAc,
|
|
1
|
+
{"version":3,"names":["TZDate","useCallback","useMemo","getClockOffsetMs","useTimezone","log","TIMEZONE_OFFSET_MAP","offsetToGenericTimezone","offset","offsetInMinutes","Math","abs","hourNum","floor","isWestOfGreenwich","etcSign","isDeviceTimezoneMappingCorrect","timezoneName","expectedOffsetInMinutes","deviceTestDate","tz","deviceOffsetInMinutes","getTimezoneOffset","undefined","getAppropriateTimezone","useTimezonedDate","timezone","appropriateTimezone","date","Date","now","fromWallClock","fields","year","month","day","hour","minute","second","millisecond","fromDateString","split","Number"],"sourceRoot":"../../../src","sources":["hooks/useTimezonedDate.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export { default as backgroundColors } from "./styles/background-colors.js";
|
|
|
6
6
|
export { default as foregroundColors } from "./styles/foreground-colors.js";
|
|
7
7
|
export { default as utilityColors } from "./styles/utility-colors.js";
|
|
8
8
|
export { default as colors } from "./styles/colors.js";
|
|
9
|
+
export * from "./clock.js";
|
|
9
10
|
export * from "./hooks/index.js";
|
|
10
11
|
export * from "./UIKitProvider.js";
|
|
11
12
|
export * from "./utils/index.js";
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["default","preset","backgroundColors","foregroundColors","utilityColors","colors"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,uBAAc;AAC5B,SAASA,OAAO,IAAIC,MAAM,QAAQ,aAAU;AAC5C,SAASD,OAAO,IAAIE,gBAAgB,QAAQ,+BAA4B;AACxE,SAASF,OAAO,IAAIG,gBAAgB,QAAQ,+BAA4B;AACxE,SAASH,OAAO,IAAII,aAAa,QAAQ,4BAAyB;AAClE,SAASJ,OAAO,IAAIK,MAAM,QAAQ,oBAAiB;AACnD,cAAc,kBAAS;AACvB,cAAc,oBAAiB;AAC/B,cAAc,kBAAS;AACvB,cAAc,gBAAa;AAC3B,cAAc,iBAAc;AAC5B,cAAc,0BAAuB;AACrC,cAAc,4BAAyB;AACvC,cAAc,qBAAkB;AAIhC,cAAc,6CAAoC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["default","preset","backgroundColors","foregroundColors","utilityColors","colors"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,cAAc,uBAAc;AAC5B,SAASA,OAAO,IAAIC,MAAM,QAAQ,aAAU;AAC5C,SAASD,OAAO,IAAIE,gBAAgB,QAAQ,+BAA4B;AACxE,SAASF,OAAO,IAAIG,gBAAgB,QAAQ,+BAA4B;AACxE,SAASH,OAAO,IAAII,aAAa,QAAQ,4BAAyB;AAClE,SAASJ,OAAO,IAAIK,MAAM,QAAQ,oBAAiB;AACnD,cAAc,YAAS;AACvB,cAAc,kBAAS;AACvB,cAAc,oBAAiB;AAC/B,cAAc,kBAAS;AACvB,cAAc,gBAAa;AAC3B,cAAc,iBAAc;AAC5B,cAAc,0BAAuB;AACrC,cAAc,4BAAyB;AACvC,cAAc,qBAAkB;AAIhC,cAAc,6CAAoC","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ const SECONDS_IN_A_MINUTE = 60;
|
|
|
7
7
|
const DAYS_IN_A_WEEK = 7;
|
|
8
8
|
const MS_IN_A_DAY = MS_IN_A_SECOND * SECONDS_IN_A_MINUTE * MINUTES_IN_A_HOUR * HOURS_IN_A_DAY;
|
|
9
9
|
const MS_IN_A_MINUTE = MS_IN_A_SECOND * SECONDS_IN_A_MINUTE;
|
|
10
|
+
const MS_IN_A_HOUR = MS_IN_A_MINUTE * MINUTES_IN_A_HOUR;
|
|
10
11
|
const MS_IN_A_WEEK = MS_IN_A_DAY * DAYS_IN_A_WEEK;
|
|
11
|
-
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_WEEK };
|
|
12
|
+
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_HOUR, MS_IN_A_WEEK };
|
|
12
13
|
//# sourceMappingURL=timeConstants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MS_IN_A_SECOND","HOURS_IN_A_DAY","MINUTES_IN_A_HOUR","SECONDS_IN_A_MINUTE","DAYS_IN_A_WEEK","MS_IN_A_DAY","MS_IN_A_MINUTE","MS_IN_A_WEEK"],"sourceRoot":"../../../src","sources":["utils/timeConstants.ts"],"mappings":";;AAAA,MAAMA,cAAc,GAAG,KAAK;AAC5B,MAAMC,cAAc,GAAG,EAAE;AACzB,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,mBAAmB,GAAG,EAAE;AAC9B,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,WAAW,GAAGL,cAAc,GAAGG,mBAAmB,GAAGD,iBAAiB,GAAGD,cAAc;AAC7F,MAAMK,cAAc,GAAGN,cAAc,GAAGG,mBAAmB;AAC3D,MAAMI,YAAY,
|
|
1
|
+
{"version":3,"names":["MS_IN_A_SECOND","HOURS_IN_A_DAY","MINUTES_IN_A_HOUR","SECONDS_IN_A_MINUTE","DAYS_IN_A_WEEK","MS_IN_A_DAY","MS_IN_A_MINUTE","MS_IN_A_HOUR","MS_IN_A_WEEK"],"sourceRoot":"../../../src","sources":["utils/timeConstants.ts"],"mappings":";;AAAA,MAAMA,cAAc,GAAG,KAAK;AAC5B,MAAMC,cAAc,GAAG,EAAE;AACzB,MAAMC,iBAAiB,GAAG,EAAE;AAC5B,MAAMC,mBAAmB,GAAG,EAAE;AAC9B,MAAMC,cAAc,GAAG,CAAC;AACxB,MAAMC,WAAW,GAAGL,cAAc,GAAGG,mBAAmB,GAAGD,iBAAiB,GAAGD,cAAc;AAC7F,MAAMK,cAAc,GAAGN,cAAc,GAAGG,mBAAmB;AAC3D,MAAMI,YAAY,GAAGD,cAAc,GAAGJ,iBAAiB;AACvD,MAAMM,YAAY,GAAGH,WAAW,GAAGD,cAAc;AAEjD,SACEJ,cAAc,EACdC,cAAc,EACdC,iBAAiB,EACjBC,mBAAmB,EACnBC,cAAc,EACdC,WAAW,EACXC,cAAc,EACdC,YAAY,EACZC,YAAY","ignoreList":[]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
|
+
import { ClockConfig } from './clock';
|
|
2
3
|
import { AppVersionCheckConfig } from './hooks/useAppUpdateCheck';
|
|
3
4
|
import { InternetConnectionStatusConfig } from './hooks/useInternetConnectionStatus';
|
|
4
5
|
export interface UIKitConfig {
|
|
5
6
|
internetConnection?: InternetConnectionStatusConfig;
|
|
6
7
|
appVersionCheck?: AppVersionCheckConfig;
|
|
7
8
|
timezone: string;
|
|
9
|
+
clock?: ClockConfig;
|
|
8
10
|
}
|
|
9
11
|
interface UIKitProviderProps {
|
|
10
12
|
children: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIKitProvider.d.ts","sourceRoot":"","sources":["../../../src/UIKitProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"UIKitProvider.d.ts","sourceRoot":"","sources":["../../../src/UIKitProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAC0B,SAAS,EAChD,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,EAAE,8BAA8B,CAAC;IACpD,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAcD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBAYrE;AAED,wBAAgB,cAAc,IAAI,WAAW,CAM5C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAIpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/clock.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Some devices have a wrong UTC epoch even when the displayed clock looks right (manual clock
|
|
4
|
+
* set under a wrong GMT offset). The consumer app's response interceptor feeds
|
|
5
|
+
* `recordDriftSample` with the server time of every response; `getClockOffsetMs`/`serverNow`
|
|
6
|
+
* expose the corrected "now". Both are plain functions so they work outside React
|
|
7
|
+
* (interceptors, linking config).
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
type DriftBucket = 'none' | '<30s' | '30s-5m' | '5m-1h' | '>1h';
|
|
11
|
+
interface ClockConfig {
|
|
12
|
+
/** Called when the drift estimate moves to a different bucket. Send telemetry here. */
|
|
13
|
+
onDriftEstimateChange?: (estimateMs: number, rttMs: number) => void;
|
|
14
|
+
/** Called (once per session) when a sample is beyond any plausible clock error. */
|
|
15
|
+
onImplausibleSample?: (offsetMs: number) => void;
|
|
16
|
+
/** Apply the measured offset in tz()/useCurrentTime/serverNow. Defaults to true; set false
|
|
17
|
+
* for observe-only mode (drift is measured and reported but never applied). */
|
|
18
|
+
applyCorrection?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface ClockStoreState {
|
|
21
|
+
offsetMs: number;
|
|
22
|
+
measuredAtMs: number;
|
|
23
|
+
setOffset: (offsetMs: number, measuredAtMs: number) => void;
|
|
24
|
+
}
|
|
25
|
+
interface DriftSample {
|
|
26
|
+
offsetMs: number;
|
|
27
|
+
rttMs: number;
|
|
28
|
+
atMs: number;
|
|
29
|
+
}
|
|
30
|
+
declare const useClockStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<ClockStoreState>, "setState" | "persist"> & {
|
|
31
|
+
setState(partial: ClockStoreState | Partial<ClockStoreState> | ((state: ClockStoreState) => ClockStoreState | Partial<ClockStoreState>), replace?: false | undefined): unknown;
|
|
32
|
+
setState(state: ClockStoreState | ((state: ClockStoreState) => ClockStoreState), replace: true): unknown;
|
|
33
|
+
persist: {
|
|
34
|
+
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ClockStoreState, unknown, unknown>>) => void;
|
|
35
|
+
clearStorage: () => void;
|
|
36
|
+
rehydrate: () => void | Promise<void>;
|
|
37
|
+
hasHydrated: () => boolean;
|
|
38
|
+
onHydrate: (fn: (state: ClockStoreState) => void) => () => void;
|
|
39
|
+
onFinishHydration: (fn: (state: ClockStoreState) => void) => () => void;
|
|
40
|
+
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ClockStoreState, unknown, unknown>>;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
/** Wired by UIKitProvider; not part of the public API. */
|
|
44
|
+
export declare function setClockConfig(config: ClockConfig | undefined): void;
|
|
45
|
+
export declare function driftBucket(offsetMs: number): DriftBucket;
|
|
46
|
+
export declare function pruneDriftSamples(driftSamples: DriftSample[], nowMs: number): DriftSample[];
|
|
47
|
+
/**
|
|
48
|
+
* The lowest-RTT sample in the window carries the least network-asymmetry error, so it wins.
|
|
49
|
+
* Offsets below the noise floor are reported as 0.
|
|
50
|
+
*/
|
|
51
|
+
export declare function selectDriftEstimate(driftSamples: DriftSample[]): DriftSample | null;
|
|
52
|
+
export declare function recordDriftSample(rawOffsetMs: number, rttMs: number): void;
|
|
53
|
+
export declare function getClockOffsetMs(): number;
|
|
54
|
+
export declare function serverNow(): Date;
|
|
55
|
+
/** Test helper: clears module state that would otherwise leak between examples. */
|
|
56
|
+
export declare function resetClockStateForTesting(): void;
|
|
57
|
+
export { useClockStore };
|
|
58
|
+
export type { ClockConfig, DriftBucket, DriftSample };
|
|
59
|
+
//# sourceMappingURL=clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../../src/clock.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AAEH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAEhE,UAAU,WAAW;IACnB,uFAAuF;IACvF,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD;mFAC+E;IAC/E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAUD,QAAA,MAAM,aAAa;;;;;;;;;;;;EAYlB,CAAC;AAQF,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CASzD;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAM3F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,GAAG,IAAI,CAMnF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAkC1E;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTimezonedDate.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTimezonedDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useTimezonedDate.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTimezonedDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA4EtC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB;gBAUC,IAAI,GAAG,MAAM,GAAG,MAAM,KAAG,MAAM;4BA2BnB;QACzC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;2BAkByC,MAAM;;EAgBjD"}
|
|
@@ -4,6 +4,7 @@ export { default as backgroundColors } from './styles/background-colors';
|
|
|
4
4
|
export { default as foregroundColors } from './styles/foreground-colors';
|
|
5
5
|
export { default as utilityColors } from './styles/utility-colors';
|
|
6
6
|
export { default as colors } from './styles/colors';
|
|
7
|
+
export * from './clock';
|
|
7
8
|
export * from './hooks';
|
|
8
9
|
export * from './UIKitProvider';
|
|
9
10
|
export * from './utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,cAAc,oCAAoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,cAAc,oCAAoC,CAAC"}
|
|
@@ -5,6 +5,7 @@ declare const SECONDS_IN_A_MINUTE = 60;
|
|
|
5
5
|
declare const DAYS_IN_A_WEEK = 7;
|
|
6
6
|
declare const MS_IN_A_DAY: number;
|
|
7
7
|
declare const MS_IN_A_MINUTE: number;
|
|
8
|
+
declare const MS_IN_A_HOUR: number;
|
|
8
9
|
declare const MS_IN_A_WEEK: number;
|
|
9
|
-
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_WEEK, };
|
|
10
|
+
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_HOUR, MS_IN_A_WEEK, };
|
|
10
11
|
//# sourceMappingURL=timeConstants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeConstants.d.ts","sourceRoot":"","sources":["../../../../src/utils/timeConstants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,OAAQ,CAAC;AAC7B,QAAA,MAAM,cAAc,KAAK,CAAC;AAC1B,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAC7B,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAC/B,QAAA,MAAM,cAAc,IAAI,CAAC;AACzB,QAAA,MAAM,WAAW,QAA4E,CAAC;AAC9F,QAAA,MAAM,cAAc,QAAuC,CAAC;AAC5D,QAAA,MAAM,YAAY,QAA+B,CAAC;AAElD,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,GACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"timeConstants.d.ts","sourceRoot":"","sources":["../../../../src/utils/timeConstants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,OAAQ,CAAC;AAC7B,QAAA,MAAM,cAAc,KAAK,CAAC;AAC1B,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAC7B,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAC/B,QAAA,MAAM,cAAc,IAAI,CAAC;AACzB,QAAA,MAAM,WAAW,QAA4E,CAAC;AAC9F,QAAA,MAAM,cAAc,QAAuC,CAAC;AAC5D,QAAA,MAAM,YAAY,QAAqC,CAAC;AACxD,QAAA,MAAM,YAAY,QAA+B,CAAC;AAElD,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,GACb,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import React, { ReactNode } from 'react';
|
|
2
|
+
import { ClockConfig } from './clock';
|
|
2
3
|
import { AppVersionCheckConfig } from './hooks/useAppUpdateCheck';
|
|
3
4
|
import { InternetConnectionStatusConfig } from './hooks/useInternetConnectionStatus';
|
|
4
5
|
export interface UIKitConfig {
|
|
5
6
|
internetConnection?: InternetConnectionStatusConfig;
|
|
6
7
|
appVersionCheck?: AppVersionCheckConfig;
|
|
7
8
|
timezone: string;
|
|
9
|
+
clock?: ClockConfig;
|
|
8
10
|
}
|
|
9
11
|
interface UIKitProviderProps {
|
|
10
12
|
children: ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UIKitProvider.d.ts","sourceRoot":"","sources":["../../../src/UIKitProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"UIKitProvider.d.ts","sourceRoot":"","sources":["../../../src/UIKitProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAC0B,SAAS,EAChD,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAkB,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,EAAE,8BAA8B,CAAC;IACpD,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAcD,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,kBAAkB,qBAYrE;AAED,wBAAgB,cAAc,IAAI,WAAW,CAM5C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAIpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/clock.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Some devices have a wrong UTC epoch even when the displayed clock looks right (manual clock
|
|
4
|
+
* set under a wrong GMT offset). The consumer app's response interceptor feeds
|
|
5
|
+
* `recordDriftSample` with the server time of every response; `getClockOffsetMs`/`serverNow`
|
|
6
|
+
* expose the corrected "now". Both are plain functions so they work outside React
|
|
7
|
+
* (interceptors, linking config).
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
type DriftBucket = 'none' | '<30s' | '30s-5m' | '5m-1h' | '>1h';
|
|
11
|
+
interface ClockConfig {
|
|
12
|
+
/** Called when the drift estimate moves to a different bucket. Send telemetry here. */
|
|
13
|
+
onDriftEstimateChange?: (estimateMs: number, rttMs: number) => void;
|
|
14
|
+
/** Called (once per session) when a sample is beyond any plausible clock error. */
|
|
15
|
+
onImplausibleSample?: (offsetMs: number) => void;
|
|
16
|
+
/** Apply the measured offset in tz()/useCurrentTime/serverNow. Defaults to true; set false
|
|
17
|
+
* for observe-only mode (drift is measured and reported but never applied). */
|
|
18
|
+
applyCorrection?: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface ClockStoreState {
|
|
21
|
+
offsetMs: number;
|
|
22
|
+
measuredAtMs: number;
|
|
23
|
+
setOffset: (offsetMs: number, measuredAtMs: number) => void;
|
|
24
|
+
}
|
|
25
|
+
interface DriftSample {
|
|
26
|
+
offsetMs: number;
|
|
27
|
+
rttMs: number;
|
|
28
|
+
atMs: number;
|
|
29
|
+
}
|
|
30
|
+
declare const useClockStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<ClockStoreState>, "setState" | "persist"> & {
|
|
31
|
+
setState(partial: ClockStoreState | Partial<ClockStoreState> | ((state: ClockStoreState) => ClockStoreState | Partial<ClockStoreState>), replace?: false | undefined): unknown;
|
|
32
|
+
setState(state: ClockStoreState | ((state: ClockStoreState) => ClockStoreState), replace: true): unknown;
|
|
33
|
+
persist: {
|
|
34
|
+
setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ClockStoreState, unknown, unknown>>) => void;
|
|
35
|
+
clearStorage: () => void;
|
|
36
|
+
rehydrate: () => void | Promise<void>;
|
|
37
|
+
hasHydrated: () => boolean;
|
|
38
|
+
onHydrate: (fn: (state: ClockStoreState) => void) => () => void;
|
|
39
|
+
onFinishHydration: (fn: (state: ClockStoreState) => void) => () => void;
|
|
40
|
+
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ClockStoreState, unknown, unknown>>;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
/** Wired by UIKitProvider; not part of the public API. */
|
|
44
|
+
export declare function setClockConfig(config: ClockConfig | undefined): void;
|
|
45
|
+
export declare function driftBucket(offsetMs: number): DriftBucket;
|
|
46
|
+
export declare function pruneDriftSamples(driftSamples: DriftSample[], nowMs: number): DriftSample[];
|
|
47
|
+
/**
|
|
48
|
+
* The lowest-RTT sample in the window carries the least network-asymmetry error, so it wins.
|
|
49
|
+
* Offsets below the noise floor are reported as 0.
|
|
50
|
+
*/
|
|
51
|
+
export declare function selectDriftEstimate(driftSamples: DriftSample[]): DriftSample | null;
|
|
52
|
+
export declare function recordDriftSample(rawOffsetMs: number, rttMs: number): void;
|
|
53
|
+
export declare function getClockOffsetMs(): number;
|
|
54
|
+
export declare function serverNow(): Date;
|
|
55
|
+
/** Test helper: clears module state that would otherwise leak between examples. */
|
|
56
|
+
export declare function resetClockStateForTesting(): void;
|
|
57
|
+
export { useClockStore };
|
|
58
|
+
export type { ClockConfig, DriftBucket, DriftSample };
|
|
59
|
+
//# sourceMappingURL=clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../../src/clock.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AAEH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAEhE,UAAU,WAAW;IACnB,uFAAuF;IACvF,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD;mFAC+E;IAC/E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAUD,QAAA,MAAM,aAAa;;;;;;;;;;;;EAYlB,CAAC;AAQF,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CASzD;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAM3F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,GAAG,IAAI,CAMnF;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAkC1E;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED,mFAAmF;AACnF,wBAAgB,yBAAyB,IAAI,IAAI,CAKhD;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTimezonedDate.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTimezonedDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"useTimezonedDate.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useTimezonedDate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA4EtC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB;gBAUC,IAAI,GAAG,MAAM,GAAG,MAAM,KAAG,MAAM;4BA2BnB;QACzC,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;2BAkByC,MAAM;;EAgBjD"}
|
|
@@ -4,6 +4,7 @@ export { default as backgroundColors } from './styles/background-colors';
|
|
|
4
4
|
export { default as foregroundColors } from './styles/foreground-colors';
|
|
5
5
|
export { default as utilityColors } from './styles/utility-colors';
|
|
6
6
|
export { default as colors } from './styles/colors';
|
|
7
|
+
export * from './clock';
|
|
7
8
|
export * from './hooks';
|
|
8
9
|
export * from './UIKitProvider';
|
|
9
10
|
export * from './utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,cAAc,oCAAoC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,cAAc,oCAAoC,CAAC"}
|
|
@@ -5,6 +5,7 @@ declare const SECONDS_IN_A_MINUTE = 60;
|
|
|
5
5
|
declare const DAYS_IN_A_WEEK = 7;
|
|
6
6
|
declare const MS_IN_A_DAY: number;
|
|
7
7
|
declare const MS_IN_A_MINUTE: number;
|
|
8
|
+
declare const MS_IN_A_HOUR: number;
|
|
8
9
|
declare const MS_IN_A_WEEK: number;
|
|
9
|
-
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_WEEK, };
|
|
10
|
+
export { MS_IN_A_SECOND, HOURS_IN_A_DAY, MINUTES_IN_A_HOUR, SECONDS_IN_A_MINUTE, DAYS_IN_A_WEEK, MS_IN_A_DAY, MS_IN_A_MINUTE, MS_IN_A_HOUR, MS_IN_A_WEEK, };
|
|
10
11
|
//# sourceMappingURL=timeConstants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeConstants.d.ts","sourceRoot":"","sources":["../../../../src/utils/timeConstants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,OAAQ,CAAC;AAC7B,QAAA,MAAM,cAAc,KAAK,CAAC;AAC1B,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAC7B,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAC/B,QAAA,MAAM,cAAc,IAAI,CAAC;AACzB,QAAA,MAAM,WAAW,QAA4E,CAAC;AAC9F,QAAA,MAAM,cAAc,QAAuC,CAAC;AAC5D,QAAA,MAAM,YAAY,QAA+B,CAAC;AAElD,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,GACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"timeConstants.d.ts","sourceRoot":"","sources":["../../../../src/utils/timeConstants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,OAAQ,CAAC;AAC7B,QAAA,MAAM,cAAc,KAAK,CAAC;AAC1B,QAAA,MAAM,iBAAiB,KAAK,CAAC;AAC7B,QAAA,MAAM,mBAAmB,KAAK,CAAC;AAC/B,QAAA,MAAM,cAAc,IAAI,CAAC;AACzB,QAAA,MAAM,WAAW,QAA4E,CAAC;AAC9F,QAAA,MAAM,cAAc,QAAuC,CAAC;AAC5D,QAAA,MAAM,YAAY,QAAqC,CAAC;AACxD,QAAA,MAAM,YAAY,QAA+B,CAAC;AAElD,OAAO,EACL,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,GACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grupalia/rn-ui-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"description": "Grupalia React Native UI Kit",
|
|
5
5
|
"main": "./lib/module/index.js",
|
|
6
6
|
"types": "./lib/typescript/module/index.d.ts",
|
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"react-use-wizard": "^2.3.0",
|
|
63
63
|
"tailwind-merge": "^2.5.0",
|
|
64
64
|
"tailwindcss": "~3.3.2",
|
|
65
|
-
"yup": "^1.7.1"
|
|
65
|
+
"yup": "^1.7.1",
|
|
66
|
+
"zustand": "^5.0.0"
|
|
66
67
|
},
|
|
67
68
|
"devDependencies": {
|
|
68
69
|
"@babel/core": "^7.20.0",
|
|
@@ -122,7 +123,8 @@
|
|
|
122
123
|
"tailwind-merge": "^2.5.0",
|
|
123
124
|
"tailwindcss": "3.3.2",
|
|
124
125
|
"typescript": "~5.3.3",
|
|
125
|
-
"vitest": "^3.2.4"
|
|
126
|
+
"vitest": "^3.2.4",
|
|
127
|
+
"zustand": "^5.0.3"
|
|
126
128
|
},
|
|
127
129
|
"exports": {
|
|
128
130
|
".": {
|