@ctlyst.id/utils 2.1.0 → 2.2.0-alpha.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/dist/index.d.mts +41 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.js +120 -73
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +104 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -8,6 +8,21 @@ declare const isValidEvent: (event: any, ref: RefObject<HTMLElement>) => boolean
|
|
|
8
8
|
declare const canUseDOM: () => boolean;
|
|
9
9
|
declare const isBrowser: boolean;
|
|
10
10
|
|
|
11
|
+
type Breakpoint = "mobile" | "desktop" | "wide";
|
|
12
|
+
/**
|
|
13
|
+
* Returns the current active breakpoint based on viewport width and orientation.
|
|
14
|
+
*
|
|
15
|
+
* Strategy (orientation-aware):
|
|
16
|
+
* - mobile: default, including tablets/iPads in portrait (even iPad Pro 12.9" at 1024×1366)
|
|
17
|
+
* - desktop: viewport ≥ 1024px AND orientation landscape
|
|
18
|
+
* - wide: viewport ≥ 1440px AND orientation landscape
|
|
19
|
+
*
|
|
20
|
+
* Uses the same media query strings as CSS (tokens.mediaQueries) so JS & CSS
|
|
21
|
+
* switch at exactly the same points. Reactive to resize and orientation change
|
|
22
|
+
* via matchMedia listeners — no refresh required.
|
|
23
|
+
*/
|
|
24
|
+
declare const useBreakpoint: () => Breakpoint;
|
|
25
|
+
|
|
11
26
|
declare const useCallbackRef: <T extends (...args: any[]) => any>(callback: T | undefined, deps?: DependencyList) => T;
|
|
12
27
|
|
|
13
28
|
interface UseClipboardOptions {
|
|
@@ -31,6 +46,31 @@ interface UseDebounceProps<T> {
|
|
|
31
46
|
}
|
|
32
47
|
declare const useDebounce: <T>({ value, delay }: UseDebounceProps<T>) => T;
|
|
33
48
|
|
|
49
|
+
interface DeviceInfo {
|
|
50
|
+
/** True if the device is an iPad (including iPads reporting as Mac in Safari since iPadOS 13) */
|
|
51
|
+
isIpadOS: boolean;
|
|
52
|
+
/** True if the device is any tablet (iPad or Android tablet) */
|
|
53
|
+
isTablet: boolean;
|
|
54
|
+
/** True if the device is a mobile phone */
|
|
55
|
+
isMobile: boolean;
|
|
56
|
+
/** True if the device is a desktop/laptop (no multi-touch signature) */
|
|
57
|
+
isDesktop: boolean;
|
|
58
|
+
/** True if the device supports multi-touch */
|
|
59
|
+
hasTouch: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect device type using feature detection (not User Agent string alone).
|
|
63
|
+
*
|
|
64
|
+
* Solves the iPad detection problem: since iPadOS 13, large iPads (Air, Pro)
|
|
65
|
+
* report desktop Safari UA ("Macintosh"). We detect them by checking if a
|
|
66
|
+
* "Mac" has multi-touch (`maxTouchPoints > 1`), which real Macs don't expose.
|
|
67
|
+
*
|
|
68
|
+
* Use this for JS decisions only (e.g. whether to show an install-app banner).
|
|
69
|
+
* For styling/layout, prefer CSS breakpoints + capability variants — they react
|
|
70
|
+
* to resize/rotate without JS re-render.
|
|
71
|
+
*/
|
|
72
|
+
declare const useDeviceDetect: () => DeviceInfo;
|
|
73
|
+
|
|
34
74
|
type BoxModel = BoxModel$1;
|
|
35
75
|
declare const useDimensions: (ref: RefObject<HTMLElement>, observe?: boolean) => BoxModel$1 | null;
|
|
36
76
|
|
|
@@ -139,4 +179,4 @@ type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' |
|
|
|
139
179
|
|
|
140
180
|
declare const useVoucherTnc: (props: VoucherTncProps | null) => string[];
|
|
141
181
|
|
|
142
|
-
export { type BoxModel, DiscountType, type GetAppliesToProps, type GetBankBinProps, type GetMethodTermsProps, type GetPeriodProps, type GetUsageLimitProps, type NumberFormatterProps, type UseClipboardOptions, type UseClipboardProps, type UseDebounceProps, type UseDisclosureProps, type UseMediaQueryOptions, type UseOutsideClickProps, type VoucherPaymentType, type VoucherTncProps, VoucherType, canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent, useCallbackRef, useClipboard, useDebounce, useDimensions, useDisclosure, useMediaQuery, useNumberFormatter, useOnlineStatus, useOutsideClick, useSafeLayoutEffect, useVoucherTnc };
|
|
182
|
+
export { type BoxModel, type Breakpoint, type DeviceInfo, DiscountType, type GetAppliesToProps, type GetBankBinProps, type GetMethodTermsProps, type GetPeriodProps, type GetUsageLimitProps, type NumberFormatterProps, type UseClipboardOptions, type UseClipboardProps, type UseDebounceProps, type UseDisclosureProps, type UseMediaQueryOptions, type UseOutsideClickProps, type VoucherPaymentType, type VoucherTncProps, VoucherType, canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent, useBreakpoint, useCallbackRef, useClipboard, useDebounce, useDeviceDetect, useDimensions, useDisclosure, useMediaQuery, useNumberFormatter, useOnlineStatus, useOutsideClick, useSafeLayoutEffect, useVoucherTnc };
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,21 @@ declare const isValidEvent: (event: any, ref: RefObject<HTMLElement>) => boolean
|
|
|
8
8
|
declare const canUseDOM: () => boolean;
|
|
9
9
|
declare const isBrowser: boolean;
|
|
10
10
|
|
|
11
|
+
type Breakpoint = "mobile" | "desktop" | "wide";
|
|
12
|
+
/**
|
|
13
|
+
* Returns the current active breakpoint based on viewport width and orientation.
|
|
14
|
+
*
|
|
15
|
+
* Strategy (orientation-aware):
|
|
16
|
+
* - mobile: default, including tablets/iPads in portrait (even iPad Pro 12.9" at 1024×1366)
|
|
17
|
+
* - desktop: viewport ≥ 1024px AND orientation landscape
|
|
18
|
+
* - wide: viewport ≥ 1440px AND orientation landscape
|
|
19
|
+
*
|
|
20
|
+
* Uses the same media query strings as CSS (tokens.mediaQueries) so JS & CSS
|
|
21
|
+
* switch at exactly the same points. Reactive to resize and orientation change
|
|
22
|
+
* via matchMedia listeners — no refresh required.
|
|
23
|
+
*/
|
|
24
|
+
declare const useBreakpoint: () => Breakpoint;
|
|
25
|
+
|
|
11
26
|
declare const useCallbackRef: <T extends (...args: any[]) => any>(callback: T | undefined, deps?: DependencyList) => T;
|
|
12
27
|
|
|
13
28
|
interface UseClipboardOptions {
|
|
@@ -31,6 +46,31 @@ interface UseDebounceProps<T> {
|
|
|
31
46
|
}
|
|
32
47
|
declare const useDebounce: <T>({ value, delay }: UseDebounceProps<T>) => T;
|
|
33
48
|
|
|
49
|
+
interface DeviceInfo {
|
|
50
|
+
/** True if the device is an iPad (including iPads reporting as Mac in Safari since iPadOS 13) */
|
|
51
|
+
isIpadOS: boolean;
|
|
52
|
+
/** True if the device is any tablet (iPad or Android tablet) */
|
|
53
|
+
isTablet: boolean;
|
|
54
|
+
/** True if the device is a mobile phone */
|
|
55
|
+
isMobile: boolean;
|
|
56
|
+
/** True if the device is a desktop/laptop (no multi-touch signature) */
|
|
57
|
+
isDesktop: boolean;
|
|
58
|
+
/** True if the device supports multi-touch */
|
|
59
|
+
hasTouch: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Detect device type using feature detection (not User Agent string alone).
|
|
63
|
+
*
|
|
64
|
+
* Solves the iPad detection problem: since iPadOS 13, large iPads (Air, Pro)
|
|
65
|
+
* report desktop Safari UA ("Macintosh"). We detect them by checking if a
|
|
66
|
+
* "Mac" has multi-touch (`maxTouchPoints > 1`), which real Macs don't expose.
|
|
67
|
+
*
|
|
68
|
+
* Use this for JS decisions only (e.g. whether to show an install-app banner).
|
|
69
|
+
* For styling/layout, prefer CSS breakpoints + capability variants — they react
|
|
70
|
+
* to resize/rotate without JS re-render.
|
|
71
|
+
*/
|
|
72
|
+
declare const useDeviceDetect: () => DeviceInfo;
|
|
73
|
+
|
|
34
74
|
type BoxModel = BoxModel$1;
|
|
35
75
|
declare const useDimensions: (ref: RefObject<HTMLElement>, observe?: boolean) => BoxModel$1 | null;
|
|
36
76
|
|
|
@@ -139,4 +179,4 @@ type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' |
|
|
|
139
179
|
|
|
140
180
|
declare const useVoucherTnc: (props: VoucherTncProps | null) => string[];
|
|
141
181
|
|
|
142
|
-
export { type BoxModel, DiscountType, type GetAppliesToProps, type GetBankBinProps, type GetMethodTermsProps, type GetPeriodProps, type GetUsageLimitProps, type NumberFormatterProps, type UseClipboardOptions, type UseClipboardProps, type UseDebounceProps, type UseDisclosureProps, type UseMediaQueryOptions, type UseOutsideClickProps, type VoucherPaymentType, type VoucherTncProps, VoucherType, canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent, useCallbackRef, useClipboard, useDebounce, useDimensions, useDisclosure, useMediaQuery, useNumberFormatter, useOnlineStatus, useOutsideClick, useSafeLayoutEffect, useVoucherTnc };
|
|
182
|
+
export { type BoxModel, type Breakpoint, type DeviceInfo, DiscountType, type GetAppliesToProps, type GetBankBinProps, type GetMethodTermsProps, type GetPeriodProps, type GetUsageLimitProps, type NumberFormatterProps, type UseClipboardOptions, type UseClipboardProps, type UseDebounceProps, type UseDisclosureProps, type UseMediaQueryOptions, type UseOutsideClickProps, type VoucherPaymentType, type VoucherTncProps, VoucherType, canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent, useBreakpoint, useCallbackRef, useClipboard, useDebounce, useDeviceDetect, useDimensions, useDisclosure, useMediaQuery, useNumberFormatter, useOnlineStatus, useOutsideClick, useSafeLayoutEffect, useVoucherTnc };
|
package/dist/index.js
CHANGED
|
@@ -37,9 +37,11 @@ __export(index_exports, {
|
|
|
37
37
|
isBrowser: () => isBrowser,
|
|
38
38
|
isElement: () => isElement,
|
|
39
39
|
isValidEvent: () => isValidEvent,
|
|
40
|
+
useBreakpoint: () => use_breakpoint_default,
|
|
40
41
|
useCallbackRef: () => use_callback_ref_default,
|
|
41
42
|
useClipboard: () => use_clipboard_default,
|
|
42
43
|
useDebounce: () => use_debounce_default,
|
|
44
|
+
useDeviceDetect: () => use_device_detect_default,
|
|
43
45
|
useDimensions: () => use_dimensions_default,
|
|
44
46
|
useDisclosure: () => use_disclosure_default,
|
|
45
47
|
useMediaQuery: () => use_media_query_default,
|
|
@@ -74,14 +76,72 @@ var canUseDOM = () => {
|
|
|
74
76
|
};
|
|
75
77
|
var isBrowser = canUseDOM();
|
|
76
78
|
|
|
77
|
-
// src/hooks/use-
|
|
79
|
+
// src/hooks/use-breakpoint/use-breakpoint.ts
|
|
80
|
+
var import_voila_ui_core = require("@ctlyst.id/voila-ui-core");
|
|
81
|
+
|
|
82
|
+
// src/hooks/use-media-query/use-media-query.ts
|
|
78
83
|
var import_react = require("react");
|
|
79
|
-
var
|
|
80
|
-
const
|
|
84
|
+
var useMediaQuery = (query, options = {}) => {
|
|
85
|
+
const { ssr = true, fallback } = options;
|
|
86
|
+
const queries = Array.isArray(query) ? query : [query];
|
|
87
|
+
let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];
|
|
88
|
+
fallbackValues = fallbackValues.filter((v) => v != null);
|
|
89
|
+
const [value, setValue] = (0, import_react.useState)(() => {
|
|
90
|
+
return queries.map((data, index) => ({
|
|
91
|
+
media: data,
|
|
92
|
+
matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
81
95
|
(0, import_react.useEffect)(() => {
|
|
96
|
+
const win = window;
|
|
97
|
+
setValue(
|
|
98
|
+
queries.map((data) => ({
|
|
99
|
+
media: data,
|
|
100
|
+
matches: win.matchMedia(data).matches
|
|
101
|
+
}))
|
|
102
|
+
);
|
|
103
|
+
const mql = queries.map((data) => win.matchMedia(data));
|
|
104
|
+
const handler = (evt) => {
|
|
105
|
+
setValue((prev) => {
|
|
106
|
+
return prev.slice().map((item) => {
|
|
107
|
+
if (item.media === evt.media) return { ...item, matches: evt.matches };
|
|
108
|
+
return item;
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
mql.forEach((data) => {
|
|
113
|
+
data.addEventListener("change", handler);
|
|
114
|
+
});
|
|
115
|
+
return () => {
|
|
116
|
+
mql.forEach((data) => {
|
|
117
|
+
data.removeEventListener("change", handler);
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
}, [window]);
|
|
121
|
+
return value.map((item) => item.matches);
|
|
122
|
+
};
|
|
123
|
+
var use_media_query_default = useMediaQuery;
|
|
124
|
+
|
|
125
|
+
// src/hooks/use-breakpoint/use-breakpoint.ts
|
|
126
|
+
var useBreakpoint = () => {
|
|
127
|
+
const [isWide, isDesktop] = use_media_query_default([
|
|
128
|
+
import_voila_ui_core.tokens.mediaQueries.wide,
|
|
129
|
+
import_voila_ui_core.tokens.mediaQueries.desktop
|
|
130
|
+
]);
|
|
131
|
+
if (isWide) return "wide";
|
|
132
|
+
if (isDesktop) return "desktop";
|
|
133
|
+
return "mobile";
|
|
134
|
+
};
|
|
135
|
+
var use_breakpoint_default = useBreakpoint;
|
|
136
|
+
|
|
137
|
+
// src/hooks/use-callback-ref/use-callback-ref.ts
|
|
138
|
+
var import_react2 = require("react");
|
|
139
|
+
var useCallbackRef = (callback, deps = []) => {
|
|
140
|
+
const callbackRef = (0, import_react2.useRef)(callback);
|
|
141
|
+
(0, import_react2.useEffect)(() => {
|
|
82
142
|
callbackRef.current = callback;
|
|
83
143
|
});
|
|
84
|
-
return (0,
|
|
144
|
+
return (0, import_react2.useCallback)((...args) => {
|
|
85
145
|
var _a;
|
|
86
146
|
return (_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef, ...args);
|
|
87
147
|
}, deps);
|
|
@@ -90,17 +150,17 @@ var use_callback_ref_default = useCallbackRef;
|
|
|
90
150
|
|
|
91
151
|
// src/hooks/use-clipboard/use-clipboard.ts
|
|
92
152
|
var import_copy_to_clipboard = __toESM(require("copy-to-clipboard"));
|
|
93
|
-
var
|
|
153
|
+
var import_react3 = require("react");
|
|
94
154
|
var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
|
|
95
|
-
const [hasCopied, setHasCopied] = (0,
|
|
96
|
-
const [valueState, setValueState] = (0,
|
|
97
|
-
(0,
|
|
155
|
+
const [hasCopied, setHasCopied] = (0, import_react3.useState)(false);
|
|
156
|
+
const [valueState, setValueState] = (0, import_react3.useState)(value);
|
|
157
|
+
(0, import_react3.useEffect)(() => setValueState(value), [value]);
|
|
98
158
|
const { timeout = 1500, ...copyOptions } = typeof optionsOrTimeout === "number" ? { timeout: optionsOrTimeout } : optionsOrTimeout;
|
|
99
|
-
const onCopy = (0,
|
|
159
|
+
const onCopy = (0, import_react3.useCallback)(() => {
|
|
100
160
|
const didCopy = (0, import_copy_to_clipboard.default)(valueState, copyOptions);
|
|
101
161
|
setHasCopied(didCopy);
|
|
102
162
|
}, [valueState, copyOptions]);
|
|
103
|
-
(0,
|
|
163
|
+
(0, import_react3.useEffect)(() => {
|
|
104
164
|
let timeoutId = null;
|
|
105
165
|
if (hasCopied) {
|
|
106
166
|
timeoutId = window.setTimeout(() => {
|
|
@@ -123,10 +183,10 @@ var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
|
|
|
123
183
|
var use_clipboard_default = useClipboard;
|
|
124
184
|
|
|
125
185
|
// src/hooks/use-debounce/use-debounce.ts
|
|
126
|
-
var
|
|
186
|
+
var import_react4 = require("react");
|
|
127
187
|
var useDebounce = ({ value, delay = 500 }) => {
|
|
128
|
-
const [debouncedValue, setDebouncedValue] = (0,
|
|
129
|
-
(0,
|
|
188
|
+
const [debouncedValue, setDebouncedValue] = (0, import_react4.useState)(value);
|
|
189
|
+
(0, import_react4.useEffect)(() => {
|
|
130
190
|
const timer = setTimeout(() => setDebouncedValue(value), delay || 500);
|
|
131
191
|
return () => {
|
|
132
192
|
clearTimeout(timer);
|
|
@@ -136,19 +196,47 @@ var useDebounce = ({ value, delay = 500 }) => {
|
|
|
136
196
|
};
|
|
137
197
|
var use_debounce_default = useDebounce;
|
|
138
198
|
|
|
199
|
+
// src/hooks/use-device-detect/use-device-detect.ts
|
|
200
|
+
var import_react5 = require("react");
|
|
201
|
+
var useDeviceDetect = () => {
|
|
202
|
+
return (0, import_react5.useMemo)(() => {
|
|
203
|
+
if (typeof navigator === "undefined") {
|
|
204
|
+
return {
|
|
205
|
+
isIpadOS: false,
|
|
206
|
+
isTablet: false,
|
|
207
|
+
isMobile: false,
|
|
208
|
+
isDesktop: true,
|
|
209
|
+
hasTouch: false
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const ua = navigator.userAgent;
|
|
213
|
+
const hasTouch = navigator.maxTouchPoints > 1;
|
|
214
|
+
const isMacLike = /Macintosh/i.test(ua);
|
|
215
|
+
const isExplicitIpad = /iPad/i.test(ua);
|
|
216
|
+
const isIpadOS = isExplicitIpad || isMacLike && hasTouch;
|
|
217
|
+
const isAndroidTablet = /Android/i.test(ua) && !/Mobile/i.test(ua);
|
|
218
|
+
const isTablet = isIpadOS || isAndroidTablet;
|
|
219
|
+
const isMobileUA = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini/i.test(ua);
|
|
220
|
+
const isMobile = isMobileUA && !isTablet;
|
|
221
|
+
const isDesktop = !isTablet && !isMobile;
|
|
222
|
+
return { isIpadOS, isTablet, isMobile, isDesktop, hasTouch };
|
|
223
|
+
}, []);
|
|
224
|
+
};
|
|
225
|
+
var use_device_detect_default = useDeviceDetect;
|
|
226
|
+
|
|
139
227
|
// src/hooks/use-dimensions/use-dimensions.ts
|
|
140
228
|
var import_css_box_model = require("css-box-model");
|
|
141
|
-
var
|
|
229
|
+
var import_react7 = require("react");
|
|
142
230
|
|
|
143
231
|
// src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts
|
|
144
|
-
var
|
|
145
|
-
var useSafeLayoutEffect = isBrowser ?
|
|
232
|
+
var import_react6 = require("react");
|
|
233
|
+
var useSafeLayoutEffect = isBrowser ? import_react6.useLayoutEffect : import_react6.useEffect;
|
|
146
234
|
var use_safe_layout_effect_default = useSafeLayoutEffect;
|
|
147
235
|
|
|
148
236
|
// src/hooks/use-dimensions/use-dimensions.ts
|
|
149
237
|
var useDimensions = (ref, observe) => {
|
|
150
|
-
const [dimensions, setDimensions] = (0,
|
|
151
|
-
const rafId = (0,
|
|
238
|
+
const [dimensions, setDimensions] = (0, import_react7.useState)(null);
|
|
239
|
+
const rafId = (0, import_react7.useRef)();
|
|
152
240
|
use_safe_layout_effect_default(() => {
|
|
153
241
|
const measure = () => {
|
|
154
242
|
const node = ref.current;
|
|
@@ -178,7 +266,7 @@ var useDimensions = (ref, observe) => {
|
|
|
178
266
|
var use_dimensions_default = useDimensions;
|
|
179
267
|
|
|
180
268
|
// src/hooks/use-disclosure/use-disclosure.ts
|
|
181
|
-
var
|
|
269
|
+
var import_react8 = require("react");
|
|
182
270
|
var useDisclosure = ({
|
|
183
271
|
onClose: onCloseProp,
|
|
184
272
|
onOpen: onOpenProp,
|
|
@@ -186,26 +274,26 @@ var useDisclosure = ({
|
|
|
186
274
|
defaultIsOpen: defaultIsOpenProp,
|
|
187
275
|
id: idProp
|
|
188
276
|
} = {}) => {
|
|
189
|
-
const [isOpenState, setIsOpenState] = (0,
|
|
277
|
+
const [isOpenState, setIsOpenState] = (0, import_react8.useState)(defaultIsOpenProp || false);
|
|
190
278
|
const isOpen = isOpenProp !== void 0 ? isOpenProp : isOpenState;
|
|
191
279
|
const isControlled = isOpenProp !== void 0;
|
|
192
|
-
const uid = (0,
|
|
280
|
+
const uid = (0, import_react8.useId)();
|
|
193
281
|
const id2 = idProp != null ? idProp : `disclosure-${uid}`;
|
|
194
282
|
const handleOpen = use_callback_ref_default(onOpenProp);
|
|
195
283
|
const handleClose = use_callback_ref_default(onCloseProp);
|
|
196
|
-
const onClose = (0,
|
|
284
|
+
const onClose = (0, import_react8.useCallback)(() => {
|
|
197
285
|
if (!isControlled) {
|
|
198
286
|
setIsOpenState(false);
|
|
199
287
|
}
|
|
200
288
|
handleClose == null ? void 0 : handleClose();
|
|
201
289
|
}, [isControlled, handleClose]);
|
|
202
|
-
const onOpen = (0,
|
|
290
|
+
const onOpen = (0, import_react8.useCallback)(() => {
|
|
203
291
|
if (!isControlled) {
|
|
204
292
|
setIsOpenState(true);
|
|
205
293
|
}
|
|
206
294
|
handleOpen == null ? void 0 : handleOpen();
|
|
207
295
|
}, [isControlled, handleOpen]);
|
|
208
|
-
const onToggle = (0,
|
|
296
|
+
const onToggle = (0, import_react8.useCallback)(() => {
|
|
209
297
|
if (isOpen) {
|
|
210
298
|
onClose();
|
|
211
299
|
} else {
|
|
@@ -241,49 +329,6 @@ var useDisclosure = ({
|
|
|
241
329
|
};
|
|
242
330
|
var use_disclosure_default = useDisclosure;
|
|
243
331
|
|
|
244
|
-
// src/hooks/use-media-query/use-media-query.ts
|
|
245
|
-
var import_react7 = require("react");
|
|
246
|
-
var useMediaQuery = (query, options = {}) => {
|
|
247
|
-
const { ssr = true, fallback } = options;
|
|
248
|
-
const queries = Array.isArray(query) ? query : [query];
|
|
249
|
-
let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];
|
|
250
|
-
fallbackValues = fallbackValues.filter((v) => v != null);
|
|
251
|
-
const [value, setValue] = (0, import_react7.useState)(() => {
|
|
252
|
-
return queries.map((data, index) => ({
|
|
253
|
-
media: data,
|
|
254
|
-
matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches
|
|
255
|
-
}));
|
|
256
|
-
});
|
|
257
|
-
(0, import_react7.useEffect)(() => {
|
|
258
|
-
const win = window;
|
|
259
|
-
setValue(
|
|
260
|
-
queries.map((data) => ({
|
|
261
|
-
media: data,
|
|
262
|
-
matches: win.matchMedia(data).matches
|
|
263
|
-
}))
|
|
264
|
-
);
|
|
265
|
-
const mql = queries.map((data) => win.matchMedia(data));
|
|
266
|
-
const handler = (evt) => {
|
|
267
|
-
setValue((prev) => {
|
|
268
|
-
return prev.slice().map((item) => {
|
|
269
|
-
if (item.media === evt.media) return { ...item, matches: evt.matches };
|
|
270
|
-
return item;
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
};
|
|
274
|
-
mql.forEach((data) => {
|
|
275
|
-
data.addEventListener("change", handler);
|
|
276
|
-
});
|
|
277
|
-
return () => {
|
|
278
|
-
mql.forEach((data) => {
|
|
279
|
-
data.removeEventListener("change", handler);
|
|
280
|
-
});
|
|
281
|
-
};
|
|
282
|
-
}, [window]);
|
|
283
|
-
return value.map((item) => item.matches);
|
|
284
|
-
};
|
|
285
|
-
var use_media_query_default = useMediaQuery;
|
|
286
|
-
|
|
287
332
|
// src/hooks/use-number-formatter/use-number-formatter.ts
|
|
288
333
|
var useNumberFormatter = ({
|
|
289
334
|
value,
|
|
@@ -316,10 +361,10 @@ var useNumberFormatter = ({
|
|
|
316
361
|
var use_number_formatter_default = useNumberFormatter;
|
|
317
362
|
|
|
318
363
|
// src/hooks/use-online-status/use-online-status.ts
|
|
319
|
-
var
|
|
364
|
+
var import_react9 = require("react");
|
|
320
365
|
var useOnlineStatus = () => {
|
|
321
|
-
const [isOnline, setIsOnline] = (0,
|
|
322
|
-
(0,
|
|
366
|
+
const [isOnline, setIsOnline] = (0, import_react9.useState)(navigator.onLine);
|
|
367
|
+
(0, import_react9.useEffect)(() => {
|
|
323
368
|
const handleEvent = () => setIsOnline(navigator.onLine);
|
|
324
369
|
window.addEventListener("online", handleEvent);
|
|
325
370
|
window.addEventListener("offline", handleEvent);
|
|
@@ -333,15 +378,15 @@ var useOnlineStatus = () => {
|
|
|
333
378
|
var use_online_status_default = useOnlineStatus;
|
|
334
379
|
|
|
335
380
|
// src/hooks/use-outside-click/use-outside-click.ts
|
|
336
|
-
var
|
|
381
|
+
var import_react10 = require("react");
|
|
337
382
|
var useOutsideClick = ({ enabled = true, ref, handler }) => {
|
|
338
383
|
const savedHandler = use_callback_ref_default(handler);
|
|
339
|
-
const stateRef = (0,
|
|
384
|
+
const stateRef = (0, import_react10.useRef)({
|
|
340
385
|
isPointerDown: false,
|
|
341
386
|
ignoreEmulatedMouseEvents: false
|
|
342
387
|
});
|
|
343
388
|
const state = stateRef.current;
|
|
344
|
-
(0,
|
|
389
|
+
(0, import_react10.useEffect)(() => {
|
|
345
390
|
if (!enabled) return void 0;
|
|
346
391
|
const onPointerDown = (e) => {
|
|
347
392
|
if (isValidEvent(e, ref)) {
|
|
@@ -671,9 +716,11 @@ var use_voucher_tnc_default = useVoucherTnc;
|
|
|
671
716
|
isBrowser,
|
|
672
717
|
isElement,
|
|
673
718
|
isValidEvent,
|
|
719
|
+
useBreakpoint,
|
|
674
720
|
useCallbackRef,
|
|
675
721
|
useClipboard,
|
|
676
722
|
useDebounce,
|
|
723
|
+
useDeviceDetect,
|
|
677
724
|
useDimensions,
|
|
678
725
|
useDisclosure,
|
|
679
726
|
useMediaQuery,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/hooks/use-callback-ref/use-callback-ref.ts","../src/hooks/use-clipboard/use-clipboard.ts","../src/hooks/use-debounce/use-debounce.ts","../src/hooks/use-dimensions/use-dimensions.ts","../src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts","../src/hooks/use-disclosure/use-disclosure.ts","../src/hooks/use-media-query/use-media-query.ts","../src/hooks/use-number-formatter/use-number-formatter.ts","../src/hooks/use-online-status/use-online-status.ts","../src/hooks/use-outside-click/use-outside-click.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.types.ts","../src/hooks/use-voucher-tnc/get-applies-to.ts","../src/hooks/use-voucher-tnc/get-bank-bin.ts","../src/hooks/use-voucher-tnc/get-period.ts","../src/hooks/use-voucher-tnc/get-usage-limit.ts","../src/hooks/use-voucher-tnc/use-voucher-method-terms.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.ts"],"sourcesContent":["export * from './dom';\nexport * from './hooks';\n","import type { RefObject } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst isElement = (el: any): el is Element => {\n return el != null && typeof el === 'object' && 'nodeType' in el && el.nodeType === Node.ELEMENT_NODE;\n};\n\nconst getOwnerDocument = (node?: Element | null): Document => {\n return isElement(node) ? (node.ownerDocument ?? document) : document;\n};\n\nconst isValidEvent = (event: any, ref: RefObject<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (event.button > 0) return false;\n // if the event target is no longer in the document\n if (target) {\n const doc = getOwnerDocument(target);\n if (!doc.contains(target)) return false;\n }\n\n return !ref.current?.contains(target);\n};\n\nconst canUseDOM = (): boolean => {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n};\n\nconst isBrowser = canUseDOM();\n\nexport { canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst useCallbackRef = <T extends (...args: any[]) => any>(callback: T | undefined, deps: DependencyList = []) => {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(((...args: any) => callbackRef.current?.(...args)) as T, deps);\n};\n\nexport default useCallbackRef;\n","import copy from 'copy-to-clipboard';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface UseClipboardOptions {\n timeout?: number;\n format?: string;\n}\n\nexport interface UseClipboardProps {\n value?: string;\n optionsOrTimeout?: number | UseClipboardOptions;\n}\n\nconst useClipboard = ({ value = '', optionsOrTimeout = {} }: UseClipboardProps = {}) => {\n const [hasCopied, setHasCopied] = useState(false);\n\n const [valueState, setValueState] = useState(value);\n useEffect(() => setValueState(value), [value]);\n\n const { timeout = 1500, ...copyOptions } =\n typeof optionsOrTimeout === 'number' ? { timeout: optionsOrTimeout } : optionsOrTimeout;\n\n const onCopy = useCallback(() => {\n const didCopy = copy(valueState, copyOptions);\n setHasCopied(didCopy);\n }, [valueState, copyOptions]);\n\n useEffect(() => {\n let timeoutId: number | null = null;\n\n if (hasCopied) {\n timeoutId = window.setTimeout(() => {\n setHasCopied(false);\n }, timeout);\n }\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [timeout, hasCopied]);\n\n return {\n value: valueState,\n setValue: setValueState,\n onCopy,\n hasCopied,\n };\n};\n\nexport default useClipboard;\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\n\nexport interface UseDebounceProps<T> {\n value: T;\n delay?: number;\n}\n\nconst useDebounce = <T>({ value, delay = 500 }: UseDebounceProps<T>) => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [JSON.stringify(value), delay]);\n\n return debouncedValue;\n};\n\nexport default useDebounce;\n","import type { BoxModel as BoxModelType } from 'css-box-model';\nimport { getBox } from 'css-box-model';\nimport type { RefObject } from 'react';\nimport { useRef, useState } from 'react';\n\nimport { useSafeLayoutEffect } from '../use-safe-layout-effect';\n\nexport type BoxModel = BoxModelType;\n\nconst useDimensions = (ref: RefObject<HTMLElement>, observe?: boolean) => {\n const [dimensions, setDimensions] = useState<BoxModelType | null>(null);\n const rafId = useRef<number>();\n\n useSafeLayoutEffect(() => {\n const measure = () => {\n const node = ref.current;\n if (!node) return;\n rafId.current = requestAnimationFrame(() => {\n const boxModel = getBox(node);\n setDimensions(boxModel);\n });\n };\n\n measure();\n\n if (observe) {\n window.addEventListener('resize', measure);\n window.addEventListener('scroll', measure);\n }\n\n return () => {\n if (observe) {\n window.removeEventListener('resize', measure);\n window.removeEventListener('scroll', measure);\n }\n\n if (rafId.current) {\n cancelAnimationFrame(rafId.current);\n }\n };\n }, [observe]);\n\n return dimensions;\n};\n\nexport default useDimensions;\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { isBrowser } from '../../dom';\n\nconst useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useSafeLayoutEffect;\n","import type { HTMLAttributes } from 'react';\nimport { useCallback, useId, useState } from 'react';\n\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseDisclosureProps {\n isOpen?: boolean;\n defaultIsOpen?: boolean;\n onClose?(): void;\n onOpen?(): void;\n id?: string;\n}\n\ntype HTMLProps = HTMLAttributes<HTMLElement>;\n\nconst useDisclosure = ({\n onClose: onCloseProp,\n onOpen: onOpenProp,\n isOpen: isOpenProp,\n defaultIsOpen: defaultIsOpenProp,\n id: idProp,\n}: UseDisclosureProps = {}) => {\n const [isOpenState, setIsOpenState] = useState(defaultIsOpenProp || false);\n const isOpen = isOpenProp !== undefined ? isOpenProp : isOpenState;\n const isControlled = isOpenProp !== undefined;\n const uid = useId();\n const id = idProp ?? `disclosure-${uid}`;\n\n const handleOpen = useCallbackRef(onOpenProp);\n const handleClose = useCallbackRef(onCloseProp);\n\n const onClose = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(false);\n }\n handleClose?.();\n }, [isControlled, handleClose]);\n\n const onOpen = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(true);\n }\n handleOpen?.();\n }, [isControlled, handleOpen]);\n\n const onToggle = useCallback(() => {\n if (isOpen) {\n onClose();\n } else {\n onOpen();\n }\n }, [isOpen, onOpen, onClose]);\n\n const getButtonProps = ({ onClick, ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n 'aria-expanded': isOpen,\n 'aria-controls': id,\n onClick(event) {\n onClick?.(event);\n onToggle();\n },\n };\n };\n\n const getDisclosureProps = ({ ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n hidden: !isOpen,\n id,\n };\n };\n\n return {\n onClose,\n onOpen,\n onToggle,\n getButtonProps,\n getDisclosureProps,\n isOpen,\n };\n};\n\nexport default useDisclosure;\n","import { useEffect, useState } from 'react';\n\nexport type UseMediaQueryOptions = {\n fallback?: boolean | boolean[];\n ssr?: boolean;\n};\n\nconst useMediaQuery = (query: string | string[], options: UseMediaQueryOptions = {}): boolean[] => {\n const { ssr = true, fallback } = options;\n\n const queries = Array.isArray(query) ? query : [query];\n\n let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];\n fallbackValues = fallbackValues.filter(v => v != null) as boolean[];\n\n const [value, setValue] = useState(() => {\n return queries.map((data, index) => ({\n media: data,\n matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches,\n }));\n });\n\n useEffect(() => {\n const win = window;\n setValue(\n queries.map(data => ({\n media: data,\n matches: win.matchMedia(data).matches,\n }))\n );\n\n const mql = queries.map(data => win.matchMedia(data));\n\n const handler = (evt: MediaQueryListEvent) => {\n setValue(prev => {\n return prev.slice().map(item => {\n if (item.media === evt.media) return { ...item, matches: evt.matches };\n return item;\n });\n });\n };\n\n mql.forEach(data => {\n data.addEventListener('change', handler);\n });\n\n return () => {\n mql.forEach(data => {\n data.removeEventListener('change', handler);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [window]);\n\n return value.map(item => item.matches);\n};\n\nexport default useMediaQuery;\n","export interface NumberFormatterProps {\n value: number;\n thousandSeparator?: string;\n decimalLength?: number;\n decimalSeparator?: string;\n prefix?: string;\n}\n\nconst useNumberFormatter = ({\n value,\n thousandSeparator = '.',\n decimalLength,\n decimalSeparator = ',',\n prefix = '',\n}: NumberFormatterProps): string => {\n const formatNumber = (number: number) => {\n const parts = number.toString().split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n let decimalPart = '';\n\n if (decimalLength !== undefined) {\n if (parts.length > 1 && decimalLength > 0) {\n decimalPart = decimalSeparator + parts[1].padEnd(decimalLength, '0').slice(0, decimalLength);\n } else if (decimalLength > 0) {\n decimalPart = decimalSeparator + '0'.repeat(decimalLength);\n }\n } else if (parts.length > 1) {\n decimalPart = decimalSeparator + parts[1];\n }\n\n return integerPart + decimalPart;\n };\n\n const formattedValue = formatNumber(value);\n\n if (formattedValue.charAt(0) === `-`) {\n return formattedValue.replace(/^-/g, `-${prefix}`);\n }\n\n return `${prefix}${formattedValue}`;\n};\n\nexport default useNumberFormatter;\n","import { useEffect, useState } from 'react';\n\nconst useOnlineStatus = () => {\n const [isOnline, setIsOnline] = useState(navigator.onLine);\n\n useEffect(() => {\n const handleEvent = () => setIsOnline(navigator.onLine);\n\n window.addEventListener('online', handleEvent);\n window.addEventListener('offline', handleEvent);\n return () => {\n window.removeEventListener('online', handleEvent);\n window.removeEventListener('offline', handleEvent);\n };\n }, []);\n\n return { isOnline, isOffline: !isOnline };\n};\n\nexport default useOnlineStatus;\n","import type { RefObject } from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport { getOwnerDocument, isValidEvent } from '../../dom';\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseOutsideClickProps {\n enabled?: boolean;\n ref: RefObject<HTMLElement>;\n handler?: (e: Event) => void;\n}\n\nconst useOutsideClick = ({ enabled = true, ref, handler }: UseOutsideClickProps): void => {\n const savedHandler = useCallbackRef(handler);\n\n const stateRef = useRef({\n isPointerDown: false,\n ignoreEmulatedMouseEvents: false,\n });\n\n const state = stateRef.current;\n\n useEffect(() => {\n if (!enabled) return undefined;\n const onPointerDown = <T extends PointerEvent | MouseEvent | TouchEvent>(e: T) => {\n if (isValidEvent(e, ref)) {\n state.isPointerDown = true;\n }\n };\n\n const onMouseUp = (event: MouseEvent) => {\n if (state.ignoreEmulatedMouseEvents) {\n state.ignoreEmulatedMouseEvents = false;\n return;\n }\n\n if (state.isPointerDown && handler && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n state.ignoreEmulatedMouseEvents = true;\n if (handler && state.isPointerDown && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const doc = getOwnerDocument(ref.current);\n doc.addEventListener('mousedown', onPointerDown, true);\n doc.addEventListener('mouseup', onMouseUp, true);\n doc.addEventListener('touchstart', onPointerDown, true);\n doc.addEventListener('touchend', onTouchEnd, true);\n\n return () => {\n doc.removeEventListener('mousedown', onPointerDown, true);\n doc.removeEventListener('mouseup', onMouseUp, true);\n doc.removeEventListener('touchstart', onPointerDown, true);\n doc.removeEventListener('touchend', onTouchEnd, true);\n };\n }, [handler, ref, savedHandler, state, enabled]);\n};\n\nexport default useOutsideClick;\n","export enum VoucherType {\n product = 'Product',\n order = 'Order',\n gift = 'Gift',\n freeShipping = 'Free Shipping',\n freeInsurance = 'Free Insurance',\n bundling = 'Bundling',\n payment = 'Payment',\n affiliate = 'Affiliate',\n}\n\nexport enum DiscountType {\n percentage = 'percentage',\n amount = 'amount',\n}\n\ntype CollectionType = {\n collectionId: number;\n name: string;\n};\n\ntype BrandType = {\n brandId: number;\n name: string;\n};\n\nexport type VoucherPaymentType = {\n bankId: number;\n bankName: string;\n paymentMethod: string[];\n bin: string[];\n creditBinGroup: string[];\n debitBinGroup: string[];\n};\n\nexport interface VoucherTncProps {\n type: string;\n discountType: string;\n discountValue: number | string;\n maxDiscountAmount: number | string;\n collections: CollectionType[];\n brands: BrandType[];\n eligibilityType: string | null;\n isCheckedMaxFee: boolean;\n limitFee: number | string;\n termsMinQty: number | string;\n termsMinTotalAmount: number | string;\n isOneTimeUsage: boolean;\n quota: number;\n transactionTerms: number;\n dateStart: string;\n dateEnd: string;\n isOneTimeUsagePerCard: boolean;\n payment: VoucherPaymentType | null;\n isGiftCard?: boolean;\n}\n\nexport type GetPeriodProps = Pick<VoucherTncProps, 'dateStart' | 'dateEnd'>;\nexport type GetAppliesToProps = Pick<\n VoucherTncProps,\n 'type' | 'brands' | 'collections' | 'eligibilityType' | 'payment'\n>;\nexport type GetMethodTermsProps = Pick<\n VoucherTncProps,\n | 'type'\n | 'discountType'\n | 'discountValue'\n | 'isCheckedMaxFee'\n | 'maxDiscountAmount'\n | 'transactionTerms'\n | 'termsMinTotalAmount'\n | 'termsMinQty'\n | 'limitFee'\n>;\nexport type GetUsageLimitProps = Pick<VoucherTncProps, 'isOneTimeUsage' | 'isOneTimeUsagePerCard'>;\nexport type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' | 'debitBinGroup'>;\n","import type { GetAppliesToProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nexport default function getAppliesTo(args: GetAppliesToProps): string {\n let appliesTo = '';\n const { type, eligibilityType, payment } = args;\n\n const collections = args.collections ?? [];\n const brands = args.brands ?? [];\n\n if (type === VoucherType.product) {\n if (collections.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari collection ${collections\n .map(value => value.name)\n .join(', ')}.`;\n } else if (brands.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari brand ${brands\n .map(value => value.name)\n .join(', ')}.`;\n } else if (eligibilityType === 'selected_products') {\n appliesTo = `Hanya berlaku untuk produk tertentu.`;\n }\n } else if (type === VoucherType.payment) {\n const { bankName, paymentMethod, creditBinGroup, debitBinGroup } = payment || {};\n const isFullPayment = (paymentMethod || []).some(pay => (pay || '').includes('(Full Payment)'));\n const isInstallment3 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 3x)'));\n const isInstallment6 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 6x)'));\n const isInstallment12 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 12x)'));\n const isInstallment18 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 18x)'));\n const isInstallment = isInstallment3 || isInstallment6 || isInstallment12 || isInstallment18;\n const isCredit = isFullPayment || isInstallment;\n const isDebit = (paymentMethod || []).some(pay => (pay || '').includes('Debit Card'));\n const debitAndCredit = [\n ...(isDebit && (debitBinGroup || []).length > 0 ? ['Kartu Debit'] : []),\n ...(isCredit && (creditBinGroup || []).length > 0 ? ['Kartu Kredit'] : []),\n ];\n let txtCreditSystem = '';\n\n if (isCredit) {\n const creditSystem = [\n ...(isFullPayment ? ['sistem pembayaran penuh'] : []),\n ...(isInstallment ? ['sistem cicilan'] : []),\n ];\n const installments = [\n ...(isInstallment3 ? ['3'] : []),\n ...(isInstallment6 ? ['6'] : []),\n ...(isInstallment12 ? ['12'] : []),\n ...(isInstallment18 ? ['18'] : []),\n ];\n let replacedStrInstallment = installments.join(' dan ');\n\n if (installments.length > 2) {\n const strInstallment = installments.join(', ');\n const lastCharIndex = strInstallment.lastIndexOf(',');\n const left = strInstallment.slice(0, lastCharIndex);\n const right = strInstallment.slice(lastCharIndex + 1, strInstallment.length);\n\n replacedStrInstallment = [left, right].join(', dan');\n }\n\n txtCreditSystem = [\n 'dengan',\n creditSystem.join(' dan '),\n ...(isInstallment ? [`(${replacedStrInstallment} bulan)`] : []),\n ].join(' ');\n }\n\n if (debitAndCredit.length > 0) {\n appliesTo = `${[\n 'Voucher berlaku untuk pembayaran menggunakan',\n debitAndCredit.join(' dan '),\n bankName,\n txtCreditSystem,\n ]\n .filter(txt => (txt || '').length > 0)\n .join(' ')}.`;\n }\n }\n\n return appliesTo;\n}\n","import type { GetBankBinProps } from './use-voucher-tnc.types';\n\nexport default function getBankBin(args: GetBankBinProps): string[] {\n const { bankName, creditBinGroup, debitBinGroup } = args;\n const txtCreditBin = (creditBinGroup || []).join(', ');\n const txtDebitBin = (debitBinGroup || []).join(', ');\n\n return [\n ...(bankName && txtCreditBin\n ? [`Voucher berlaku untuk Kartu Kredit ${bankName} dengan Bank Identification Number (BIN): ${txtCreditBin}.`]\n : []),\n ...(bankName && txtDebitBin\n ? [`Voucher berlaku untuk Kartu Debit ${bankName} dengan Bank Identification Number (BIN): ${txtDebitBin}.`]\n : []),\n ];\n}\n","import { format } from 'date-fns';\nimport { id } from 'date-fns/locale';\n\nimport type { GetPeriodProps } from './use-voucher-tnc.types';\n\nexport default function getPeriodText(args: GetPeriodProps): string {\n let period = '';\n const { dateStart, dateEnd } = args;\n\n if (dateStart && dateEnd) {\n const dateStartFormatter = format(new Date(dateStart), 'yyyy-MM-dd HH:mm');\n const dateEndFormatter = format(new Date(dateEnd), 'yyyy-MM-dd HH:mm');\n\n const dateStartSplitTime = dateStartFormatter.split(' ');\n const dateStartSplit = dateStartSplitTime[0].split('-');\n const dateStartYear = dateStartSplit[0];\n const dateStartMonth = dateStartSplit[1];\n const dateEndSplitTime = dateEndFormatter.split(' ');\n const dateEndSplit = dateEndSplitTime[0].split('-');\n const dateEndYear = dateEndSplit[0];\n const dateEndMonth = dateEndSplit[1];\n\n if (dateStartSplitTime[0] === dateEndSplitTime[0]) {\n period = `Voucher hanya berlaku di tanggal ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n } else if (dateStartYear !== dateEndYear) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n } else if (dateStartYear === dateEndYear) {\n if (dateStartMonth === dateEndMonth) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n {\n locale: id,\n }\n )}.`;\n } else {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n }\n }\n } else if (dateStart) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n }\n\n return period;\n}\n","import type { GetUsageLimitProps } from './use-voucher-tnc.types';\n\nexport default function getVoucherUsageLimit(args: GetUsageLimitProps): string {\n const { isOneTimeUsage, isOneTimeUsagePerCard } = args;\n\n if (!isOneTimeUsage && !isOneTimeUsagePerCard) {\n return '';\n }\n\n let usageLimit = '';\n\n if (isOneTimeUsage) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per member selama masa berlaku.';\n }\n\n if (isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per kartu selama masa berlaku.';\n }\n\n if (isOneTimeUsage && isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x transaksi untuk 1 kartu dan 1 member selama masa berlaku.';\n }\n\n return usageLimit;\n}\n","import { useNumberFormatter } from '../use-number-formatter';\nimport type { GetMethodTermsProps } from './use-voucher-tnc.types';\nimport { DiscountType, VoucherType } from './use-voucher-tnc.types';\n\nexport default function useVoucherMethodTerms(args: GetMethodTermsProps) {\n let methodTerm = '';\n const {\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n } = args;\n const safeNumber = (val: number | string): number => {\n if (typeof val === 'number') return val;\n\n return !Number.isNaN(Number(val)) ? Number(val) : 0;\n };\n const formattedMaxDiscount = useNumberFormatter({ value: safeNumber(maxDiscountAmount), prefix: 'Rp' });\n const formattedDiscountVal = useNumberFormatter({ value: safeNumber(discountValue), prefix: 'Rp' });\n const formattedLimitFee = useNumberFormatter({ value: safeNumber(limitFee), prefix: 'Rp' });\n const formattedMinTotalAmount = useNumberFormatter({ value: safeNumber(termsMinTotalAmount), prefix: 'Rp' });\n const formattedMinTotalQty = useNumberFormatter({ value: safeNumber(termsMinQty) });\n\n if (\n type === VoucherType.product ||\n type === VoucherType.order ||\n type === VoucherType.gift ||\n type === VoucherType.affiliate ||\n type === VoucherType.payment\n ) {\n if (discountType === DiscountType.percentage && type !== VoucherType.gift) {\n methodTerm = `Diskon ${discountValue || 0}%`;\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedMaxDiscount})`;\n }\n } else if (discountType === DiscountType.amount && type !== VoucherType.gift) {\n methodTerm = `Potongan ${formattedDiscountVal}`;\n } else {\n methodTerm = `Potongan ${formattedLimitFee}`;\n }\n } else if (type === VoucherType.freeShipping) {\n methodTerm = 'Shipping fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n } else if (type === VoucherType.freeInsurance) {\n methodTerm = 'Insurance fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n }\n\n switch (transactionTerms) {\n case 0:\n methodTerm += ' tanpa minimum pembelian.';\n break;\n case 1:\n methodTerm += ` dengan min. pembelian ${formattedMinTotalAmount}.`;\n break;\n case 2:\n methodTerm += ` dengan min. pembelian ${termsMinQty ? formattedMinTotalQty : 0} item.`;\n break;\n default:\n methodTerm += '';\n }\n\n return methodTerm;\n}\n","import getAppliesTo from './get-applies-to';\nimport getBankBin from './get-bank-bin';\nimport getPeriodText from './get-period';\nimport getVoucherUsageLimit from './get-usage-limit';\nimport getMethodTerms from './use-voucher-method-terms';\nimport type { VoucherTncProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nconst useVoucherTnc = (props: VoucherTncProps | null): string[] => {\n if (props) {\n const terms = [];\n const {\n dateEnd,\n dateStart,\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n collections,\n brands,\n eligibilityType,\n isOneTimeUsage,\n quota,\n isOneTimeUsagePerCard,\n payment,\n isGiftCard,\n } = props;\n const { bankName = '', creditBinGroup = [], debitBinGroup = [] } = payment || {};\n\n const period = getPeriodText({ dateStart, dateEnd });\n const appliesTo = getAppliesTo({ type, collections, brands, eligibilityType, payment });\n const methodTerms = getMethodTerms({\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n });\n const usageLimit = getVoucherUsageLimit({ isOneTimeUsage, isOneTimeUsagePerCard });\n const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });\n\n if (period) terms.push(period);\n if (methodTerms) terms.push(methodTerms);\n if (type === VoucherType.affiliate) {\n terms.push('Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.');\n }\n if (appliesTo) terms.push(appliesTo);\n if (usageLimit) terms.push(usageLimit);\n if (quota > 0) terms.push('Kuota voucher terbatas.');\n if ((bankBin || []).length > 0) terms.push(...bankBin);\n\n if (\n type === VoucherType.order ||\n type === VoucherType.payment ||\n type === VoucherType.freeInsurance ||\n (type === VoucherType.gift && !isGiftCard)\n ) {\n terms.push('Hanya berlaku untuk produk tertentu.');\n }\n\n return terms;\n }\n\n return [];\n};\n\nexport default useVoucherTnc;\n"],"mappings":"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","names":["import_react","copy","import_react","import_react","import_react","import_react","id","import_react","import_react","import_react","VoucherType","DiscountType"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/dom.ts","../src/hooks/use-breakpoint/use-breakpoint.ts","../src/hooks/use-media-query/use-media-query.ts","../src/hooks/use-callback-ref/use-callback-ref.ts","../src/hooks/use-clipboard/use-clipboard.ts","../src/hooks/use-debounce/use-debounce.ts","../src/hooks/use-device-detect/use-device-detect.ts","../src/hooks/use-dimensions/use-dimensions.ts","../src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts","../src/hooks/use-disclosure/use-disclosure.ts","../src/hooks/use-number-formatter/use-number-formatter.ts","../src/hooks/use-online-status/use-online-status.ts","../src/hooks/use-outside-click/use-outside-click.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.types.ts","../src/hooks/use-voucher-tnc/get-applies-to.ts","../src/hooks/use-voucher-tnc/get-bank-bin.ts","../src/hooks/use-voucher-tnc/get-period.ts","../src/hooks/use-voucher-tnc/get-usage-limit.ts","../src/hooks/use-voucher-tnc/use-voucher-method-terms.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.ts"],"sourcesContent":["export * from './dom';\nexport * from './hooks';\n","import type { RefObject } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst isElement = (el: any): el is Element => {\n return el != null && typeof el === 'object' && 'nodeType' in el && el.nodeType === Node.ELEMENT_NODE;\n};\n\nconst getOwnerDocument = (node?: Element | null): Document => {\n return isElement(node) ? (node.ownerDocument ?? document) : document;\n};\n\nconst isValidEvent = (event: any, ref: RefObject<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (event.button > 0) return false;\n // if the event target is no longer in the document\n if (target) {\n const doc = getOwnerDocument(target);\n if (!doc.contains(target)) return false;\n }\n\n return !ref.current?.contains(target);\n};\n\nconst canUseDOM = (): boolean => {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n};\n\nconst isBrowser = canUseDOM();\n\nexport { canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent };\n","import { tokens } from \"@ctlyst.id/voila-ui-core\";\n\nimport useMediaQuery from \"../use-media-query/use-media-query\";\n\nexport type Breakpoint = \"mobile\" | \"desktop\" | \"wide\";\n\n/**\n * Returns the current active breakpoint based on viewport width and orientation.\n *\n * Strategy (orientation-aware):\n * - mobile: default, including tablets/iPads in portrait (even iPad Pro 12.9\" at 1024×1366)\n * - desktop: viewport ≥ 1024px AND orientation landscape\n * - wide: viewport ≥ 1440px AND orientation landscape\n *\n * Uses the same media query strings as CSS (tokens.mediaQueries) so JS & CSS\n * switch at exactly the same points. Reactive to resize and orientation change\n * via matchMedia listeners — no refresh required.\n */\nexport const useBreakpoint = (): Breakpoint => {\n const [isWide, isDesktop] = useMediaQuery([\n tokens.mediaQueries.wide,\n tokens.mediaQueries.desktop,\n ]);\n\n if (isWide) return \"wide\";\n if (isDesktop) return \"desktop\";\n return \"mobile\";\n};\n\nexport default useBreakpoint;\n","import { useEffect, useState } from 'react';\n\nexport type UseMediaQueryOptions = {\n fallback?: boolean | boolean[];\n ssr?: boolean;\n};\n\nconst useMediaQuery = (query: string | string[], options: UseMediaQueryOptions = {}): boolean[] => {\n const { ssr = true, fallback } = options;\n\n const queries = Array.isArray(query) ? query : [query];\n\n let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];\n fallbackValues = fallbackValues.filter(v => v != null) as boolean[];\n\n const [value, setValue] = useState(() => {\n return queries.map((data, index) => ({\n media: data,\n matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches,\n }));\n });\n\n useEffect(() => {\n const win = window;\n setValue(\n queries.map(data => ({\n media: data,\n matches: win.matchMedia(data).matches,\n }))\n );\n\n const mql = queries.map(data => win.matchMedia(data));\n\n const handler = (evt: MediaQueryListEvent) => {\n setValue(prev => {\n return prev.slice().map(item => {\n if (item.media === evt.media) return { ...item, matches: evt.matches };\n return item;\n });\n });\n };\n\n mql.forEach(data => {\n data.addEventListener('change', handler);\n });\n\n return () => {\n mql.forEach(data => {\n data.removeEventListener('change', handler);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [window]);\n\n return value.map(item => item.matches);\n};\n\nexport default useMediaQuery;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst useCallbackRef = <T extends (...args: any[]) => any>(callback: T | undefined, deps: DependencyList = []) => {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(((...args: any) => callbackRef.current?.(...args)) as T, deps);\n};\n\nexport default useCallbackRef;\n","import copy from 'copy-to-clipboard';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface UseClipboardOptions {\n timeout?: number;\n format?: string;\n}\n\nexport interface UseClipboardProps {\n value?: string;\n optionsOrTimeout?: number | UseClipboardOptions;\n}\n\nconst useClipboard = ({ value = '', optionsOrTimeout = {} }: UseClipboardProps = {}) => {\n const [hasCopied, setHasCopied] = useState(false);\n\n const [valueState, setValueState] = useState(value);\n useEffect(() => setValueState(value), [value]);\n\n const { timeout = 1500, ...copyOptions } =\n typeof optionsOrTimeout === 'number' ? { timeout: optionsOrTimeout } : optionsOrTimeout;\n\n const onCopy = useCallback(() => {\n const didCopy = copy(valueState, copyOptions);\n setHasCopied(didCopy);\n }, [valueState, copyOptions]);\n\n useEffect(() => {\n let timeoutId: number | null = null;\n\n if (hasCopied) {\n timeoutId = window.setTimeout(() => {\n setHasCopied(false);\n }, timeout);\n }\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [timeout, hasCopied]);\n\n return {\n value: valueState,\n setValue: setValueState,\n onCopy,\n hasCopied,\n };\n};\n\nexport default useClipboard;\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\n\nexport interface UseDebounceProps<T> {\n value: T;\n delay?: number;\n}\n\nconst useDebounce = <T>({ value, delay = 500 }: UseDebounceProps<T>) => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [JSON.stringify(value), delay]);\n\n return debouncedValue;\n};\n\nexport default useDebounce;\n","import { useMemo } from \"react\";\n\nexport interface DeviceInfo {\n /** True if the device is an iPad (including iPads reporting as Mac in Safari since iPadOS 13) */\n isIpadOS: boolean;\n /** True if the device is any tablet (iPad or Android tablet) */\n isTablet: boolean;\n /** True if the device is a mobile phone */\n isMobile: boolean;\n /** True if the device is a desktop/laptop (no multi-touch signature) */\n isDesktop: boolean;\n /** True if the device supports multi-touch */\n hasTouch: boolean;\n}\n\n/**\n * Detect device type using feature detection (not User Agent string alone).\n *\n * Solves the iPad detection problem: since iPadOS 13, large iPads (Air, Pro)\n * report desktop Safari UA (\"Macintosh\"). We detect them by checking if a\n * \"Mac\" has multi-touch (`maxTouchPoints > 1`), which real Macs don't expose.\n *\n * Use this for JS decisions only (e.g. whether to show an install-app banner).\n * For styling/layout, prefer CSS breakpoints + capability variants — they react\n * to resize/rotate without JS re-render.\n */\nexport const useDeviceDetect = (): DeviceInfo => {\n return useMemo(() => {\n if (typeof navigator === \"undefined\") {\n return {\n isIpadOS: false,\n isTablet: false,\n isMobile: false,\n isDesktop: true,\n hasTouch: false,\n };\n }\n\n const ua = navigator.userAgent;\n const hasTouch = navigator.maxTouchPoints > 1;\n\n // iPad detection: UA says Mac but has multi-touch = iPadOS\n const isMacLike = /Macintosh/i.test(ua);\n const isExplicitIpad = /iPad/i.test(ua);\n const isIpadOS = isExplicitIpad || (isMacLike && hasTouch);\n\n // Android tablet: has \"Android\" but not \"Mobile\"\n const isAndroidTablet = /Android/i.test(ua) && !/Mobile/i.test(ua);\n\n const isTablet = isIpadOS || isAndroidTablet;\n\n // Mobile phone: explicit mobile UA and not a tablet\n const isMobileUA = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini/i.test(ua);\n const isMobile = isMobileUA && !isTablet;\n\n const isDesktop = !isTablet && !isMobile;\n\n return { isIpadOS, isTablet, isMobile, isDesktop, hasTouch };\n }, []);\n};\n\nexport default useDeviceDetect;\n","import type { BoxModel as BoxModelType } from 'css-box-model';\nimport { getBox } from 'css-box-model';\nimport type { RefObject } from 'react';\nimport { useRef, useState } from 'react';\n\nimport { useSafeLayoutEffect } from '../use-safe-layout-effect';\n\nexport type BoxModel = BoxModelType;\n\nconst useDimensions = (ref: RefObject<HTMLElement>, observe?: boolean) => {\n const [dimensions, setDimensions] = useState<BoxModelType | null>(null);\n const rafId = useRef<number>();\n\n useSafeLayoutEffect(() => {\n const measure = () => {\n const node = ref.current;\n if (!node) return;\n rafId.current = requestAnimationFrame(() => {\n const boxModel = getBox(node);\n setDimensions(boxModel);\n });\n };\n\n measure();\n\n if (observe) {\n window.addEventListener('resize', measure);\n window.addEventListener('scroll', measure);\n }\n\n return () => {\n if (observe) {\n window.removeEventListener('resize', measure);\n window.removeEventListener('scroll', measure);\n }\n\n if (rafId.current) {\n cancelAnimationFrame(rafId.current);\n }\n };\n }, [observe]);\n\n return dimensions;\n};\n\nexport default useDimensions;\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { isBrowser } from '../../dom';\n\nconst useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useSafeLayoutEffect;\n","import type { HTMLAttributes } from 'react';\nimport { useCallback, useId, useState } from 'react';\n\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseDisclosureProps {\n isOpen?: boolean;\n defaultIsOpen?: boolean;\n onClose?(): void;\n onOpen?(): void;\n id?: string;\n}\n\ntype HTMLProps = HTMLAttributes<HTMLElement>;\n\nconst useDisclosure = ({\n onClose: onCloseProp,\n onOpen: onOpenProp,\n isOpen: isOpenProp,\n defaultIsOpen: defaultIsOpenProp,\n id: idProp,\n}: UseDisclosureProps = {}) => {\n const [isOpenState, setIsOpenState] = useState(defaultIsOpenProp || false);\n const isOpen = isOpenProp !== undefined ? isOpenProp : isOpenState;\n const isControlled = isOpenProp !== undefined;\n const uid = useId();\n const id = idProp ?? `disclosure-${uid}`;\n\n const handleOpen = useCallbackRef(onOpenProp);\n const handleClose = useCallbackRef(onCloseProp);\n\n const onClose = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(false);\n }\n handleClose?.();\n }, [isControlled, handleClose]);\n\n const onOpen = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(true);\n }\n handleOpen?.();\n }, [isControlled, handleOpen]);\n\n const onToggle = useCallback(() => {\n if (isOpen) {\n onClose();\n } else {\n onOpen();\n }\n }, [isOpen, onOpen, onClose]);\n\n const getButtonProps = ({ onClick, ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n 'aria-expanded': isOpen,\n 'aria-controls': id,\n onClick(event) {\n onClick?.(event);\n onToggle();\n },\n };\n };\n\n const getDisclosureProps = ({ ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n hidden: !isOpen,\n id,\n };\n };\n\n return {\n onClose,\n onOpen,\n onToggle,\n getButtonProps,\n getDisclosureProps,\n isOpen,\n };\n};\n\nexport default useDisclosure;\n","export interface NumberFormatterProps {\n value: number;\n thousandSeparator?: string;\n decimalLength?: number;\n decimalSeparator?: string;\n prefix?: string;\n}\n\nconst useNumberFormatter = ({\n value,\n thousandSeparator = '.',\n decimalLength,\n decimalSeparator = ',',\n prefix = '',\n}: NumberFormatterProps): string => {\n const formatNumber = (number: number) => {\n const parts = number.toString().split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n let decimalPart = '';\n\n if (decimalLength !== undefined) {\n if (parts.length > 1 && decimalLength > 0) {\n decimalPart = decimalSeparator + parts[1].padEnd(decimalLength, '0').slice(0, decimalLength);\n } else if (decimalLength > 0) {\n decimalPart = decimalSeparator + '0'.repeat(decimalLength);\n }\n } else if (parts.length > 1) {\n decimalPart = decimalSeparator + parts[1];\n }\n\n return integerPart + decimalPart;\n };\n\n const formattedValue = formatNumber(value);\n\n if (formattedValue.charAt(0) === `-`) {\n return formattedValue.replace(/^-/g, `-${prefix}`);\n }\n\n return `${prefix}${formattedValue}`;\n};\n\nexport default useNumberFormatter;\n","import { useEffect, useState } from 'react';\n\nconst useOnlineStatus = () => {\n const [isOnline, setIsOnline] = useState(navigator.onLine);\n\n useEffect(() => {\n const handleEvent = () => setIsOnline(navigator.onLine);\n\n window.addEventListener('online', handleEvent);\n window.addEventListener('offline', handleEvent);\n return () => {\n window.removeEventListener('online', handleEvent);\n window.removeEventListener('offline', handleEvent);\n };\n }, []);\n\n return { isOnline, isOffline: !isOnline };\n};\n\nexport default useOnlineStatus;\n","import type { RefObject } from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport { getOwnerDocument, isValidEvent } from '../../dom';\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseOutsideClickProps {\n enabled?: boolean;\n ref: RefObject<HTMLElement>;\n handler?: (e: Event) => void;\n}\n\nconst useOutsideClick = ({ enabled = true, ref, handler }: UseOutsideClickProps): void => {\n const savedHandler = useCallbackRef(handler);\n\n const stateRef = useRef({\n isPointerDown: false,\n ignoreEmulatedMouseEvents: false,\n });\n\n const state = stateRef.current;\n\n useEffect(() => {\n if (!enabled) return undefined;\n const onPointerDown = <T extends PointerEvent | MouseEvent | TouchEvent>(e: T) => {\n if (isValidEvent(e, ref)) {\n state.isPointerDown = true;\n }\n };\n\n const onMouseUp = (event: MouseEvent) => {\n if (state.ignoreEmulatedMouseEvents) {\n state.ignoreEmulatedMouseEvents = false;\n return;\n }\n\n if (state.isPointerDown && handler && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n state.ignoreEmulatedMouseEvents = true;\n if (handler && state.isPointerDown && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const doc = getOwnerDocument(ref.current);\n doc.addEventListener('mousedown', onPointerDown, true);\n doc.addEventListener('mouseup', onMouseUp, true);\n doc.addEventListener('touchstart', onPointerDown, true);\n doc.addEventListener('touchend', onTouchEnd, true);\n\n return () => {\n doc.removeEventListener('mousedown', onPointerDown, true);\n doc.removeEventListener('mouseup', onMouseUp, true);\n doc.removeEventListener('touchstart', onPointerDown, true);\n doc.removeEventListener('touchend', onTouchEnd, true);\n };\n }, [handler, ref, savedHandler, state, enabled]);\n};\n\nexport default useOutsideClick;\n","export enum VoucherType {\n product = 'Product',\n order = 'Order',\n gift = 'Gift',\n freeShipping = 'Free Shipping',\n freeInsurance = 'Free Insurance',\n bundling = 'Bundling',\n payment = 'Payment',\n affiliate = 'Affiliate',\n}\n\nexport enum DiscountType {\n percentage = 'percentage',\n amount = 'amount',\n}\n\ntype CollectionType = {\n collectionId: number;\n name: string;\n};\n\ntype BrandType = {\n brandId: number;\n name: string;\n};\n\nexport type VoucherPaymentType = {\n bankId: number;\n bankName: string;\n paymentMethod: string[];\n bin: string[];\n creditBinGroup: string[];\n debitBinGroup: string[];\n};\n\nexport interface VoucherTncProps {\n type: string;\n discountType: string;\n discountValue: number | string;\n maxDiscountAmount: number | string;\n collections: CollectionType[];\n brands: BrandType[];\n eligibilityType: string | null;\n isCheckedMaxFee: boolean;\n limitFee: number | string;\n termsMinQty: number | string;\n termsMinTotalAmount: number | string;\n isOneTimeUsage: boolean;\n quota: number;\n transactionTerms: number;\n dateStart: string;\n dateEnd: string;\n isOneTimeUsagePerCard: boolean;\n payment: VoucherPaymentType | null;\n isGiftCard?: boolean;\n}\n\nexport type GetPeriodProps = Pick<VoucherTncProps, 'dateStart' | 'dateEnd'>;\nexport type GetAppliesToProps = Pick<\n VoucherTncProps,\n 'type' | 'brands' | 'collections' | 'eligibilityType' | 'payment'\n>;\nexport type GetMethodTermsProps = Pick<\n VoucherTncProps,\n | 'type'\n | 'discountType'\n | 'discountValue'\n | 'isCheckedMaxFee'\n | 'maxDiscountAmount'\n | 'transactionTerms'\n | 'termsMinTotalAmount'\n | 'termsMinQty'\n | 'limitFee'\n>;\nexport type GetUsageLimitProps = Pick<VoucherTncProps, 'isOneTimeUsage' | 'isOneTimeUsagePerCard'>;\nexport type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' | 'debitBinGroup'>;\n","import type { GetAppliesToProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nexport default function getAppliesTo(args: GetAppliesToProps): string {\n let appliesTo = '';\n const { type, eligibilityType, payment } = args;\n\n const collections = args.collections ?? [];\n const brands = args.brands ?? [];\n\n if (type === VoucherType.product) {\n if (collections.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari collection ${collections\n .map(value => value.name)\n .join(', ')}.`;\n } else if (brands.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari brand ${brands\n .map(value => value.name)\n .join(', ')}.`;\n } else if (eligibilityType === 'selected_products') {\n appliesTo = `Hanya berlaku untuk produk tertentu.`;\n }\n } else if (type === VoucherType.payment) {\n const { bankName, paymentMethod, creditBinGroup, debitBinGroup } = payment || {};\n const isFullPayment = (paymentMethod || []).some(pay => (pay || '').includes('(Full Payment)'));\n const isInstallment3 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 3x)'));\n const isInstallment6 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 6x)'));\n const isInstallment12 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 12x)'));\n const isInstallment18 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 18x)'));\n const isInstallment = isInstallment3 || isInstallment6 || isInstallment12 || isInstallment18;\n const isCredit = isFullPayment || isInstallment;\n const isDebit = (paymentMethod || []).some(pay => (pay || '').includes('Debit Card'));\n const debitAndCredit = [\n ...(isDebit && (debitBinGroup || []).length > 0 ? ['Kartu Debit'] : []),\n ...(isCredit && (creditBinGroup || []).length > 0 ? ['Kartu Kredit'] : []),\n ];\n let txtCreditSystem = '';\n\n if (isCredit) {\n const creditSystem = [\n ...(isFullPayment ? ['sistem pembayaran penuh'] : []),\n ...(isInstallment ? ['sistem cicilan'] : []),\n ];\n const installments = [\n ...(isInstallment3 ? ['3'] : []),\n ...(isInstallment6 ? ['6'] : []),\n ...(isInstallment12 ? ['12'] : []),\n ...(isInstallment18 ? ['18'] : []),\n ];\n let replacedStrInstallment = installments.join(' dan ');\n\n if (installments.length > 2) {\n const strInstallment = installments.join(', ');\n const lastCharIndex = strInstallment.lastIndexOf(',');\n const left = strInstallment.slice(0, lastCharIndex);\n const right = strInstallment.slice(lastCharIndex + 1, strInstallment.length);\n\n replacedStrInstallment = [left, right].join(', dan');\n }\n\n txtCreditSystem = [\n 'dengan',\n creditSystem.join(' dan '),\n ...(isInstallment ? [`(${replacedStrInstallment} bulan)`] : []),\n ].join(' ');\n }\n\n if (debitAndCredit.length > 0) {\n appliesTo = `${[\n 'Voucher berlaku untuk pembayaran menggunakan',\n debitAndCredit.join(' dan '),\n bankName,\n txtCreditSystem,\n ]\n .filter(txt => (txt || '').length > 0)\n .join(' ')}.`;\n }\n }\n\n return appliesTo;\n}\n","import type { GetBankBinProps } from './use-voucher-tnc.types';\n\nexport default function getBankBin(args: GetBankBinProps): string[] {\n const { bankName, creditBinGroup, debitBinGroup } = args;\n const txtCreditBin = (creditBinGroup || []).join(', ');\n const txtDebitBin = (debitBinGroup || []).join(', ');\n\n return [\n ...(bankName && txtCreditBin\n ? [`Voucher berlaku untuk Kartu Kredit ${bankName} dengan Bank Identification Number (BIN): ${txtCreditBin}.`]\n : []),\n ...(bankName && txtDebitBin\n ? [`Voucher berlaku untuk Kartu Debit ${bankName} dengan Bank Identification Number (BIN): ${txtDebitBin}.`]\n : []),\n ];\n}\n","import { format } from 'date-fns';\nimport { id } from 'date-fns/locale';\n\nimport type { GetPeriodProps } from './use-voucher-tnc.types';\n\nexport default function getPeriodText(args: GetPeriodProps): string {\n let period = '';\n const { dateStart, dateEnd } = args;\n\n if (dateStart && dateEnd) {\n const dateStartFormatter = format(new Date(dateStart), 'yyyy-MM-dd HH:mm');\n const dateEndFormatter = format(new Date(dateEnd), 'yyyy-MM-dd HH:mm');\n\n const dateStartSplitTime = dateStartFormatter.split(' ');\n const dateStartSplit = dateStartSplitTime[0].split('-');\n const dateStartYear = dateStartSplit[0];\n const dateStartMonth = dateStartSplit[1];\n const dateEndSplitTime = dateEndFormatter.split(' ');\n const dateEndSplit = dateEndSplitTime[0].split('-');\n const dateEndYear = dateEndSplit[0];\n const dateEndMonth = dateEndSplit[1];\n\n if (dateStartSplitTime[0] === dateEndSplitTime[0]) {\n period = `Voucher hanya berlaku di tanggal ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n } else if (dateStartYear !== dateEndYear) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n } else if (dateStartYear === dateEndYear) {\n if (dateStartMonth === dateEndMonth) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n {\n locale: id,\n }\n )}.`;\n } else {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n }\n }\n } else if (dateStart) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n }\n\n return period;\n}\n","import type { GetUsageLimitProps } from './use-voucher-tnc.types';\n\nexport default function getVoucherUsageLimit(args: GetUsageLimitProps): string {\n const { isOneTimeUsage, isOneTimeUsagePerCard } = args;\n\n if (!isOneTimeUsage && !isOneTimeUsagePerCard) {\n return '';\n }\n\n let usageLimit = '';\n\n if (isOneTimeUsage) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per member selama masa berlaku.';\n }\n\n if (isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per kartu selama masa berlaku.';\n }\n\n if (isOneTimeUsage && isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x transaksi untuk 1 kartu dan 1 member selama masa berlaku.';\n }\n\n return usageLimit;\n}\n","import { useNumberFormatter } from '../use-number-formatter';\nimport type { GetMethodTermsProps } from './use-voucher-tnc.types';\nimport { DiscountType, VoucherType } from './use-voucher-tnc.types';\n\nexport default function useVoucherMethodTerms(args: GetMethodTermsProps) {\n let methodTerm = '';\n const {\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n } = args;\n const safeNumber = (val: number | string): number => {\n if (typeof val === 'number') return val;\n\n return !Number.isNaN(Number(val)) ? Number(val) : 0;\n };\n const formattedMaxDiscount = useNumberFormatter({ value: safeNumber(maxDiscountAmount), prefix: 'Rp' });\n const formattedDiscountVal = useNumberFormatter({ value: safeNumber(discountValue), prefix: 'Rp' });\n const formattedLimitFee = useNumberFormatter({ value: safeNumber(limitFee), prefix: 'Rp' });\n const formattedMinTotalAmount = useNumberFormatter({ value: safeNumber(termsMinTotalAmount), prefix: 'Rp' });\n const formattedMinTotalQty = useNumberFormatter({ value: safeNumber(termsMinQty) });\n\n if (\n type === VoucherType.product ||\n type === VoucherType.order ||\n type === VoucherType.gift ||\n type === VoucherType.affiliate ||\n type === VoucherType.payment\n ) {\n if (discountType === DiscountType.percentage && type !== VoucherType.gift) {\n methodTerm = `Diskon ${discountValue || 0}%`;\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedMaxDiscount})`;\n }\n } else if (discountType === DiscountType.amount && type !== VoucherType.gift) {\n methodTerm = `Potongan ${formattedDiscountVal}`;\n } else {\n methodTerm = `Potongan ${formattedLimitFee}`;\n }\n } else if (type === VoucherType.freeShipping) {\n methodTerm = 'Shipping fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n } else if (type === VoucherType.freeInsurance) {\n methodTerm = 'Insurance fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n }\n\n switch (transactionTerms) {\n case 0:\n methodTerm += ' tanpa minimum pembelian.';\n break;\n case 1:\n methodTerm += ` dengan min. pembelian ${formattedMinTotalAmount}.`;\n break;\n case 2:\n methodTerm += ` dengan min. pembelian ${termsMinQty ? formattedMinTotalQty : 0} item.`;\n break;\n default:\n methodTerm += '';\n }\n\n return methodTerm;\n}\n","import getAppliesTo from './get-applies-to';\nimport getBankBin from './get-bank-bin';\nimport getPeriodText from './get-period';\nimport getVoucherUsageLimit from './get-usage-limit';\nimport getMethodTerms from './use-voucher-method-terms';\nimport type { VoucherTncProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nconst useVoucherTnc = (props: VoucherTncProps | null): string[] => {\n if (props) {\n const terms = [];\n const {\n dateEnd,\n dateStart,\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n collections,\n brands,\n eligibilityType,\n isOneTimeUsage,\n quota,\n isOneTimeUsagePerCard,\n payment,\n isGiftCard,\n } = props;\n const { bankName = '', creditBinGroup = [], debitBinGroup = [] } = payment || {};\n\n const period = getPeriodText({ dateStart, dateEnd });\n const appliesTo = getAppliesTo({ type, collections, brands, eligibilityType, payment });\n const methodTerms = getMethodTerms({\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n });\n const usageLimit = getVoucherUsageLimit({ isOneTimeUsage, isOneTimeUsagePerCard });\n const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });\n\n if (period) terms.push(period);\n if (methodTerms) terms.push(methodTerms);\n if (type === VoucherType.affiliate) {\n terms.push('Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.');\n }\n if (appliesTo) terms.push(appliesTo);\n if (usageLimit) terms.push(usageLimit);\n if (quota > 0) terms.push('Kuota voucher terbatas.');\n if ((bankBin || []).length > 0) terms.push(...bankBin);\n\n if (\n type === VoucherType.order ||\n type === VoucherType.payment ||\n type === VoucherType.freeInsurance ||\n (type === VoucherType.gift && !isGiftCard)\n ) {\n terms.push('Hanya berlaku untuk produk tertentu.');\n }\n\n return terms;\n }\n\n return [];\n};\n\nexport default useVoucherTnc;\n"],"mappings":"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","names":["import_react","import_react","copy","import_react","import_react","import_react","import_react","import_react","id","import_react","import_react","VoucherType","DiscountType"]}
|
package/dist/index.mjs
CHANGED
|
@@ -21,11 +21,69 @@ var canUseDOM = () => {
|
|
|
21
21
|
};
|
|
22
22
|
var isBrowser = canUseDOM();
|
|
23
23
|
|
|
24
|
+
// src/hooks/use-breakpoint/use-breakpoint.ts
|
|
25
|
+
import { tokens } from "@ctlyst.id/voila-ui-core";
|
|
26
|
+
|
|
27
|
+
// src/hooks/use-media-query/use-media-query.ts
|
|
28
|
+
import { useEffect, useState } from "react";
|
|
29
|
+
var useMediaQuery = (query, options = {}) => {
|
|
30
|
+
const { ssr = true, fallback } = options;
|
|
31
|
+
const queries = Array.isArray(query) ? query : [query];
|
|
32
|
+
let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];
|
|
33
|
+
fallbackValues = fallbackValues.filter((v) => v != null);
|
|
34
|
+
const [value, setValue] = useState(() => {
|
|
35
|
+
return queries.map((data, index) => ({
|
|
36
|
+
media: data,
|
|
37
|
+
matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
const win = window;
|
|
42
|
+
setValue(
|
|
43
|
+
queries.map((data) => ({
|
|
44
|
+
media: data,
|
|
45
|
+
matches: win.matchMedia(data).matches
|
|
46
|
+
}))
|
|
47
|
+
);
|
|
48
|
+
const mql = queries.map((data) => win.matchMedia(data));
|
|
49
|
+
const handler = (evt) => {
|
|
50
|
+
setValue((prev) => {
|
|
51
|
+
return prev.slice().map((item) => {
|
|
52
|
+
if (item.media === evt.media) return { ...item, matches: evt.matches };
|
|
53
|
+
return item;
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
mql.forEach((data) => {
|
|
58
|
+
data.addEventListener("change", handler);
|
|
59
|
+
});
|
|
60
|
+
return () => {
|
|
61
|
+
mql.forEach((data) => {
|
|
62
|
+
data.removeEventListener("change", handler);
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
}, [window]);
|
|
66
|
+
return value.map((item) => item.matches);
|
|
67
|
+
};
|
|
68
|
+
var use_media_query_default = useMediaQuery;
|
|
69
|
+
|
|
70
|
+
// src/hooks/use-breakpoint/use-breakpoint.ts
|
|
71
|
+
var useBreakpoint = () => {
|
|
72
|
+
const [isWide, isDesktop] = use_media_query_default([
|
|
73
|
+
tokens.mediaQueries.wide,
|
|
74
|
+
tokens.mediaQueries.desktop
|
|
75
|
+
]);
|
|
76
|
+
if (isWide) return "wide";
|
|
77
|
+
if (isDesktop) return "desktop";
|
|
78
|
+
return "mobile";
|
|
79
|
+
};
|
|
80
|
+
var use_breakpoint_default = useBreakpoint;
|
|
81
|
+
|
|
24
82
|
// src/hooks/use-callback-ref/use-callback-ref.ts
|
|
25
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
83
|
+
import { useCallback, useEffect as useEffect2, useRef } from "react";
|
|
26
84
|
var useCallbackRef = (callback, deps = []) => {
|
|
27
85
|
const callbackRef = useRef(callback);
|
|
28
|
-
|
|
86
|
+
useEffect2(() => {
|
|
29
87
|
callbackRef.current = callback;
|
|
30
88
|
});
|
|
31
89
|
return useCallback((...args) => {
|
|
@@ -37,17 +95,17 @@ var use_callback_ref_default = useCallbackRef;
|
|
|
37
95
|
|
|
38
96
|
// src/hooks/use-clipboard/use-clipboard.ts
|
|
39
97
|
import copy from "copy-to-clipboard";
|
|
40
|
-
import { useCallback as useCallback2, useEffect as
|
|
98
|
+
import { useCallback as useCallback2, useEffect as useEffect3, useState as useState2 } from "react";
|
|
41
99
|
var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
|
|
42
|
-
const [hasCopied, setHasCopied] =
|
|
43
|
-
const [valueState, setValueState] =
|
|
44
|
-
|
|
100
|
+
const [hasCopied, setHasCopied] = useState2(false);
|
|
101
|
+
const [valueState, setValueState] = useState2(value);
|
|
102
|
+
useEffect3(() => setValueState(value), [value]);
|
|
45
103
|
const { timeout = 1500, ...copyOptions } = typeof optionsOrTimeout === "number" ? { timeout: optionsOrTimeout } : optionsOrTimeout;
|
|
46
104
|
const onCopy = useCallback2(() => {
|
|
47
105
|
const didCopy = copy(valueState, copyOptions);
|
|
48
106
|
setHasCopied(didCopy);
|
|
49
107
|
}, [valueState, copyOptions]);
|
|
50
|
-
|
|
108
|
+
useEffect3(() => {
|
|
51
109
|
let timeoutId = null;
|
|
52
110
|
if (hasCopied) {
|
|
53
111
|
timeoutId = window.setTimeout(() => {
|
|
@@ -70,10 +128,10 @@ var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
|
|
|
70
128
|
var use_clipboard_default = useClipboard;
|
|
71
129
|
|
|
72
130
|
// src/hooks/use-debounce/use-debounce.ts
|
|
73
|
-
import { useEffect as
|
|
131
|
+
import { useEffect as useEffect4, useState as useState3 } from "react";
|
|
74
132
|
var useDebounce = ({ value, delay = 500 }) => {
|
|
75
|
-
const [debouncedValue, setDebouncedValue] =
|
|
76
|
-
|
|
133
|
+
const [debouncedValue, setDebouncedValue] = useState3(value);
|
|
134
|
+
useEffect4(() => {
|
|
77
135
|
const timer = setTimeout(() => setDebouncedValue(value), delay || 500);
|
|
78
136
|
return () => {
|
|
79
137
|
clearTimeout(timer);
|
|
@@ -83,18 +141,46 @@ var useDebounce = ({ value, delay = 500 }) => {
|
|
|
83
141
|
};
|
|
84
142
|
var use_debounce_default = useDebounce;
|
|
85
143
|
|
|
144
|
+
// src/hooks/use-device-detect/use-device-detect.ts
|
|
145
|
+
import { useMemo } from "react";
|
|
146
|
+
var useDeviceDetect = () => {
|
|
147
|
+
return useMemo(() => {
|
|
148
|
+
if (typeof navigator === "undefined") {
|
|
149
|
+
return {
|
|
150
|
+
isIpadOS: false,
|
|
151
|
+
isTablet: false,
|
|
152
|
+
isMobile: false,
|
|
153
|
+
isDesktop: true,
|
|
154
|
+
hasTouch: false
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const ua = navigator.userAgent;
|
|
158
|
+
const hasTouch = navigator.maxTouchPoints > 1;
|
|
159
|
+
const isMacLike = /Macintosh/i.test(ua);
|
|
160
|
+
const isExplicitIpad = /iPad/i.test(ua);
|
|
161
|
+
const isIpadOS = isExplicitIpad || isMacLike && hasTouch;
|
|
162
|
+
const isAndroidTablet = /Android/i.test(ua) && !/Mobile/i.test(ua);
|
|
163
|
+
const isTablet = isIpadOS || isAndroidTablet;
|
|
164
|
+
const isMobileUA = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini/i.test(ua);
|
|
165
|
+
const isMobile = isMobileUA && !isTablet;
|
|
166
|
+
const isDesktop = !isTablet && !isMobile;
|
|
167
|
+
return { isIpadOS, isTablet, isMobile, isDesktop, hasTouch };
|
|
168
|
+
}, []);
|
|
169
|
+
};
|
|
170
|
+
var use_device_detect_default = useDeviceDetect;
|
|
171
|
+
|
|
86
172
|
// src/hooks/use-dimensions/use-dimensions.ts
|
|
87
173
|
import { getBox } from "css-box-model";
|
|
88
|
-
import { useRef as useRef2, useState as
|
|
174
|
+
import { useRef as useRef2, useState as useState4 } from "react";
|
|
89
175
|
|
|
90
176
|
// src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts
|
|
91
|
-
import { useEffect as
|
|
92
|
-
var useSafeLayoutEffect = isBrowser ? useLayoutEffect :
|
|
177
|
+
import { useEffect as useEffect5, useLayoutEffect } from "react";
|
|
178
|
+
var useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect5;
|
|
93
179
|
var use_safe_layout_effect_default = useSafeLayoutEffect;
|
|
94
180
|
|
|
95
181
|
// src/hooks/use-dimensions/use-dimensions.ts
|
|
96
182
|
var useDimensions = (ref, observe) => {
|
|
97
|
-
const [dimensions, setDimensions] =
|
|
183
|
+
const [dimensions, setDimensions] = useState4(null);
|
|
98
184
|
const rafId = useRef2();
|
|
99
185
|
use_safe_layout_effect_default(() => {
|
|
100
186
|
const measure = () => {
|
|
@@ -125,7 +211,7 @@ var useDimensions = (ref, observe) => {
|
|
|
125
211
|
var use_dimensions_default = useDimensions;
|
|
126
212
|
|
|
127
213
|
// src/hooks/use-disclosure/use-disclosure.ts
|
|
128
|
-
import { useCallback as useCallback3, useId, useState as
|
|
214
|
+
import { useCallback as useCallback3, useId, useState as useState5 } from "react";
|
|
129
215
|
var useDisclosure = ({
|
|
130
216
|
onClose: onCloseProp,
|
|
131
217
|
onOpen: onOpenProp,
|
|
@@ -133,7 +219,7 @@ var useDisclosure = ({
|
|
|
133
219
|
defaultIsOpen: defaultIsOpenProp,
|
|
134
220
|
id: idProp
|
|
135
221
|
} = {}) => {
|
|
136
|
-
const [isOpenState, setIsOpenState] =
|
|
222
|
+
const [isOpenState, setIsOpenState] = useState5(defaultIsOpenProp || false);
|
|
137
223
|
const isOpen = isOpenProp !== void 0 ? isOpenProp : isOpenState;
|
|
138
224
|
const isControlled = isOpenProp !== void 0;
|
|
139
225
|
const uid = useId();
|
|
@@ -188,49 +274,6 @@ var useDisclosure = ({
|
|
|
188
274
|
};
|
|
189
275
|
var use_disclosure_default = useDisclosure;
|
|
190
276
|
|
|
191
|
-
// src/hooks/use-media-query/use-media-query.ts
|
|
192
|
-
import { useEffect as useEffect5, useState as useState5 } from "react";
|
|
193
|
-
var useMediaQuery = (query, options = {}) => {
|
|
194
|
-
const { ssr = true, fallback } = options;
|
|
195
|
-
const queries = Array.isArray(query) ? query : [query];
|
|
196
|
-
let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];
|
|
197
|
-
fallbackValues = fallbackValues.filter((v) => v != null);
|
|
198
|
-
const [value, setValue] = useState5(() => {
|
|
199
|
-
return queries.map((data, index) => ({
|
|
200
|
-
media: data,
|
|
201
|
-
matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches
|
|
202
|
-
}));
|
|
203
|
-
});
|
|
204
|
-
useEffect5(() => {
|
|
205
|
-
const win = window;
|
|
206
|
-
setValue(
|
|
207
|
-
queries.map((data) => ({
|
|
208
|
-
media: data,
|
|
209
|
-
matches: win.matchMedia(data).matches
|
|
210
|
-
}))
|
|
211
|
-
);
|
|
212
|
-
const mql = queries.map((data) => win.matchMedia(data));
|
|
213
|
-
const handler = (evt) => {
|
|
214
|
-
setValue((prev) => {
|
|
215
|
-
return prev.slice().map((item) => {
|
|
216
|
-
if (item.media === evt.media) return { ...item, matches: evt.matches };
|
|
217
|
-
return item;
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
};
|
|
221
|
-
mql.forEach((data) => {
|
|
222
|
-
data.addEventListener("change", handler);
|
|
223
|
-
});
|
|
224
|
-
return () => {
|
|
225
|
-
mql.forEach((data) => {
|
|
226
|
-
data.removeEventListener("change", handler);
|
|
227
|
-
});
|
|
228
|
-
};
|
|
229
|
-
}, [window]);
|
|
230
|
-
return value.map((item) => item.matches);
|
|
231
|
-
};
|
|
232
|
-
var use_media_query_default = useMediaQuery;
|
|
233
|
-
|
|
234
277
|
// src/hooks/use-number-formatter/use-number-formatter.ts
|
|
235
278
|
var useNumberFormatter = ({
|
|
236
279
|
value,
|
|
@@ -617,9 +660,11 @@ export {
|
|
|
617
660
|
isBrowser,
|
|
618
661
|
isElement,
|
|
619
662
|
isValidEvent,
|
|
663
|
+
use_breakpoint_default as useBreakpoint,
|
|
620
664
|
use_callback_ref_default as useCallbackRef,
|
|
621
665
|
use_clipboard_default as useClipboard,
|
|
622
666
|
use_debounce_default as useDebounce,
|
|
667
|
+
use_device_detect_default as useDeviceDetect,
|
|
623
668
|
use_dimensions_default as useDimensions,
|
|
624
669
|
use_disclosure_default as useDisclosure,
|
|
625
670
|
use_media_query_default as useMediaQuery,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom.ts","../src/hooks/use-callback-ref/use-callback-ref.ts","../src/hooks/use-clipboard/use-clipboard.ts","../src/hooks/use-debounce/use-debounce.ts","../src/hooks/use-dimensions/use-dimensions.ts","../src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts","../src/hooks/use-disclosure/use-disclosure.ts","../src/hooks/use-media-query/use-media-query.ts","../src/hooks/use-number-formatter/use-number-formatter.ts","../src/hooks/use-online-status/use-online-status.ts","../src/hooks/use-outside-click/use-outside-click.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.types.ts","../src/hooks/use-voucher-tnc/get-applies-to.ts","../src/hooks/use-voucher-tnc/get-bank-bin.ts","../src/hooks/use-voucher-tnc/get-period.ts","../src/hooks/use-voucher-tnc/get-usage-limit.ts","../src/hooks/use-voucher-tnc/use-voucher-method-terms.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.ts"],"sourcesContent":["import type { RefObject } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst isElement = (el: any): el is Element => {\n return el != null && typeof el === 'object' && 'nodeType' in el && el.nodeType === Node.ELEMENT_NODE;\n};\n\nconst getOwnerDocument = (node?: Element | null): Document => {\n return isElement(node) ? (node.ownerDocument ?? document) : document;\n};\n\nconst isValidEvent = (event: any, ref: RefObject<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (event.button > 0) return false;\n // if the event target is no longer in the document\n if (target) {\n const doc = getOwnerDocument(target);\n if (!doc.contains(target)) return false;\n }\n\n return !ref.current?.contains(target);\n};\n\nconst canUseDOM = (): boolean => {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n};\n\nconst isBrowser = canUseDOM();\n\nexport { canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst useCallbackRef = <T extends (...args: any[]) => any>(callback: T | undefined, deps: DependencyList = []) => {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(((...args: any) => callbackRef.current?.(...args)) as T, deps);\n};\n\nexport default useCallbackRef;\n","import copy from 'copy-to-clipboard';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface UseClipboardOptions {\n timeout?: number;\n format?: string;\n}\n\nexport interface UseClipboardProps {\n value?: string;\n optionsOrTimeout?: number | UseClipboardOptions;\n}\n\nconst useClipboard = ({ value = '', optionsOrTimeout = {} }: UseClipboardProps = {}) => {\n const [hasCopied, setHasCopied] = useState(false);\n\n const [valueState, setValueState] = useState(value);\n useEffect(() => setValueState(value), [value]);\n\n const { timeout = 1500, ...copyOptions } =\n typeof optionsOrTimeout === 'number' ? { timeout: optionsOrTimeout } : optionsOrTimeout;\n\n const onCopy = useCallback(() => {\n const didCopy = copy(valueState, copyOptions);\n setHasCopied(didCopy);\n }, [valueState, copyOptions]);\n\n useEffect(() => {\n let timeoutId: number | null = null;\n\n if (hasCopied) {\n timeoutId = window.setTimeout(() => {\n setHasCopied(false);\n }, timeout);\n }\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [timeout, hasCopied]);\n\n return {\n value: valueState,\n setValue: setValueState,\n onCopy,\n hasCopied,\n };\n};\n\nexport default useClipboard;\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\n\nexport interface UseDebounceProps<T> {\n value: T;\n delay?: number;\n}\n\nconst useDebounce = <T>({ value, delay = 500 }: UseDebounceProps<T>) => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [JSON.stringify(value), delay]);\n\n return debouncedValue;\n};\n\nexport default useDebounce;\n","import type { BoxModel as BoxModelType } from 'css-box-model';\nimport { getBox } from 'css-box-model';\nimport type { RefObject } from 'react';\nimport { useRef, useState } from 'react';\n\nimport { useSafeLayoutEffect } from '../use-safe-layout-effect';\n\nexport type BoxModel = BoxModelType;\n\nconst useDimensions = (ref: RefObject<HTMLElement>, observe?: boolean) => {\n const [dimensions, setDimensions] = useState<BoxModelType | null>(null);\n const rafId = useRef<number>();\n\n useSafeLayoutEffect(() => {\n const measure = () => {\n const node = ref.current;\n if (!node) return;\n rafId.current = requestAnimationFrame(() => {\n const boxModel = getBox(node);\n setDimensions(boxModel);\n });\n };\n\n measure();\n\n if (observe) {\n window.addEventListener('resize', measure);\n window.addEventListener('scroll', measure);\n }\n\n return () => {\n if (observe) {\n window.removeEventListener('resize', measure);\n window.removeEventListener('scroll', measure);\n }\n\n if (rafId.current) {\n cancelAnimationFrame(rafId.current);\n }\n };\n }, [observe]);\n\n return dimensions;\n};\n\nexport default useDimensions;\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { isBrowser } from '../../dom';\n\nconst useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useSafeLayoutEffect;\n","import type { HTMLAttributes } from 'react';\nimport { useCallback, useId, useState } from 'react';\n\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseDisclosureProps {\n isOpen?: boolean;\n defaultIsOpen?: boolean;\n onClose?(): void;\n onOpen?(): void;\n id?: string;\n}\n\ntype HTMLProps = HTMLAttributes<HTMLElement>;\n\nconst useDisclosure = ({\n onClose: onCloseProp,\n onOpen: onOpenProp,\n isOpen: isOpenProp,\n defaultIsOpen: defaultIsOpenProp,\n id: idProp,\n}: UseDisclosureProps = {}) => {\n const [isOpenState, setIsOpenState] = useState(defaultIsOpenProp || false);\n const isOpen = isOpenProp !== undefined ? isOpenProp : isOpenState;\n const isControlled = isOpenProp !== undefined;\n const uid = useId();\n const id = idProp ?? `disclosure-${uid}`;\n\n const handleOpen = useCallbackRef(onOpenProp);\n const handleClose = useCallbackRef(onCloseProp);\n\n const onClose = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(false);\n }\n handleClose?.();\n }, [isControlled, handleClose]);\n\n const onOpen = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(true);\n }\n handleOpen?.();\n }, [isControlled, handleOpen]);\n\n const onToggle = useCallback(() => {\n if (isOpen) {\n onClose();\n } else {\n onOpen();\n }\n }, [isOpen, onOpen, onClose]);\n\n const getButtonProps = ({ onClick, ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n 'aria-expanded': isOpen,\n 'aria-controls': id,\n onClick(event) {\n onClick?.(event);\n onToggle();\n },\n };\n };\n\n const getDisclosureProps = ({ ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n hidden: !isOpen,\n id,\n };\n };\n\n return {\n onClose,\n onOpen,\n onToggle,\n getButtonProps,\n getDisclosureProps,\n isOpen,\n };\n};\n\nexport default useDisclosure;\n","import { useEffect, useState } from 'react';\n\nexport type UseMediaQueryOptions = {\n fallback?: boolean | boolean[];\n ssr?: boolean;\n};\n\nconst useMediaQuery = (query: string | string[], options: UseMediaQueryOptions = {}): boolean[] => {\n const { ssr = true, fallback } = options;\n\n const queries = Array.isArray(query) ? query : [query];\n\n let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];\n fallbackValues = fallbackValues.filter(v => v != null) as boolean[];\n\n const [value, setValue] = useState(() => {\n return queries.map((data, index) => ({\n media: data,\n matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches,\n }));\n });\n\n useEffect(() => {\n const win = window;\n setValue(\n queries.map(data => ({\n media: data,\n matches: win.matchMedia(data).matches,\n }))\n );\n\n const mql = queries.map(data => win.matchMedia(data));\n\n const handler = (evt: MediaQueryListEvent) => {\n setValue(prev => {\n return prev.slice().map(item => {\n if (item.media === evt.media) return { ...item, matches: evt.matches };\n return item;\n });\n });\n };\n\n mql.forEach(data => {\n data.addEventListener('change', handler);\n });\n\n return () => {\n mql.forEach(data => {\n data.removeEventListener('change', handler);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [window]);\n\n return value.map(item => item.matches);\n};\n\nexport default useMediaQuery;\n","export interface NumberFormatterProps {\n value: number;\n thousandSeparator?: string;\n decimalLength?: number;\n decimalSeparator?: string;\n prefix?: string;\n}\n\nconst useNumberFormatter = ({\n value,\n thousandSeparator = '.',\n decimalLength,\n decimalSeparator = ',',\n prefix = '',\n}: NumberFormatterProps): string => {\n const formatNumber = (number: number) => {\n const parts = number.toString().split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n let decimalPart = '';\n\n if (decimalLength !== undefined) {\n if (parts.length > 1 && decimalLength > 0) {\n decimalPart = decimalSeparator + parts[1].padEnd(decimalLength, '0').slice(0, decimalLength);\n } else if (decimalLength > 0) {\n decimalPart = decimalSeparator + '0'.repeat(decimalLength);\n }\n } else if (parts.length > 1) {\n decimalPart = decimalSeparator + parts[1];\n }\n\n return integerPart + decimalPart;\n };\n\n const formattedValue = formatNumber(value);\n\n if (formattedValue.charAt(0) === `-`) {\n return formattedValue.replace(/^-/g, `-${prefix}`);\n }\n\n return `${prefix}${formattedValue}`;\n};\n\nexport default useNumberFormatter;\n","import { useEffect, useState } from 'react';\n\nconst useOnlineStatus = () => {\n const [isOnline, setIsOnline] = useState(navigator.onLine);\n\n useEffect(() => {\n const handleEvent = () => setIsOnline(navigator.onLine);\n\n window.addEventListener('online', handleEvent);\n window.addEventListener('offline', handleEvent);\n return () => {\n window.removeEventListener('online', handleEvent);\n window.removeEventListener('offline', handleEvent);\n };\n }, []);\n\n return { isOnline, isOffline: !isOnline };\n};\n\nexport default useOnlineStatus;\n","import type { RefObject } from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport { getOwnerDocument, isValidEvent } from '../../dom';\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseOutsideClickProps {\n enabled?: boolean;\n ref: RefObject<HTMLElement>;\n handler?: (e: Event) => void;\n}\n\nconst useOutsideClick = ({ enabled = true, ref, handler }: UseOutsideClickProps): void => {\n const savedHandler = useCallbackRef(handler);\n\n const stateRef = useRef({\n isPointerDown: false,\n ignoreEmulatedMouseEvents: false,\n });\n\n const state = stateRef.current;\n\n useEffect(() => {\n if (!enabled) return undefined;\n const onPointerDown = <T extends PointerEvent | MouseEvent | TouchEvent>(e: T) => {\n if (isValidEvent(e, ref)) {\n state.isPointerDown = true;\n }\n };\n\n const onMouseUp = (event: MouseEvent) => {\n if (state.ignoreEmulatedMouseEvents) {\n state.ignoreEmulatedMouseEvents = false;\n return;\n }\n\n if (state.isPointerDown && handler && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n state.ignoreEmulatedMouseEvents = true;\n if (handler && state.isPointerDown && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const doc = getOwnerDocument(ref.current);\n doc.addEventListener('mousedown', onPointerDown, true);\n doc.addEventListener('mouseup', onMouseUp, true);\n doc.addEventListener('touchstart', onPointerDown, true);\n doc.addEventListener('touchend', onTouchEnd, true);\n\n return () => {\n doc.removeEventListener('mousedown', onPointerDown, true);\n doc.removeEventListener('mouseup', onMouseUp, true);\n doc.removeEventListener('touchstart', onPointerDown, true);\n doc.removeEventListener('touchend', onTouchEnd, true);\n };\n }, [handler, ref, savedHandler, state, enabled]);\n};\n\nexport default useOutsideClick;\n","export enum VoucherType {\n product = 'Product',\n order = 'Order',\n gift = 'Gift',\n freeShipping = 'Free Shipping',\n freeInsurance = 'Free Insurance',\n bundling = 'Bundling',\n payment = 'Payment',\n affiliate = 'Affiliate',\n}\n\nexport enum DiscountType {\n percentage = 'percentage',\n amount = 'amount',\n}\n\ntype CollectionType = {\n collectionId: number;\n name: string;\n};\n\ntype BrandType = {\n brandId: number;\n name: string;\n};\n\nexport type VoucherPaymentType = {\n bankId: number;\n bankName: string;\n paymentMethod: string[];\n bin: string[];\n creditBinGroup: string[];\n debitBinGroup: string[];\n};\n\nexport interface VoucherTncProps {\n type: string;\n discountType: string;\n discountValue: number | string;\n maxDiscountAmount: number | string;\n collections: CollectionType[];\n brands: BrandType[];\n eligibilityType: string | null;\n isCheckedMaxFee: boolean;\n limitFee: number | string;\n termsMinQty: number | string;\n termsMinTotalAmount: number | string;\n isOneTimeUsage: boolean;\n quota: number;\n transactionTerms: number;\n dateStart: string;\n dateEnd: string;\n isOneTimeUsagePerCard: boolean;\n payment: VoucherPaymentType | null;\n isGiftCard?: boolean;\n}\n\nexport type GetPeriodProps = Pick<VoucherTncProps, 'dateStart' | 'dateEnd'>;\nexport type GetAppliesToProps = Pick<\n VoucherTncProps,\n 'type' | 'brands' | 'collections' | 'eligibilityType' | 'payment'\n>;\nexport type GetMethodTermsProps = Pick<\n VoucherTncProps,\n | 'type'\n | 'discountType'\n | 'discountValue'\n | 'isCheckedMaxFee'\n | 'maxDiscountAmount'\n | 'transactionTerms'\n | 'termsMinTotalAmount'\n | 'termsMinQty'\n | 'limitFee'\n>;\nexport type GetUsageLimitProps = Pick<VoucherTncProps, 'isOneTimeUsage' | 'isOneTimeUsagePerCard'>;\nexport type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' | 'debitBinGroup'>;\n","import type { GetAppliesToProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nexport default function getAppliesTo(args: GetAppliesToProps): string {\n let appliesTo = '';\n const { type, eligibilityType, payment } = args;\n\n const collections = args.collections ?? [];\n const brands = args.brands ?? [];\n\n if (type === VoucherType.product) {\n if (collections.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari collection ${collections\n .map(value => value.name)\n .join(', ')}.`;\n } else if (brands.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari brand ${brands\n .map(value => value.name)\n .join(', ')}.`;\n } else if (eligibilityType === 'selected_products') {\n appliesTo = `Hanya berlaku untuk produk tertentu.`;\n }\n } else if (type === VoucherType.payment) {\n const { bankName, paymentMethod, creditBinGroup, debitBinGroup } = payment || {};\n const isFullPayment = (paymentMethod || []).some(pay => (pay || '').includes('(Full Payment)'));\n const isInstallment3 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 3x)'));\n const isInstallment6 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 6x)'));\n const isInstallment12 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 12x)'));\n const isInstallment18 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 18x)'));\n const isInstallment = isInstallment3 || isInstallment6 || isInstallment12 || isInstallment18;\n const isCredit = isFullPayment || isInstallment;\n const isDebit = (paymentMethod || []).some(pay => (pay || '').includes('Debit Card'));\n const debitAndCredit = [\n ...(isDebit && (debitBinGroup || []).length > 0 ? ['Kartu Debit'] : []),\n ...(isCredit && (creditBinGroup || []).length > 0 ? ['Kartu Kredit'] : []),\n ];\n let txtCreditSystem = '';\n\n if (isCredit) {\n const creditSystem = [\n ...(isFullPayment ? ['sistem pembayaran penuh'] : []),\n ...(isInstallment ? ['sistem cicilan'] : []),\n ];\n const installments = [\n ...(isInstallment3 ? ['3'] : []),\n ...(isInstallment6 ? ['6'] : []),\n ...(isInstallment12 ? ['12'] : []),\n ...(isInstallment18 ? ['18'] : []),\n ];\n let replacedStrInstallment = installments.join(' dan ');\n\n if (installments.length > 2) {\n const strInstallment = installments.join(', ');\n const lastCharIndex = strInstallment.lastIndexOf(',');\n const left = strInstallment.slice(0, lastCharIndex);\n const right = strInstallment.slice(lastCharIndex + 1, strInstallment.length);\n\n replacedStrInstallment = [left, right].join(', dan');\n }\n\n txtCreditSystem = [\n 'dengan',\n creditSystem.join(' dan '),\n ...(isInstallment ? [`(${replacedStrInstallment} bulan)`] : []),\n ].join(' ');\n }\n\n if (debitAndCredit.length > 0) {\n appliesTo = `${[\n 'Voucher berlaku untuk pembayaran menggunakan',\n debitAndCredit.join(' dan '),\n bankName,\n txtCreditSystem,\n ]\n .filter(txt => (txt || '').length > 0)\n .join(' ')}.`;\n }\n }\n\n return appliesTo;\n}\n","import type { GetBankBinProps } from './use-voucher-tnc.types';\n\nexport default function getBankBin(args: GetBankBinProps): string[] {\n const { bankName, creditBinGroup, debitBinGroup } = args;\n const txtCreditBin = (creditBinGroup || []).join(', ');\n const txtDebitBin = (debitBinGroup || []).join(', ');\n\n return [\n ...(bankName && txtCreditBin\n ? [`Voucher berlaku untuk Kartu Kredit ${bankName} dengan Bank Identification Number (BIN): ${txtCreditBin}.`]\n : []),\n ...(bankName && txtDebitBin\n ? [`Voucher berlaku untuk Kartu Debit ${bankName} dengan Bank Identification Number (BIN): ${txtDebitBin}.`]\n : []),\n ];\n}\n","import { format } from 'date-fns';\nimport { id } from 'date-fns/locale';\n\nimport type { GetPeriodProps } from './use-voucher-tnc.types';\n\nexport default function getPeriodText(args: GetPeriodProps): string {\n let period = '';\n const { dateStart, dateEnd } = args;\n\n if (dateStart && dateEnd) {\n const dateStartFormatter = format(new Date(dateStart), 'yyyy-MM-dd HH:mm');\n const dateEndFormatter = format(new Date(dateEnd), 'yyyy-MM-dd HH:mm');\n\n const dateStartSplitTime = dateStartFormatter.split(' ');\n const dateStartSplit = dateStartSplitTime[0].split('-');\n const dateStartYear = dateStartSplit[0];\n const dateStartMonth = dateStartSplit[1];\n const dateEndSplitTime = dateEndFormatter.split(' ');\n const dateEndSplit = dateEndSplitTime[0].split('-');\n const dateEndYear = dateEndSplit[0];\n const dateEndMonth = dateEndSplit[1];\n\n if (dateStartSplitTime[0] === dateEndSplitTime[0]) {\n period = `Voucher hanya berlaku di tanggal ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n } else if (dateStartYear !== dateEndYear) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n } else if (dateStartYear === dateEndYear) {\n if (dateStartMonth === dateEndMonth) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n {\n locale: id,\n }\n )}.`;\n } else {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n }\n }\n } else if (dateStart) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n }\n\n return period;\n}\n","import type { GetUsageLimitProps } from './use-voucher-tnc.types';\n\nexport default function getVoucherUsageLimit(args: GetUsageLimitProps): string {\n const { isOneTimeUsage, isOneTimeUsagePerCard } = args;\n\n if (!isOneTimeUsage && !isOneTimeUsagePerCard) {\n return '';\n }\n\n let usageLimit = '';\n\n if (isOneTimeUsage) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per member selama masa berlaku.';\n }\n\n if (isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per kartu selama masa berlaku.';\n }\n\n if (isOneTimeUsage && isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x transaksi untuk 1 kartu dan 1 member selama masa berlaku.';\n }\n\n return usageLimit;\n}\n","import { useNumberFormatter } from '../use-number-formatter';\nimport type { GetMethodTermsProps } from './use-voucher-tnc.types';\nimport { DiscountType, VoucherType } from './use-voucher-tnc.types';\n\nexport default function useVoucherMethodTerms(args: GetMethodTermsProps) {\n let methodTerm = '';\n const {\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n } = args;\n const safeNumber = (val: number | string): number => {\n if (typeof val === 'number') return val;\n\n return !Number.isNaN(Number(val)) ? Number(val) : 0;\n };\n const formattedMaxDiscount = useNumberFormatter({ value: safeNumber(maxDiscountAmount), prefix: 'Rp' });\n const formattedDiscountVal = useNumberFormatter({ value: safeNumber(discountValue), prefix: 'Rp' });\n const formattedLimitFee = useNumberFormatter({ value: safeNumber(limitFee), prefix: 'Rp' });\n const formattedMinTotalAmount = useNumberFormatter({ value: safeNumber(termsMinTotalAmount), prefix: 'Rp' });\n const formattedMinTotalQty = useNumberFormatter({ value: safeNumber(termsMinQty) });\n\n if (\n type === VoucherType.product ||\n type === VoucherType.order ||\n type === VoucherType.gift ||\n type === VoucherType.affiliate ||\n type === VoucherType.payment\n ) {\n if (discountType === DiscountType.percentage && type !== VoucherType.gift) {\n methodTerm = `Diskon ${discountValue || 0}%`;\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedMaxDiscount})`;\n }\n } else if (discountType === DiscountType.amount && type !== VoucherType.gift) {\n methodTerm = `Potongan ${formattedDiscountVal}`;\n } else {\n methodTerm = `Potongan ${formattedLimitFee}`;\n }\n } else if (type === VoucherType.freeShipping) {\n methodTerm = 'Shipping fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n } else if (type === VoucherType.freeInsurance) {\n methodTerm = 'Insurance fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n }\n\n switch (transactionTerms) {\n case 0:\n methodTerm += ' tanpa minimum pembelian.';\n break;\n case 1:\n methodTerm += ` dengan min. pembelian ${formattedMinTotalAmount}.`;\n break;\n case 2:\n methodTerm += ` dengan min. pembelian ${termsMinQty ? formattedMinTotalQty : 0} item.`;\n break;\n default:\n methodTerm += '';\n }\n\n return methodTerm;\n}\n","import getAppliesTo from './get-applies-to';\nimport getBankBin from './get-bank-bin';\nimport getPeriodText from './get-period';\nimport getVoucherUsageLimit from './get-usage-limit';\nimport getMethodTerms from './use-voucher-method-terms';\nimport type { VoucherTncProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nconst useVoucherTnc = (props: VoucherTncProps | null): string[] => {\n if (props) {\n const terms = [];\n const {\n dateEnd,\n dateStart,\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n collections,\n brands,\n eligibilityType,\n isOneTimeUsage,\n quota,\n isOneTimeUsagePerCard,\n payment,\n isGiftCard,\n } = props;\n const { bankName = '', creditBinGroup = [], debitBinGroup = [] } = payment || {};\n\n const period = getPeriodText({ dateStart, dateEnd });\n const appliesTo = getAppliesTo({ type, collections, brands, eligibilityType, payment });\n const methodTerms = getMethodTerms({\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n });\n const usageLimit = getVoucherUsageLimit({ isOneTimeUsage, isOneTimeUsagePerCard });\n const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });\n\n if (period) terms.push(period);\n if (methodTerms) terms.push(methodTerms);\n if (type === VoucherType.affiliate) {\n terms.push('Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.');\n }\n if (appliesTo) terms.push(appliesTo);\n if (usageLimit) terms.push(usageLimit);\n if (quota > 0) terms.push('Kuota voucher terbatas.');\n if ((bankBin || []).length > 0) terms.push(...bankBin);\n\n if (\n type === VoucherType.order ||\n type === VoucherType.payment ||\n type === VoucherType.freeInsurance ||\n (type === VoucherType.gift && !isGiftCard)\n ) {\n terms.push('Hanya berlaku untuk produk tertentu.');\n }\n\n return terms;\n }\n\n return [];\n};\n\nexport default useVoucherTnc;\n"],"mappings":"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","names":["useCallback","useEffect","useEffect","useState","useRef","useState","useEffect","useEffect","useState","useRef","useCallback","useState","useState","id","useCallback","useEffect","useState","useEffect","useState","useEffect","useRef","useRef","useEffect","VoucherType","DiscountType"]}
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts","../src/hooks/use-breakpoint/use-breakpoint.ts","../src/hooks/use-media-query/use-media-query.ts","../src/hooks/use-callback-ref/use-callback-ref.ts","../src/hooks/use-clipboard/use-clipboard.ts","../src/hooks/use-debounce/use-debounce.ts","../src/hooks/use-device-detect/use-device-detect.ts","../src/hooks/use-dimensions/use-dimensions.ts","../src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts","../src/hooks/use-disclosure/use-disclosure.ts","../src/hooks/use-number-formatter/use-number-formatter.ts","../src/hooks/use-online-status/use-online-status.ts","../src/hooks/use-outside-click/use-outside-click.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.types.ts","../src/hooks/use-voucher-tnc/get-applies-to.ts","../src/hooks/use-voucher-tnc/get-bank-bin.ts","../src/hooks/use-voucher-tnc/get-period.ts","../src/hooks/use-voucher-tnc/get-usage-limit.ts","../src/hooks/use-voucher-tnc/use-voucher-method-terms.ts","../src/hooks/use-voucher-tnc/use-voucher-tnc.ts"],"sourcesContent":["import type { RefObject } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst isElement = (el: any): el is Element => {\n return el != null && typeof el === 'object' && 'nodeType' in el && el.nodeType === Node.ELEMENT_NODE;\n};\n\nconst getOwnerDocument = (node?: Element | null): Document => {\n return isElement(node) ? (node.ownerDocument ?? document) : document;\n};\n\nconst isValidEvent = (event: any, ref: RefObject<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (event.button > 0) return false;\n // if the event target is no longer in the document\n if (target) {\n const doc = getOwnerDocument(target);\n if (!doc.contains(target)) return false;\n }\n\n return !ref.current?.contains(target);\n};\n\nconst canUseDOM = (): boolean => {\n return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n};\n\nconst isBrowser = canUseDOM();\n\nexport { canUseDOM, getOwnerDocument, isBrowser, isElement, isValidEvent };\n","import { tokens } from \"@ctlyst.id/voila-ui-core\";\n\nimport useMediaQuery from \"../use-media-query/use-media-query\";\n\nexport type Breakpoint = \"mobile\" | \"desktop\" | \"wide\";\n\n/**\n * Returns the current active breakpoint based on viewport width and orientation.\n *\n * Strategy (orientation-aware):\n * - mobile: default, including tablets/iPads in portrait (even iPad Pro 12.9\" at 1024×1366)\n * - desktop: viewport ≥ 1024px AND orientation landscape\n * - wide: viewport ≥ 1440px AND orientation landscape\n *\n * Uses the same media query strings as CSS (tokens.mediaQueries) so JS & CSS\n * switch at exactly the same points. Reactive to resize and orientation change\n * via matchMedia listeners — no refresh required.\n */\nexport const useBreakpoint = (): Breakpoint => {\n const [isWide, isDesktop] = useMediaQuery([\n tokens.mediaQueries.wide,\n tokens.mediaQueries.desktop,\n ]);\n\n if (isWide) return \"wide\";\n if (isDesktop) return \"desktop\";\n return \"mobile\";\n};\n\nexport default useBreakpoint;\n","import { useEffect, useState } from 'react';\n\nexport type UseMediaQueryOptions = {\n fallback?: boolean | boolean[];\n ssr?: boolean;\n};\n\nconst useMediaQuery = (query: string | string[], options: UseMediaQueryOptions = {}): boolean[] => {\n const { ssr = true, fallback } = options;\n\n const queries = Array.isArray(query) ? query : [query];\n\n let fallbackValues = Array.isArray(fallback) ? fallback : [fallback];\n fallbackValues = fallbackValues.filter(v => v != null) as boolean[];\n\n const [value, setValue] = useState(() => {\n return queries.map((data, index) => ({\n media: data,\n matches: ssr ? !!fallbackValues[index] : window.matchMedia(data).matches,\n }));\n });\n\n useEffect(() => {\n const win = window;\n setValue(\n queries.map(data => ({\n media: data,\n matches: win.matchMedia(data).matches,\n }))\n );\n\n const mql = queries.map(data => win.matchMedia(data));\n\n const handler = (evt: MediaQueryListEvent) => {\n setValue(prev => {\n return prev.slice().map(item => {\n if (item.media === evt.media) return { ...item, matches: evt.matches };\n return item;\n });\n });\n };\n\n mql.forEach(data => {\n data.addEventListener('change', handler);\n });\n\n return () => {\n mql.forEach(data => {\n data.removeEventListener('change', handler);\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [window]);\n\n return value.map(item => item.matches);\n};\n\nexport default useMediaQuery;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DependencyList } from 'react';\nimport { useCallback, useEffect, useRef } from 'react';\n\nconst useCallbackRef = <T extends (...args: any[]) => any>(callback: T | undefined, deps: DependencyList = []) => {\n const callbackRef = useRef(callback);\n\n useEffect(() => {\n callbackRef.current = callback;\n });\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useCallback(((...args: any) => callbackRef.current?.(...args)) as T, deps);\n};\n\nexport default useCallbackRef;\n","import copy from 'copy-to-clipboard';\nimport { useCallback, useEffect, useState } from 'react';\n\nexport interface UseClipboardOptions {\n timeout?: number;\n format?: string;\n}\n\nexport interface UseClipboardProps {\n value?: string;\n optionsOrTimeout?: number | UseClipboardOptions;\n}\n\nconst useClipboard = ({ value = '', optionsOrTimeout = {} }: UseClipboardProps = {}) => {\n const [hasCopied, setHasCopied] = useState(false);\n\n const [valueState, setValueState] = useState(value);\n useEffect(() => setValueState(value), [value]);\n\n const { timeout = 1500, ...copyOptions } =\n typeof optionsOrTimeout === 'number' ? { timeout: optionsOrTimeout } : optionsOrTimeout;\n\n const onCopy = useCallback(() => {\n const didCopy = copy(valueState, copyOptions);\n setHasCopied(didCopy);\n }, [valueState, copyOptions]);\n\n useEffect(() => {\n let timeoutId: number | null = null;\n\n if (hasCopied) {\n timeoutId = window.setTimeout(() => {\n setHasCopied(false);\n }, timeout);\n }\n\n return () => {\n if (timeoutId) {\n window.clearTimeout(timeoutId);\n }\n };\n }, [timeout, hasCopied]);\n\n return {\n value: valueState,\n setValue: setValueState,\n onCopy,\n hasCopied,\n };\n};\n\nexport default useClipboard;\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport { useEffect, useState } from 'react';\n\nexport interface UseDebounceProps<T> {\n value: T;\n delay?: number;\n}\n\nconst useDebounce = <T>({ value, delay = 500 }: UseDebounceProps<T>) => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay || 500);\n\n return () => {\n clearTimeout(timer);\n };\n }, [JSON.stringify(value), delay]);\n\n return debouncedValue;\n};\n\nexport default useDebounce;\n","import { useMemo } from \"react\";\n\nexport interface DeviceInfo {\n /** True if the device is an iPad (including iPads reporting as Mac in Safari since iPadOS 13) */\n isIpadOS: boolean;\n /** True if the device is any tablet (iPad or Android tablet) */\n isTablet: boolean;\n /** True if the device is a mobile phone */\n isMobile: boolean;\n /** True if the device is a desktop/laptop (no multi-touch signature) */\n isDesktop: boolean;\n /** True if the device supports multi-touch */\n hasTouch: boolean;\n}\n\n/**\n * Detect device type using feature detection (not User Agent string alone).\n *\n * Solves the iPad detection problem: since iPadOS 13, large iPads (Air, Pro)\n * report desktop Safari UA (\"Macintosh\"). We detect them by checking if a\n * \"Mac\" has multi-touch (`maxTouchPoints > 1`), which real Macs don't expose.\n *\n * Use this for JS decisions only (e.g. whether to show an install-app banner).\n * For styling/layout, prefer CSS breakpoints + capability variants — they react\n * to resize/rotate without JS re-render.\n */\nexport const useDeviceDetect = (): DeviceInfo => {\n return useMemo(() => {\n if (typeof navigator === \"undefined\") {\n return {\n isIpadOS: false,\n isTablet: false,\n isMobile: false,\n isDesktop: true,\n hasTouch: false,\n };\n }\n\n const ua = navigator.userAgent;\n const hasTouch = navigator.maxTouchPoints > 1;\n\n // iPad detection: UA says Mac but has multi-touch = iPadOS\n const isMacLike = /Macintosh/i.test(ua);\n const isExplicitIpad = /iPad/i.test(ua);\n const isIpadOS = isExplicitIpad || (isMacLike && hasTouch);\n\n // Android tablet: has \"Android\" but not \"Mobile\"\n const isAndroidTablet = /Android/i.test(ua) && !/Mobile/i.test(ua);\n\n const isTablet = isIpadOS || isAndroidTablet;\n\n // Mobile phone: explicit mobile UA and not a tablet\n const isMobileUA = /iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini/i.test(ua);\n const isMobile = isMobileUA && !isTablet;\n\n const isDesktop = !isTablet && !isMobile;\n\n return { isIpadOS, isTablet, isMobile, isDesktop, hasTouch };\n }, []);\n};\n\nexport default useDeviceDetect;\n","import type { BoxModel as BoxModelType } from 'css-box-model';\nimport { getBox } from 'css-box-model';\nimport type { RefObject } from 'react';\nimport { useRef, useState } from 'react';\n\nimport { useSafeLayoutEffect } from '../use-safe-layout-effect';\n\nexport type BoxModel = BoxModelType;\n\nconst useDimensions = (ref: RefObject<HTMLElement>, observe?: boolean) => {\n const [dimensions, setDimensions] = useState<BoxModelType | null>(null);\n const rafId = useRef<number>();\n\n useSafeLayoutEffect(() => {\n const measure = () => {\n const node = ref.current;\n if (!node) return;\n rafId.current = requestAnimationFrame(() => {\n const boxModel = getBox(node);\n setDimensions(boxModel);\n });\n };\n\n measure();\n\n if (observe) {\n window.addEventListener('resize', measure);\n window.addEventListener('scroll', measure);\n }\n\n return () => {\n if (observe) {\n window.removeEventListener('resize', measure);\n window.removeEventListener('scroll', measure);\n }\n\n if (rafId.current) {\n cancelAnimationFrame(rafId.current);\n }\n };\n }, [observe]);\n\n return dimensions;\n};\n\nexport default useDimensions;\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { isBrowser } from '../../dom';\n\nconst useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect;\nexport default useSafeLayoutEffect;\n","import type { HTMLAttributes } from 'react';\nimport { useCallback, useId, useState } from 'react';\n\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseDisclosureProps {\n isOpen?: boolean;\n defaultIsOpen?: boolean;\n onClose?(): void;\n onOpen?(): void;\n id?: string;\n}\n\ntype HTMLProps = HTMLAttributes<HTMLElement>;\n\nconst useDisclosure = ({\n onClose: onCloseProp,\n onOpen: onOpenProp,\n isOpen: isOpenProp,\n defaultIsOpen: defaultIsOpenProp,\n id: idProp,\n}: UseDisclosureProps = {}) => {\n const [isOpenState, setIsOpenState] = useState(defaultIsOpenProp || false);\n const isOpen = isOpenProp !== undefined ? isOpenProp : isOpenState;\n const isControlled = isOpenProp !== undefined;\n const uid = useId();\n const id = idProp ?? `disclosure-${uid}`;\n\n const handleOpen = useCallbackRef(onOpenProp);\n const handleClose = useCallbackRef(onCloseProp);\n\n const onClose = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(false);\n }\n handleClose?.();\n }, [isControlled, handleClose]);\n\n const onOpen = useCallback(() => {\n if (!isControlled) {\n setIsOpenState(true);\n }\n handleOpen?.();\n }, [isControlled, handleOpen]);\n\n const onToggle = useCallback(() => {\n if (isOpen) {\n onClose();\n } else {\n onOpen();\n }\n }, [isOpen, onOpen, onClose]);\n\n const getButtonProps = ({ onClick, ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n 'aria-expanded': isOpen,\n 'aria-controls': id,\n onClick(event) {\n onClick?.(event);\n onToggle();\n },\n };\n };\n\n const getDisclosureProps = ({ ...rest }: HTMLProps = {}): HTMLProps => {\n return {\n ...rest,\n hidden: !isOpen,\n id,\n };\n };\n\n return {\n onClose,\n onOpen,\n onToggle,\n getButtonProps,\n getDisclosureProps,\n isOpen,\n };\n};\n\nexport default useDisclosure;\n","export interface NumberFormatterProps {\n value: number;\n thousandSeparator?: string;\n decimalLength?: number;\n decimalSeparator?: string;\n prefix?: string;\n}\n\nconst useNumberFormatter = ({\n value,\n thousandSeparator = '.',\n decimalLength,\n decimalSeparator = ',',\n prefix = '',\n}: NumberFormatterProps): string => {\n const formatNumber = (number: number) => {\n const parts = number.toString().split('.');\n const integerPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n let decimalPart = '';\n\n if (decimalLength !== undefined) {\n if (parts.length > 1 && decimalLength > 0) {\n decimalPart = decimalSeparator + parts[1].padEnd(decimalLength, '0').slice(0, decimalLength);\n } else if (decimalLength > 0) {\n decimalPart = decimalSeparator + '0'.repeat(decimalLength);\n }\n } else if (parts.length > 1) {\n decimalPart = decimalSeparator + parts[1];\n }\n\n return integerPart + decimalPart;\n };\n\n const formattedValue = formatNumber(value);\n\n if (formattedValue.charAt(0) === `-`) {\n return formattedValue.replace(/^-/g, `-${prefix}`);\n }\n\n return `${prefix}${formattedValue}`;\n};\n\nexport default useNumberFormatter;\n","import { useEffect, useState } from 'react';\n\nconst useOnlineStatus = () => {\n const [isOnline, setIsOnline] = useState(navigator.onLine);\n\n useEffect(() => {\n const handleEvent = () => setIsOnline(navigator.onLine);\n\n window.addEventListener('online', handleEvent);\n window.addEventListener('offline', handleEvent);\n return () => {\n window.removeEventListener('online', handleEvent);\n window.removeEventListener('offline', handleEvent);\n };\n }, []);\n\n return { isOnline, isOffline: !isOnline };\n};\n\nexport default useOnlineStatus;\n","import type { RefObject } from 'react';\nimport { useEffect, useRef } from 'react';\n\nimport { getOwnerDocument, isValidEvent } from '../../dom';\nimport { useCallbackRef } from '../use-callback-ref';\n\nexport interface UseOutsideClickProps {\n enabled?: boolean;\n ref: RefObject<HTMLElement>;\n handler?: (e: Event) => void;\n}\n\nconst useOutsideClick = ({ enabled = true, ref, handler }: UseOutsideClickProps): void => {\n const savedHandler = useCallbackRef(handler);\n\n const stateRef = useRef({\n isPointerDown: false,\n ignoreEmulatedMouseEvents: false,\n });\n\n const state = stateRef.current;\n\n useEffect(() => {\n if (!enabled) return undefined;\n const onPointerDown = <T extends PointerEvent | MouseEvent | TouchEvent>(e: T) => {\n if (isValidEvent(e, ref)) {\n state.isPointerDown = true;\n }\n };\n\n const onMouseUp = (event: MouseEvent) => {\n if (state.ignoreEmulatedMouseEvents) {\n state.ignoreEmulatedMouseEvents = false;\n return;\n }\n\n if (state.isPointerDown && handler && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n state.ignoreEmulatedMouseEvents = true;\n if (handler && state.isPointerDown && isValidEvent(event, ref)) {\n state.isPointerDown = false;\n savedHandler(event);\n }\n };\n\n const doc = getOwnerDocument(ref.current);\n doc.addEventListener('mousedown', onPointerDown, true);\n doc.addEventListener('mouseup', onMouseUp, true);\n doc.addEventListener('touchstart', onPointerDown, true);\n doc.addEventListener('touchend', onTouchEnd, true);\n\n return () => {\n doc.removeEventListener('mousedown', onPointerDown, true);\n doc.removeEventListener('mouseup', onMouseUp, true);\n doc.removeEventListener('touchstart', onPointerDown, true);\n doc.removeEventListener('touchend', onTouchEnd, true);\n };\n }, [handler, ref, savedHandler, state, enabled]);\n};\n\nexport default useOutsideClick;\n","export enum VoucherType {\n product = 'Product',\n order = 'Order',\n gift = 'Gift',\n freeShipping = 'Free Shipping',\n freeInsurance = 'Free Insurance',\n bundling = 'Bundling',\n payment = 'Payment',\n affiliate = 'Affiliate',\n}\n\nexport enum DiscountType {\n percentage = 'percentage',\n amount = 'amount',\n}\n\ntype CollectionType = {\n collectionId: number;\n name: string;\n};\n\ntype BrandType = {\n brandId: number;\n name: string;\n};\n\nexport type VoucherPaymentType = {\n bankId: number;\n bankName: string;\n paymentMethod: string[];\n bin: string[];\n creditBinGroup: string[];\n debitBinGroup: string[];\n};\n\nexport interface VoucherTncProps {\n type: string;\n discountType: string;\n discountValue: number | string;\n maxDiscountAmount: number | string;\n collections: CollectionType[];\n brands: BrandType[];\n eligibilityType: string | null;\n isCheckedMaxFee: boolean;\n limitFee: number | string;\n termsMinQty: number | string;\n termsMinTotalAmount: number | string;\n isOneTimeUsage: boolean;\n quota: number;\n transactionTerms: number;\n dateStart: string;\n dateEnd: string;\n isOneTimeUsagePerCard: boolean;\n payment: VoucherPaymentType | null;\n isGiftCard?: boolean;\n}\n\nexport type GetPeriodProps = Pick<VoucherTncProps, 'dateStart' | 'dateEnd'>;\nexport type GetAppliesToProps = Pick<\n VoucherTncProps,\n 'type' | 'brands' | 'collections' | 'eligibilityType' | 'payment'\n>;\nexport type GetMethodTermsProps = Pick<\n VoucherTncProps,\n | 'type'\n | 'discountType'\n | 'discountValue'\n | 'isCheckedMaxFee'\n | 'maxDiscountAmount'\n | 'transactionTerms'\n | 'termsMinTotalAmount'\n | 'termsMinQty'\n | 'limitFee'\n>;\nexport type GetUsageLimitProps = Pick<VoucherTncProps, 'isOneTimeUsage' | 'isOneTimeUsagePerCard'>;\nexport type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' | 'debitBinGroup'>;\n","import type { GetAppliesToProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nexport default function getAppliesTo(args: GetAppliesToProps): string {\n let appliesTo = '';\n const { type, eligibilityType, payment } = args;\n\n const collections = args.collections ?? [];\n const brands = args.brands ?? [];\n\n if (type === VoucherType.product) {\n if (collections.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari collection ${collections\n .map(value => value.name)\n .join(', ')}.`;\n } else if (brands.length > 0) {\n appliesTo = `Voucher hanya berlaku untuk produk tertentu dari brand ${brands\n .map(value => value.name)\n .join(', ')}.`;\n } else if (eligibilityType === 'selected_products') {\n appliesTo = `Hanya berlaku untuk produk tertentu.`;\n }\n } else if (type === VoucherType.payment) {\n const { bankName, paymentMethod, creditBinGroup, debitBinGroup } = payment || {};\n const isFullPayment = (paymentMethod || []).some(pay => (pay || '').includes('(Full Payment)'));\n const isInstallment3 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 3x)'));\n const isInstallment6 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 6x)'));\n const isInstallment12 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 12x)'));\n const isInstallment18 = (paymentMethod || []).some(pay => (pay || '').includes('(Cicilan 18x)'));\n const isInstallment = isInstallment3 || isInstallment6 || isInstallment12 || isInstallment18;\n const isCredit = isFullPayment || isInstallment;\n const isDebit = (paymentMethod || []).some(pay => (pay || '').includes('Debit Card'));\n const debitAndCredit = [\n ...(isDebit && (debitBinGroup || []).length > 0 ? ['Kartu Debit'] : []),\n ...(isCredit && (creditBinGroup || []).length > 0 ? ['Kartu Kredit'] : []),\n ];\n let txtCreditSystem = '';\n\n if (isCredit) {\n const creditSystem = [\n ...(isFullPayment ? ['sistem pembayaran penuh'] : []),\n ...(isInstallment ? ['sistem cicilan'] : []),\n ];\n const installments = [\n ...(isInstallment3 ? ['3'] : []),\n ...(isInstallment6 ? ['6'] : []),\n ...(isInstallment12 ? ['12'] : []),\n ...(isInstallment18 ? ['18'] : []),\n ];\n let replacedStrInstallment = installments.join(' dan ');\n\n if (installments.length > 2) {\n const strInstallment = installments.join(', ');\n const lastCharIndex = strInstallment.lastIndexOf(',');\n const left = strInstallment.slice(0, lastCharIndex);\n const right = strInstallment.slice(lastCharIndex + 1, strInstallment.length);\n\n replacedStrInstallment = [left, right].join(', dan');\n }\n\n txtCreditSystem = [\n 'dengan',\n creditSystem.join(' dan '),\n ...(isInstallment ? [`(${replacedStrInstallment} bulan)`] : []),\n ].join(' ');\n }\n\n if (debitAndCredit.length > 0) {\n appliesTo = `${[\n 'Voucher berlaku untuk pembayaran menggunakan',\n debitAndCredit.join(' dan '),\n bankName,\n txtCreditSystem,\n ]\n .filter(txt => (txt || '').length > 0)\n .join(' ')}.`;\n }\n }\n\n return appliesTo;\n}\n","import type { GetBankBinProps } from './use-voucher-tnc.types';\n\nexport default function getBankBin(args: GetBankBinProps): string[] {\n const { bankName, creditBinGroup, debitBinGroup } = args;\n const txtCreditBin = (creditBinGroup || []).join(', ');\n const txtDebitBin = (debitBinGroup || []).join(', ');\n\n return [\n ...(bankName && txtCreditBin\n ? [`Voucher berlaku untuk Kartu Kredit ${bankName} dengan Bank Identification Number (BIN): ${txtCreditBin}.`]\n : []),\n ...(bankName && txtDebitBin\n ? [`Voucher berlaku untuk Kartu Debit ${bankName} dengan Bank Identification Number (BIN): ${txtDebitBin}.`]\n : []),\n ];\n}\n","import { format } from 'date-fns';\nimport { id } from 'date-fns/locale';\n\nimport type { GetPeriodProps } from './use-voucher-tnc.types';\n\nexport default function getPeriodText(args: GetPeriodProps): string {\n let period = '';\n const { dateStart, dateEnd } = args;\n\n if (dateStart && dateEnd) {\n const dateStartFormatter = format(new Date(dateStart), 'yyyy-MM-dd HH:mm');\n const dateEndFormatter = format(new Date(dateEnd), 'yyyy-MM-dd HH:mm');\n\n const dateStartSplitTime = dateStartFormatter.split(' ');\n const dateStartSplit = dateStartSplitTime[0].split('-');\n const dateStartYear = dateStartSplit[0];\n const dateStartMonth = dateStartSplit[1];\n const dateEndSplitTime = dateEndFormatter.split(' ');\n const dateEndSplit = dateEndSplitTime[0].split('-');\n const dateEndYear = dateEndSplit[0];\n const dateEndMonth = dateEndSplit[1];\n\n if (dateStartSplitTime[0] === dateEndSplitTime[0]) {\n period = `Voucher hanya berlaku di tanggal ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n } else if (dateStartYear !== dateEndYear) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n } else if (dateStartYear === dateEndYear) {\n if (dateStartMonth === dateEndMonth) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n {\n locale: id,\n }\n )}.`;\n } else {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM', { locale: id })} - ${format(\n new Date(dateEnd),\n 'd MMM yyyy',\n { locale: id }\n )}.`;\n }\n }\n } else if (dateStart) {\n period = `Voucher berlaku dari ${format(new Date(dateStart), 'd MMM yyyy', { locale: id })}.`;\n }\n\n return period;\n}\n","import type { GetUsageLimitProps } from './use-voucher-tnc.types';\n\nexport default function getVoucherUsageLimit(args: GetUsageLimitProps): string {\n const { isOneTimeUsage, isOneTimeUsagePerCard } = args;\n\n if (!isOneTimeUsage && !isOneTimeUsagePerCard) {\n return '';\n }\n\n let usageLimit = '';\n\n if (isOneTimeUsage) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per member selama masa berlaku.';\n }\n\n if (isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x per kartu selama masa berlaku.';\n }\n\n if (isOneTimeUsage && isOneTimeUsagePerCard) {\n usageLimit = 'Voucher hanya dapat digunakan 1x transaksi untuk 1 kartu dan 1 member selama masa berlaku.';\n }\n\n return usageLimit;\n}\n","import { useNumberFormatter } from '../use-number-formatter';\nimport type { GetMethodTermsProps } from './use-voucher-tnc.types';\nimport { DiscountType, VoucherType } from './use-voucher-tnc.types';\n\nexport default function useVoucherMethodTerms(args: GetMethodTermsProps) {\n let methodTerm = '';\n const {\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n } = args;\n const safeNumber = (val: number | string): number => {\n if (typeof val === 'number') return val;\n\n return !Number.isNaN(Number(val)) ? Number(val) : 0;\n };\n const formattedMaxDiscount = useNumberFormatter({ value: safeNumber(maxDiscountAmount), prefix: 'Rp' });\n const formattedDiscountVal = useNumberFormatter({ value: safeNumber(discountValue), prefix: 'Rp' });\n const formattedLimitFee = useNumberFormatter({ value: safeNumber(limitFee), prefix: 'Rp' });\n const formattedMinTotalAmount = useNumberFormatter({ value: safeNumber(termsMinTotalAmount), prefix: 'Rp' });\n const formattedMinTotalQty = useNumberFormatter({ value: safeNumber(termsMinQty) });\n\n if (\n type === VoucherType.product ||\n type === VoucherType.order ||\n type === VoucherType.gift ||\n type === VoucherType.affiliate ||\n type === VoucherType.payment\n ) {\n if (discountType === DiscountType.percentage && type !== VoucherType.gift) {\n methodTerm = `Diskon ${discountValue || 0}%`;\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedMaxDiscount})`;\n }\n } else if (discountType === DiscountType.amount && type !== VoucherType.gift) {\n methodTerm = `Potongan ${formattedDiscountVal}`;\n } else {\n methodTerm = `Potongan ${formattedLimitFee}`;\n }\n } else if (type === VoucherType.freeShipping) {\n methodTerm = 'Shipping fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n } else if (type === VoucherType.freeInsurance) {\n methodTerm = 'Insurance fee ditanggung oleh voilà.id';\n\n if (isCheckedMaxFee) {\n methodTerm += ` (hingga ${formattedLimitFee})`;\n }\n }\n\n switch (transactionTerms) {\n case 0:\n methodTerm += ' tanpa minimum pembelian.';\n break;\n case 1:\n methodTerm += ` dengan min. pembelian ${formattedMinTotalAmount}.`;\n break;\n case 2:\n methodTerm += ` dengan min. pembelian ${termsMinQty ? formattedMinTotalQty : 0} item.`;\n break;\n default:\n methodTerm += '';\n }\n\n return methodTerm;\n}\n","import getAppliesTo from './get-applies-to';\nimport getBankBin from './get-bank-bin';\nimport getPeriodText from './get-period';\nimport getVoucherUsageLimit from './get-usage-limit';\nimport getMethodTerms from './use-voucher-method-terms';\nimport type { VoucherTncProps } from './use-voucher-tnc.types';\nimport { VoucherType } from './use-voucher-tnc.types';\n\nconst useVoucherTnc = (props: VoucherTncProps | null): string[] => {\n if (props) {\n const terms = [];\n const {\n dateEnd,\n dateStart,\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n collections,\n brands,\n eligibilityType,\n isOneTimeUsage,\n quota,\n isOneTimeUsagePerCard,\n payment,\n isGiftCard,\n } = props;\n const { bankName = '', creditBinGroup = [], debitBinGroup = [] } = payment || {};\n\n const period = getPeriodText({ dateStart, dateEnd });\n const appliesTo = getAppliesTo({ type, collections, brands, eligibilityType, payment });\n const methodTerms = getMethodTerms({\n type,\n discountType,\n discountValue,\n isCheckedMaxFee,\n maxDiscountAmount,\n transactionTerms,\n termsMinTotalAmount,\n termsMinQty,\n limitFee,\n });\n const usageLimit = getVoucherUsageLimit({ isOneTimeUsage, isOneTimeUsagePerCard });\n const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });\n\n if (period) terms.push(period);\n if (methodTerms) terms.push(methodTerms);\n if (type === VoucherType.affiliate) {\n terms.push('Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.');\n }\n if (appliesTo) terms.push(appliesTo);\n if (usageLimit) terms.push(usageLimit);\n if (quota > 0) terms.push('Kuota voucher terbatas.');\n if ((bankBin || []).length > 0) terms.push(...bankBin);\n\n if (\n type === VoucherType.order ||\n type === VoucherType.payment ||\n type === VoucherType.freeInsurance ||\n (type === VoucherType.gift && !isGiftCard)\n ) {\n terms.push('Hanya berlaku untuk produk tertentu.');\n }\n\n return terms;\n }\n\n return [];\n};\n\nexport default useVoucherTnc;\n"],"mappings":"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","names":["useEffect","useCallback","useEffect","useState","useEffect","useState","useRef","useState","useEffect","useEffect","useState","useRef","useCallback","useState","useState","id","useCallback","useEffect","useState","useEffect","useRef","useRef","useEffect","VoucherType","DiscountType"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ctlyst.id/utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0-alpha.0",
|
|
4
4
|
"description": "Utilities library for voila user facing library.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"copy-to-clipboard": "^3.3.3",
|
|
21
21
|
"css-box-model": "^1.2.1",
|
|
22
22
|
"date-fns": "^4.1.0",
|
|
23
|
-
"tslib": "^2.7.0"
|
|
23
|
+
"tslib": "^2.7.0",
|
|
24
|
+
"@ctlyst.id/voila-ui-core": "3.0.0-alpha.0"
|
|
24
25
|
},
|
|
25
26
|
"peerDependencies": {
|
|
26
27
|
"react": "^18.3.1",
|
|
@@ -31,7 +32,6 @@
|
|
|
31
32
|
"clean": "rimraf dist",
|
|
32
33
|
"format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
|
|
33
34
|
"lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"",
|
|
34
|
-
"prepublish": "pnpm build",
|
|
35
35
|
"validate": "pnpm lint && pnpm type-check"
|
|
36
36
|
}
|
|
37
37
|
}
|