phx-react 1.3.1837 → 1.3.1839
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/cjs/components/Modal/Modal.d.ts +1 -1
- package/dist/cjs/components/Modal/Modal.js +53 -19
- package/dist/cjs/components/Modal/Modal.js.map +1 -1
- package/dist/cjs/components/Onboarding/contexts/onboarding-context.d.ts +63 -0
- package/dist/cjs/components/Onboarding/contexts/onboarding-context.js +282 -0
- package/dist/cjs/components/Onboarding/contexts/onboarding-context.js.map +1 -0
- package/dist/cjs/components/Onboarding/contexts/style.d.ts +1 -0
- package/dist/cjs/components/Onboarding/contexts/style.js +77 -0
- package/dist/cjs/components/Onboarding/contexts/style.js.map +1 -0
- package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.d.ts +7 -0
- package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.js +19 -0
- package/dist/cjs/components/Onboarding/hooks/use-onboarding-init.js.map +1 -0
- package/dist/cjs/components/Onboarding/index.d.ts +3 -0
- package/dist/cjs/components/Onboarding/index.js +7 -0
- package/dist/cjs/components/Onboarding/index.js.map +1 -0
- package/dist/cjs/components/Onboarding/modal-slides/modal-slides.d.ts +10 -0
- package/dist/cjs/components/Onboarding/modal-slides/modal-slides.js +59 -0
- package/dist/cjs/components/Onboarding/modal-slides/modal-slides.js.map +1 -0
- package/dist/cjs/components/Onboarding/onbroading-demo.d.ts +9 -0
- package/dist/cjs/components/Onboarding/onbroading-demo.js +208 -0
- package/dist/cjs/components/Onboarding/onbroading-demo.js.map +1 -0
- package/dist/cjs/components/Slider/index.d.ts +2 -0
- package/dist/cjs/components/Slider/index.js +6 -0
- package/dist/cjs/components/Slider/index.js.map +1 -0
- package/dist/cjs/components/Slider/phx-slider-item.d.ts +6 -0
- package/dist/cjs/components/Slider/phx-slider-item.js +38 -0
- package/dist/cjs/components/Slider/phx-slider-item.js.map +1 -0
- package/dist/cjs/components/Slider/phx-slider.d.ts +18 -0
- package/dist/cjs/components/Slider/phx-slider.js +168 -0
- package/dist/cjs/components/Slider/phx-slider.js.map +1 -0
- package/dist/cjs/components/Slider/ultis/create-animate.d.ts +17 -0
- package/dist/cjs/components/Slider/ultis/create-animate.js +38 -0
- package/dist/cjs/components/Slider/ultis/create-animate.js.map +1 -0
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/components/Modal/Modal.d.ts +1 -1
- package/dist/esm/components/Modal/Modal.js +54 -20
- package/dist/esm/components/Modal/Modal.js.map +1 -1
- package/dist/esm/components/Onboarding/contexts/onboarding-context.d.ts +63 -0
- package/dist/esm/components/Onboarding/contexts/onboarding-context.js +276 -0
- package/dist/esm/components/Onboarding/contexts/onboarding-context.js.map +1 -0
- package/dist/esm/components/Onboarding/contexts/style.d.ts +1 -0
- package/dist/esm/components/Onboarding/contexts/style.js +74 -0
- package/dist/esm/components/Onboarding/contexts/style.js.map +1 -0
- package/dist/esm/components/Onboarding/hooks/use-onboarding-init.d.ts +7 -0
- package/dist/esm/components/Onboarding/hooks/use-onboarding-init.js +15 -0
- package/dist/esm/components/Onboarding/hooks/use-onboarding-init.js.map +1 -0
- package/dist/esm/components/Onboarding/index.d.ts +3 -0
- package/dist/esm/components/Onboarding/index.js +4 -0
- package/dist/esm/components/Onboarding/index.js.map +1 -0
- package/dist/esm/components/Onboarding/modal-slides/modal-slides.d.ts +10 -0
- package/dist/esm/components/Onboarding/modal-slides/modal-slides.js +54 -0
- package/dist/esm/components/Onboarding/modal-slides/modal-slides.js.map +1 -0
- package/dist/esm/components/Onboarding/onbroading-demo.d.ts +9 -0
- package/dist/esm/components/Onboarding/onbroading-demo.js +203 -0
- package/dist/esm/components/Onboarding/onbroading-demo.js.map +1 -0
- package/dist/esm/components/Slider/index.d.ts +2 -0
- package/dist/esm/components/Slider/index.js +2 -0
- package/dist/esm/components/Slider/index.js.map +1 -0
- package/dist/esm/components/Slider/phx-slider-item.d.ts +6 -0
- package/dist/esm/components/Slider/phx-slider-item.js +33 -0
- package/dist/esm/components/Slider/phx-slider-item.js.map +1 -0
- package/dist/esm/components/Slider/phx-slider.d.ts +18 -0
- package/dist/esm/components/Slider/phx-slider.js +164 -0
- package/dist/esm/components/Slider/phx-slider.js.map +1 -0
- package/dist/esm/components/Slider/ultis/create-animate.d.ts +17 -0
- package/dist/esm/components/Slider/ultis/create-animate.js +34 -0
- package/dist/esm/components/Slider/ultis/create-animate.js.map +1 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -45,4 +45,4 @@ export interface ModalProps {
|
|
|
45
45
|
headerClassName?: string;
|
|
46
46
|
theme?: 'WHITE' | 'GRAY';
|
|
47
47
|
}
|
|
48
|
-
export declare const PHXModal: ({
|
|
48
|
+
export declare const PHXModal: ({ children, className, closeButton, customFooter, customHeight, customWidth, dangerActionText, dangerLoading, dangerSubmit, disableCloseButton, disableLeftAction, disableOutsideClick, disableSubmit, dowloadIcon, downloadLinkRef, downloadText, footerBulkAction, headerClassName, headerContent, hiddenCloseButton, hiddenSubmit, hrefLink, inCard, isCancel, isHeaderDownload, leftActionText, loadingLeftAction, noOverlay, onCancel, onDangerClick, onHeaderAction, onHide, onLeftActionText, onPrimaryClick, onSubmit, primaryActionText, primaryLoading, primarySubmit, secondaryActionText, show, size, theme, title, type, }: ModalProps) => React.JSX.Element;
|
|
@@ -15,7 +15,10 @@ var MODAL_THEME;
|
|
|
15
15
|
MODAL_THEME["WHITE"] = "WHITE";
|
|
16
16
|
MODAL_THEME["GRAY"] = "GRAY";
|
|
17
17
|
})(MODAL_THEME || (MODAL_THEME = {}));
|
|
18
|
-
const PHXModal = ({
|
|
18
|
+
const PHXModal = ({ children, className,
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
21
|
+
closeButton, customFooter, customHeight, customWidth, dangerActionText, dangerLoading, dangerSubmit, disableCloseButton = false, disableLeftAction = false, disableOutsideClick, disableSubmit = false, dowloadIcon = false, downloadLinkRef, downloadText, footerBulkAction, headerClassName = '', headerContent, hiddenCloseButton = false, hiddenSubmit, hrefLink, inCard = true, isCancel = false, isHeaderDownload, leftActionText, loadingLeftAction = false, noOverlay = false, onCancel, onDangerClick, onHeaderAction, onHide, onLeftActionText, onPrimaryClick, onSubmit, primaryActionText = 'Xác nhận', primaryLoading, primarySubmit, secondaryActionText = 'Đóng', show, size = 'small', theme = MODAL_THEME.WHITE, title, type = 'default', }) => {
|
|
19
22
|
const [open, setOpen] = (0, react_1.useState)(false);
|
|
20
23
|
const headerText = headerContent ? headerContent : '';
|
|
21
24
|
const sizeModal = (0, types_1.classNames)(size === 'small' && 'sm:max-w-lg', size === 'medium' && 'sm:max-w-xl', size === 'large' && 'sm:max-w-2xl', size === 'large-plus' && 'sm:max-w-2xl lg:max-w-4xl', size === 'extra-large' && 'w-[90vw] max-w-[95vw] sm:max-w-3xl md:max-w-4xl lg:max-w-5xl xl:max-w-7xl');
|
|
@@ -44,7 +47,16 @@ const PHXModal = ({ show, title, className, primaryActionText = 'Xác nhận', s
|
|
|
44
47
|
onHide();
|
|
45
48
|
}
|
|
46
49
|
};
|
|
47
|
-
const Card = () => (react_1.default.createElement(Card_1.PHXCard, {
|
|
50
|
+
const Card = () => (react_1.default.createElement(Card_1.PHXCard, { dangerFooterAction: {
|
|
51
|
+
content: dangerActionText,
|
|
52
|
+
loading: dangerLoading,
|
|
53
|
+
onClick: onDangerClick,
|
|
54
|
+
submit: dangerSubmit,
|
|
55
|
+
disabled: disableSubmit,
|
|
56
|
+
}, dowloadIcon: dowloadIcon, downloadLinkRef: downloadLinkRef, downloadText: downloadText, footerBulkAction: footerBulkAction, fullSize: type === 'no-padding', headerAction: {
|
|
57
|
+
content: headerText || 'close',
|
|
58
|
+
onClick: handleClickCloseAction,
|
|
59
|
+
}, hrefLink: hrefLink, isHeaderDownload: isHeaderDownload, primaryFooterAction: !hiddenSubmit
|
|
48
60
|
? {
|
|
49
61
|
content: primaryActionText,
|
|
50
62
|
loading: primaryLoading,
|
|
@@ -52,14 +64,26 @@ const PHXModal = ({ show, title, className, primaryActionText = 'Xác nhận', s
|
|
|
52
64
|
submit: primarySubmit,
|
|
53
65
|
disabled: disableSubmit,
|
|
54
66
|
}
|
|
55
|
-
: {},
|
|
56
|
-
content: dangerActionText,
|
|
57
|
-
loading: dangerLoading,
|
|
58
|
-
onClick: onDangerClick,
|
|
59
|
-
submit: dangerSubmit,
|
|
60
|
-
disabled: disableSubmit,
|
|
61
|
-
}, isHeaderDownload: isHeaderDownload },
|
|
67
|
+
: {}, primaryHeader: true, secondaryFooterActions: !hiddenCloseButton ? [{ content: secondaryActionText, onClick: onClose }] : undefined, title: title, type: 'modal' },
|
|
62
68
|
react_1.default.createElement("div", { className: type !== 'no-padding' ? '-mt-1' : '' }, children)));
|
|
69
|
+
(0, react_1.useEffect)(() => {
|
|
70
|
+
/**
|
|
71
|
+
* Handles the Escape key press to close the modal.
|
|
72
|
+
* Prevents closing when the close button is disabled.
|
|
73
|
+
*
|
|
74
|
+
* @param event - The keyboard event triggered by the user.
|
|
75
|
+
*/
|
|
76
|
+
const handleKeyDown = (event) => {
|
|
77
|
+
if (event.key === 'Escape' && !disableCloseButton) {
|
|
78
|
+
setOpen(false);
|
|
79
|
+
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
83
|
+
return () => {
|
|
84
|
+
window.removeEventListener('keydown', handleKeyDown);
|
|
85
|
+
};
|
|
86
|
+
}, [disableCloseButton, show]);
|
|
63
87
|
return (react_1.default.createElement(react_2.Transition.Root, { as: react_1.Fragment, show: open },
|
|
64
88
|
react_1.default.createElement(react_2.Dialog, { as: 'div', className: 'relative z-50', onClose: () => {
|
|
65
89
|
// Chỉ tắt modal này
|
|
@@ -70,29 +94,39 @@ const PHXModal = ({ show, title, className, primaryActionText = 'Xác nhận', s
|
|
|
70
94
|
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
71
95
|
}, static: true },
|
|
72
96
|
!noOverlay && (react_1.default.createElement(react_2.Transition.Child, { as: react_1.Fragment, enter: 'transform ease-out duration-300 transition', enterFrom: 'translate-y-2 opacity-0 sm:translate-y-0 sm:translate-y-10', enterTo: 'translate-y-0 opacity-100 sm:translate-y-0', leave: 'transition ease-in duration-100', leaveFrom: 'translate-y-0 opacity-100 sm:translate-y-0', leaveTo: 'translate-y-2 opacity-0 sm:translate-y-0 sm:translate-y-10' },
|
|
73
|
-
react_1.default.createElement("div", { className: 'fixed inset-0 z-40
|
|
97
|
+
react_1.default.createElement("div", { className: 'fixed inset-0 z-40 bg-gray-500 bg-opacity-75 transition-opacity' }))),
|
|
74
98
|
react_1.default.createElement("div", { className: `fixed inset-0 z-50 overflow-y-auto ${className || ''}` },
|
|
75
|
-
react_1.default.createElement("div", { className: 'flex items-center justify-center
|
|
99
|
+
react_1.default.createElement("div", { className: 'flex min-h-full items-center justify-center p-4 text-center sm:items-center sm:p-0' },
|
|
76
100
|
react_1.default.createElement(react_2.Transition.Child, { as: react_1.Fragment, enter: 'transform ease-out duration-300 transition', enterFrom: 'translate-y-2 opacity-0 sm:translate-y-0 sm:translate-y-10', enterTo: 'translate-y-0 opacity-100 sm:translate-y-0', leave: 'transition ease-in duration-100', leaveFrom: 'translate-y-0 opacity-100 sm:translate-y-0', leaveTo: 'translate-y-2 opacity-0 sm:translate-y-0 sm:translate-y-10' },
|
|
77
101
|
react_1.default.createElement("div", { className: (0, types_1.classNames)('min-w-0 flex-1', customWidth ? customWidth : sizeModal) },
|
|
78
102
|
react_1.default.createElement(react_2.Dialog.Panel, { className: (0, types_1.classNames)('shadow-xl relative transform rounded-lg text-left transition-all sm:my-24 sm:w-full', theme === MODAL_THEME.GRAY ? 'bg-[#F1F1F1]' : 'bg-white') }, inCard ? (primarySubmit || dangerSubmit ? (react_1.default.createElement("form", { onSubmit: onSubmit },
|
|
79
103
|
react_1.default.createElement(Card, null))) : (react_1.default.createElement(Card, null))) : (react_1.default.createElement("div", null,
|
|
80
104
|
react_1.default.createElement("div", { className: (0, types_1.classNames)('flex items-center justify-between rounded-t-lg border-b border-gray-200 p-4 text-sm font-semibold text-gray-900', headerClassName, theme === MODAL_THEME.GRAY ? 'bg-[#F1F1F1]' : 'bg-[#F3F3F3]') },
|
|
81
105
|
react_1.default.createElement("div", { className: 'flex items-center gap-1' },
|
|
82
|
-
isCancel && (react_1.default.createElement("button", { className: 'inline-flex items-center px-2 py-1 text-xs font-bold text-gray-700
|
|
83
|
-
react_1.default.createElement(solid_1.ArrowLeftIcon, { className: '
|
|
84
|
-
title)
|
|
85
|
-
|
|
106
|
+
isCancel && (react_1.default.createElement("button", { className: 'inline-flex items-center rounded-lg bg-transparent px-2 py-1 text-xs font-bold text-gray-700 hover:bg-gray-200', onClick: onCancel, type: 'button' },
|
|
107
|
+
react_1.default.createElement(solid_1.ArrowLeftIcon, { className: 'h-4 w-4' }))),
|
|
108
|
+
title),
|
|
109
|
+
react_1.default.createElement("button", { className: 'grid grid-cols-1 rounded-md p-0.5 text-gray-400 hover:bg-gray-200 hover:text-gray-500', onClick: () => {
|
|
110
|
+
if (disableCloseButton) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
setOpen(false);
|
|
114
|
+
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
115
|
+
}, type: 'button' },
|
|
116
|
+
react_1.default.createElement(react_1.default.Fragment, null,
|
|
117
|
+
react_1.default.createElement("span", { className: 'sr-only' }, "Close"),
|
|
118
|
+
react_1.default.createElement(solid_1.XMarkIcon, { "aria-hidden": 'true', className: 'h-5 w-5' })))),
|
|
119
|
+
react_1.default.createElement("div", { className: type === 'default' ? 'p-3 text-xs text-gray-500' : '', style: { maxHeight: customHeight || '100%' } }, children),
|
|
86
120
|
react_1.default.createElement("div", { className: (0, types_1.classNames)('flex items-center justify-between gap-x-3 rounded-b-lg border-t border-gray-200 ', theme === MODAL_THEME.GRAY ? 'bg-[#F1F1F1]' : 'bg-white') }, customFooter ? (customFooter) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
87
|
-
react_1.default.createElement("div", { className: 'flex items-center
|
|
121
|
+
react_1.default.createElement("div", { className: 'flex items-center gap-x-3 rounded-t-lg p-4 pl-5' },
|
|
88
122
|
downloadLinkRef && hrefLink && downloadText && (react_1.default.createElement("div", { className: 'group flex items-center gap-x-1' },
|
|
89
123
|
dowloadIcon && (react_1.default.createElement(outline_1.ArrowDownTrayIcon, { className: 'h-4 w-4 text-link-500 group-hover:text-link-600 group-active:text-link-600', strokeWidth: 2 })),
|
|
90
|
-
react_1.default.createElement(link_1.default, { as: 'a',
|
|
124
|
+
react_1.default.createElement(link_1.default, { ref: downloadLinkRef, as: 'a', href: hrefLink }, downloadText))),
|
|
91
125
|
leftActionText && (react_1.default.createElement("div", { className: 'flex gap-2' },
|
|
92
|
-
react_1.default.createElement(Button_1.PHXButton, { className: 'text-sm !text-link-500
|
|
126
|
+
react_1.default.createElement(Button_1.PHXButton, { className: '!px-0 text-sm !text-link-500', disabled: disableLeftAction, onClick: onLeftActionText, plain: true }, leftActionText),
|
|
93
127
|
loadingLeftAction && react_1.default.createElement(Button_1.PHXButton, { disabled: true, loading: true, plain: true, size: 'micro' }))),
|
|
94
128
|
footerBulkAction && footerBulkAction.content && (react_1.default.createElement(Button_1.PHXButton, { danger: true, disabled: footerBulkAction.disabled, loading: footerBulkAction.loading, onClick: footerBulkAction.onClick, size: 'micro', submit: !!footerBulkAction.submit }, footerBulkAction.content))),
|
|
95
|
-
react_1.default.createElement("div", { className: 'flex justify-end
|
|
129
|
+
react_1.default.createElement("div", { className: 'flex justify-end gap-x-3 rounded-t-lg p-4' },
|
|
96
130
|
react_1.default.createElement(Button_1.PHXButton, { disabled: disableCloseButton, onClick: onHide, secondary: true, size: 'micro' }, secondaryActionText),
|
|
97
131
|
dangerSubmit && (react_1.default.createElement(Button_1.PHXButton, { danger: true, disabled: disableSubmit, loading: dangerLoading, onClick: onDangerClick, size: 'micro' }, dangerActionText)),
|
|
98
132
|
!hiddenSubmit && (react_1.default.createElement(Button_1.PHXButton, { disabled: disableSubmit, loading: primaryLoading, onClick: () => onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(), primary: true, size: 'micro' }, primaryActionText))))))))))))))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":";;;;AAAA,uDAA4D;AAC5D,6CAAsD;AACtD,kCAAiC;AACjC,oCAAqC;AACrC,sCAAqC;AACrC,
|
|
1
|
+
{"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import 'driver.js/dist/driver.css';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export interface IPHXOnboardingStep {
|
|
4
|
+
element: string;
|
|
5
|
+
popover: {
|
|
6
|
+
title: string;
|
|
7
|
+
description: string;
|
|
8
|
+
side?: 'left' | 'right' | 'top' | 'bottom';
|
|
9
|
+
align?: 'start' | 'center' | 'end';
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export interface IPHXOnboardingSlideStep {
|
|
13
|
+
id: number;
|
|
14
|
+
title?: string;
|
|
15
|
+
description?: string;
|
|
16
|
+
content?: string;
|
|
17
|
+
image: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Một flow onboarding có thể có slides, tour steps, hoặc cả hai.
|
|
21
|
+
* - Chỉ slides: hiện modal slides, không có tour
|
|
22
|
+
* - Chỉ tour: chạy driver.js tour trực tiếp
|
|
23
|
+
* - Cả hai: hiện modal slides → nút "Bắt đầu Tour" → chạy tour
|
|
24
|
+
*/
|
|
25
|
+
export interface IPHXOnboardingFlow {
|
|
26
|
+
name: string;
|
|
27
|
+
slides?: Array<IPHXOnboardingSlideStep>;
|
|
28
|
+
steps?: Array<IPHXOnboardingStep>;
|
|
29
|
+
}
|
|
30
|
+
export interface IPHXOnboardingStatus {
|
|
31
|
+
slidesCompleted: boolean;
|
|
32
|
+
toursCompleted: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface IPHXOnboardingContextType {
|
|
35
|
+
currentFlow: string | null;
|
|
36
|
+
isRunning: boolean;
|
|
37
|
+
registerFlow(flow: IPHXOnboardingFlow): void;
|
|
38
|
+
startFlow(flowName: string): void;
|
|
39
|
+
endFlow(): void;
|
|
40
|
+
nextStep(): void;
|
|
41
|
+
previousStep(): void;
|
|
42
|
+
skipFlow(): void;
|
|
43
|
+
resetStatusOnboarding(flowName: string): void;
|
|
44
|
+
isSlidesOpen: boolean;
|
|
45
|
+
closeSlides(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Lưu trạng thái hoàn thành của flow vào localStorage.
|
|
48
|
+
* Mặc định trạng thái chỉ được giữ trong bộ nhớ (in-memory).
|
|
49
|
+
* Gọi hàm này khi muốn persist để không hiện lại lần sau.
|
|
50
|
+
*/
|
|
51
|
+
persistFlowStatus(flowName: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Đọc trạng thái hiện tại của flow từ bộ nhớ.
|
|
54
|
+
*/
|
|
55
|
+
getFlowStatus(flowName: string): IPHXOnboardingStatus;
|
|
56
|
+
}
|
|
57
|
+
export declare const PHXOnboardingProvider: React.FC<{
|
|
58
|
+
children: React.ReactNode;
|
|
59
|
+
}>;
|
|
60
|
+
/**
|
|
61
|
+
* Hook để sử dụng context
|
|
62
|
+
*/
|
|
63
|
+
export declare const usePHXOnboarding: () => IPHXOnboardingContextType;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.usePHXOnboarding = exports.PHXOnboardingProvider = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const driver_js_1 = require("driver.js");
|
|
7
|
+
require("driver.js/dist/driver.css");
|
|
8
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
9
|
+
const modal_slides_1 = require("../modal-slides/modal-slides");
|
|
10
|
+
const style_1 = require("./style");
|
|
11
|
+
const ONBOARDING_STATUS_KEY = 'phx-onboarding-status';
|
|
12
|
+
const PHXOnboardingContext = (0, react_1.createContext)(undefined);
|
|
13
|
+
const PHXOnboardingProvider = ({ children }) => {
|
|
14
|
+
const [currentFlow, setCurrentFlow] = (0, react_1.useState)(null);
|
|
15
|
+
const [isRunning, setIsRunning] = (0, react_1.useState)(false);
|
|
16
|
+
const [flows, setFlows] = (0, react_1.useState)(new Map());
|
|
17
|
+
const [driverInstance, setDriverInstance] = (0, react_1.useState)(null);
|
|
18
|
+
// Modal slides state
|
|
19
|
+
const [isSlidesOpen, setIsSlidesOpen] = (0, react_1.useState)(false);
|
|
20
|
+
const [activeSlides, setActiveSlides] = (0, react_1.useState)([]);
|
|
21
|
+
const [hasTours, setHasTours] = (0, react_1.useState)(false);
|
|
22
|
+
const [pendingTourFlowName, setPendingTourFlowName] = (0, react_1.useState)(null);
|
|
23
|
+
// In-memory status only — không tự động ghi localStorage
|
|
24
|
+
const [onboardingStatus, setOnboardingStatus] = (0, react_1.useState)({});
|
|
25
|
+
// Đọc trạng thái đã persist từ localStorage khi khởi động
|
|
26
|
+
(0, react_1.useEffect)(() => {
|
|
27
|
+
const saved = localStorage.getItem(ONBOARDING_STATUS_KEY);
|
|
28
|
+
if (saved) {
|
|
29
|
+
try {
|
|
30
|
+
setOnboardingStatus(JSON.parse(saved));
|
|
31
|
+
}
|
|
32
|
+
catch (_a) {
|
|
33
|
+
// ignore parse error
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}, []);
|
|
37
|
+
/**
|
|
38
|
+
* Cập nhật trạng thái trong bộ nhớ (KHÔNG ghi localStorage)
|
|
39
|
+
* @param flowName Tên flow
|
|
40
|
+
* @param patch Trạng thái muốn cập nhật
|
|
41
|
+
*/
|
|
42
|
+
const updateStatus = (flowName, patch) => {
|
|
43
|
+
setOnboardingStatus((prev) => {
|
|
44
|
+
var _a;
|
|
45
|
+
const current = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
|
|
46
|
+
slidesCompleted: false,
|
|
47
|
+
toursCompleted: false,
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
...prev,
|
|
51
|
+
[flowName]: { ...current, ...patch },
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
/** Lưu trạng thái của flow vào localStorage
|
|
56
|
+
* @param flowName Tên flow
|
|
57
|
+
*/
|
|
58
|
+
const persistFlowStatus = (flowName) => {
|
|
59
|
+
setOnboardingStatus((prev) => {
|
|
60
|
+
var _a;
|
|
61
|
+
const status = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
|
|
62
|
+
slidesCompleted: false,
|
|
63
|
+
toursCompleted: false,
|
|
64
|
+
};
|
|
65
|
+
const updated = { ...prev, [flowName]: status };
|
|
66
|
+
localStorage.setItem(ONBOARDING_STATUS_KEY, JSON.stringify(updated));
|
|
67
|
+
return updated;
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Lấy trạng thái của flow
|
|
72
|
+
* @param flowName Tên flow
|
|
73
|
+
*/
|
|
74
|
+
const getFlowStatus = (flowName) => {
|
|
75
|
+
var _a;
|
|
76
|
+
return (_a = onboardingStatus[flowName]) !== null && _a !== void 0 ? _a : {
|
|
77
|
+
slidesCompleted: false,
|
|
78
|
+
toursCompleted: false,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Đăng ký flow
|
|
83
|
+
* @param flow Flow cần đăng ký
|
|
84
|
+
*/
|
|
85
|
+
const registerFlow = (flow) => {
|
|
86
|
+
setFlows((prev) => new Map(prev).set(flow.name, flow));
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Chạy tour
|
|
90
|
+
* @param flowName Tên flow
|
|
91
|
+
* @param flow Flow cần chạy tour
|
|
92
|
+
*/
|
|
93
|
+
const runTour = (flowName, flow) => {
|
|
94
|
+
var _a;
|
|
95
|
+
if (!((_a = flow.steps) === null || _a === void 0 ? void 0 : _a.length))
|
|
96
|
+
return;
|
|
97
|
+
if (driverInstance) {
|
|
98
|
+
driverInstance.destroy();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Tạo driver instance
|
|
102
|
+
*/
|
|
103
|
+
const newDriver = (0, driver_js_1.driver)({
|
|
104
|
+
showProgress: true,
|
|
105
|
+
showButtons: ['next', 'previous', 'close'],
|
|
106
|
+
nextBtnText: 'Tiếp theo',
|
|
107
|
+
prevBtnText: 'Quay lại',
|
|
108
|
+
doneBtnText: 'Hoàn tất',
|
|
109
|
+
stageRadius: 12,
|
|
110
|
+
allowClose: true,
|
|
111
|
+
onDestroyed: () => {
|
|
112
|
+
setDriverInstance(null);
|
|
113
|
+
setCurrentFlow(null);
|
|
114
|
+
setIsRunning(false);
|
|
115
|
+
// Chỉ cập nhật in-memory, không tự động persist
|
|
116
|
+
updateStatus(flowName, { toursCompleted: true });
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
newDriver.setSteps(flow.steps.map((step) => {
|
|
120
|
+
var _a, _b;
|
|
121
|
+
return ({
|
|
122
|
+
element: step.element,
|
|
123
|
+
popover: {
|
|
124
|
+
title: step.popover.title,
|
|
125
|
+
description: step.popover.description,
|
|
126
|
+
side: (_a = step.popover.side) !== null && _a !== void 0 ? _a : 'bottom',
|
|
127
|
+
align: (_b = step.popover.align) !== null && _b !== void 0 ? _b : 'center',
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
}));
|
|
131
|
+
setDriverInstance(newDriver);
|
|
132
|
+
setCurrentFlow(flowName);
|
|
133
|
+
setIsRunning(true);
|
|
134
|
+
newDriver.drive();
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Bắt đầu flow
|
|
138
|
+
* @param flowName Tên flow
|
|
139
|
+
*/
|
|
140
|
+
const startFlow = (flowName) => {
|
|
141
|
+
var _a, _b;
|
|
142
|
+
const flow = flows.get(flowName);
|
|
143
|
+
if (!flow) {
|
|
144
|
+
console.warn(`[Onboarding] Flow "${flowName}" not registered`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const hasSlides = Boolean((_a = flow.slides) === null || _a === void 0 ? void 0 : _a.length);
|
|
148
|
+
const hasTourSteps = Boolean((_b = flow.steps) === null || _b === void 0 ? void 0 : _b.length);
|
|
149
|
+
const status = getFlowStatus(flowName);
|
|
150
|
+
// Case 1: chỉ có tour (không có slides)
|
|
151
|
+
if (!hasSlides && hasTourSteps) {
|
|
152
|
+
runTour(flowName, flow);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Case 2: chỉ có slides (không có tour)
|
|
156
|
+
if (hasSlides && !hasTourSteps) {
|
|
157
|
+
if (!status.slidesCompleted) {
|
|
158
|
+
setActiveSlides(flow.slides);
|
|
159
|
+
setHasTours(false);
|
|
160
|
+
setPendingTourFlowName(null);
|
|
161
|
+
setCurrentFlow(flowName);
|
|
162
|
+
setIsSlidesOpen(true);
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Case 3: cả slides lẫn tour
|
|
167
|
+
if (hasSlides && hasTourSteps) {
|
|
168
|
+
if (!status.slidesCompleted) {
|
|
169
|
+
setActiveSlides(flow.slides);
|
|
170
|
+
setHasTours(true);
|
|
171
|
+
setPendingTourFlowName(flowName);
|
|
172
|
+
setCurrentFlow(flowName);
|
|
173
|
+
setIsSlidesOpen(true);
|
|
174
|
+
}
|
|
175
|
+
else if (!status.toursCompleted) {
|
|
176
|
+
runTour(flowName, flow);
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
console.warn(`[Onboarding] Flow "${flowName}" has no slides or steps`);
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Cập nhật trạng thái của flow
|
|
184
|
+
*/
|
|
185
|
+
const updateStatusFlow = () => {
|
|
186
|
+
if (currentFlow) {
|
|
187
|
+
// Chỉ cập nhật in-memory, không tự động persist
|
|
188
|
+
updateStatus(currentFlow, { slidesCompleted: true });
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* Đóng slides
|
|
193
|
+
*/
|
|
194
|
+
const closeSlides = () => {
|
|
195
|
+
setIsSlidesOpen(false);
|
|
196
|
+
updateStatusFlow();
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Bắt đầu tour từ slides
|
|
200
|
+
*/
|
|
201
|
+
const startTourFromSlides = () => {
|
|
202
|
+
setIsSlidesOpen(false);
|
|
203
|
+
updateStatusFlow();
|
|
204
|
+
if (pendingTourFlowName) {
|
|
205
|
+
const flow = flows.get(pendingTourFlowName);
|
|
206
|
+
if (flow) {
|
|
207
|
+
runTour(pendingTourFlowName, flow);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Kết thúc flow
|
|
213
|
+
*/
|
|
214
|
+
const endFlow = () => {
|
|
215
|
+
if (driverInstance) {
|
|
216
|
+
driverInstance.destroy();
|
|
217
|
+
setDriverInstance(null);
|
|
218
|
+
}
|
|
219
|
+
setIsRunning(false);
|
|
220
|
+
setCurrentFlow(null);
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* Chuyển đến bước tiếp theo
|
|
224
|
+
*/
|
|
225
|
+
const nextStep = () => {
|
|
226
|
+
driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.moveNext();
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
229
|
+
* Chuyển đến bước trước đó
|
|
230
|
+
*/
|
|
231
|
+
const previousStep = () => {
|
|
232
|
+
driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.movePrevious();
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Bỏ qua flow
|
|
236
|
+
*/
|
|
237
|
+
const skipFlow = () => {
|
|
238
|
+
endFlow();
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Reset trạng thái của flow
|
|
242
|
+
* @param flowName Tên flow
|
|
243
|
+
*/
|
|
244
|
+
const resetStatusOnboarding = (flowName) => {
|
|
245
|
+
updateStatus(flowName, {
|
|
246
|
+
slidesCompleted: false,
|
|
247
|
+
toursCompleted: false,
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
const value = {
|
|
251
|
+
currentFlow,
|
|
252
|
+
isRunning,
|
|
253
|
+
registerFlow,
|
|
254
|
+
startFlow,
|
|
255
|
+
endFlow,
|
|
256
|
+
nextStep,
|
|
257
|
+
previousStep,
|
|
258
|
+
skipFlow,
|
|
259
|
+
isSlidesOpen,
|
|
260
|
+
closeSlides,
|
|
261
|
+
persistFlowStatus,
|
|
262
|
+
getFlowStatus,
|
|
263
|
+
resetStatusOnboarding,
|
|
264
|
+
};
|
|
265
|
+
return (react_1.default.createElement(PHXOnboardingContext.Provider, { value: value },
|
|
266
|
+
react_1.default.createElement("style", { dangerouslySetInnerHTML: { __html: style_1.styleOnboarding } }),
|
|
267
|
+
children,
|
|
268
|
+
react_1.default.createElement(modal_slides_1.PHXOnboardingModal, { hasTours: hasTours, onHide: closeSlides, onStartTour: startTourFromSlides, show: isSlidesOpen, slides: activeSlides })));
|
|
269
|
+
};
|
|
270
|
+
exports.PHXOnboardingProvider = PHXOnboardingProvider;
|
|
271
|
+
/**
|
|
272
|
+
* Hook để sử dụng context
|
|
273
|
+
*/
|
|
274
|
+
const usePHXOnboarding = () => {
|
|
275
|
+
const context = (0, react_1.useContext)(PHXOnboardingContext);
|
|
276
|
+
if (!context) {
|
|
277
|
+
throw new Error('useOnboarding must be used within OnboardingProvider');
|
|
278
|
+
}
|
|
279
|
+
return context;
|
|
280
|
+
};
|
|
281
|
+
exports.usePHXOnboarding = usePHXOnboarding;
|
|
282
|
+
//# sourceMappingURL=onboarding-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-context.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/contexts/onboarding-context.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const styleOnboarding = "\n.driver-popover-footer button {\n all: unset;\n display: flex;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n padding: 6px 12px;\n font-weight: 400 !important;\n text-decoration: none;\n text-shadow: 1px 1px 0 #fff;\n background-color: #fff;\n color: rgb(3 7 18 / 1);\n font-size: 14px;\n line-height: normal;\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n cursor: pointer;\n outline: 0;\n border: 1px solid rgb(209 213 219 / 1);\n border-radius: 8px;\n transition-duration: 0.3s;\n transition-property: color, background-color, border-color,\n text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter,\n backdrop-filter;\n --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n}\n\n.driver-popover-footer button:active {\n --tw-shadow: 0rem 0.125rem 0.1rem 0rem #0004 inset;\n --tw-shadow-colored: inset 0rem 0.125rem 0.1rem 0rem var(--tw-shadow-color);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\n padding-top: 0.3rem;\n padding-bottom: 0.2rem;\n background-color: rgb(229 231 235 / 1);\n border-bottom-color: rgb(209 213 219 / 1);\n transition-timing-function: cubic-bezier(0.4, 0.36, 0, 1);\n}\n.driver-popover {\n font-weight: 400 !important;\n font-size: 14px;\n line-height: normal;\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n border-radius: 12px;\n color: #fff;\n background-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover-title {\n font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,\n Roboto, Helvetica Neue, sans-serif;\n}\n.driver-popover .driver-popover-arrow-side-left.driver-popover-arrow {\n border-left-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-right.driver-popover-arrow {\n border-right-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-top.driver-popover-arrow {\n border-top-color: rgb(0 0 0 / 1);\n}\n\n.driver-popover .driver-popover-arrow-side-bottom.driver-popover-arrow {\n border-bottom-color: rgb(0 0 0 / 1);\n}\n";
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.styleOnboarding = void 0;
|
|
4
|
+
exports.styleOnboarding = `
|
|
5
|
+
.driver-popover-footer button {
|
|
6
|
+
all: unset;
|
|
7
|
+
display: flex;
|
|
8
|
+
justify-content: center;
|
|
9
|
+
align-items: center;
|
|
10
|
+
box-sizing: border-box;
|
|
11
|
+
padding: 6px 12px;
|
|
12
|
+
font-weight: 400 !important;
|
|
13
|
+
text-decoration: none;
|
|
14
|
+
text-shadow: 1px 1px 0 #fff;
|
|
15
|
+
background-color: #fff;
|
|
16
|
+
color: rgb(3 7 18 / 1);
|
|
17
|
+
font-size: 14px;
|
|
18
|
+
line-height: normal;
|
|
19
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
|
|
20
|
+
Roboto, Helvetica Neue, sans-serif;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
outline: 0;
|
|
23
|
+
border: 1px solid rgb(209 213 219 / 1);
|
|
24
|
+
border-radius: 8px;
|
|
25
|
+
transition-duration: 0.3s;
|
|
26
|
+
transition-property: color, background-color, border-color,
|
|
27
|
+
text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter,
|
|
28
|
+
backdrop-filter;
|
|
29
|
+
--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
|
|
30
|
+
--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
|
|
31
|
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
|
|
32
|
+
var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.driver-popover-footer button:active {
|
|
36
|
+
--tw-shadow: 0rem 0.125rem 0.1rem 0rem #0004 inset;
|
|
37
|
+
--tw-shadow-colored: inset 0rem 0.125rem 0.1rem 0rem var(--tw-shadow-color);
|
|
38
|
+
box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000),
|
|
39
|
+
var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
|
|
40
|
+
padding-top: 0.3rem;
|
|
41
|
+
padding-bottom: 0.2rem;
|
|
42
|
+
background-color: rgb(229 231 235 / 1);
|
|
43
|
+
border-bottom-color: rgb(209 213 219 / 1);
|
|
44
|
+
transition-timing-function: cubic-bezier(0.4, 0.36, 0, 1);
|
|
45
|
+
}
|
|
46
|
+
.driver-popover {
|
|
47
|
+
font-weight: 400 !important;
|
|
48
|
+
font-size: 14px;
|
|
49
|
+
line-height: normal;
|
|
50
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
|
|
51
|
+
Roboto, Helvetica Neue, sans-serif;
|
|
52
|
+
border-radius: 12px;
|
|
53
|
+
color: #fff;
|
|
54
|
+
background-color: rgb(0 0 0 / 1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.driver-popover-title {
|
|
58
|
+
font-family: Inter, -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI,
|
|
59
|
+
Roboto, Helvetica Neue, sans-serif;
|
|
60
|
+
}
|
|
61
|
+
.driver-popover .driver-popover-arrow-side-left.driver-popover-arrow {
|
|
62
|
+
border-left-color: rgb(0 0 0 / 1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.driver-popover .driver-popover-arrow-side-right.driver-popover-arrow {
|
|
66
|
+
border-right-color: rgb(0 0 0 / 1);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.driver-popover .driver-popover-arrow-side-top.driver-popover-arrow {
|
|
70
|
+
border-top-color: rgb(0 0 0 / 1);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.driver-popover .driver-popover-arrow-side-bottom.driver-popover-arrow {
|
|
74
|
+
border-bottom-color: rgb(0 0 0 / 1);
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../../../src/components/Onboarding/contexts/style.tsx"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwE9B,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { IPHXOnboardingFlow } from '../contexts/onboarding-context';
|
|
2
|
+
/**
|
|
3
|
+
* Đăng ký danh sách flows vào OnboardingProvider.
|
|
4
|
+
* Gọi hook này một lần trong component gốc của mỗi module.
|
|
5
|
+
* @param flows Danh sách flows cần đăng ký
|
|
6
|
+
*/
|
|
7
|
+
export declare const usePHXOnboardingInit: (flows: Array<IPHXOnboardingFlow>) => void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.usePHXOnboardingInit = void 0;
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const onboarding_context_1 = require("../contexts/onboarding-context");
|
|
7
|
+
/**
|
|
8
|
+
* Đăng ký danh sách flows vào OnboardingProvider.
|
|
9
|
+
* Gọi hook này một lần trong component gốc của mỗi module.
|
|
10
|
+
* @param flows Danh sách flows cần đăng ký
|
|
11
|
+
*/
|
|
12
|
+
const usePHXOnboardingInit = (flows) => {
|
|
13
|
+
const { registerFlow } = (0, onboarding_context_1.usePHXOnboarding)();
|
|
14
|
+
(0, react_1.useEffect)(() => {
|
|
15
|
+
flows.map((flow) => registerFlow(flow));
|
|
16
|
+
}, [registerFlow]);
|
|
17
|
+
};
|
|
18
|
+
exports.usePHXOnboardingInit = usePHXOnboardingInit;
|
|
19
|
+
//# sourceMappingURL=use-onboarding-init.js.map
|