@ctlyst.id/utils 2.0.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 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
 
@@ -87,7 +127,8 @@ declare enum VoucherType {
87
127
  freeShipping = "Free Shipping",
88
128
  freeInsurance = "Free Insurance",
89
129
  bundling = "Bundling",
90
- payment = "Payment"
130
+ payment = "Payment",
131
+ affiliate = "Affiliate"
91
132
  }
92
133
  declare enum DiscountType {
93
134
  percentage = "percentage",
@@ -138,4 +179,4 @@ type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' |
138
179
 
139
180
  declare const useVoucherTnc: (props: VoucherTncProps | null) => string[];
140
181
 
141
- 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
 
@@ -87,7 +127,8 @@ declare enum VoucherType {
87
127
  freeShipping = "Free Shipping",
88
128
  freeInsurance = "Free Insurance",
89
129
  bundling = "Bundling",
90
- payment = "Payment"
130
+ payment = "Payment",
131
+ affiliate = "Affiliate"
91
132
  }
92
133
  declare enum DiscountType {
93
134
  percentage = "percentage",
@@ -138,4 +179,4 @@ type GetBankBinProps = Pick<VoucherPaymentType, 'bankName' | 'creditBinGroup' |
138
179
 
139
180
  declare const useVoucherTnc: (props: VoucherTncProps | null) => string[];
140
181
 
141
- 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-callback-ref/use-callback-ref.ts
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 useCallbackRef = (callback, deps = []) => {
80
- const callbackRef = (0, import_react.useRef)(callback);
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, import_react.useCallback)((...args) => {
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 import_react2 = require("react");
153
+ var import_react3 = require("react");
94
154
  var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
95
- const [hasCopied, setHasCopied] = (0, import_react2.useState)(false);
96
- const [valueState, setValueState] = (0, import_react2.useState)(value);
97
- (0, import_react2.useEffect)(() => setValueState(value), [value]);
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, import_react2.useCallback)(() => {
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, import_react2.useEffect)(() => {
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 import_react3 = require("react");
186
+ var import_react4 = require("react");
127
187
  var useDebounce = ({ value, delay = 500 }) => {
128
- const [debouncedValue, setDebouncedValue] = (0, import_react3.useState)(value);
129
- (0, import_react3.useEffect)(() => {
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 import_react5 = require("react");
229
+ var import_react7 = require("react");
142
230
 
143
231
  // src/hooks/use-safe-layout-effect/use-safe-layout-effect.ts
144
- var import_react4 = require("react");
145
- var useSafeLayoutEffect = isBrowser ? import_react4.useLayoutEffect : import_react4.useEffect;
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, import_react5.useState)(null);
151
- const rafId = (0, import_react5.useRef)();
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 import_react6 = require("react");
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, import_react6.useState)(defaultIsOpenProp || false);
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, import_react6.useId)();
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, import_react6.useCallback)(() => {
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, import_react6.useCallback)(() => {
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, import_react6.useCallback)(() => {
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 import_react8 = require("react");
364
+ var import_react9 = require("react");
320
365
  var useOnlineStatus = () => {
321
- const [isOnline, setIsOnline] = (0, import_react8.useState)(navigator.onLine);
322
- (0, import_react8.useEffect)(() => {
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 import_react9 = require("react");
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, import_react9.useRef)({
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, import_react9.useEffect)(() => {
389
+ (0, import_react10.useEffect)(() => {
345
390
  if (!enabled) return void 0;
346
391
  const onPointerDown = (e) => {
347
392
  if (isValidEvent(e, ref)) {
@@ -389,6 +434,7 @@ var VoucherType = /* @__PURE__ */ ((VoucherType2) => {
389
434
  VoucherType2["freeInsurance"] = "Free Insurance";
390
435
  VoucherType2["bundling"] = "Bundling";
391
436
  VoucherType2["payment"] = "Payment";
437
+ VoucherType2["affiliate"] = "Affiliate";
392
438
  return VoucherType2;
393
439
  })(VoucherType || {});
394
440
  var DiscountType = /* @__PURE__ */ ((DiscountType2) => {
@@ -565,7 +611,7 @@ function useVoucherMethodTerms(args) {
565
611
  const formattedLimitFee = use_number_formatter_default({ value: safeNumber(limitFee), prefix: "Rp" });
566
612
  const formattedMinTotalAmount = use_number_formatter_default({ value: safeNumber(termsMinTotalAmount), prefix: "Rp" });
567
613
  const formattedMinTotalQty = use_number_formatter_default({ value: safeNumber(termsMinQty) });
568
- if (type === "Product" /* product */ || type === "Order" /* order */ || type === "Gift" /* gift */ || type === "Payment" /* payment */) {
614
+ if (type === "Product" /* product */ || type === "Order" /* order */ || type === "Gift" /* gift */ || type === "Affiliate" /* affiliate */ || type === "Payment" /* payment */) {
569
615
  if (discountType === "percentage" /* percentage */ && type !== "Gift" /* gift */) {
570
616
  methodTerm = `Diskon ${discountValue || 0}%`;
571
617
  if (isCheckedMaxFee) {
@@ -646,6 +692,9 @@ var useVoucherTnc = (props) => {
646
692
  const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });
647
693
  if (period) terms.push(period);
648
694
  if (methodTerms) terms.push(methodTerms);
695
+ if (type === "Affiliate" /* affiliate */) {
696
+ terms.push("Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.");
697
+ }
649
698
  if (appliesTo) terms.push(appliesTo);
650
699
  if (usageLimit) terms.push(usageLimit);
651
700
  if (quota > 0) terms.push("Kuota voucher terbatas.");
@@ -667,9 +716,11 @@ var use_voucher_tnc_default = useVoucherTnc;
667
716
  isBrowser,
668
717
  isElement,
669
718
  isValidEvent,
719
+ useBreakpoint,
670
720
  useCallbackRef,
671
721
  useClipboard,
672
722
  useDebounce,
723
+ useDeviceDetect,
673
724
  useDimensions,
674
725
  useDisclosure,
675
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}\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.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 (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
- useEffect(() => {
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 useEffect2, useState } from "react";
98
+ import { useCallback as useCallback2, useEffect as useEffect3, useState as useState2 } from "react";
41
99
  var useClipboard = ({ value = "", optionsOrTimeout = {} } = {}) => {
42
- const [hasCopied, setHasCopied] = useState(false);
43
- const [valueState, setValueState] = useState(value);
44
- useEffect2(() => setValueState(value), [value]);
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
- useEffect2(() => {
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 useEffect3, useState as useState2 } from "react";
131
+ import { useEffect as useEffect4, useState as useState3 } from "react";
74
132
  var useDebounce = ({ value, delay = 500 }) => {
75
- const [debouncedValue, setDebouncedValue] = useState2(value);
76
- useEffect3(() => {
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 useState3 } from "react";
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 useEffect4, useLayoutEffect } from "react";
92
- var useSafeLayoutEffect = isBrowser ? useLayoutEffect : useEffect4;
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] = useState3(null);
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 useState4 } from "react";
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] = useState4(defaultIsOpenProp || false);
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,
@@ -336,6 +379,7 @@ var VoucherType = /* @__PURE__ */ ((VoucherType2) => {
336
379
  VoucherType2["freeInsurance"] = "Free Insurance";
337
380
  VoucherType2["bundling"] = "Bundling";
338
381
  VoucherType2["payment"] = "Payment";
382
+ VoucherType2["affiliate"] = "Affiliate";
339
383
  return VoucherType2;
340
384
  })(VoucherType || {});
341
385
  var DiscountType = /* @__PURE__ */ ((DiscountType2) => {
@@ -512,7 +556,7 @@ function useVoucherMethodTerms(args) {
512
556
  const formattedLimitFee = use_number_formatter_default({ value: safeNumber(limitFee), prefix: "Rp" });
513
557
  const formattedMinTotalAmount = use_number_formatter_default({ value: safeNumber(termsMinTotalAmount), prefix: "Rp" });
514
558
  const formattedMinTotalQty = use_number_formatter_default({ value: safeNumber(termsMinQty) });
515
- if (type === "Product" /* product */ || type === "Order" /* order */ || type === "Gift" /* gift */ || type === "Payment" /* payment */) {
559
+ if (type === "Product" /* product */ || type === "Order" /* order */ || type === "Gift" /* gift */ || type === "Affiliate" /* affiliate */ || type === "Payment" /* payment */) {
516
560
  if (discountType === "percentage" /* percentage */ && type !== "Gift" /* gift */) {
517
561
  methodTerm = `Diskon ${discountValue || 0}%`;
518
562
  if (isCheckedMaxFee) {
@@ -593,6 +637,9 @@ var useVoucherTnc = (props) => {
593
637
  const bankBin = getBankBin({ bankName, creditBinGroup, debitBinGroup });
594
638
  if (period) terms.push(period);
595
639
  if (methodTerms) terms.push(methodTerms);
640
+ if (type === "Affiliate" /* affiliate */) {
641
+ terms.push("Voucher affiliate dapat digabungkan dengan tipe voucher lainnya.");
642
+ }
596
643
  if (appliesTo) terms.push(appliesTo);
597
644
  if (usageLimit) terms.push(usageLimit);
598
645
  if (quota > 0) terms.push("Kuota voucher terbatas.");
@@ -613,9 +660,11 @@ export {
613
660
  isBrowser,
614
661
  isElement,
615
662
  isValidEvent,
663
+ use_breakpoint_default as useBreakpoint,
616
664
  use_callback_ref_default as useCallbackRef,
617
665
  use_clipboard_default as useClipboard,
618
666
  use_debounce_default as useDebounce,
667
+ use_device_detect_default as useDeviceDetect,
619
668
  use_dimensions_default as useDimensions,
620
669
  use_disclosure_default as useDisclosure,
621
670
  use_media_query_default as useMediaQuery,
@@ -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}\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.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 (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.0.0",
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
  }