@coorpacademy/components 11.40.18 → 11.40.20
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/es/molecule/cm-popin/index.d.ts.map +1 -1
- package/es/molecule/cm-popin/index.js +6 -1
- package/es/molecule/cm-popin/index.js.map +1 -1
- package/es/template/app-player/player/index.d.ts +8 -2
- package/es/template/app-player/player/index.d.ts.map +1 -1
- package/es/template/app-player/player/index.js +6 -1
- package/es/template/app-player/player/index.js.map +1 -1
- package/es/template/app-player/player/slides/header/index.d.ts +4 -0
- package/es/template/app-player/player/slides/header/index.d.ts.map +1 -1
- package/es/template/app-player/player/slides/header/index.js +23 -3
- package/es/template/app-player/player/slides/header/index.js.map +1 -1
- package/es/template/app-player/player/slides/header/style.css +18 -1
- package/es/template/app-player/player/slides/index.d.ts +4 -0
- package/es/template/app-player/player/slides/index.d.ts.map +1 -1
- package/es/template/app-player/player/slides/index.js +4 -1
- package/es/template/app-player/player/slides/index.js.map +1 -1
- package/es/template/app-player/player/slides/style.css +12 -6
- package/es/template/app-player/player/tourguide/index.d.ts +158 -0
- package/es/template/app-player/player/tourguide/index.d.ts.map +1 -0
- package/es/template/app-player/player/tourguide/index.js +289 -0
- package/es/template/app-player/player/tourguide/index.js.map +1 -0
- package/es/template/app-player/player/tourguide/style.css +385 -0
- package/es/template/app-player/popin-end/index.d.ts +4 -0
- package/es/template/app-player/popin-end/summary.js +2 -2
- package/es/template/app-player/popin-end/summary.js.map +1 -1
- package/es/template/common/search-page/index.js +1 -1
- package/es/template/common/search-page/index.js.map +1 -1
- package/es/template/my-learning/index.d.ts.map +1 -1
- package/es/template/my-learning/index.js +1 -0
- package/es/template/my-learning/index.js.map +1 -1
- package/es/types/tourguidejs.d.js +2 -0
- package/es/types/tourguidejs.d.js.map +1 -0
- package/lib/molecule/cm-popin/index.d.ts.map +1 -1
- package/lib/molecule/cm-popin/index.js +6 -1
- package/lib/molecule/cm-popin/index.js.map +1 -1
- package/lib/template/app-player/player/index.d.ts +8 -2
- package/lib/template/app-player/player/index.d.ts.map +1 -1
- package/lib/template/app-player/player/index.js +8 -1
- package/lib/template/app-player/player/index.js.map +1 -1
- package/lib/template/app-player/player/slides/header/index.d.ts +4 -0
- package/lib/template/app-player/player/slides/header/index.d.ts.map +1 -1
- package/lib/template/app-player/player/slides/header/index.js +23 -3
- package/lib/template/app-player/player/slides/header/index.js.map +1 -1
- package/lib/template/app-player/player/slides/header/style.css +18 -1
- package/lib/template/app-player/player/slides/index.d.ts +4 -0
- package/lib/template/app-player/player/slides/index.d.ts.map +1 -1
- package/lib/template/app-player/player/slides/index.js +4 -1
- package/lib/template/app-player/player/slides/index.js.map +1 -1
- package/lib/template/app-player/player/slides/style.css +12 -6
- package/lib/template/app-player/player/tourguide/index.d.ts +158 -0
- package/lib/template/app-player/player/tourguide/index.d.ts.map +1 -0
- package/lib/template/app-player/player/tourguide/index.js +294 -0
- package/lib/template/app-player/player/tourguide/index.js.map +1 -0
- package/lib/template/app-player/player/tourguide/style.css +385 -0
- package/lib/template/app-player/popin-end/index.d.ts +4 -0
- package/lib/template/app-player/popin-end/summary.js +4 -2
- package/lib/template/app-player/popin-end/summary.js.map +1 -1
- package/lib/template/common/search-page/index.js +1 -1
- package/lib/template/common/search-page/index.js.map +1 -1
- package/lib/template/my-learning/index.d.ts.map +1 -1
- package/lib/template/my-learning/index.js +1 -0
- package/lib/template/my-learning/index.js.map +1 -1
- package/lib/types/tourguidejs.d.js +2 -0
- package/lib/types/tourguidejs.d.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.shouldStartTour = exports.default = exports.__test__ = exports.TourGuideStepPropType = exports.TourGuideOptionsPropType = exports.TourGuideConfigPropType = void 0;
|
|
5
|
+
var _sortBy2 = _interopRequireDefault(require("lodash/fp/sortBy"));
|
|
6
|
+
var _pipe2 = _interopRequireDefault(require("lodash/fp/pipe"));
|
|
7
|
+
var _map2 = _interopRequireDefault(require("lodash/fp/map"));
|
|
8
|
+
var _keys2 = _interopRequireDefault(require("lodash/fp/keys"));
|
|
9
|
+
var _join2 = _interopRequireDefault(require("lodash/fp/join"));
|
|
10
|
+
var _isString2 = _interopRequireDefault(require("lodash/fp/isString"));
|
|
11
|
+
var _isObject2 = _interopRequireDefault(require("lodash/fp/isObject"));
|
|
12
|
+
var _isFunction2 = _interopRequireDefault(require("lodash/fp/isFunction"));
|
|
13
|
+
var _identity2 = _interopRequireDefault(require("lodash/fp/identity"));
|
|
14
|
+
var _react = require("react");
|
|
15
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
16
|
+
var _tourguidejs = require("@sjmc11/tourguidejs");
|
|
17
|
+
require("./style.css");
|
|
18
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
|
+
// Fixed class used to attach our CSS customizations to the TourGuide dialog.
|
|
20
|
+
const TOURGUIDE_DIALOG_CLASS = 'coorp-tourguide-dialog';
|
|
21
|
+
|
|
22
|
+
// Normalize step content for stable serialization:
|
|
23
|
+
// - keep strings as-is
|
|
24
|
+
// - allow objects with a custom toString
|
|
25
|
+
// - otherwise fall back to empty string
|
|
26
|
+
const normalizeStepContent = content => {
|
|
27
|
+
if ((0, _isString2.default)(content)) {
|
|
28
|
+
return content;
|
|
29
|
+
}
|
|
30
|
+
if ((0, _isObject2.default)(content) && (0, _isFunction2.default)(content?.toString)) {
|
|
31
|
+
if (content.toString === Object.prototype.toString) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
return content.toString();
|
|
35
|
+
}
|
|
36
|
+
return '';
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Build a deterministic key for steps to avoid re-init on referential changes only.
|
|
40
|
+
// We include target/order/group/content so a real content change triggers a re-init.
|
|
41
|
+
const serializeSteps = steps => (0, _pipe2.default)((0, _map2.default)(step => `${step.target || ''}|${step.order ?? ''}|${step.group || ''}|${normalizeStepContent(step.content)}`), (0, _join2.default)(';;'))(steps || []);
|
|
42
|
+
|
|
43
|
+
// Same idea for options: stable key for effect dependencies.
|
|
44
|
+
// Sorting keys ensures we don't recreate the client due to object key ordering.
|
|
45
|
+
const serializeOptions = options => (0, _pipe2.default)(_keys2.default, (0, _sortBy2.default)(_identity2.default), (0, _map2.default)(key => `${key}:${String(options[key])}`), (0, _join2.default)('|'))(options || {});
|
|
46
|
+
const shouldStartTour = (autoStart, group, client) => autoStart && !client.isFinished(group);
|
|
47
|
+
|
|
48
|
+
// Test-only hooks for unit tests (not used in production code).
|
|
49
|
+
exports.shouldStartTour = shouldStartTour;
|
|
50
|
+
const __test__ = exports.__test__ = {
|
|
51
|
+
normalizeStepContent,
|
|
52
|
+
serializeSteps,
|
|
53
|
+
serializeOptions,
|
|
54
|
+
TOURGUIDE_DIALOG_CLASS,
|
|
55
|
+
shouldStartTour
|
|
56
|
+
};
|
|
57
|
+
const TourGuideStepPropType = exports.TourGuideStepPropType = _propTypes.default.shape({
|
|
58
|
+
title: _propTypes.default.string,
|
|
59
|
+
content: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]).isRequired,
|
|
60
|
+
target: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]).isRequired,
|
|
61
|
+
order: _propTypes.default.number,
|
|
62
|
+
group: _propTypes.default.string,
|
|
63
|
+
position: _propTypes.default.string,
|
|
64
|
+
fixed: _propTypes.default.bool,
|
|
65
|
+
buttons: _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
66
|
+
text: _propTypes.default.string,
|
|
67
|
+
type: _propTypes.default.string
|
|
68
|
+
}))
|
|
69
|
+
});
|
|
70
|
+
const TourGuideOptionsPropType = exports.TourGuideOptionsPropType = _propTypes.default.shape({
|
|
71
|
+
autoScroll: _propTypes.default.bool,
|
|
72
|
+
autoScrollSmooth: _propTypes.default.bool,
|
|
73
|
+
autoScrollOffset: _propTypes.default.number,
|
|
74
|
+
backdropAnimate: _propTypes.default.bool,
|
|
75
|
+
backdropClass: _propTypes.default.string,
|
|
76
|
+
backdropColor: _propTypes.default.string,
|
|
77
|
+
dialogAnimate: _propTypes.default.string,
|
|
78
|
+
dialogZ: _propTypes.default.number,
|
|
79
|
+
dialogWidth: _propTypes.default.number,
|
|
80
|
+
dialogMaxWidth: _propTypes.default.number,
|
|
81
|
+
dialogPlacement: _propTypes.default.oneOf(['top', 'right', 'bottom', 'left']),
|
|
82
|
+
targetPadding: _propTypes.default.number,
|
|
83
|
+
hideNext: _propTypes.default.bool,
|
|
84
|
+
hidePrev: _propTypes.default.bool,
|
|
85
|
+
nextLabel: _propTypes.default.string,
|
|
86
|
+
prevLabel: _propTypes.default.string,
|
|
87
|
+
finishLabel: _propTypes.default.string,
|
|
88
|
+
completeOnFinish: _propTypes.default.bool,
|
|
89
|
+
exitOnEscape: _propTypes.default.bool,
|
|
90
|
+
exitOnClickOutside: _propTypes.default.bool,
|
|
91
|
+
keyboardControls: _propTypes.default.bool,
|
|
92
|
+
showStepDots: _propTypes.default.bool,
|
|
93
|
+
stepDotsPlacement: _propTypes.default.oneOf(['footer', 'body']),
|
|
94
|
+
showButtons: _propTypes.default.bool,
|
|
95
|
+
showStepProgress: _propTypes.default.bool,
|
|
96
|
+
progressBar: _propTypes.default.string,
|
|
97
|
+
closeButton: _propTypes.default.bool,
|
|
98
|
+
rememberStep: _propTypes.default.bool,
|
|
99
|
+
propagateEvents: _propTypes.default.bool,
|
|
100
|
+
debug: _propTypes.default.bool
|
|
101
|
+
});
|
|
102
|
+
const TourGuideConfigPropType = exports.TourGuideConfigPropType = _propTypes.default.shape({
|
|
103
|
+
steps: _propTypes.default.arrayOf(TourGuideStepPropType).isRequired,
|
|
104
|
+
options: TourGuideOptionsPropType,
|
|
105
|
+
group: _propTypes.default.string,
|
|
106
|
+
autoStart: _propTypes.default.bool,
|
|
107
|
+
forceStart: _propTypes.default.bool,
|
|
108
|
+
startStep: _propTypes.default.number,
|
|
109
|
+
onStepChange: _propTypes.default.func,
|
|
110
|
+
onStart: _propTypes.default.func,
|
|
111
|
+
onExit: _propTypes.default.func,
|
|
112
|
+
onFinish: _propTypes.default.func,
|
|
113
|
+
testMode: _propTypes.default.bool
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// TourGuideManager is a React-only controller:
|
|
117
|
+
// - creates/destroys the TourGuide client
|
|
118
|
+
// - starts the tour when allowed
|
|
119
|
+
// - cleans up DOM nodes left by the library
|
|
120
|
+
const TourGuideManager = ({
|
|
121
|
+
steps = [],
|
|
122
|
+
options = {},
|
|
123
|
+
group,
|
|
124
|
+
autoStart = true,
|
|
125
|
+
forceStart = false,
|
|
126
|
+
startStep,
|
|
127
|
+
onStepChange,
|
|
128
|
+
onStart,
|
|
129
|
+
onExit,
|
|
130
|
+
onFinish,
|
|
131
|
+
// Unit-test injection point to avoid using the real TourGuideClient.
|
|
132
|
+
testClientFactory,
|
|
133
|
+
testMode = false
|
|
134
|
+
}) => {
|
|
135
|
+
const clientRef = (0, _react.useRef)(null);
|
|
136
|
+
// Expose refs for unit tests without relying on globals.
|
|
137
|
+
const isTestEnv = Boolean(testMode);
|
|
138
|
+
if (isTestEnv) {
|
|
139
|
+
__test__.__clientRef = clientRef;
|
|
140
|
+
}
|
|
141
|
+
const hasStartedRef = (0, _react.useRef)(false);
|
|
142
|
+
const hasExitedRef = (0, _react.useRef)(false);
|
|
143
|
+
const startStepRef = (0, _react.useRef)(startStep);
|
|
144
|
+
const onStepChangeRef = (0, _react.useRef)(onStepChange);
|
|
145
|
+
const onStartRef = (0, _react.useRef)(onStart);
|
|
146
|
+
const onExitRef = (0, _react.useRef)(onExit);
|
|
147
|
+
const onFinishRef = (0, _react.useRef)(onFinish);
|
|
148
|
+
const sanitizedOptions = (0, _react.useMemo)(() => {
|
|
149
|
+
// We control dialogClass internally; don't let external props override it.
|
|
150
|
+
const cleanOptions = {
|
|
151
|
+
...options
|
|
152
|
+
};
|
|
153
|
+
delete cleanOptions.dialogClass;
|
|
154
|
+
return cleanOptions;
|
|
155
|
+
}, [options]);
|
|
156
|
+
const optionsKey = serializeOptions(sanitizedOptions);
|
|
157
|
+
const sanitizedOptionsRef = (0, _react.useRef)({
|
|
158
|
+
key: optionsKey,
|
|
159
|
+
value: sanitizedOptions
|
|
160
|
+
});
|
|
161
|
+
if (sanitizedOptionsRef.current.key !== optionsKey) {
|
|
162
|
+
sanitizedOptionsRef.current = {
|
|
163
|
+
key: optionsKey,
|
|
164
|
+
value: sanitizedOptions
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
const stableOptions = sanitizedOptionsRef.current.value;
|
|
168
|
+
const stepsKey = serializeSteps(steps);
|
|
169
|
+
// Clone steps because TourGuideJS mutates targets (string -> HTMLElement).
|
|
170
|
+
// Use stepsKey so we only re-clone when the actual content changes.
|
|
171
|
+
const stepsForClientRef = (0, _react.useRef)({
|
|
172
|
+
key: stepsKey,
|
|
173
|
+
value: (steps || []).map(step => ({
|
|
174
|
+
...step
|
|
175
|
+
}))
|
|
176
|
+
});
|
|
177
|
+
if (stepsForClientRef.current.key !== stepsKey) {
|
|
178
|
+
stepsForClientRef.current = {
|
|
179
|
+
key: stepsKey,
|
|
180
|
+
value: (steps || []).map(step => ({
|
|
181
|
+
...step
|
|
182
|
+
}))
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
const stepsForClient = stepsForClientRef.current.value;
|
|
186
|
+
(0, _react.useEffect)(() => {
|
|
187
|
+
startStepRef.current = startStep;
|
|
188
|
+
onStepChangeRef.current = onStepChange;
|
|
189
|
+
onStartRef.current = onStart;
|
|
190
|
+
onExitRef.current = onExit;
|
|
191
|
+
onFinishRef.current = onFinish;
|
|
192
|
+
}, [startStep, onStepChange, onStart, onExit, onFinish]);
|
|
193
|
+
(0, _react.useEffect)(() => {
|
|
194
|
+
// Avoid client creation on the server or with empty steps.
|
|
195
|
+
if (typeof window === 'undefined' || stepsForClient.length === 0) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
if (!_tourguidejs.TourGuideClient && !testClientFactory) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const createClient = testClientFactory || (clientOptions => {
|
|
202
|
+
return new _tourguidejs.TourGuideClient(clientOptions);
|
|
203
|
+
});
|
|
204
|
+
// Create a fresh client when steps/options change and apply our fixed dialog class.
|
|
205
|
+
const client = createClient({
|
|
206
|
+
steps: stepsForClient,
|
|
207
|
+
...stableOptions,
|
|
208
|
+
dialogClass: TOURGUIDE_DIALOG_CLASS
|
|
209
|
+
});
|
|
210
|
+
clientRef.current = client;
|
|
211
|
+
hasStartedRef.current = false;
|
|
212
|
+
hasExitedRef.current = false;
|
|
213
|
+
if (typeof startStepRef.current === 'number' && startStepRef.current >= 0) {
|
|
214
|
+
client.activeStep = startStepRef.current;
|
|
215
|
+
}
|
|
216
|
+
client._globalAfterChangeCallback = (currentStepIndex, nextStepIndex) => {
|
|
217
|
+
if (onStepChangeRef.current) {
|
|
218
|
+
onStepChangeRef.current(nextStepIndex);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
client._globalAfterExitCallback = () => {
|
|
222
|
+
if (hasExitedRef.current) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
hasExitedRef.current = true;
|
|
226
|
+
if (onExitRef.current) {
|
|
227
|
+
onExitRef.current();
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
client._globalFinishCallback = () => {
|
|
231
|
+
if (onFinishRef.current) {
|
|
232
|
+
onFinishRef.current();
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
return () => {
|
|
236
|
+
// Ensure old DOM nodes are removed; TourGuideJS uses fixed IDs
|
|
237
|
+
// and can otherwise leave stale elements behind.
|
|
238
|
+
const exitPromise = client.isVisible ? client.exit().catch(() => {}) : Promise.resolve();
|
|
239
|
+
exitPromise.finally(() => {
|
|
240
|
+
client.dialog?.remove();
|
|
241
|
+
client.backdrop?.remove();
|
|
242
|
+
}).catch(() => {});
|
|
243
|
+
if (clientRef.current === client) {
|
|
244
|
+
clientRef.current = null;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
}, [stepsKey, optionsKey, stepsForClient, stableOptions, testClientFactory]);
|
|
248
|
+
(0, _react.useEffect)(() => {
|
|
249
|
+
const client = clientRef.current;
|
|
250
|
+
if (!client) {
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
if (autoStart) {
|
|
254
|
+
// Don't restart a tour that was already completed for this group unless explicitly allowed.
|
|
255
|
+
if (!forceStart && group && client.isFinished && client.isFinished(group)) {
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
if (hasStartedRef.current) {
|
|
259
|
+
hasStartedRef.current = false;
|
|
260
|
+
client.exit().catch(() => {});
|
|
261
|
+
}
|
|
262
|
+
const start = () => {
|
|
263
|
+
// Mark as started before calling into the library to avoid double-start.
|
|
264
|
+
hasStartedRef.current = true;
|
|
265
|
+
if (onStartRef.current) {
|
|
266
|
+
onStartRef.current(client.activeStep, group);
|
|
267
|
+
}
|
|
268
|
+
client.start(group).catch(() => {});
|
|
269
|
+
};
|
|
270
|
+
start();
|
|
271
|
+
} else if (!autoStart && hasStartedRef.current) {
|
|
272
|
+
hasStartedRef.current = false;
|
|
273
|
+
client.exit().catch(() => {});
|
|
274
|
+
}
|
|
275
|
+
return undefined;
|
|
276
|
+
}, [autoStart, forceStart, group, stepsKey, optionsKey]);
|
|
277
|
+
return null;
|
|
278
|
+
};
|
|
279
|
+
TourGuideManager.propTypes = {
|
|
280
|
+
steps: _propTypes.default.arrayOf(TourGuideStepPropType),
|
|
281
|
+
options: TourGuideOptionsPropType,
|
|
282
|
+
group: _propTypes.default.string,
|
|
283
|
+
autoStart: _propTypes.default.bool,
|
|
284
|
+
forceStart: _propTypes.default.bool,
|
|
285
|
+
startStep: _propTypes.default.number,
|
|
286
|
+
onStepChange: _propTypes.default.func,
|
|
287
|
+
onStart: _propTypes.default.func,
|
|
288
|
+
onExit: _propTypes.default.func,
|
|
289
|
+
onFinish: _propTypes.default.func,
|
|
290
|
+
testClientFactory: _propTypes.default.func,
|
|
291
|
+
testMode: _propTypes.default.bool
|
|
292
|
+
};
|
|
293
|
+
var _default = exports.default = TourGuideManager;
|
|
294
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_react","require","_propTypes","_interopRequireDefault","_tourguidejs","e","__esModule","default","TOURGUIDE_DIALOG_CLASS","normalizeStepContent","content","_isString2","_isObject2","_isFunction2","toString","Object","prototype","serializeSteps","steps","_pipe2","_map2","step","target","order","group","_join2","serializeOptions","options","_keys2","_sortBy2","_identity2","key","String","shouldStartTour","autoStart","client","isFinished","exports","__test__","TourGuideStepPropType","PropTypes","shape","title","string","oneOfType","node","isRequired","object","number","position","fixed","bool","buttons","arrayOf","text","type","TourGuideOptionsPropType","autoScroll","autoScrollSmooth","autoScrollOffset","backdropAnimate","backdropClass","backdropColor","dialogAnimate","dialogZ","dialogWidth","dialogMaxWidth","dialogPlacement","oneOf","targetPadding","hideNext","hidePrev","nextLabel","prevLabel","finishLabel","completeOnFinish","exitOnEscape","exitOnClickOutside","keyboardControls","showStepDots","stepDotsPlacement","showButtons","showStepProgress","progressBar","closeButton","rememberStep","propagateEvents","debug","TourGuideConfigPropType","forceStart","startStep","onStepChange","func","onStart","onExit","onFinish","testMode","TourGuideManager","testClientFactory","clientRef","useRef","isTestEnv","Boolean","__clientRef","hasStartedRef","hasExitedRef","startStepRef","onStepChangeRef","onStartRef","onExitRef","onFinishRef","sanitizedOptions","useMemo","cleanOptions","dialogClass","optionsKey","sanitizedOptionsRef","value","current","stableOptions","stepsKey","stepsForClientRef","map","stepsForClient","useEffect","window","length","undefined","TourGuideClient","createClient","clientOptions","activeStep","_globalAfterChangeCallback","currentStepIndex","nextStepIndex","_globalAfterExitCallback","_globalFinishCallback","exitPromise","isVisible","exit","catch","Promise","resolve","finally","dialog","remove","backdrop","start","propTypes","_default"],"sources":["../../../../../src/template/app-player/player/tourguide/index.js"],"sourcesContent":["import {useEffect, useMemo, useRef} from 'react';\nimport PropTypes from 'prop-types';\nimport {identity, isFunction, isObject, isString, join, keys, map, pipe, sortBy} from 'lodash/fp';\nimport {TourGuideClient} from '@sjmc11/tourguidejs';\nimport './style.css';\n\n// Fixed class used to attach our CSS customizations to the TourGuide dialog.\nconst TOURGUIDE_DIALOG_CLASS = 'coorp-tourguide-dialog';\n\n// Normalize step content for stable serialization:\n// - keep strings as-is\n// - allow objects with a custom toString\n// - otherwise fall back to empty string\nconst normalizeStepContent = content => {\n if (isString(content)) {\n return content;\n }\n\n if (isObject(content) && isFunction(content?.toString)) {\n if (content.toString === Object.prototype.toString) {\n return '';\n }\n return content.toString();\n }\n\n return '';\n};\n\n// Build a deterministic key for steps to avoid re-init on referential changes only.\n// We include target/order/group/content so a real content change triggers a re-init.\nconst serializeSteps = steps =>\n pipe(\n map(\n step =>\n `${step.target || ''}|${step.order ?? ''}|${step.group || ''}|${normalizeStepContent(\n step.content\n )}`\n ),\n join(';;')\n )(steps || []);\n\n// Same idea for options: stable key for effect dependencies.\n// Sorting keys ensures we don't recreate the client due to object key ordering.\nconst serializeOptions = options =>\n pipe(\n keys,\n sortBy(identity),\n map(key => `${key}:${String(options[key])}`),\n join('|')\n )(options || {});\n\nexport const shouldStartTour = (autoStart, group, client) => autoStart && !client.isFinished(group);\n\n// Test-only hooks for unit tests (not used in production code).\nexport const __test__ = {\n normalizeStepContent,\n serializeSteps,\n serializeOptions,\n TOURGUIDE_DIALOG_CLASS,\n shouldStartTour\n};\n\nexport const TourGuideStepPropType = PropTypes.shape({\n title: PropTypes.string,\n content: PropTypes.oneOfType([PropTypes.string, PropTypes.node]).isRequired,\n target: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\n order: PropTypes.number,\n group: PropTypes.string,\n position: PropTypes.string,\n fixed: PropTypes.bool,\n buttons: PropTypes.arrayOf(\n PropTypes.shape({\n text: PropTypes.string,\n type: PropTypes.string\n })\n )\n});\n\nexport const TourGuideOptionsPropType = PropTypes.shape({\n autoScroll: PropTypes.bool,\n autoScrollSmooth: PropTypes.bool,\n autoScrollOffset: PropTypes.number,\n backdropAnimate: PropTypes.bool,\n backdropClass: PropTypes.string,\n backdropColor: PropTypes.string,\n dialogAnimate: PropTypes.string,\n dialogZ: PropTypes.number,\n dialogWidth: PropTypes.number,\n dialogMaxWidth: PropTypes.number,\n dialogPlacement: PropTypes.oneOf(['top', 'right', 'bottom', 'left']),\n targetPadding: PropTypes.number,\n hideNext: PropTypes.bool,\n hidePrev: PropTypes.bool,\n nextLabel: PropTypes.string,\n prevLabel: PropTypes.string,\n finishLabel: PropTypes.string,\n completeOnFinish: PropTypes.bool,\n exitOnEscape: PropTypes.bool,\n exitOnClickOutside: PropTypes.bool,\n keyboardControls: PropTypes.bool,\n showStepDots: PropTypes.bool,\n stepDotsPlacement: PropTypes.oneOf(['footer', 'body']),\n showButtons: PropTypes.bool,\n showStepProgress: PropTypes.bool,\n progressBar: PropTypes.string,\n closeButton: PropTypes.bool,\n rememberStep: PropTypes.bool,\n propagateEvents: PropTypes.bool,\n debug: PropTypes.bool\n});\n\nexport const TourGuideConfigPropType = PropTypes.shape({\n steps: PropTypes.arrayOf(TourGuideStepPropType).isRequired,\n options: TourGuideOptionsPropType,\n group: PropTypes.string,\n autoStart: PropTypes.bool,\n forceStart: PropTypes.bool,\n startStep: PropTypes.number,\n onStepChange: PropTypes.func,\n onStart: PropTypes.func,\n onExit: PropTypes.func,\n onFinish: PropTypes.func,\n testMode: PropTypes.bool\n});\n\n// TourGuideManager is a React-only controller:\n// - creates/destroys the TourGuide client\n// - starts the tour when allowed\n// - cleans up DOM nodes left by the library\nconst TourGuideManager = ({\n steps = [],\n options = {},\n group,\n autoStart = true,\n forceStart = false,\n startStep,\n onStepChange,\n onStart,\n onExit,\n onFinish,\n // Unit-test injection point to avoid using the real TourGuideClient.\n testClientFactory,\n testMode = false\n}) => {\n const clientRef = useRef(null);\n // Expose refs for unit tests without relying on globals.\n const isTestEnv = Boolean(testMode);\n if (isTestEnv) {\n __test__.__clientRef = clientRef;\n }\n const hasStartedRef = useRef(false);\n const hasExitedRef = useRef(false);\n const startStepRef = useRef(startStep);\n const onStepChangeRef = useRef(onStepChange);\n const onStartRef = useRef(onStart);\n const onExitRef = useRef(onExit);\n const onFinishRef = useRef(onFinish);\n const sanitizedOptions = useMemo(() => {\n // We control dialogClass internally; don't let external props override it.\n const cleanOptions = {...options};\n delete cleanOptions.dialogClass;\n return cleanOptions;\n }, [options]);\n const optionsKey = serializeOptions(sanitizedOptions);\n const sanitizedOptionsRef = useRef({key: optionsKey, value: sanitizedOptions});\n if (sanitizedOptionsRef.current.key !== optionsKey) {\n sanitizedOptionsRef.current = {key: optionsKey, value: sanitizedOptions};\n }\n const stableOptions = sanitizedOptionsRef.current.value;\n const stepsKey = serializeSteps(steps);\n // Clone steps because TourGuideJS mutates targets (string -> HTMLElement).\n // Use stepsKey so we only re-clone when the actual content changes.\n const stepsForClientRef = useRef({key: stepsKey, value: (steps || []).map(step => ({...step}))});\n if (stepsForClientRef.current.key !== stepsKey) {\n stepsForClientRef.current = {key: stepsKey, value: (steps || []).map(step => ({...step}))};\n }\n const stepsForClient = stepsForClientRef.current.value;\n\n useEffect(() => {\n startStepRef.current = startStep;\n onStepChangeRef.current = onStepChange;\n onStartRef.current = onStart;\n onExitRef.current = onExit;\n onFinishRef.current = onFinish;\n }, [startStep, onStepChange, onStart, onExit, onFinish]);\n\n useEffect(() => {\n // Avoid client creation on the server or with empty steps.\n if (typeof window === 'undefined' || stepsForClient.length === 0) {\n return undefined;\n }\n if (!TourGuideClient && !testClientFactory) {\n return undefined;\n }\n const createClient =\n testClientFactory ||\n (clientOptions => {\n return new TourGuideClient(clientOptions);\n });\n // Create a fresh client when steps/options change and apply our fixed dialog class.\n const client = createClient({\n steps: stepsForClient,\n ...stableOptions,\n dialogClass: TOURGUIDE_DIALOG_CLASS\n });\n\n clientRef.current = client;\n hasStartedRef.current = false;\n hasExitedRef.current = false;\n if (typeof startStepRef.current === 'number' && startStepRef.current >= 0) {\n client.activeStep = startStepRef.current;\n }\n client._globalAfterChangeCallback = (currentStepIndex, nextStepIndex) => {\n if (onStepChangeRef.current) {\n onStepChangeRef.current(nextStepIndex);\n }\n };\n client._globalAfterExitCallback = () => {\n if (hasExitedRef.current) {\n return;\n }\n hasExitedRef.current = true;\n if (onExitRef.current) {\n onExitRef.current();\n }\n };\n client._globalFinishCallback = () => {\n if (onFinishRef.current) {\n onFinishRef.current();\n }\n };\n\n return () => {\n // Ensure old DOM nodes are removed; TourGuideJS uses fixed IDs\n // and can otherwise leave stale elements behind.\n const exitPromise = client.isVisible ? client.exit().catch(() => {}) : Promise.resolve();\n exitPromise\n .finally(() => {\n client.dialog?.remove();\n client.backdrop?.remove();\n })\n .catch(() => {});\n if (clientRef.current === client) {\n clientRef.current = null;\n }\n };\n }, [stepsKey, optionsKey, stepsForClient, stableOptions, testClientFactory]);\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client) {\n return undefined;\n }\n\n if (autoStart) {\n // Don't restart a tour that was already completed for this group unless explicitly allowed.\n if (!forceStart && group && client.isFinished && client.isFinished(group)) {\n return undefined;\n }\n if (hasStartedRef.current) {\n hasStartedRef.current = false;\n client.exit().catch(() => {});\n }\n const start = () => {\n // Mark as started before calling into the library to avoid double-start.\n hasStartedRef.current = true;\n if (onStartRef.current) {\n onStartRef.current(client.activeStep, group);\n }\n client.start(group).catch(() => {});\n };\n start();\n } else if (!autoStart && hasStartedRef.current) {\n hasStartedRef.current = false;\n client.exit().catch(() => {});\n }\n\n return undefined;\n }, [autoStart, forceStart, group, stepsKey, optionsKey]);\n\n return null;\n};\n\nTourGuideManager.propTypes = {\n steps: PropTypes.arrayOf(TourGuideStepPropType),\n options: TourGuideOptionsPropType,\n group: PropTypes.string,\n autoStart: PropTypes.bool,\n forceStart: PropTypes.bool,\n startStep: PropTypes.number,\n onStepChange: PropTypes.func,\n onStart: PropTypes.func,\n onExit: PropTypes.func,\n onFinish: PropTypes.func,\n testClientFactory: PropTypes.func,\n testMode: PropTypes.bool\n};\n\nexport default TourGuideManager;\n"],"mappings":"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","ignoreList":[]}
|