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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAnimate = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tạo animation
|
|
6
|
+
* @param duration Thời lượng animation
|
|
7
|
+
* @param from Giá trị bắt đầu
|
|
8
|
+
* @param onUpdate Callback khi cập nhật giá trị
|
|
9
|
+
* @param onEnd Callback khi kết thúc
|
|
10
|
+
* @param to Giá trị kết thúc
|
|
11
|
+
*/
|
|
12
|
+
const createAnimate = ({ duration, from, onEnd, onUpdate, to }) => {
|
|
13
|
+
const start = performance.now();
|
|
14
|
+
/**
|
|
15
|
+
* Hàm tạo animation
|
|
16
|
+
* @param now Thời gian hiện tại
|
|
17
|
+
*/
|
|
18
|
+
const frame = (now) => {
|
|
19
|
+
const progress = Math.min((now - start) / duration, 1);
|
|
20
|
+
/**
|
|
21
|
+
* Hàm tính toán giá trị animation
|
|
22
|
+
* @param t Giá trị progress
|
|
23
|
+
*/
|
|
24
|
+
const easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);
|
|
25
|
+
const eased = easeOutCubic(progress);
|
|
26
|
+
const value = from + (to - from) * eased;
|
|
27
|
+
onUpdate(value);
|
|
28
|
+
if (progress < 1) {
|
|
29
|
+
requestAnimationFrame(frame);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
onEnd === null || onEnd === void 0 ? void 0 : onEnd();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
requestAnimationFrame(frame);
|
|
36
|
+
};
|
|
37
|
+
exports.createAnimate = createAnimate;
|
|
38
|
+
//# sourceMappingURL=create-animate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-animate.js","sourceRoot":"","sources":["../../../../../src/components/Slider/ultis/create-animate.ts"],"names":[],"mappings":";;;AAOA;;;;;;;GAOG;AACI,MAAM,aAAa,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAuB,EAAE,EAAE;IAC5F,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B;;;OAGG;IACH,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAA;QAEtD;;;WAGG;QACH,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;QAEpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAA;QACxC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAEf,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,qBAAqB,CAAC,KAAK,CAAC,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,KAAK,aAAL,KAAK,uBAAL,KAAK,EAAI,CAAA;QACX,CAAC;IACH,CAAC,CAAA;IACD,qBAAqB,CAAC,KAAK,CAAC,CAAA;AAC9B,CAAC,CAAA;AA1BY,QAAA,aAAa,iBA0BzB"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -135,5 +135,7 @@ import { PHXFormatDateTime } from './helpers/formatDate';
|
|
|
135
135
|
import PHXTableGroup from './components/TableGroup/TableGroup';
|
|
136
136
|
import { EMAIL_REGEX, PHONE_NUMBER_REGEX } from './utils/constants';
|
|
137
137
|
import { PHXIframe } from './components/Iframe';
|
|
138
|
+
export * from './components/Slider';
|
|
139
|
+
export * from './components/Onboarding';
|
|
138
140
|
import { PHXScheduleTable } from './components/TableSchedule';
|
|
139
141
|
export { PHXBottomAction, ModalCreateBorrowTicket as PHXLibraryModalCreateBorrowTicket, ModalReturnBook as PHXLibraryModalReturnBook, useFixedAction, PHXGrpcQueryAllSchool, PHXTextEditorV2, useMainwrapV4EventBus, PHXGetSettingSite, PHXSetSettingSite, PHXMainWrapV4, PHXTargetSelect, PHXTextEditorView, PHXStoreProduct, PHXButton, PHXBreadcrumb, PHXCard, PHXSpinner, PHXFormWrap, PHXHeaderBar, PHXTableV3, PHXInput, PHXSelect, PHXSelectBox, PHXRadio, PHXCheckbox, PHXCheckboxGroup, PHXContainer, PHXFormStep, PHXNotifications, PHXStep, PHXSkeleton, PHXFuncGetLoggedInfo, PHXClientQueryV3, PHXClientMutationV3, PHXClientMutationDataCenterV3, PHXClientQueryDataCenterV3, PHXClientMutationDevPortalV3, PHXClientQueryDevPortalV3, PHXTextarea, PHXModal, PHXTabs, PHXChoiceList, PHXDescriptionLists, PHXBadge, PHXLoginV3, PHXLoginSsoV3, PHXBanner, PHXButtonGroup, PHXCombobox, PHXFormLayout, PHXHorizontalStack, PHXUploadFile, PHXSearchResultListV3, PHXDatePicker, PHXEmptyRecord, PHXEmptySearch, PHXTimePicker, PHXDropdown, PHXUploadAvatar, PHXDateRangePicker, PHXUseDebounce, PHXResourceList, PHXFetchAPI, PieChart, BarChart, DonutChart, PHXTooltip, PHXGetActiveYearAndNextYearV3, PHXGetPrevCurrentNextYearV3, PHXGetCurrentYearWithTermHocVuV3, PHXGetCurrentYearWithTermV3, PHXFormTuitionV3, PHXMainWrapV3, PHXPagePermissionV3, PHXGetEnvPublicV3, PHXFuncGetActionPermissionV3, PHXUseQueryDataV3, PHXCalendar, PHXLoadingProvider, useLoading, PHXLoadingIndicator, PHXLink, PHXSwitchView, PHXTableVertical, PHXEmptyStateAction, PHXActivityHistory, PHXBannerWithCard, PHXUrlApply, PHXGetSelectedFilterValueFromUrl, PHXCardDetail, PHXGridLayout, PHXColumn, PHXRow, PHXStepCircle, PHXTableStatic, PHXGetToken, PHXToggle, PHXColSpan, PHXSortItem, PHXSortable, PHXGetListDepartmentManager, PHXGetUserManagerByUserId, PHXReportButtonTab, PHXReportButtonTabV2, PHXAllowExplanation, PHXUseRouterBack, PHXChunkUpdateMany, PHXTabDate, PHXTwoColumnLayout, PHXAxiosInstance, PHXDrawer, PHXResourceListSetting, PHXCompleteState, PHXTableReport, PHXMiniProgressBar, PHXFormConfigTimeUseService, PHXSelectWithAction, PHXText, PHXDescriptionListInTooltip, PHXSegmentTab, PHXUserTargetSelect, PHXTimeline, PHXClientQueryV5, PHXClientMutationV5, PHXUseToastContent, PHXTableV5, PHXPushNotificationService, PHXClientQueryV6, PHXClientMutationV6, PHXTableV6, PHXTextV2, PHXBox, PHXLegend, PHXIcon, PHXDivider, PHXPreviewNoti, PHXBlockStack, PHXInlineGrid, PHXUseDirectLink, PHXInputTags, PHXUseAuditLog, PHXFormatDateTime, PHXTableGroup, EMAIL_REGEX, PHONE_NUMBER_REGEX, PHXIframe, PHXScheduleTable, };
|
package/dist/cjs/index.js
CHANGED
|
@@ -287,6 +287,8 @@ Object.defineProperty(exports, "EMAIL_REGEX", { enumerable: true, get: function
|
|
|
287
287
|
Object.defineProperty(exports, "PHONE_NUMBER_REGEX", { enumerable: true, get: function () { return constants_1.PHONE_NUMBER_REGEX; } });
|
|
288
288
|
const Iframe_1 = require("./components/Iframe");
|
|
289
289
|
Object.defineProperty(exports, "PHXIframe", { enumerable: true, get: function () { return Iframe_1.PHXIframe; } });
|
|
290
|
+
tslib_1.__exportStar(require("./components/Slider"), exports);
|
|
291
|
+
tslib_1.__exportStar(require("./components/Onboarding"), exports);
|
|
290
292
|
const TableSchedule_1 = require("./components/TableSchedule");
|
|
291
293
|
Object.defineProperty(exports, "PHXScheduleTable", { enumerable: true, get: function () { return TableSchedule_1.PHXScheduleTable; } });
|
|
292
294
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,+EAA8E;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
@@ -3,7 +3,7 @@ import { Dialog, Transition } from '@headlessui/react';
|
|
|
3
3
|
import { PHXCard } from '../Card';
|
|
4
4
|
import { classNames } from '../types';
|
|
5
5
|
import { PHXButton } from '../Button';
|
|
6
|
-
import { ArrowLeftIcon } from '@heroicons/react/24/solid';
|
|
6
|
+
import { ArrowLeftIcon, XMarkIcon } from '@heroicons/react/24/solid';
|
|
7
7
|
import { ArrowDownTrayIcon } from '@heroicons/react/24/outline';
|
|
8
8
|
import PHXLink from '../Link/link';
|
|
9
9
|
var MODAL_THEME;
|
|
@@ -11,7 +11,10 @@ var MODAL_THEME;
|
|
|
11
11
|
MODAL_THEME["WHITE"] = "WHITE";
|
|
12
12
|
MODAL_THEME["GRAY"] = "GRAY";
|
|
13
13
|
})(MODAL_THEME || (MODAL_THEME = {}));
|
|
14
|
-
export const PHXModal = ({
|
|
14
|
+
export const PHXModal = ({ children, className,
|
|
15
|
+
// @ts-ignore
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
|
+
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', }) => {
|
|
15
18
|
const [open, setOpen] = useState(false);
|
|
16
19
|
const headerText = headerContent ? headerContent : '';
|
|
17
20
|
const sizeModal = 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');
|
|
@@ -40,7 +43,16 @@ export const PHXModal = ({ show, title, className, primaryActionText = 'Xác nh
|
|
|
40
43
|
onHide();
|
|
41
44
|
}
|
|
42
45
|
};
|
|
43
|
-
const Card = () => (React.createElement(PHXCard, {
|
|
46
|
+
const Card = () => (React.createElement(PHXCard, { dangerFooterAction: {
|
|
47
|
+
content: dangerActionText,
|
|
48
|
+
loading: dangerLoading,
|
|
49
|
+
onClick: onDangerClick,
|
|
50
|
+
submit: dangerSubmit,
|
|
51
|
+
disabled: disableSubmit,
|
|
52
|
+
}, dowloadIcon: dowloadIcon, downloadLinkRef: downloadLinkRef, downloadText: downloadText, footerBulkAction: footerBulkAction, fullSize: type === 'no-padding', headerAction: {
|
|
53
|
+
content: headerText || 'close',
|
|
54
|
+
onClick: handleClickCloseAction,
|
|
55
|
+
}, hrefLink: hrefLink, isHeaderDownload: isHeaderDownload, primaryFooterAction: !hiddenSubmit
|
|
44
56
|
? {
|
|
45
57
|
content: primaryActionText,
|
|
46
58
|
loading: primaryLoading,
|
|
@@ -48,14 +60,26 @@ export const PHXModal = ({ show, title, className, primaryActionText = 'Xác nh
|
|
|
48
60
|
submit: primarySubmit,
|
|
49
61
|
disabled: disableSubmit,
|
|
50
62
|
}
|
|
51
|
-
: {},
|
|
52
|
-
content: dangerActionText,
|
|
53
|
-
loading: dangerLoading,
|
|
54
|
-
onClick: onDangerClick,
|
|
55
|
-
submit: dangerSubmit,
|
|
56
|
-
disabled: disableSubmit,
|
|
57
|
-
}, isHeaderDownload: isHeaderDownload },
|
|
63
|
+
: {}, primaryHeader: true, secondaryFooterActions: !hiddenCloseButton ? [{ content: secondaryActionText, onClick: onClose }] : undefined, title: title, type: 'modal' },
|
|
58
64
|
React.createElement("div", { className: type !== 'no-padding' ? '-mt-1' : '' }, children)));
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
/**
|
|
67
|
+
* Handles the Escape key press to close the modal.
|
|
68
|
+
* Prevents closing when the close button is disabled.
|
|
69
|
+
*
|
|
70
|
+
* @param event - The keyboard event triggered by the user.
|
|
71
|
+
*/
|
|
72
|
+
const handleKeyDown = (event) => {
|
|
73
|
+
if (event.key === 'Escape' && !disableCloseButton) {
|
|
74
|
+
setOpen(false);
|
|
75
|
+
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
79
|
+
return () => {
|
|
80
|
+
window.removeEventListener('keydown', handleKeyDown);
|
|
81
|
+
};
|
|
82
|
+
}, [disableCloseButton, show]);
|
|
59
83
|
return (React.createElement(Transition.Root, { as: Fragment, show: open },
|
|
60
84
|
React.createElement(Dialog, { as: 'div', className: 'relative z-50', onClose: () => {
|
|
61
85
|
// Chỉ tắt modal này
|
|
@@ -66,29 +90,39 @@ export const PHXModal = ({ show, title, className, primaryActionText = 'Xác nh
|
|
|
66
90
|
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
67
91
|
}, static: true },
|
|
68
92
|
!noOverlay && (React.createElement(Transition.Child, { as: 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' },
|
|
69
|
-
React.createElement("div", { className: 'fixed inset-0 z-40
|
|
93
|
+
React.createElement("div", { className: 'fixed inset-0 z-40 bg-gray-500 bg-opacity-75 transition-opacity' }))),
|
|
70
94
|
React.createElement("div", { className: `fixed inset-0 z-50 overflow-y-auto ${className || ''}` },
|
|
71
|
-
React.createElement("div", { className: 'flex items-center justify-center
|
|
95
|
+
React.createElement("div", { className: 'flex min-h-full items-center justify-center p-4 text-center sm:items-center sm:p-0' },
|
|
72
96
|
React.createElement(Transition.Child, { as: 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
97
|
React.createElement("div", { className: classNames('min-w-0 flex-1', customWidth ? customWidth : sizeModal) },
|
|
74
98
|
React.createElement(Dialog.Panel, { className: 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.createElement("form", { onSubmit: onSubmit },
|
|
75
99
|
React.createElement(Card, null))) : (React.createElement(Card, null))) : (React.createElement("div", null,
|
|
76
100
|
React.createElement("div", { className: 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]') },
|
|
77
101
|
React.createElement("div", { className: 'flex items-center gap-1' },
|
|
78
|
-
isCancel && (React.createElement("button", { className: 'inline-flex items-center px-2 py-1 text-xs font-bold text-gray-700
|
|
79
|
-
React.createElement(ArrowLeftIcon, { className: '
|
|
80
|
-
title)
|
|
81
|
-
|
|
102
|
+
isCancel && (React.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' },
|
|
103
|
+
React.createElement(ArrowLeftIcon, { className: 'h-4 w-4' }))),
|
|
104
|
+
title),
|
|
105
|
+
React.createElement("button", { className: 'grid grid-cols-1 rounded-md p-0.5 text-gray-400 hover:bg-gray-200 hover:text-gray-500', onClick: () => {
|
|
106
|
+
if (disableCloseButton) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
setOpen(false);
|
|
110
|
+
onHide === null || onHide === void 0 ? void 0 : onHide();
|
|
111
|
+
}, type: 'button' },
|
|
112
|
+
React.createElement(React.Fragment, null,
|
|
113
|
+
React.createElement("span", { className: 'sr-only' }, "Close"),
|
|
114
|
+
React.createElement(XMarkIcon, { "aria-hidden": 'true', className: 'h-5 w-5' })))),
|
|
115
|
+
React.createElement("div", { className: type === 'default' ? 'p-3 text-xs text-gray-500' : '', style: { maxHeight: customHeight || '100%' } }, children),
|
|
82
116
|
React.createElement("div", { className: 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.createElement(React.Fragment, null,
|
|
83
|
-
React.createElement("div", { className: 'flex items-center
|
|
117
|
+
React.createElement("div", { className: 'flex items-center gap-x-3 rounded-t-lg p-4 pl-5' },
|
|
84
118
|
downloadLinkRef && hrefLink && downloadText && (React.createElement("div", { className: 'group flex items-center gap-x-1' },
|
|
85
119
|
dowloadIcon && (React.createElement(ArrowDownTrayIcon, { className: 'h-4 w-4 text-link-500 group-hover:text-link-600 group-active:text-link-600', strokeWidth: 2 })),
|
|
86
|
-
React.createElement(PHXLink, { as: 'a',
|
|
120
|
+
React.createElement(PHXLink, { ref: downloadLinkRef, as: 'a', href: hrefLink }, downloadText))),
|
|
87
121
|
leftActionText && (React.createElement("div", { className: 'flex gap-2' },
|
|
88
|
-
React.createElement(PHXButton, { className: 'text-sm !text-link-500
|
|
122
|
+
React.createElement(PHXButton, { className: '!px-0 text-sm !text-link-500', disabled: disableLeftAction, onClick: onLeftActionText, plain: true }, leftActionText),
|
|
89
123
|
loadingLeftAction && React.createElement(PHXButton, { disabled: true, loading: true, plain: true, size: 'micro' }))),
|
|
90
124
|
footerBulkAction && footerBulkAction.content && (React.createElement(PHXButton, { danger: true, disabled: footerBulkAction.disabled, loading: footerBulkAction.loading, onClick: footerBulkAction.onClick, size: 'micro', submit: !!footerBulkAction.submit }, footerBulkAction.content))),
|
|
91
|
-
React.createElement("div", { className: 'flex justify-end
|
|
125
|
+
React.createElement("div", { className: 'flex justify-end gap-x-3 rounded-t-lg p-4' },
|
|
92
126
|
React.createElement(PHXButton, { disabled: disableCloseButton, onClick: onHide, secondary: true, size: 'micro' }, secondaryActionText),
|
|
93
127
|
dangerSubmit && (React.createElement(PHXButton, { danger: true, disabled: disableSubmit, loading: dangerLoading, onClick: onDangerClick, size: 'micro' }, dangerActionText)),
|
|
94
128
|
!hiddenSubmit && (React.createElement(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,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;
|
|
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,276 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { driver } from 'driver.js';
|
|
3
|
+
import 'driver.js/dist/driver.css';
|
|
4
|
+
import React, { createContext, useContext, useEffect, useState } from 'react';
|
|
5
|
+
import { PHXOnboardingModal } from '../modal-slides/modal-slides';
|
|
6
|
+
import { styleOnboarding } from './style';
|
|
7
|
+
const ONBOARDING_STATUS_KEY = 'phx-onboarding-status';
|
|
8
|
+
const PHXOnboardingContext = createContext(undefined);
|
|
9
|
+
export const PHXOnboardingProvider = ({ children }) => {
|
|
10
|
+
const [currentFlow, setCurrentFlow] = useState(null);
|
|
11
|
+
const [isRunning, setIsRunning] = useState(false);
|
|
12
|
+
const [flows, setFlows] = useState(new Map());
|
|
13
|
+
const [driverInstance, setDriverInstance] = useState(null);
|
|
14
|
+
// Modal slides state
|
|
15
|
+
const [isSlidesOpen, setIsSlidesOpen] = useState(false);
|
|
16
|
+
const [activeSlides, setActiveSlides] = useState([]);
|
|
17
|
+
const [hasTours, setHasTours] = useState(false);
|
|
18
|
+
const [pendingTourFlowName, setPendingTourFlowName] = useState(null);
|
|
19
|
+
// In-memory status only — không tự động ghi localStorage
|
|
20
|
+
const [onboardingStatus, setOnboardingStatus] = useState({});
|
|
21
|
+
// Đọc trạng thái đã persist từ localStorage khi khởi động
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const saved = localStorage.getItem(ONBOARDING_STATUS_KEY);
|
|
24
|
+
if (saved) {
|
|
25
|
+
try {
|
|
26
|
+
setOnboardingStatus(JSON.parse(saved));
|
|
27
|
+
}
|
|
28
|
+
catch (_a) {
|
|
29
|
+
// ignore parse error
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}, []);
|
|
33
|
+
/**
|
|
34
|
+
* Cập nhật trạng thái trong bộ nhớ (KHÔNG ghi localStorage)
|
|
35
|
+
* @param flowName Tên flow
|
|
36
|
+
* @param patch Trạng thái muốn cập nhật
|
|
37
|
+
*/
|
|
38
|
+
const updateStatus = (flowName, patch) => {
|
|
39
|
+
setOnboardingStatus((prev) => {
|
|
40
|
+
var _a;
|
|
41
|
+
const current = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
|
|
42
|
+
slidesCompleted: false,
|
|
43
|
+
toursCompleted: false,
|
|
44
|
+
};
|
|
45
|
+
return {
|
|
46
|
+
...prev,
|
|
47
|
+
[flowName]: { ...current, ...patch },
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
/** Lưu trạng thái của flow vào localStorage
|
|
52
|
+
* @param flowName Tên flow
|
|
53
|
+
*/
|
|
54
|
+
const persistFlowStatus = (flowName) => {
|
|
55
|
+
setOnboardingStatus((prev) => {
|
|
56
|
+
var _a;
|
|
57
|
+
const status = (_a = prev[flowName]) !== null && _a !== void 0 ? _a : {
|
|
58
|
+
slidesCompleted: false,
|
|
59
|
+
toursCompleted: false,
|
|
60
|
+
};
|
|
61
|
+
const updated = { ...prev, [flowName]: status };
|
|
62
|
+
localStorage.setItem(ONBOARDING_STATUS_KEY, JSON.stringify(updated));
|
|
63
|
+
return updated;
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Lấy trạng thái của flow
|
|
68
|
+
* @param flowName Tên flow
|
|
69
|
+
*/
|
|
70
|
+
const getFlowStatus = (flowName) => {
|
|
71
|
+
var _a;
|
|
72
|
+
return (_a = onboardingStatus[flowName]) !== null && _a !== void 0 ? _a : {
|
|
73
|
+
slidesCompleted: false,
|
|
74
|
+
toursCompleted: false,
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Đăng ký flow
|
|
79
|
+
* @param flow Flow cần đăng ký
|
|
80
|
+
*/
|
|
81
|
+
const registerFlow = (flow) => {
|
|
82
|
+
setFlows((prev) => new Map(prev).set(flow.name, flow));
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Chạy tour
|
|
86
|
+
* @param flowName Tên flow
|
|
87
|
+
* @param flow Flow cần chạy tour
|
|
88
|
+
*/
|
|
89
|
+
const runTour = (flowName, flow) => {
|
|
90
|
+
var _a;
|
|
91
|
+
if (!((_a = flow.steps) === null || _a === void 0 ? void 0 : _a.length))
|
|
92
|
+
return;
|
|
93
|
+
if (driverInstance) {
|
|
94
|
+
driverInstance.destroy();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Tạo driver instance
|
|
98
|
+
*/
|
|
99
|
+
const newDriver = driver({
|
|
100
|
+
showProgress: true,
|
|
101
|
+
showButtons: ['next', 'previous', 'close'],
|
|
102
|
+
nextBtnText: 'Tiếp theo',
|
|
103
|
+
prevBtnText: 'Quay lại',
|
|
104
|
+
doneBtnText: 'Hoàn tất',
|
|
105
|
+
stageRadius: 12,
|
|
106
|
+
allowClose: true,
|
|
107
|
+
onDestroyed: () => {
|
|
108
|
+
setDriverInstance(null);
|
|
109
|
+
setCurrentFlow(null);
|
|
110
|
+
setIsRunning(false);
|
|
111
|
+
// Chỉ cập nhật in-memory, không tự động persist
|
|
112
|
+
updateStatus(flowName, { toursCompleted: true });
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
newDriver.setSteps(flow.steps.map((step) => {
|
|
116
|
+
var _a, _b;
|
|
117
|
+
return ({
|
|
118
|
+
element: step.element,
|
|
119
|
+
popover: {
|
|
120
|
+
title: step.popover.title,
|
|
121
|
+
description: step.popover.description,
|
|
122
|
+
side: (_a = step.popover.side) !== null && _a !== void 0 ? _a : 'bottom',
|
|
123
|
+
align: (_b = step.popover.align) !== null && _b !== void 0 ? _b : 'center',
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}));
|
|
127
|
+
setDriverInstance(newDriver);
|
|
128
|
+
setCurrentFlow(flowName);
|
|
129
|
+
setIsRunning(true);
|
|
130
|
+
newDriver.drive();
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Bắt đầu flow
|
|
134
|
+
* @param flowName Tên flow
|
|
135
|
+
*/
|
|
136
|
+
const startFlow = (flowName) => {
|
|
137
|
+
var _a, _b;
|
|
138
|
+
const flow = flows.get(flowName);
|
|
139
|
+
if (!flow) {
|
|
140
|
+
console.warn(`[Onboarding] Flow "${flowName}" not registered`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const hasSlides = Boolean((_a = flow.slides) === null || _a === void 0 ? void 0 : _a.length);
|
|
144
|
+
const hasTourSteps = Boolean((_b = flow.steps) === null || _b === void 0 ? void 0 : _b.length);
|
|
145
|
+
const status = getFlowStatus(flowName);
|
|
146
|
+
// Case 1: chỉ có tour (không có slides)
|
|
147
|
+
if (!hasSlides && hasTourSteps) {
|
|
148
|
+
runTour(flowName, flow);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Case 2: chỉ có slides (không có tour)
|
|
152
|
+
if (hasSlides && !hasTourSteps) {
|
|
153
|
+
if (!status.slidesCompleted) {
|
|
154
|
+
setActiveSlides(flow.slides);
|
|
155
|
+
setHasTours(false);
|
|
156
|
+
setPendingTourFlowName(null);
|
|
157
|
+
setCurrentFlow(flowName);
|
|
158
|
+
setIsSlidesOpen(true);
|
|
159
|
+
}
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Case 3: cả slides lẫn tour
|
|
163
|
+
if (hasSlides && hasTourSteps) {
|
|
164
|
+
if (!status.slidesCompleted) {
|
|
165
|
+
setActiveSlides(flow.slides);
|
|
166
|
+
setHasTours(true);
|
|
167
|
+
setPendingTourFlowName(flowName);
|
|
168
|
+
setCurrentFlow(flowName);
|
|
169
|
+
setIsSlidesOpen(true);
|
|
170
|
+
}
|
|
171
|
+
else if (!status.toursCompleted) {
|
|
172
|
+
runTour(flowName, flow);
|
|
173
|
+
}
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
console.warn(`[Onboarding] Flow "${flowName}" has no slides or steps`);
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Cập nhật trạng thái của flow
|
|
180
|
+
*/
|
|
181
|
+
const updateStatusFlow = () => {
|
|
182
|
+
if (currentFlow) {
|
|
183
|
+
// Chỉ cập nhật in-memory, không tự động persist
|
|
184
|
+
updateStatus(currentFlow, { slidesCompleted: true });
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* Đóng slides
|
|
189
|
+
*/
|
|
190
|
+
const closeSlides = () => {
|
|
191
|
+
setIsSlidesOpen(false);
|
|
192
|
+
updateStatusFlow();
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Bắt đầu tour từ slides
|
|
196
|
+
*/
|
|
197
|
+
const startTourFromSlides = () => {
|
|
198
|
+
setIsSlidesOpen(false);
|
|
199
|
+
updateStatusFlow();
|
|
200
|
+
if (pendingTourFlowName) {
|
|
201
|
+
const flow = flows.get(pendingTourFlowName);
|
|
202
|
+
if (flow) {
|
|
203
|
+
runTour(pendingTourFlowName, flow);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
/**
|
|
208
|
+
* Kết thúc flow
|
|
209
|
+
*/
|
|
210
|
+
const endFlow = () => {
|
|
211
|
+
if (driverInstance) {
|
|
212
|
+
driverInstance.destroy();
|
|
213
|
+
setDriverInstance(null);
|
|
214
|
+
}
|
|
215
|
+
setIsRunning(false);
|
|
216
|
+
setCurrentFlow(null);
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Chuyển đến bước tiếp theo
|
|
220
|
+
*/
|
|
221
|
+
const nextStep = () => {
|
|
222
|
+
driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.moveNext();
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Chuyển đến bước trước đó
|
|
226
|
+
*/
|
|
227
|
+
const previousStep = () => {
|
|
228
|
+
driverInstance === null || driverInstance === void 0 ? void 0 : driverInstance.movePrevious();
|
|
229
|
+
};
|
|
230
|
+
/**
|
|
231
|
+
* Bỏ qua flow
|
|
232
|
+
*/
|
|
233
|
+
const skipFlow = () => {
|
|
234
|
+
endFlow();
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* Reset trạng thái của flow
|
|
238
|
+
* @param flowName Tên flow
|
|
239
|
+
*/
|
|
240
|
+
const resetStatusOnboarding = (flowName) => {
|
|
241
|
+
updateStatus(flowName, {
|
|
242
|
+
slidesCompleted: false,
|
|
243
|
+
toursCompleted: false,
|
|
244
|
+
});
|
|
245
|
+
};
|
|
246
|
+
const value = {
|
|
247
|
+
currentFlow,
|
|
248
|
+
isRunning,
|
|
249
|
+
registerFlow,
|
|
250
|
+
startFlow,
|
|
251
|
+
endFlow,
|
|
252
|
+
nextStep,
|
|
253
|
+
previousStep,
|
|
254
|
+
skipFlow,
|
|
255
|
+
isSlidesOpen,
|
|
256
|
+
closeSlides,
|
|
257
|
+
persistFlowStatus,
|
|
258
|
+
getFlowStatus,
|
|
259
|
+
resetStatusOnboarding,
|
|
260
|
+
};
|
|
261
|
+
return (React.createElement(PHXOnboardingContext.Provider, { value: value },
|
|
262
|
+
React.createElement("style", { dangerouslySetInnerHTML: { __html: styleOnboarding } }),
|
|
263
|
+
children,
|
|
264
|
+
React.createElement(PHXOnboardingModal, { hasTours: hasTours, onHide: closeSlides, onStartTour: startTourFromSlides, show: isSlidesOpen, slides: activeSlides })));
|
|
265
|
+
};
|
|
266
|
+
/**
|
|
267
|
+
* Hook để sử dụng context
|
|
268
|
+
*/
|
|
269
|
+
export const usePHXOnboarding = () => {
|
|
270
|
+
const context = useContext(PHXOnboardingContext);
|
|
271
|
+
if (!context) {
|
|
272
|
+
throw new Error('useOnboarding must be used within OnboardingProvider');
|
|
273
|
+
}
|
|
274
|
+
return context;
|
|
275
|
+
};
|
|
276
|
+
//# sourceMappingURL=onboarding-context.js.map
|