@burdenoff/microfe-tours 2026.1013.2 → 2026.1109.1
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/constants/featureFlags.d.ts +24 -0
- package/dist/constants/featureFlags.js +1 -2
- package/dist/constants/featureFlags.js.map +1 -1
- package/dist/constants/permissions.d.ts +48 -0
- package/dist/constants/permissions.js +1 -2
- package/dist/constants/permissions.js.map +1 -1
- package/dist/dev/main.d.ts +0 -0
- package/dist/generated/global-operations.d.ts +1318 -0
- package/dist/generated/global-operations.js +2 -3
- package/dist/generated/global-operations.js.map +1 -1
- package/dist/generated/global-types.d.ts +26469 -0
- package/dist/generated/wspace-operations.d.ts +1 -0
- package/dist/generated/wspace-types.d.ts +108647 -0
- package/dist/index.d.ts +5 -0
- package/dist/test/happydom.d.ts +1 -0
- package/dist/test/testing-library.d.ts +1 -0
- package/dist/tours/ToursAdminRoot.d.ts +14 -0
- package/dist/tours/ToursAdminRoot.js +14 -13
- package/dist/tours/ToursAdminRoot.js.map +1 -1
- package/dist/tours/ToursAdminRoutes.d.ts +11 -0
- package/dist/tours/ToursAdminRoutes.js +12 -13
- package/dist/tours/ToursAdminRoutes.js.map +1 -1
- package/dist/tours/ToursRoot.d.ts +9 -0
- package/dist/tours/ToursRoot.js +1 -1
- package/dist/tours/ToursUserRoot.d.ts +13 -0
- package/dist/tours/ToursUserRoot.js +14 -13
- package/dist/tours/ToursUserRoot.js.map +1 -1
- package/dist/tours/ToursUserRoutes.d.ts +14 -0
- package/dist/tours/ToursUserRoutes.js +13 -13
- package/dist/tours/ToursUserRoutes.js.map +1 -1
- package/dist/tours/components/MarkdownEditor.d.ts +12 -0
- package/dist/tours/components/MarkdownEditor.js +1 -2
- package/dist/tours/components/MarkdownEditor.js.map +1 -1
- package/dist/tours/components/RouteHelpers.d.ts +31 -0
- package/dist/tours/components/RouteHelpers.js +1 -2
- package/dist/tours/components/RouteHelpers.js.map +1 -1
- package/dist/tours/components/ToursAdminNavRegistrar.d.ts +23 -0
- package/dist/tours/components/ToursAdminNavRegistrar.js +4 -3
- package/dist/tours/components/ToursAdminNavRegistrar.js.map +1 -1
- package/dist/tours/hooks/useMediaLibrary.d.ts +20 -0
- package/dist/tours/hooks/useMediaLibrary.js +1 -2
- package/dist/tours/hooks/useMediaLibrary.js.map +1 -1
- package/dist/tours/hooks/useStepSequencer.d.ts +18 -0
- package/dist/tours/hooks/useStepSequencer.js +16 -13
- package/dist/tours/hooks/useStepSequencer.js.map +1 -1
- package/dist/tours/hooks/useTourAnalytics.d.ts +30 -0
- package/dist/tours/hooks/useTourAnalytics.js +1 -2
- package/dist/tours/hooks/useTourAnalytics.js.map +1 -1
- package/dist/tours/hooks/useTourBuilder.d.ts +59 -0
- package/dist/tours/hooks/useTourBuilder.js +10 -6
- package/dist/tours/hooks/useTourBuilder.js.map +1 -1
- package/dist/tours/hooks/useTourLifecycle.d.ts +21 -0
- package/dist/tours/hooks/useTourLifecycle.js +4 -5
- package/dist/tours/hooks/useTourLifecycle.js.map +1 -1
- package/dist/tours/hooks/useTourPreview.d.ts +31 -0
- package/dist/tours/hooks/useTourPreview.js +5 -6
- package/dist/tours/hooks/useTourPreview.js.map +1 -1
- package/dist/tours/hooks/useToursList.d.ts +15 -0
- package/dist/tours/hooks/useToursList.js +1 -2
- package/dist/tours/hooks/useToursList.js.map +1 -1
- package/dist/tours/hooks/useToursPermissionAccess.d.ts +15 -0
- package/dist/tours/hooks/useToursPermissionAccess.js +1 -2
- package/dist/tours/hooks/useToursPermissionAccess.js.map +1 -1
- package/dist/tours/i18n.d.ts +413 -0
- package/dist/tours/i18n.js +1 -2
- package/dist/tours/i18n.js.map +1 -1
- package/dist/tours/index.d.ts +21 -0
- package/dist/tours/index.js +6 -5
- package/dist/tours/pages/AnalyticsDashboardPage.d.ts +5 -0
- package/dist/tours/pages/AnalyticsDashboardPage.js +6 -7
- package/dist/tours/pages/AnalyticsDashboardPage.js.map +1 -1
- package/dist/tours/pages/MediaLibraryPage.d.ts +5 -0
- package/dist/tours/pages/MediaLibraryPage.js +10 -11
- package/dist/tours/pages/MediaLibraryPage.js.map +1 -1
- package/dist/tours/pages/MyToursPage.d.ts +10 -0
- package/dist/tours/pages/MyToursPage.js +5 -6
- package/dist/tours/pages/MyToursPage.js.map +1 -1
- package/dist/tours/pages/MyToursProgressPage.d.ts +5 -0
- package/dist/tours/pages/MyToursProgressPage.js +5 -6
- package/dist/tours/pages/MyToursProgressPage.js.map +1 -1
- package/dist/tours/pages/SchedulerPage.d.ts +5 -0
- package/dist/tours/pages/SchedulerPage.js +10 -11
- package/dist/tours/pages/SchedulerPage.js.map +1 -1
- package/dist/tours/pages/StepEditorPage.d.ts +6 -0
- package/dist/tours/pages/StepEditorPage.js +302 -309
- package/dist/tours/pages/StepEditorPage.js.map +1 -1
- package/dist/tours/pages/SystemAnalyticsPage.d.ts +5 -0
- package/dist/tours/pages/SystemAnalyticsPage.js +1 -2
- package/dist/tours/pages/SystemAnalyticsPage.js.map +1 -1
- package/dist/tours/pages/TemplateLibraryPage.d.ts +5 -0
- package/dist/tours/pages/TemplateLibraryPage.js +15 -16
- package/dist/tours/pages/TemplateLibraryPage.js.map +1 -1
- package/dist/tours/pages/TourBuilderPage.d.ts +1 -0
- package/dist/tours/pages/TourBuilderPage.js +273 -300
- package/dist/tours/pages/TourBuilderPage.js.map +1 -1
- package/dist/tours/pages/TourPreviewPage.d.ts +5 -0
- package/dist/tours/pages/TourPreviewPage.js +9 -10
- package/dist/tours/pages/TourPreviewPage.js.map +1 -1
- package/dist/tours/pages/ToursListPage.d.ts +5 -0
- package/dist/tours/pages/ToursListPage.js +157 -157
- package/dist/tours/pages/ToursListPage.js.map +1 -1
- package/dist/tours/providers/ToursProvider.d.ts +25 -0
- package/dist/tours/providers/ToursProvider.js +1 -2
- package/dist/tours/providers/ToursProvider.js.map +1 -1
- package/dist/tours/store/toursStore.d.ts +40 -0
- package/dist/tours/store/toursStore.js +5 -6
- package/dist/tours/store/toursStore.js.map +1 -1
- package/dist/tours/telemetry.d.ts +7 -0
- package/dist/tours/telemetry.js +1 -2
- package/dist/tours/telemetry.js.map +1 -1
- package/dist/tours/types/index.d.ts +348 -0
- package/dist/tours/utils/index.d.ts +28 -0
- package/dist/tours/utils/index.js +3 -4
- package/dist/tours/utils/index.js.map +1 -1
- package/dist/tours/utils/joinPath.d.ts +8 -0
- package/dist/tours/utils/joinPath.js +1 -2
- package/dist/tours/utils/joinPath.js.map +1 -1
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +1 -2
- package/package.json +62 -51
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook wrapping admin lifecycle mutations for tours.
|
|
3
|
+
* Provides publish, unpublish, archive, duplicate, and save-as-template actions.
|
|
4
|
+
*/
|
|
5
|
+
export declare function useTourLifecycle(): {
|
|
6
|
+
publishTour: (id: string) => Promise<any>;
|
|
7
|
+
unpublishTour: (id: string) => Promise<any>;
|
|
8
|
+
archiveTour: (id: string) => Promise<any>;
|
|
9
|
+
duplicateTour: (id: string, newName?: string) => Promise<any>;
|
|
10
|
+
saveAsTemplate: (tourId: string, input: {
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
category?: string;
|
|
14
|
+
isPublic?: boolean;
|
|
15
|
+
}) => Promise<any>;
|
|
16
|
+
publishing: boolean;
|
|
17
|
+
unpublishing: boolean;
|
|
18
|
+
archiving: boolean;
|
|
19
|
+
duplicating: boolean;
|
|
20
|
+
savingTemplate: boolean;
|
|
21
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useArchiveTourMutation as e, useDuplicateTourMutation as t, usePublishTourMutation as n, useSaveTourAsTemplateMutation as r, useUnpublishTourMutation as i } from "../../generated/global-operations.js";
|
|
2
|
+
import { useToursStore as a } from "../store/toursStore.js";
|
|
3
3
|
import { useCallback as o } from "react";
|
|
4
|
-
|
|
4
|
+
// src/tours/hooks/useTourLifecycle.ts
|
|
5
5
|
function s() {
|
|
6
|
-
let s =
|
|
6
|
+
let s = a((e) => e.notifyToursListChanged), [c, { loading: l }] = n(), [u, { loading: d }] = i(), [f, { loading: p }] = e(), [m, { loading: h }] = t(), [g, { loading: _ }] = r();
|
|
7
7
|
return {
|
|
8
8
|
publishTour: o(async (e) => {
|
|
9
9
|
let t = await c({ variables: { id: e } });
|
|
@@ -38,7 +38,6 @@ function s() {
|
|
|
38
38
|
savingTemplate: _
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
//#endregion
|
|
42
41
|
export { s as useTourLifecycle };
|
|
43
42
|
|
|
44
43
|
//# sourceMappingURL=useTourLifecycle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTourLifecycle.js","names":[],"sources":["../../../src/tours/hooks/useTourLifecycle.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport {\n usePublishTourMutation,\n useUnpublishTourMutation,\n useArchiveTourMutation,\n useDuplicateTourMutation,\n useSaveTourAsTemplateMutation,\n} from '../../generated/global-operations';\nimport { useToursStore } from '../store/toursStore';\n\n/**\n * Hook wrapping admin lifecycle mutations for tours.\n * Provides publish, unpublish, archive, duplicate, and save-as-template actions.\n */\nexport function useTourLifecycle() {\n const notifyToursListChanged = useToursStore((state) => state.notifyToursListChanged);\n const [publishTourMutation, { loading: publishing }] = usePublishTourMutation();\n const [unpublishTourMutation, { loading: unpublishing }] = useUnpublishTourMutation();\n const [archiveTourMutation, { loading: archiving }] = useArchiveTourMutation();\n const [duplicateTourMutation, { loading: duplicating }] = useDuplicateTourMutation();\n const [saveTourAsTemplateMutation, { loading: savingTemplate }] = useSaveTourAsTemplateMutation();\n\n const publishTour = useCallback(\n async (id: string) => {\n const result = await publishTourMutation({ variables: { id } });\n if (result.data?.publishTour) {\n notifyToursListChanged();\n }\n return result.data?.publishTour ?? null;\n },\n [notifyToursListChanged, publishTourMutation]\n );\n\n const unpublishTour = useCallback(\n async (id: string) => {\n const result = await unpublishTourMutation({ variables: { id } });\n if (result.data?.unpublishTour) {\n notifyToursListChanged();\n }\n return result.data?.unpublishTour ?? null;\n },\n [notifyToursListChanged, unpublishTourMutation]\n );\n\n const archiveTour = useCallback(\n async (id: string) => {\n const result = await archiveTourMutation({ variables: { id } });\n if (result.data?.archiveTour) {\n notifyToursListChanged();\n }\n return result.data?.archiveTour ?? null;\n },\n [archiveTourMutation, notifyToursListChanged]\n );\n\n const duplicateTour = useCallback(\n async (id: string, newName?: string) => {\n const result = await duplicateTourMutation({ variables: { id, newName } });\n if (result.data?.duplicateTour) {\n notifyToursListChanged();\n }\n return result.data?.duplicateTour ?? null;\n },\n [duplicateTourMutation, notifyToursListChanged]\n );\n\n const saveAsTemplate = useCallback(\n async (\n tourId: string,\n input: { name: string; description?: string; category?: string; isPublic?: boolean }\n ) => {\n const result = await saveTourAsTemplateMutation({\n variables: { tourId, input },\n refetchQueries: ['GetTourTemplates'],\n });\n return result.data?.saveTourAsTemplate ?? null;\n },\n [saveTourAsTemplateMutation]\n );\n\n return {\n publishTour,\n unpublishTour,\n archiveTour,\n duplicateTour,\n saveAsTemplate,\n publishing,\n unpublishing,\n archiving,\n duplicating,\n savingTemplate,\n };\n}\n"],"mappings":";;;;AAcA,
|
|
1
|
+
{"version":3,"file":"useTourLifecycle.js","names":["useTourLifecycle","notifyToursListChanged","useToursStore","state","publishTourMutation","publishing","usePublishTourMutation","unpublishTourMutation","unpublishing","useUnpublishTourMutation","archiveTourMutation","archiving","useArchiveTourMutation","duplicateTourMutation","duplicating","useDuplicateTourMutation","saveTourAsTemplateMutation","savingTemplate","useSaveTourAsTemplateMutation","useCallback","result"],"sources":["../../../src/tours/hooks/useTourLifecycle.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport {\n usePublishTourMutation,\n useUnpublishTourMutation,\n useArchiveTourMutation,\n useDuplicateTourMutation,\n useSaveTourAsTemplateMutation,\n} from '../../generated/global-operations';\nimport { useToursStore } from '../store/toursStore';\n\n/**\n * Hook wrapping admin lifecycle mutations for tours.\n * Provides publish, unpublish, archive, duplicate, and save-as-template actions.\n */\nexport function useTourLifecycle() {\n const notifyToursListChanged = useToursStore((state) => state.notifyToursListChanged);\n const [publishTourMutation, { loading: publishing }] = usePublishTourMutation();\n const [unpublishTourMutation, { loading: unpublishing }] = useUnpublishTourMutation();\n const [archiveTourMutation, { loading: archiving }] = useArchiveTourMutation();\n const [duplicateTourMutation, { loading: duplicating }] = useDuplicateTourMutation();\n const [saveTourAsTemplateMutation, { loading: savingTemplate }] = useSaveTourAsTemplateMutation();\n\n const publishTour = useCallback(\n async (id: string) => {\n const result = await publishTourMutation({ variables: { id } });\n if (result.data?.publishTour) {\n notifyToursListChanged();\n }\n return result.data?.publishTour ?? null;\n },\n [notifyToursListChanged, publishTourMutation]\n );\n\n const unpublishTour = useCallback(\n async (id: string) => {\n const result = await unpublishTourMutation({ variables: { id } });\n if (result.data?.unpublishTour) {\n notifyToursListChanged();\n }\n return result.data?.unpublishTour ?? null;\n },\n [notifyToursListChanged, unpublishTourMutation]\n );\n\n const archiveTour = useCallback(\n async (id: string) => {\n const result = await archiveTourMutation({ variables: { id } });\n if (result.data?.archiveTour) {\n notifyToursListChanged();\n }\n return result.data?.archiveTour ?? null;\n },\n [archiveTourMutation, notifyToursListChanged]\n );\n\n const duplicateTour = useCallback(\n async (id: string, newName?: string) => {\n const result = await duplicateTourMutation({ variables: { id, newName } });\n if (result.data?.duplicateTour) {\n notifyToursListChanged();\n }\n return result.data?.duplicateTour ?? null;\n },\n [duplicateTourMutation, notifyToursListChanged]\n );\n\n const saveAsTemplate = useCallback(\n async (\n tourId: string,\n input: { name: string; description?: string; category?: string; isPublic?: boolean }\n ) => {\n const result = await saveTourAsTemplateMutation({\n variables: { tourId, input },\n refetchQueries: ['GetTourTemplates'],\n });\n return result.data?.saveTourAsTemplate ?? null;\n },\n [saveTourAsTemplateMutation]\n );\n\n return {\n publishTour,\n unpublishTour,\n archiveTour,\n duplicateTour,\n saveAsTemplate,\n publishing,\n unpublishing,\n archiving,\n duplicating,\n savingTemplate,\n };\n}\n"],"mappings":";;;;AAcA,SAAgBA,IAAmB;CACjC,IAAMC,IAAyBC,GAAe,MAAUC,EAAM,sBAAsB,GAC9E,CAACC,GAAqB,EAAE,SAASC,OAAgBC,EAAuB,GACxE,CAACC,GAAuB,EAAE,SAASC,OAAkBC,EAAyB,GAC9E,CAACC,GAAqB,EAAE,SAASC,OAAeC,EAAuB,GACvE,CAACC,GAAuB,EAAE,SAASC,OAAiBC,EAAyB,GAC7E,CAACC,GAA4B,EAAE,SAASC,OAAoBC,EAA8B;CA4DhG,OAAO;EACL,aA3DkBC,EAClB,OAAO,MAAe;GACpB,IAAMC,IAAS,MAAMhB,EAAoB,EAAE,WAAW,EAAE,MAAG,EAAE,CAAC;GAI9D,OAHIgB,EAAO,MAAM,eACfnB,EAAuB,GAElBmB,EAAO,MAAM,eAAe;EACrC,GACA,CAACnB,GAAwBG,CAAmB,CAmD5C;EACA,eAjDoBe,EACpB,OAAO,MAAe;GACpB,IAAMC,IAAS,MAAMb,EAAsB,EAAE,WAAW,EAAE,MAAG,EAAE,CAAC;GAIhE,OAHIa,EAAO,MAAM,iBACfnB,EAAuB,GAElBmB,EAAO,MAAM,iBAAiB;EACvC,GACA,CAACnB,GAAwBM,CAAqB,CAyC9C;EACA,aAvCkBY,EAClB,OAAO,MAAe;GACpB,IAAMC,IAAS,MAAMV,EAAoB,EAAE,WAAW,EAAE,MAAG,EAAE,CAAC;GAI9D,OAHIU,EAAO,MAAM,eACfnB,EAAuB,GAElBmB,EAAO,MAAM,eAAe;EACrC,GACA,CAACV,GAAqBT,CAAsB,CA+B5C;EACA,eA7BoBkB,EACpB,OAAO,GAAY,MAAqB;GACtC,IAAMC,IAAS,MAAMP,EAAsB,EAAE,WAAW;IAAE;IAAI;GAAQ,EAAE,CAAC;GAIzE,OAHIO,EAAO,MAAM,iBACfnB,EAAuB,GAElBmB,EAAO,MAAM,iBAAiB;EACvC,GACA,CAACP,GAAuBZ,CAAsB,CAqB9C;EACA,gBAnBqBkB,EACrB,OACE,GACA,OAMO,MAJcH,EAA2B;GAC9C,WAAW;IAAE;IAAQ;GAAM;GAC3B,gBAAgB,CAAC,kBAAkB;EACrC,CAAC,EAAA,CACa,MAAM,sBAAsB,MAE5C,CAACA,CAA0B,CAQ3B;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Tour, DeviceType } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for tour preview functionality
|
|
4
|
+
* Manages preview mode, device simulation, and validation
|
|
5
|
+
*/
|
|
6
|
+
export declare function useTourPreview(tour?: Tour): {
|
|
7
|
+
isPreviewActive: boolean;
|
|
8
|
+
currentStepIndex: number;
|
|
9
|
+
currentStep: import('../types').TourStep;
|
|
10
|
+
devicePreview: DeviceType;
|
|
11
|
+
validationResults: {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
errors: string[];
|
|
14
|
+
warnings: string[];
|
|
15
|
+
} | null;
|
|
16
|
+
totalSteps: number;
|
|
17
|
+
canGoNext: boolean;
|
|
18
|
+
canGoPrevious: boolean;
|
|
19
|
+
startPreview: () => void;
|
|
20
|
+
stopPreview: () => void;
|
|
21
|
+
nextStep: () => void;
|
|
22
|
+
previousStep: () => void;
|
|
23
|
+
goToStep: (index: number) => void;
|
|
24
|
+
changeDevice: (device: DeviceType) => void;
|
|
25
|
+
validateForPreview: () => {
|
|
26
|
+
valid: boolean;
|
|
27
|
+
errors: string[];
|
|
28
|
+
warnings: string[];
|
|
29
|
+
};
|
|
30
|
+
generatePreviewLink: () => Promise<string | null>;
|
|
31
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useToursStore as e } from "../store/toursStore.js";
|
|
2
|
+
import { useTr as t } from "../i18n.js";
|
|
3
3
|
import { useCallback as n, useMemo as r, useState as i } from "react";
|
|
4
|
-
|
|
4
|
+
// src/tours/hooks/useTourPreview.ts
|
|
5
5
|
function a(a) {
|
|
6
|
-
let o =
|
|
6
|
+
let o = t(), [s, c] = i(!1), [l, u] = i(0), [d, f] = i(null), { devicePreview: p, setDevicePreview: m } = e(), h = r(() => a?.steps ?? [], [a?.steps]), g = h[l], _ = n(() => {
|
|
7
7
|
c(!0), u(0);
|
|
8
8
|
}, []), v = n(() => {
|
|
9
9
|
c(!1), u(0);
|
|
@@ -28,7 +28,7 @@ function a(a) {
|
|
|
28
28
|
};
|
|
29
29
|
h.length === 0 && e.push(o("tourPreview.errorNoSteps", "Tour has no steps")), h.forEach((n, r) => {
|
|
30
30
|
let i = r + 1;
|
|
31
|
-
n.placement !== "CENTER" && !n.targetSelector && e.push(o("tourPreview.errorStepNoSelector", "Step {{number}} has no selector", { number: i })),
|
|
31
|
+
n.placement !== "CENTER" && !n.targetSelector && e.push(o("tourPreview.errorStepNoSelector", "Step {{number}} has no selector", { number: i })), n.content && n.content.trim() !== "" || t.push(o("tourPreview.warningStepEmptyContent", "Step {{number}} has empty content", { number: i })), p === "mobile" && !n.targetSelectorMobile && !n.targetSelector && t.push(o("tourPreview.warningStepNoMobileSelector", "Step {{number}} has no mobile selector", { number: i })), p === "tablet" && !n.targetSelectorTablet && !n.targetSelector && t.push(o("tourPreview.warningStepNoTabletSelector", "Step {{number}} has no tablet selector", { number: i })), p === "desktop" && !n.targetSelectorDesktop && !n.targetSelector && t.push(o("tourPreview.warningStepNoDesktopSelector", "Step {{number}} has no desktop selector", { number: i })), n.media && n.media.length > 0 && n.media.forEach((n, r) => {
|
|
32
32
|
let a = r + 1;
|
|
33
33
|
n.media.cdnUrl || e.push(o("tourPreview.errorStepMediaNoUrl", "Step {{number}}, media {{mediaNumber}} has no URL", {
|
|
34
34
|
number: i,
|
|
@@ -74,7 +74,6 @@ function a(a) {
|
|
|
74
74
|
generatePreviewLink: w
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
//#endregion
|
|
78
77
|
export { a as useTourPreview };
|
|
79
78
|
|
|
80
79
|
//# sourceMappingURL=useTourPreview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTourPreview.js","names":[],"sources":["../../../src/tours/hooks/useTourPreview.ts"],"sourcesContent":["import { useState, useCallback, useMemo } from 'react';\nimport { useToursStore } from '../store/toursStore';\nimport { useTr } from '../i18n';\nimport type { Tour, DeviceType } from '../types';\n\n/**\n * Hook for tour preview functionality\n * Manages preview mode, device simulation, and validation\n */\nexport function useTourPreview(tour?: Tour) {\n const tr = useTr();\n const [isPreviewActive, setIsPreviewActive] = useState(false);\n const [currentStepIndex, setCurrentStepIndex] = useState(0);\n const [validationResults, setValidationResults] = useState<{\n valid: boolean;\n errors: string[];\n warnings: string[];\n } | null>(null);\n\n const { devicePreview, setDevicePreview } = useToursStore();\n\n const steps = useMemo(() => tour?.steps ?? [], [tour?.steps]);\n const currentStep = steps[currentStepIndex];\n\n /**\n * Start preview mode\n */\n const startPreview = useCallback(() => {\n setIsPreviewActive(true);\n setCurrentStepIndex(0);\n }, []);\n\n /**\n * Stop preview mode\n */\n const stopPreview = useCallback(() => {\n setIsPreviewActive(false);\n setCurrentStepIndex(0);\n }, []);\n\n /**\n * Navigate to next step\n */\n const nextStep = useCallback(() => {\n if (currentStepIndex < steps.length - 1) {\n setCurrentStepIndex((prev) => prev + 1);\n }\n }, [currentStepIndex, steps.length]);\n\n /**\n * Navigate to previous step\n */\n const previousStep = useCallback(() => {\n if (currentStepIndex > 0) {\n setCurrentStepIndex((prev) => prev - 1);\n }\n }, [currentStepIndex]);\n\n /**\n * Jump to specific step\n */\n const goToStep = useCallback(\n (index: number) => {\n if (index >= 0 && index < steps.length) {\n setCurrentStepIndex(index);\n }\n },\n [steps.length]\n );\n\n /**\n * Change preview device\n */\n const changeDevice = useCallback(\n (device: DeviceType) => {\n setDevicePreview(device);\n },\n [setDevicePreview]\n );\n\n /**\n * Validate tour for preview\n * Checks if all selectors exist, media is accessible, etc.\n */\n const validateForPreview = useCallback(() => {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!tour) {\n errors.push(tr('tourPreview.errorNoTour', 'No tour selected'));\n setValidationResults({ valid: false, errors, warnings });\n return { valid: false, errors, warnings };\n }\n\n if (steps.length === 0) {\n errors.push(tr('tourPreview.errorNoSteps', 'Tour has no steps'));\n }\n\n steps.forEach((step, index) => {\n const number = index + 1;\n\n if (step.placement !== 'CENTER' && !step.targetSelector) {\n errors.push(\n tr('tourPreview.errorStepNoSelector', 'Step {{number}} has no selector', { number })\n );\n }\n\n if (!step.content || step.content.trim() === '') {\n warnings.push(\n tr('tourPreview.warningStepEmptyContent', 'Step {{number}} has empty content', {\n number,\n })\n );\n }\n\n // Check device-specific selectors\n if (devicePreview === 'mobile' && !step.targetSelectorMobile && !step.targetSelector) {\n warnings.push(\n tr('tourPreview.warningStepNoMobileSelector', 'Step {{number}} has no mobile selector', {\n number,\n })\n );\n }\n if (devicePreview === 'tablet' && !step.targetSelectorTablet && !step.targetSelector) {\n warnings.push(\n tr('tourPreview.warningStepNoTabletSelector', 'Step {{number}} has no tablet selector', {\n number,\n })\n );\n }\n if (devicePreview === 'desktop' && !step.targetSelectorDesktop && !step.targetSelector) {\n warnings.push(\n tr(\n 'tourPreview.warningStepNoDesktopSelector',\n 'Step {{number}} has no desktop selector',\n {\n number,\n }\n )\n );\n }\n\n // Check media\n if (step.media && step.media.length > 0) {\n step.media.forEach((media, mediaIndex) => {\n const mediaNumber = mediaIndex + 1;\n if (!media.media.cdnUrl) {\n errors.push(\n tr(\n 'tourPreview.errorStepMediaNoUrl',\n 'Step {{number}}, media {{mediaNumber}} has no URL',\n { number, mediaNumber }\n )\n );\n }\n if (media.media.type === 'IMAGE' && !media.media.altText) {\n warnings.push(\n tr(\n 'tourPreview.warningStepMediaMissingAlt',\n 'Step {{number}}, media {{mediaNumber}} missing alt text',\n { number, mediaNumber }\n )\n );\n }\n });\n }\n });\n\n const valid = errors.length === 0;\n setValidationResults({ valid, errors, warnings });\n return { valid, errors, warnings };\n }, [tour, steps, devicePreview, tr]);\n\n /**\n * Generate shareable preview link\n */\n const generatePreviewLink = useCallback(async () => {\n if (!tour) return null;\n return `${window.location.origin}/tours/${tour.id}/preview`;\n }, [tour]);\n\n return {\n isPreviewActive,\n currentStepIndex,\n currentStep,\n devicePreview,\n validationResults,\n totalSteps: steps.length,\n canGoNext: currentStepIndex < steps.length - 1,\n canGoPrevious: currentStepIndex > 0,\n startPreview,\n stopPreview,\n nextStep,\n previousStep,\n goToStep,\n changeDevice,\n validateForPreview,\n generatePreviewLink,\n };\n}\n"],"mappings":";;;;AASA,
|
|
1
|
+
{"version":3,"file":"useTourPreview.js","names":["useTourPreview","tr","useTr","isPreviewActive","setIsPreviewActive","useState","currentStepIndex","setCurrentStepIndex","validationResults","setValidationResults","useToursStore","steps","useMemo","tour","currentStep","startPreview","useCallback","stopPreview","nextStep","prev","previousStep","goToStep","index","changeDevice","device","setDevicePreview","validateForPreview","errors","warnings","number","step","devicePreview","mediaNumber","mediaIndex","media","valid","generatePreviewLink"],"sources":["../../../src/tours/hooks/useTourPreview.ts"],"sourcesContent":["import { useState, useCallback, useMemo } from 'react';\nimport { useToursStore } from '../store/toursStore';\nimport { useTr } from '../i18n';\nimport type { Tour, DeviceType } from '../types';\n\n/**\n * Hook for tour preview functionality\n * Manages preview mode, device simulation, and validation\n */\nexport function useTourPreview(tour?: Tour) {\n const tr = useTr();\n const [isPreviewActive, setIsPreviewActive] = useState(false);\n const [currentStepIndex, setCurrentStepIndex] = useState(0);\n const [validationResults, setValidationResults] = useState<{\n valid: boolean;\n errors: string[];\n warnings: string[];\n } | null>(null);\n\n const { devicePreview, setDevicePreview } = useToursStore();\n\n const steps = useMemo(() => tour?.steps ?? [], [tour?.steps]);\n const currentStep = steps[currentStepIndex];\n\n /**\n * Start preview mode\n */\n const startPreview = useCallback(() => {\n setIsPreviewActive(true);\n setCurrentStepIndex(0);\n }, []);\n\n /**\n * Stop preview mode\n */\n const stopPreview = useCallback(() => {\n setIsPreviewActive(false);\n setCurrentStepIndex(0);\n }, []);\n\n /**\n * Navigate to next step\n */\n const nextStep = useCallback(() => {\n if (currentStepIndex < steps.length - 1) {\n setCurrentStepIndex((prev) => prev + 1);\n }\n }, [currentStepIndex, steps.length]);\n\n /**\n * Navigate to previous step\n */\n const previousStep = useCallback(() => {\n if (currentStepIndex > 0) {\n setCurrentStepIndex((prev) => prev - 1);\n }\n }, [currentStepIndex]);\n\n /**\n * Jump to specific step\n */\n const goToStep = useCallback(\n (index: number) => {\n if (index >= 0 && index < steps.length) {\n setCurrentStepIndex(index);\n }\n },\n [steps.length]\n );\n\n /**\n * Change preview device\n */\n const changeDevice = useCallback(\n (device: DeviceType) => {\n setDevicePreview(device);\n },\n [setDevicePreview]\n );\n\n /**\n * Validate tour for preview\n * Checks if all selectors exist, media is accessible, etc.\n */\n const validateForPreview = useCallback(() => {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!tour) {\n errors.push(tr('tourPreview.errorNoTour', 'No tour selected'));\n setValidationResults({ valid: false, errors, warnings });\n return { valid: false, errors, warnings };\n }\n\n if (steps.length === 0) {\n errors.push(tr('tourPreview.errorNoSteps', 'Tour has no steps'));\n }\n\n steps.forEach((step, index) => {\n const number = index + 1;\n\n if (step.placement !== 'CENTER' && !step.targetSelector) {\n errors.push(\n tr('tourPreview.errorStepNoSelector', 'Step {{number}} has no selector', { number })\n );\n }\n\n if (!step.content || step.content.trim() === '') {\n warnings.push(\n tr('tourPreview.warningStepEmptyContent', 'Step {{number}} has empty content', {\n number,\n })\n );\n }\n\n // Check device-specific selectors\n if (devicePreview === 'mobile' && !step.targetSelectorMobile && !step.targetSelector) {\n warnings.push(\n tr('tourPreview.warningStepNoMobileSelector', 'Step {{number}} has no mobile selector', {\n number,\n })\n );\n }\n if (devicePreview === 'tablet' && !step.targetSelectorTablet && !step.targetSelector) {\n warnings.push(\n tr('tourPreview.warningStepNoTabletSelector', 'Step {{number}} has no tablet selector', {\n number,\n })\n );\n }\n if (devicePreview === 'desktop' && !step.targetSelectorDesktop && !step.targetSelector) {\n warnings.push(\n tr(\n 'tourPreview.warningStepNoDesktopSelector',\n 'Step {{number}} has no desktop selector',\n {\n number,\n }\n )\n );\n }\n\n // Check media\n if (step.media && step.media.length > 0) {\n step.media.forEach((media, mediaIndex) => {\n const mediaNumber = mediaIndex + 1;\n if (!media.media.cdnUrl) {\n errors.push(\n tr(\n 'tourPreview.errorStepMediaNoUrl',\n 'Step {{number}}, media {{mediaNumber}} has no URL',\n { number, mediaNumber }\n )\n );\n }\n if (media.media.type === 'IMAGE' && !media.media.altText) {\n warnings.push(\n tr(\n 'tourPreview.warningStepMediaMissingAlt',\n 'Step {{number}}, media {{mediaNumber}} missing alt text',\n { number, mediaNumber }\n )\n );\n }\n });\n }\n });\n\n const valid = errors.length === 0;\n setValidationResults({ valid, errors, warnings });\n return { valid, errors, warnings };\n }, [tour, steps, devicePreview, tr]);\n\n /**\n * Generate shareable preview link\n */\n const generatePreviewLink = useCallback(async () => {\n if (!tour) return null;\n return `${window.location.origin}/tours/${tour.id}/preview`;\n }, [tour]);\n\n return {\n isPreviewActive,\n currentStepIndex,\n currentStep,\n devicePreview,\n validationResults,\n totalSteps: steps.length,\n canGoNext: currentStepIndex < steps.length - 1,\n canGoPrevious: currentStepIndex > 0,\n startPreview,\n stopPreview,\n nextStep,\n previousStep,\n goToStep,\n changeDevice,\n validateForPreview,\n generatePreviewLink,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TourFilters as LocalTourFilters, TourPagination as LocalTourPagination } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for fetching and managing tours list
|
|
4
|
+
* Uses the gateway client from fe-libs
|
|
5
|
+
* All tours are now global (no workspace scoping)
|
|
6
|
+
*/
|
|
7
|
+
export declare function useToursList(_initialFilters?: LocalTourFilters, _initialPagination?: LocalTourPagination): {
|
|
8
|
+
tours: any[];
|
|
9
|
+
loading: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
total: number;
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
fetchTours: (filters?: LocalTourFilters, pagination?: LocalTourPagination) => Promise<void>;
|
|
14
|
+
refetch: () => Promise<void>;
|
|
15
|
+
};
|
|
@@ -2,7 +2,7 @@ import { useToursI18n as e } from "../i18n.js";
|
|
|
2
2
|
import { GetToursDocument as t } from "../../generated/global-operations.js";
|
|
3
3
|
import { useCallback as n, useState as r } from "react";
|
|
4
4
|
import { useGatewayClient as i } from "@burdenoff/fe-libs/shared/graphql";
|
|
5
|
-
|
|
5
|
+
// src/tours/hooks/useToursList.ts
|
|
6
6
|
function a(a, o) {
|
|
7
7
|
let { tr: s } = e(), c = i("global"), [l, u] = r([]), [d, f] = r(!1), [p, m] = r(null), [h, g] = r(0), _ = n(async (e, n) => {
|
|
8
8
|
f(!0), m(null);
|
|
@@ -44,7 +44,6 @@ function a(a, o) {
|
|
|
44
44
|
refetch: () => _()
|
|
45
45
|
};
|
|
46
46
|
}
|
|
47
|
-
//#endregion
|
|
48
47
|
export { a as useToursList };
|
|
49
48
|
|
|
50
49
|
//# sourceMappingURL=useToursList.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToursList.js","names":[],"sources":["../../../src/tours/hooks/useToursList.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useToursI18n } from '../i18n';\nimport type {\n TourFilters as LocalTourFilters,\n TourPagination as LocalTourPagination,\n} from '../types';\nimport type { TourStatus } from '../../generated/global-types';\nimport { GetToursDocument } from '../../generated/global-operations';\nimport type { GetToursQuery, GetToursQueryVariables } from '../../generated/global-operations';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Tour = any;\n\n/**\n * Hook for fetching and managing tours list\n * Uses the gateway client from fe-libs\n * All tours are now global (no workspace scoping)\n */\nexport function useToursList(\n _initialFilters?: LocalTourFilters,\n _initialPagination?: LocalTourPagination\n) {\n const { tr } = useToursI18n();\n const globalClient = useGatewayClient('global');\n\n const [tours, setTours] = useState<Tour[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [total, setTotal] = useState(0);\n\n const fetchTours = useCallback(\n async (filters?: LocalTourFilters, pagination?: LocalTourPagination) => {\n setLoading(true);\n setError(null);\n\n try {\n const { data } = await globalClient.query<GetToursQuery, GetToursQueryVariables>({\n query: GetToursDocument,\n variables: {\n filters: {\n productId: filters?.productId,\n moduleId: filters?.moduleId,\n pageId: filters?.pageId,\n status:\n filters?.status === 'all' ? undefined : (filters?.status as TourStatus | undefined),\n },\n pagination: {\n limit: pagination?.limit ?? 50,\n offset: pagination?.page ? (pagination.page - 1) * (pagination?.limit ?? 50) : 0,\n },\n },\n fetchPolicy: 'network-only',\n });\n\n const fetchedTours = (data?.tours?.tours ?? []).filter((tour) => {\n if (!filters?.search) return true;\n\n const normalizedSearch = filters.search.toLowerCase();\n return (\n tour.name.toLowerCase().includes(normalizedSearch) ||\n (tour.description ?? '').toLowerCase().includes(normalizedSearch)\n );\n });\n\n setTours(fetchedTours);\n setTotal(data?.tours?.total ?? fetchedTours.length);\n } catch (err) {\n setError(\n err instanceof Error\n ? err\n : new Error(tr('toursList.errorFetch', 'Failed to fetch tours'))\n );\n setTours([]);\n setTotal(0);\n } finally {\n setLoading(false);\n }\n },\n [globalClient, tr]\n );\n\n return {\n tours,\n loading,\n error,\n total,\n hasMore: false,\n fetchTours,\n refetch: () => fetchTours(),\n };\n}\n"],"mappings":";;;;;AAmBA,
|
|
1
|
+
{"version":3,"file":"useToursList.js","names":["useToursList","useToursI18n","globalClient","useGatewayClient","tours","setTours","useState","loading","setLoading","error","setError","total","setTotal","fetchTours","useCallback","GetToursDocument","filters","pagination","fetchedTours","data","normalizedSearch","tour","err","tr"],"sources":["../../../src/tours/hooks/useToursList.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useToursI18n } from '../i18n';\nimport type {\n TourFilters as LocalTourFilters,\n TourPagination as LocalTourPagination,\n} from '../types';\nimport type { TourStatus } from '../../generated/global-types';\nimport { GetToursDocument } from '../../generated/global-operations';\nimport type { GetToursQuery, GetToursQueryVariables } from '../../generated/global-operations';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Tour = any;\n\n/**\n * Hook for fetching and managing tours list\n * Uses the gateway client from fe-libs\n * All tours are now global (no workspace scoping)\n */\nexport function useToursList(\n _initialFilters?: LocalTourFilters,\n _initialPagination?: LocalTourPagination\n) {\n const { tr } = useToursI18n();\n const globalClient = useGatewayClient('global');\n\n const [tours, setTours] = useState<Tour[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [total, setTotal] = useState(0);\n\n const fetchTours = useCallback(\n async (filters?: LocalTourFilters, pagination?: LocalTourPagination) => {\n setLoading(true);\n setError(null);\n\n try {\n const { data } = await globalClient.query<GetToursQuery, GetToursQueryVariables>({\n query: GetToursDocument,\n variables: {\n filters: {\n productId: filters?.productId,\n moduleId: filters?.moduleId,\n pageId: filters?.pageId,\n status:\n filters?.status === 'all' ? undefined : (filters?.status as TourStatus | undefined),\n },\n pagination: {\n limit: pagination?.limit ?? 50,\n offset: pagination?.page ? (pagination.page - 1) * (pagination?.limit ?? 50) : 0,\n },\n },\n fetchPolicy: 'network-only',\n });\n\n const fetchedTours = (data?.tours?.tours ?? []).filter((tour) => {\n if (!filters?.search) return true;\n\n const normalizedSearch = filters.search.toLowerCase();\n return (\n tour.name.toLowerCase().includes(normalizedSearch) ||\n (tour.description ?? '').toLowerCase().includes(normalizedSearch)\n );\n });\n\n setTours(fetchedTours);\n setTotal(data?.tours?.total ?? fetchedTours.length);\n } catch (err) {\n setError(\n err instanceof Error\n ? err\n : new Error(tr('toursList.errorFetch', 'Failed to fetch tours'))\n );\n setTours([]);\n setTotal(0);\n } finally {\n setLoading(false);\n }\n },\n [globalClient, tr]\n );\n\n return {\n tours,\n loading,\n error,\n total,\n hasMore: false,\n fetchTours,\n refetch: () => fetchTours(),\n };\n}\n"],"mappings":";;;;;AAmBA,SAAgBA,EACd,GACA,GACA;CACA,IAAM,EAAE,UAAOC,EAAa,GACtBC,IAAeC,EAAiB,QAAQ,GAExC,CAACC,GAAOC,KAAYC,EAAiB,CAAC,CAAC,GACvC,CAACC,GAASC,KAAcF,EAAS,EAAK,GACtC,CAACG,GAAOC,KAAYJ,EAAuB,IAAI,GAC/C,CAACK,GAAOC,KAAYN,EAAS,CAAC,GAE9BO,IAAaC,EACjB,OAAO,GAA4B,MAAqC;EAEtE,AADAN,EAAW,EAAI,GACfE,EAAS,IAAI;EAEb,IAAI;GACF,IAAM,EAAE,YAAS,MAAMR,EAAa,MAA6C;IAC/E,OAAOa;IACP,WAAW;KACT,SAAS;MACP,WAAWC,GAAS;MACpB,UAAUA,GAAS;MACnB,QAAQA,GAAS;MACjB,QACEA,GAAS,WAAW,QAAQ,KAAA,IAAaA,GAAS;KACtD;KACA,YAAY;MACV,OAAOC,GAAY,SAAS;MAC5B,QAAQA,GAAY,QAAQA,EAAW,OAAO,MAAMA,GAAY,SAAS,MAAM;KACjF;IACF;IACA,aAAa;GACf,CAAC,GAEKC,KAAgBC,GAAM,OAAO,SAAS,CAAC,EAAA,CAAG,QAAQ,MAAS;IAC/D,IAAI,CAACH,GAAS,QAAQ,OAAO;IAE7B,IAAMI,IAAmBJ,EAAQ,OAAO,YAAY;IACpD,OACEK,EAAK,KAAK,YAAY,CAAC,CAAC,SAASD,CAAgB,MAChDC,EAAK,eAAe,GAAA,CAAI,YAAY,CAAC,CAAC,SAASD,CAAgB;GAEpE,CAAC;GAGD,AADAf,EAASa,CAAY,GACrBN,EAASO,GAAM,OAAO,SAASD,EAAa,MAAM;EACpD,SAASI,GAAK;GAOZ,AANAZ,EACEY,aAAe,QACXA,IACI,MAAMC,EAAG,wBAAwB,uBAAuB,CAAC,CACnE,GACAlB,EAAS,CAAC,CAAC,GACXO,EAAS,CAAC;EACZ,UAAU;GACR,EAAW,EAAK;EAClB;CACF,GACA,CAACV,GAAcqB,CAAE,CACnB;CAEA,OAAO;EACL;EACA;EACA;EACA;EACA,SAAS;EACT;EACA,eAAeV,EAAW;CAC5B;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tours-specific permission access hook.
|
|
3
|
+
*
|
|
4
|
+
* Thin passthrough to `usePermissions()` from the shared shell. Historically
|
|
5
|
+
* this hook also exposed an `isBurdenoffAdmin` flag that bypassed RBAC for
|
|
6
|
+
* any `@burdenoff.com` email, but that flag silently produced false-positive
|
|
7
|
+
* E2E and turned the test user `tours@burdenoff.com` into a de-facto
|
|
8
|
+
* super-admin. The bypass was removed in BOFF-2391 — admin access is now
|
|
9
|
+
* fully governed by RBAC permissions.
|
|
10
|
+
*
|
|
11
|
+
* Pages that need a "create" / "save" / "upload" button must wrap it in
|
|
12
|
+
* `<PermissionGate permission={...}>` rather than relying on the email
|
|
13
|
+
* domain.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useToursPermissionAccess(): import('@burdenoff/fe-libs/shared/providers/shell').PermissionContextValue;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { usePermissions as e } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
2
|
-
|
|
2
|
+
// src/tours/hooks/useToursPermissionAccess.ts
|
|
3
3
|
function t() {
|
|
4
4
|
return e();
|
|
5
5
|
}
|
|
6
|
-
//#endregion
|
|
7
6
|
export { t as useToursPermissionAccess };
|
|
8
7
|
|
|
9
8
|
//# sourceMappingURL=useToursPermissionAccess.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useToursPermissionAccess.js","names":[],"sources":["../../../src/tours/hooks/useToursPermissionAccess.ts"],"sourcesContent":["import { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\n\n/**\n * Tours-specific permission access hook.\n *\n * Thin passthrough to `usePermissions()` from the shared shell. Historically\n * this hook also exposed an `isBurdenoffAdmin` flag that bypassed RBAC for\n * any `@burdenoff.com` email, but that flag silently produced false-positive\n * E2E and turned the test user `tours@burdenoff.com` into a de-facto\n * super-admin. The bypass was removed in BOFF-2391 — admin access is now\n * fully governed by RBAC permissions.\n *\n * Pages that need a \"create\" / \"save\" / \"upload\" button must wrap it in\n * `<PermissionGate permission={...}>` rather than relying on the email\n * domain.\n */\nexport function useToursPermissionAccess() {\n return usePermissions();\n}\n"],"mappings":";;AAgBA,
|
|
1
|
+
{"version":3,"file":"useToursPermissionAccess.js","names":["useToursPermissionAccess","usePermissions"],"sources":["../../../src/tours/hooks/useToursPermissionAccess.ts"],"sourcesContent":["import { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\n\n/**\n * Tours-specific permission access hook.\n *\n * Thin passthrough to `usePermissions()` from the shared shell. Historically\n * this hook also exposed an `isBurdenoffAdmin` flag that bypassed RBAC for\n * any `@burdenoff.com` email, but that flag silently produced false-positive\n * E2E and turned the test user `tours@burdenoff.com` into a de-facto\n * super-admin. The bypass was removed in BOFF-2391 — admin access is now\n * fully governed by RBAC permissions.\n *\n * Pages that need a \"create\" / \"save\" / \"upload\" button must wrap it in\n * `<PermissionGate permission={...}>` rather than relying on the email\n * domain.\n */\nexport function useToursPermissionAccess() {\n return usePermissions();\n}\n"],"mappings":";;AAgBA,SAAgBA,IAA2B;CACzC,OAAOC,EAAe;AACxB"}
|