@davi-ai/retorik-framework 4.0.4 → 5.0.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/README.md +13 -0
- package/dist/{AttachmentDetail.637ad44f.js → AttachmentDetail.3f9c113d.js} +15 -6
- package/dist/AttachmentDetail.3f9c113d.js.map +1 -0
- package/dist/{AttachmentDetail.83788045.js → AttachmentDetail.57c5579a.js} +15 -6
- package/dist/AttachmentDetail.57c5579a.js.map +1 -0
- package/dist/{CustomView.bf84bdf3.js → CustomView.6b96f53f.js} +8 -4
- package/dist/CustomView.6b96f53f.js.map +1 -0
- package/dist/{CustomView.9930c671.js → CustomView.b32a608f.js} +8 -4
- package/dist/CustomView.b32a608f.js.map +1 -0
- package/dist/{Emergency.1112c09f.js → Emergency.43605d14.js} +11 -2
- package/dist/Emergency.43605d14.js.map +1 -0
- package/dist/{Emergency.d5810ff2.js → Emergency.f1287bd5.js} +11 -2
- package/dist/Emergency.f1287bd5.js.map +1 -0
- package/dist/FullScreenImage.17df27bf.js.map +1 -1
- package/dist/FullScreenImage.99e19e10.js.map +1 -1
- package/dist/{HistoryList.3b4b1ffb.js → HistoryList.c19556a7.js} +8 -2
- package/dist/HistoryList.c19556a7.js.map +1 -0
- package/dist/{HistoryList.e5c01f21.js → HistoryList.e7262d62.js} +8 -2
- package/dist/HistoryList.e7262d62.js.map +1 -0
- package/dist/{LanguageChoice.1d866cfa.js → LanguageChoice.54fae1dc.js} +19 -8
- package/dist/LanguageChoice.54fae1dc.js.map +1 -0
- package/dist/{LanguageChoice.cce361a3.js → LanguageChoice.6e8b74f6.js} +19 -8
- package/dist/LanguageChoice.6e8b74f6.js.map +1 -0
- package/dist/LittleWeatherContainer.7e41105e.js.map +1 -1
- package/dist/LittleWeatherContainer.ee087e22.js.map +1 -1
- package/dist/{MapContainer.14c28128.js → MapContainer.25c8f4b4.js} +20 -5
- package/dist/MapContainer.25c8f4b4.js.map +1 -0
- package/dist/{MapContainer.f22ad81f.js → MapContainer.d00ab5b2.js} +20 -5
- package/dist/MapContainer.d00ab5b2.js.map +1 -0
- package/dist/{NewsContainer.d9de093c.js → NewsContainer.a39630c3.js} +33 -26
- package/dist/NewsContainer.a39630c3.js.map +1 -0
- package/dist/{NewsContainer.463e74de.js → NewsContainer.ec15c3bb.js} +33 -26
- package/dist/NewsContainer.ec15c3bb.js.map +1 -0
- package/dist/PrintingPreview.375e62b0.js.map +1 -1
- package/dist/PrintingPreview.c0ca7706.js.map +1 -1
- package/dist/RecognitionManager.c58b8a3d.js +298 -0
- package/dist/RecognitionManager.c58b8a3d.js.map +1 -0
- package/dist/RecognitionManager.cdfb39fc.js +314 -0
- package/dist/RecognitionManager.cdfb39fc.js.map +1 -0
- package/dist/SpiritEngineWrapper.21ea10d4.js.map +1 -1
- package/dist/SpiritEngineWrapper.39627300.js.map +1 -1
- package/dist/SynthesisPonyfillManager.10888d6d.js +888 -0
- package/dist/SynthesisPonyfillManager.10888d6d.js.map +1 -0
- package/dist/SynthesisPonyfillManager.f9f9a915.js +920 -0
- package/dist/SynthesisPonyfillManager.f9f9a915.js.map +1 -0
- package/dist/{ThreeJsWrapper.dd4906ff.js → ThreeJsWrapper.0285d280.js} +24 -12
- package/dist/ThreeJsWrapper.0285d280.js.map +1 -0
- package/dist/{ThreeJsWrapper.c02a077f.js → ThreeJsWrapper.ad746197.js} +24 -11
- package/dist/ThreeJsWrapper.ad746197.js.map +1 -0
- package/dist/{VeilleManager.f3bafdec.js → VeilleManager.0b3f2454.js} +11 -13
- package/dist/VeilleManager.0b3f2454.js.map +1 -0
- package/dist/{VeilleManager.85967e7c.js → VeilleManager.340a7825.js} +11 -13
- package/dist/VeilleManager.340a7825.js.map +1 -0
- package/dist/{Weather.7e945307.js → Weather.abc13d88.js} +9 -3
- package/dist/Weather.abc13d88.js.map +1 -0
- package/dist/{Weather.e81b7205.js → Weather.b9d9f82e.js} +9 -3
- package/dist/Weather.b9d9f82e.js.map +1 -0
- package/dist/index.d.ts +21 -951
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52952 -33750
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +53468 -34269
- package/dist/index.modern.js.map +1 -1
- package/package.json +21 -21
- package/dist/AttachmentDetail.637ad44f.js.map +0 -1
- package/dist/AttachmentDetail.83788045.js.map +0 -1
- package/dist/CustomView.9930c671.js.map +0 -1
- package/dist/CustomView.bf84bdf3.js.map +0 -1
- package/dist/Emergency.1112c09f.js.map +0 -1
- package/dist/Emergency.d5810ff2.js.map +0 -1
- package/dist/HistoryList.3b4b1ffb.js.map +0 -1
- package/dist/HistoryList.e5c01f21.js.map +0 -1
- package/dist/LanguageChoice.1d866cfa.js.map +0 -1
- package/dist/LanguageChoice.cce361a3.js.map +0 -1
- package/dist/MapContainer.14c28128.js.map +0 -1
- package/dist/MapContainer.f22ad81f.js.map +0 -1
- package/dist/NewsContainer.463e74de.js.map +0 -1
- package/dist/NewsContainer.d9de093c.js.map +0 -1
- package/dist/ThreeJsWrapper.c02a077f.js.map +0 -1
- package/dist/ThreeJsWrapper.dd4906ff.js.map +0 -1
- package/dist/VeilleManager.85967e7c.js.map +0 -1
- package/dist/VeilleManager.f3bafdec.js.map +0 -1
- package/dist/Weather.7e945307.js.map +0 -1
- package/dist/Weather.e81b7205.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import "./Weather.
|
|
1
|
+
import "./Weather.b9d9f82e.js";
|
|
2
2
|
import {jsxs as $7qgKV$jsxs, jsx as $7qgKV$jsx} from "react/jsx-runtime";
|
|
3
3
|
import $7qgKV$react, {useState as $7qgKV$useState, useRef as $7qgKV$useRef, useEffect as $7qgKV$useEffect, useMemo as $7qgKV$useMemo} from "react";
|
|
4
4
|
import {useDispatch as $7qgKV$useDispatch, useSelector as $7qgKV$useSelector} from "react-redux";
|
|
@@ -26,8 +26,6 @@ $parcel$export(module.exports, "default", () => $aedc1e5f954603b8$export$2e2bcd8
|
|
|
26
26
|
|
|
27
27
|
var $8ItUL = parcelRequire("8ItUL");
|
|
28
28
|
|
|
29
|
-
var $4ucVo = parcelRequire("4ucVo");
|
|
30
|
-
|
|
31
29
|
var $6hdFJ = parcelRequire("6hdFJ");
|
|
32
30
|
|
|
33
31
|
var $hifTx = parcelRequire("hifTx");
|
|
@@ -75,7 +73,7 @@ const $aedc1e5f954603b8$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
|
|
|
75
73
|
* - else set ViewContext's route state to 'home'
|
|
76
74
|
*/ const handleBack = ()=>{
|
|
77
75
|
if (isRetorikNews) return;
|
|
78
|
-
dispatch((0, $8ItUL.storeActions).view.setRoute((0, $
|
|
76
|
+
dispatch((0, $8ItUL.storeActions).view.setRoute((0, $8ItUL.Routes).Home));
|
|
79
77
|
};
|
|
80
78
|
(0, $7qgKV$useEffect)(()=>{
|
|
81
79
|
configuration.useOldRemote && dispatch((0, $8ItUL.storeActions).view.setDisplayControls(false));
|
|
@@ -91,12 +89,20 @@ const $aedc1e5f954603b8$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
|
|
|
91
89
|
dispatch((0, $8ItUL.storeActions).retorik.setDisplaySubtitles(oldDiplaySubtitles.current));
|
|
92
90
|
}
|
|
93
91
|
// Send closing events unless we are using RetorikNews component
|
|
94
|
-
if (!isRetorikNews)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
92
|
+
if (!isRetorikNews) {
|
|
93
|
+
dispatch((0, $8ItUL.storeActions).directline.sendEvent({
|
|
94
|
+
name: 'Davi.CloseWindow',
|
|
95
|
+
callback: ()=>dispatch((0, $8ItUL.storeActions).directline.sendEvent({
|
|
96
|
+
name: 'Davi.CloseWindowNews'
|
|
97
|
+
}))
|
|
98
|
+
}));
|
|
99
|
+
dispatch((0, $8ItUL.storeActions).livekit.sendEvent({
|
|
100
|
+
name: 'Davi.CloseWindow',
|
|
101
|
+
callback: ()=>dispatch((0, $8ItUL.storeActions).livekit.sendEvent({
|
|
102
|
+
name: 'Davi.CloseWindowNews'
|
|
103
|
+
}))
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
100
106
|
};
|
|
101
107
|
}, []);
|
|
102
108
|
/**
|
|
@@ -278,7 +284,7 @@ const $c1e5018217fb7fb5$var$Time = ({ belowReturnButton: belowReturnButton })=>{
|
|
|
278
284
|
className: "rf-w-fit rf-h-fit rf-flex rf-flex-col rf-justify-start rf-items-start rf-text-white",
|
|
279
285
|
children: [
|
|
280
286
|
/*#__PURE__*/ (0, $7qgKV$jsx)("div", {
|
|
281
|
-
className: "rf-w-full rf-text-size-auto rf-px-3 rf-py-0 large:rf-px-4 large:rf-py-1 rf-text-center rf-font-semibold rf-bg-red
|
|
287
|
+
className: "rf-w-full rf-text-size-auto rf-px-3 rf-py-0 large:rf-px-4 large:rf-py-1 rf-text-center rf-font-semibold rf-bg-red rf-whitespace-nowrap",
|
|
282
288
|
children: `${translation.news.live.toLocaleUpperCase(locale)} \u25cf`
|
|
283
289
|
}),
|
|
284
290
|
/*#__PURE__*/ (0, $7qgKV$jsx)("div", {
|
|
@@ -304,8 +310,6 @@ var $8ItUL = parcelRequire("8ItUL");
|
|
|
304
310
|
|
|
305
311
|
var $kThjX = parcelRequire("kThjX");
|
|
306
312
|
|
|
307
|
-
var $4ucVo = parcelRequire("4ucVo");
|
|
308
|
-
|
|
309
313
|
var $auAlt = parcelRequire("auAlt");
|
|
310
314
|
|
|
311
315
|
var $9lsRd = parcelRequire("9lsRd");
|
|
@@ -335,6 +339,9 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
|
|
|
335
339
|
dispatch((0, $8ItUL.storeActions).directline.sendEvent({
|
|
336
340
|
name: 'news.getAllNews'
|
|
337
341
|
}));
|
|
342
|
+
dispatch((0, $8ItUL.storeActions).livekit.sendEvent({
|
|
343
|
+
name: 'news.getAllNews'
|
|
344
|
+
}));
|
|
338
345
|
}, 2000);
|
|
339
346
|
return ()=>{
|
|
340
347
|
timerRef.current && clearTimeout(timerRef.current);
|
|
@@ -342,8 +349,8 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
|
|
|
342
349
|
}, []);
|
|
343
350
|
(0, $7qgKV$useEffect)(()=>{
|
|
344
351
|
switch(currentDeviceType){
|
|
345
|
-
case (0, $
|
|
346
|
-
case (0, $
|
|
352
|
+
case (0, $8ItUL.DeviceType).mobile:
|
|
353
|
+
case (0, $8ItUL.DeviceType).widget:
|
|
347
354
|
// Set carousel's and banner's positions
|
|
348
355
|
setAlignSelfEnd(true);
|
|
349
356
|
setCarouselGridRowStart(1);
|
|
@@ -351,8 +358,8 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
|
|
|
351
358
|
setBannerGridRowStart(10);
|
|
352
359
|
setBannerGridRowSpan(3);
|
|
353
360
|
break;
|
|
354
|
-
case (0, $
|
|
355
|
-
case (0, $
|
|
361
|
+
case (0, $8ItUL.DeviceType).landscape:
|
|
362
|
+
case (0, $8ItUL.DeviceType).widgetLandscape:
|
|
356
363
|
// Check banner's position and set carousel's position if there are no position data for this one
|
|
357
364
|
if (newsConfiguration?.bannerPosition?.landscape) {
|
|
358
365
|
const start = newsConfiguration.bannerPosition.landscape.containerRowStart || 10;
|
|
@@ -387,8 +394,8 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
|
|
|
387
394
|
setCarouselGridRowSpan(9);
|
|
388
395
|
}
|
|
389
396
|
break;
|
|
390
|
-
case (0, $
|
|
391
|
-
case (0, $
|
|
397
|
+
case (0, $8ItUL.DeviceType).borne:
|
|
398
|
+
case (0, $8ItUL.DeviceType).widgetBorne:
|
|
392
399
|
// Check banner's position and set carousel's position if there are no position data for this one
|
|
393
400
|
if (newsConfiguration?.bannerPosition?.borne) {
|
|
394
401
|
const start = newsConfiguration.bannerPosition.borne.containerRowStart || 10;
|
|
@@ -462,7 +469,7 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
|
|
|
462
469
|
if (current < news.length - 1) {
|
|
463
470
|
const delay = current < news.length - 1 ? intervalInSeconds : intervalInSeconds * 3;
|
|
464
471
|
timerRef.current && clearTimeout(timerRef.current);
|
|
465
|
-
if (route === (0, $
|
|
472
|
+
if (route === (0, $8ItUL.Routes).News || isRetorikNews) timerRef.current = setTimeout(next, delay * 1000);
|
|
466
473
|
} else onEnd();
|
|
467
474
|
}
|
|
468
475
|
dispatch((0, $8ItUL.storeActions).utils.setRetorikNewsEnded(false));
|
|
@@ -509,8 +516,8 @@ parcelRegister("kThjX", function(module, exports) {
|
|
|
509
516
|
|
|
510
517
|
$parcel$export(module.exports, "default", () => $07fb045e03ad37d0$export$2e2bcd8739ae039);
|
|
511
518
|
|
|
512
|
-
var $5CsC6 = parcelRequire("5CsC6");
|
|
513
519
|
|
|
520
|
+
var $8ItUL = parcelRequire("8ItUL");
|
|
514
521
|
const $07fb045e03ad37d0$var$useNews = ()=>{
|
|
515
522
|
const activities = (0, $7qgKV$useSelector)((state)=>state.activityReducer.botEventActivities);
|
|
516
523
|
if (!activities.length) return {
|
|
@@ -525,8 +532,8 @@ const $07fb045e03ad37d0$var$useNews = ()=>{
|
|
|
525
532
|
};
|
|
526
533
|
const newsAttachments = [];
|
|
527
534
|
activity.attachments.forEach((attachment)=>{
|
|
528
|
-
if (attachment.contentType === (0, $
|
|
529
|
-
contentType: (0, $
|
|
535
|
+
if (attachment.contentType === (0, $8ItUL.CONTENT_TYPE_NEWS)) newsAttachments.push({
|
|
536
|
+
contentType: (0, $8ItUL.CONTENT_TYPE_NEWS),
|
|
530
537
|
content: attachment.content || ''
|
|
531
538
|
});
|
|
532
539
|
});
|
|
@@ -646,7 +653,7 @@ const $262dee73bb235081$var$BannerTopMobile = ({ category: category, title: titl
|
|
|
646
653
|
return /*#__PURE__*/ (0, $7qgKV$jsxs)((0, $7qgKV$react).Fragment, {
|
|
647
654
|
children: [
|
|
648
655
|
/*#__PURE__*/ (0, $7qgKV$jsx)("div", {
|
|
649
|
-
className: "rf-w-full rf-px-4 rf-py-2 rf-font-bold rf-bg-red
|
|
656
|
+
className: "rf-w-full rf-px-4 rf-py-2 rf-font-bold rf-bg-red rf-whitespace-nowrap rf-text-size-auto",
|
|
650
657
|
children: category?.toLocaleUpperCase(locale)
|
|
651
658
|
}),
|
|
652
659
|
/*#__PURE__*/ (0, $7qgKV$jsxs)("div", {
|
|
@@ -699,7 +706,7 @@ const $5485971f80937390$var$BannerTopLarge = ({ category: category, title: title
|
|
|
699
706
|
className: "rf-w-full rf-flex rf-flex-row rf-justify-start rf-text-size-auto",
|
|
700
707
|
children: [
|
|
701
708
|
/*#__PURE__*/ (0, $7qgKV$jsx)("div", {
|
|
702
|
-
className: "rf-px-4 rf-py-3 rf-font-bold rf-bg-red
|
|
709
|
+
className: "rf-px-4 rf-py-3 rf-font-bold rf-bg-red rf-whitespace-nowrap",
|
|
703
710
|
children: category?.toLocaleUpperCase(locale)
|
|
704
711
|
}),
|
|
705
712
|
/*#__PURE__*/ (0, $7qgKV$jsx)("div", {
|
|
@@ -726,4 +733,4 @@ var $5485971f80937390$export$2e2bcd8739ae039 = $5485971f80937390$var$BannerTopLa
|
|
|
726
733
|
|
|
727
734
|
|
|
728
735
|
|
|
729
|
-
//# sourceMappingURL=NewsContainer.
|
|
736
|
+
//# sourceMappingURL=NewsContainer.ec15c3bb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["src/components/News/NewsContainer.tsx","src/components/News/Time.tsx","src/components/News/News.tsx","src/hooks/useNews.tsx","src/components/News/Banner.tsx","src/components/News/BannerTopMobile.tsx","src/components/News/BannerTopLarge.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react'\r\nimport { useDispatch, useSelector } from 'react-redux'\r\nimport { RootState, storeActions, Routes } from '../../store'\r\n\r\nimport type { NewsConfig } from '../../store/models/types'\r\n\r\nimport Background from '../Common/Background'\r\nimport Time from '../News/Time'\r\nimport News from '../News/News'\r\nimport Weather from '../Weather/Weather'\r\nimport AbsoluteLargeClosingButton from '../Utils/SubView/AbsoluteLargeClosingButton'\r\nimport CloseButton from '../Common/CloseButton'\r\nimport MenuDisplayer from '../Menus/MenuDisplayer'\r\nimport { BackButton } from '../Menu/Common'\r\n\r\ninterface NewsContainerProps {\r\n hideMenu?: boolean\r\n isRetorikNews?: boolean\r\n loop?: boolean\r\n fromVeille?: boolean\r\n handleEndedWithoutloop?: () => void\r\n}\r\n\r\n// Steps enum\r\nenum Steps {\r\n opening = 1,\r\n news,\r\n events,\r\n weather,\r\n ending\r\n}\r\n\r\nconst NewsContainer = ({ hideMenu, isRetorikNews, loop, fromVeille, handleEndedWithoutloop }: NewsContainerProps): React.JSX.Element => {\r\n const dispatch = useDispatch()\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const configuration = useSelector((state: RootState) => state.retorikReducer.configuration)\r\n const displaySubtitles = useSelector((state: RootState) => state.retorikReducer.displaySubtitles)\r\n const muted = useSelector((state: RootState) => state.speechReducer.muted)\r\n const isMobile = useSelector((state: RootState) => state.viewReducer.isMobile)\r\n const isLandscape = useSelector((state: RootState) => state.viewReducer.isLandscape)\r\n const isBorne = useSelector((state: RootState) => state.viewReducer.isBorne)\r\n const configurations = useSelector((state: RootState) => state.viewReducer.configurations)\r\n const conversationId = useSelector((state: RootState) => state.activityReducer.conversationId)\r\n const storedConversationData = useSelector((state: RootState) => state.directlineReducer.storedVeilleConversationData)\r\n\r\n const [displayData, setDisplayData] = useState<NewsConfig>(configurations.views.news || configurations.views.home)\r\n const [step, setStep] = useState<number>(configurations.views.news?.openingVideo ? Steps.opening : Steps.news)\r\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const newsEndedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\r\n const oldDiplaySubtitles = useRef<boolean>(displaySubtitles)\r\n\r\n /**\r\n * On call :\r\n * - if the component is news-only, return\r\n * - else set ViewContext's route state to 'home'\r\n */\r\n const handleBack = (): void => {\r\n if (isRetorikNews) {\r\n return\r\n }\r\n dispatch(storeActions.view.setRoute(Routes.Home))\r\n }\r\n\r\n useEffect(() => {\r\n configuration.useOldRemote && dispatch(storeActions.view.setDisplayControls(false))\r\n // Force muted state to false if we are not in the veille\r\n muted && !fromVeille && dispatch(storeActions.speech.setMuted(false))\r\n // Force hiding subtitles if we are in the veille\r\n fromVeille && dispatch(storeActions.retorik.setDisplaySubtitles(false))\r\n\r\n return () => {\r\n // If we exit news from the veille, let's store the conversation id for next turn, clear activity store and set back subtitles\r\n if (fromVeille) {\r\n !storedConversationData?.id && conversationId && dispatch(storeActions.directline.setStoredVeilleConversationData(conversationId))\r\n dispatch(storeActions.activity.resetActivityStore())\r\n dispatch(storeActions.retorik.setDisplaySubtitles(oldDiplaySubtitles.current))\r\n }\r\n // Send closing events unless we are using RetorikNews component\r\n if (!isRetorikNews) {\r\n dispatch(storeActions.directline.sendEvent({ name: 'Davi.CloseWindow', callback: () => dispatch(storeActions.directline.sendEvent({ name: 'Davi.CloseWindowNews' })) }))\r\n dispatch(storeActions.livekit.sendEvent({ name: 'Davi.CloseWindow', callback: () => dispatch(storeActions.livekit.sendEvent({ name: 'Davi.CloseWindowNews' })) }))\r\n }\r\n }\r\n }, [])\r\n\r\n /**\r\n * On step change :\r\n * - switch on the current step to launch corresponding processing\r\n * On component unmount :\r\n * - clear timerRef timeout\r\n */\r\n useEffect(() => {\r\n switch (step) {\r\n case Steps.opening: {\r\n dispatch(storeActions.retorik.setDisplayAgentInNews(false))\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl && !fromVeille ? setViewContextCurrentConfiguration(videoUrl as string) : setStep(Steps.news)\r\n break\r\n }\r\n case Steps.news:\r\n dispatch(storeActions.retorik.setDisplayAgentInNews(true))\r\n setDisplayData(configurations.views.news || configurations.views.home)\r\n break\r\n case Steps.events:\r\n break\r\n case Steps.weather:\r\n dispatch(storeActions.retorik.setDisplayAgentInNews(false))\r\n // If the position is known, display the weather page during 10 seconds, otherwise switch to the next step directly\r\n configuration.position?.latitude && configuration.position?.longitude\r\n ? (timerRef.current = setTimeout(() => {\r\n setStep(Steps.ending)\r\n }, 10000))\r\n : setStep(Steps.ending)\r\n break\r\n case Steps.ending: {\r\n dispatch(storeActions.retorik.setDisplayAgentInNews(false))\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl && !fromVeille ? setViewContextCurrentConfiguration(videoUrl as string) : exitNewsOrLoop()\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n\r\n return (): void => {\r\n timerRef?.current && clearTimeout(timerRef.current)\r\n newsEndedTimerRef?.current && clearTimeout(newsEndedTimerRef.current)\r\n }\r\n }, [step])\r\n\r\n /**\r\n * On call :\r\n * - set the current display configuration to have the given video as background\r\n * @param videoUrl\r\n */\r\n const setViewContextCurrentConfiguration = (videoUrl: string): void => {\r\n setDisplayData({\r\n ...configurations.views.news,\r\n background: {\r\n video: videoUrl,\r\n style: 'video'\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * On call :\r\n * - if the component is news-only :\r\n * + if 'loop' is explicitly set to false, call props' handleEndedWithoutloop method if defined. Call handleBack method otherwise\r\n * + if 'loop' is not false, loop by setting step state to Steps.news\r\n * - or else if 'loop' parameter in configuration is true, get back to Steps.news step. Call handleBack method otherwise\r\n */\r\n const exitNewsOrLoop = (): void => {\r\n // Relaunch from the start if this is a news-only component and loop hasn't explicitly been set to false\r\n if (isRetorikNews) {\r\n if (fromVeille) {\r\n loop ? setStep(Steps.news) : handleEndedWithoutloop?.()\r\n } else {\r\n displayData.loop !== false || loop ? setStep(Steps.news) : handleEndedWithoutloop ? handleEndedWithoutloop() : handleBack()\r\n }\r\n } else {\r\n // Relaunch from the start if the loop is activated, otherwise get back to homepage\r\n displayData.loop || loop ? setStep(Steps.news) : handleBack()\r\n }\r\n }\r\n\r\n /**\r\n * On video end :\r\n * - if we are at the opening step, let's set the step state to Steps.news to launch the news\r\n * - if we are at the ending step, call exitNewsOrLoop function\r\n */\r\n const handleVideoEnd = (): void => {\r\n switch (step) {\r\n case Steps.opening:\r\n setStep(Steps.news)\r\n break\r\n case Steps.ending:\r\n exitNewsOrLoop()\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * On news end :\r\n * - wait 3 seconds\r\n * - get to the next step (Steps.events)\r\n */\r\n const handleNewsEnd = (): void => {\r\n newsEndedTimerRef &&\r\n (newsEndedTimerRef.current = setTimeout(() => {\r\n // setStep(Steps.events)\r\n setStep(Steps.weather)\r\n }, 3000))\r\n }\r\n\r\n return (\r\n <div className='rf-relative rf-col-start-1 rf-col-span-full rf-row-start-1 rf-row-span-full rf-grid rf-grid-cols-8 rf-grid-rows-12'>\r\n <Background config={displayData.background} videoLoop={false} videoMuted={true} onVideoEnded={handleVideoEnd} />\r\n\r\n {/* Timer + back button in mobile / widget mode */}\r\n {isMobile && !isRetorikNews && !hideMenu ? (\r\n <div className='rf-relative rf-z-util rf-col-start-1 rf-col-span-full rf-row-start-1 rf-flex rf-flex-col rf-gap-2 rf-items-start'>\r\n <BackButton title={translation.common.back} handleBack={handleBack} className='rf-pr-2 rf-mt-4 rf-ml-4 rf-text-size-auto rf-bg-truewhite rf-rounded-lg' />\r\n <Time belowReturnButton={true} />\r\n </div>\r\n ) : (\r\n <Time />\r\n )}\r\n\r\n {/* News step */}\r\n {step === Steps.news && <News intervalInSeconds={displayData.intervalInSeconds ? (displayData.intervalInSeconds as number) : undefined} onEnd={handleNewsEnd} isRetorikNews={isRetorikNews} />}\r\n\r\n {step === Steps.weather && configuration.position?.latitude && configuration.position?.longitude && <Weather handleClose={handleBack} />}\r\n\r\n {/* Closing button if it needs to be displayed */}\r\n {!hideMenu && <AbsoluteLargeClosingButton dashboardVisible={true} onClick={handleBack} />}\r\n\r\n {!hideMenu && isLandscape && !configuration.useOldRemote && !isRetorikNews && <CloseButton onClick={handleBack} showLabel={true} />}\r\n\r\n {!hideMenu && isBorne && !configuration.useOldRemote && !isRetorikNews && <MenuDisplayer hideMenu={configuration?.hideMenu} />}\r\n </div>\r\n )\r\n}\r\n\r\nexport default NewsContainer\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\n\r\ninterface TimeProps {\r\n belowReturnButton?: boolean\r\n}\r\n\r\nconst Time = ({ belowReturnButton }: TimeProps): React.JSX.Element => {\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n const [time, setTime] = useState<string>('')\r\n const timerRef: React.MutableRefObject<any> = useRef(null)\r\n\r\n /**\r\n * Set current time (hours and minutes) depending on the locale (ex: adds AM/PM when needed)\r\n */\r\n const setCurrentTime = (): void => {\r\n const now = new Date()\r\n setTime(\r\n now.toLocaleTimeString(locale, {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n })\r\n )\r\n }\r\n\r\n /**\r\n * On component mount :\r\n * - set time\r\n * - set interval for time update\r\n * On component unmount :\r\n * - clear interval\r\n */\r\n useEffect(() => {\r\n setCurrentTime()\r\n timerRef && (timerRef.current = setInterval(setCurrentTime, 1000))\r\n\r\n return (): void => timerRef && clearInterval(timerRef.current)\r\n }, [])\r\n\r\n return (\r\n <div className={`rf-relative ${belowReturnButton ? 'rf-ml-4' : 'rf-col-start-1 rf-col-span-2 rf-row-start-1 rf-row-span-2 rf-self-start rf-justify-self-start rf-m-4 large:rf-m-8'}`}>\r\n <div className='rf-w-fit rf-h-fit rf-flex rf-flex-col rf-justify-start rf-items-start rf-text-white'>\r\n {/* Text 'Live' + round */}\r\n <div className='rf-w-full rf-text-size-auto rf-px-3 rf-py-0 large:rf-px-4 large:rf-py-1 rf-text-center rf-font-semibold rf-bg-red rf-whitespace-nowrap'>\r\n {`${translation.news.live.toLocaleUpperCase(locale)} \\u25cf`}\r\n </div>\r\n {/* Time */}\r\n <div className='rf-w-full rf-title-size-auto rf-px-3 rf-py-0 large:rf-px-4 large:rf-py-1 rf-text-center rf-font-bold rf-bg-blue-500'>{time}</div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Time\r\n","import React, { useEffect, useMemo, useState, useRef } from 'react'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions, DeviceType, Routes } from '../../store'\r\nimport useNews from '../../hooks/useNews'\r\n\r\nimport type { Image, Media } from '../../models/attachmentTypes'\r\nimport { RetorikActivity } from '../../store/models/activityTypes'\r\n\r\nimport Banner from './Banner'\r\nimport { Carousel } from '../Utils'\r\n\r\ntype NewsProps = {\r\n intervalInSeconds?: number\r\n onEnd: () => void\r\n isRetorikNews?: boolean\r\n}\r\n\r\nconst News = ({ intervalInSeconds = 3, onEnd, isRetorikNews }: NewsProps): React.JSX.Element => {\r\n const dispatch = useDispatch()\r\n const { newsAttachments, activity } = useNews()\r\n const route = useSelector((state: RootState) => state.viewReducer.route)\r\n const isMobile = useSelector((state: RootState) => state.viewReducer.isMobile)\r\n const newsConfiguration = useSelector((state: RootState) => state.viewReducer.configurations.views.news)\r\n const currentDeviceType = useSelector((state: RootState) => state.viewReducer.currentDeviceType)\r\n const retorikNewsEnded = useSelector((state: RootState) => state.utilsReducer.retorikNewsEnded)\r\n\r\n const [carouselGridRowStart, setCarouselGridRowStart] = useState<number>()\r\n const [carouselGridRowSpan, setCarouselGridRowSpan] = useState<number>()\r\n const [bannerGridRowStart, setBannerGridRowStart] = useState<number>(10)\r\n const [bannerGridRowSpan, setBannerGridRowSpan] = useState<number>(3)\r\n // Banner's align-self is flex-end if the position of the banner hasn't been changed, flex-start in borne / landscape modes otherwise\r\n const [alignSelfEnd, setAlignSelfEnd] = useState<boolean>(true)\r\n const [current, setCurrent] = useState<number>(0)\r\n const timerRef = useRef<NodeJS.Timer | null>(null)\r\n\r\n const news = useMemo(() => {\r\n return newsAttachments.map((newsAttachement) => newsAttachement.content)\r\n }, [newsAttachments])\r\n\r\n useEffect(() => {\r\n if (!newsAttachments.length) {\r\n setTimeout(() => {\r\n dispatch(storeActions.directline.sendEvent({ name: 'news.getAllNews' }))\r\n dispatch(storeActions.livekit.sendEvent({ name: 'news.getAllNews' }))\r\n }, 2000)\r\n }\r\n\r\n return (): void => {\r\n timerRef.current && clearTimeout(timerRef.current)\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n switch (currentDeviceType) {\r\n case DeviceType.mobile:\r\n case DeviceType.widget: {\r\n // Set carousel's and banner's positions\r\n setAlignSelfEnd(true)\r\n setCarouselGridRowStart(1)\r\n setCarouselGridRowSpan(9)\r\n setBannerGridRowStart(10)\r\n setBannerGridRowSpan(3)\r\n break\r\n }\r\n case DeviceType.landscape:\r\n case DeviceType.widgetLandscape: {\r\n // Check banner's position and set carousel's position if there are no position data for this one\r\n if (newsConfiguration?.bannerPosition?.landscape) {\r\n const start = newsConfiguration.bannerPosition.landscape.containerRowStart || 10\r\n const end = newsConfiguration.bannerPosition.landscape.containerRowEnd || 13\r\n\r\n setAlignSelfEnd(false)\r\n setBannerGridRowStart(start)\r\n setBannerGridRowSpan(end - start)\r\n\r\n if (!newsConfiguration?.mediaPosition?.landscape) {\r\n // The base row span of the carousel is 9, if the custom position of the banner allows this span, let's keep it. If not, let's use the max span available.\r\n if (start > 9) {\r\n setCarouselGridRowStart(start - 9)\r\n setCarouselGridRowSpan(9)\r\n } else {\r\n setCarouselGridRowStart(1)\r\n setCarouselGridRowSpan(start - 1)\r\n }\r\n\r\n break\r\n }\r\n } else {\r\n setAlignSelfEnd(true)\r\n setBannerGridRowStart(10)\r\n setBannerGridRowSpan(3)\r\n }\r\n\r\n // Check carousel's position\r\n if (newsConfiguration?.mediaPosition?.landscape) {\r\n const start = newsConfiguration.mediaPosition.landscape.containerRowStart || 1\r\n const end = newsConfiguration.mediaPosition.landscape.containerRowEnd || 10\r\n\r\n setCarouselGridRowStart(start)\r\n setCarouselGridRowStart(end - start)\r\n } else {\r\n setCarouselGridRowStart(1)\r\n setCarouselGridRowSpan(9)\r\n }\r\n\r\n break\r\n }\r\n case DeviceType.borne:\r\n case DeviceType.widgetBorne: {\r\n // Check banner's position and set carousel's position if there are no position data for this one\r\n if (newsConfiguration?.bannerPosition?.borne) {\r\n const start = newsConfiguration.bannerPosition.borne.containerRowStart || 10\r\n const end = newsConfiguration.bannerPosition.borne.containerRowEnd || 13\r\n\r\n setAlignSelfEnd(false)\r\n setBannerGridRowStart(start)\r\n setBannerGridRowSpan(end - start)\r\n\r\n if (!newsConfiguration?.mediaPosition?.borne) {\r\n // The base row span of the carousel is 4, if the custom position of the banner allows this span, let's keep it. If not, let's use the max span available.\r\n if (start > 4) {\r\n setCarouselGridRowStart(start - 4)\r\n setCarouselGridRowSpan(4)\r\n } else {\r\n setCarouselGridRowStart(1)\r\n setCarouselGridRowSpan(start - 1)\r\n }\r\n\r\n break\r\n }\r\n } else {\r\n setAlignSelfEnd(true)\r\n setBannerGridRowStart(10)\r\n setBannerGridRowSpan(3)\r\n }\r\n\r\n // Check carousel's position\r\n if (newsConfiguration?.mediaPosition?.borne) {\r\n const start = newsConfiguration.mediaPosition.borne.containerRowStart || 7\r\n const end = newsConfiguration.mediaPosition.borne.containerRowEnd || 11\r\n\r\n setCarouselGridRowStart(start)\r\n setCarouselGridRowSpan(end - start)\r\n } else {\r\n setCarouselGridRowStart(7)\r\n setCarouselGridRowSpan(4)\r\n }\r\n break\r\n }\r\n }\r\n }, [newsConfiguration, currentDeviceType])\r\n\r\n useEffect(() => {\r\n const currentNew = news[current]\r\n if (currentNew) {\r\n const textTitle = newsConfiguration?.removeTitleFromTextToSpeak ? '' : `${currentNew.title}, <break/> `\r\n const textSubtitle = newsConfiguration?.removeSubtitleFromTextToSpeak ? '' : `${currentNew.subtitle}: <break/> `\r\n\r\n const tempActivity: RetorikActivity = {\r\n ...activity,\r\n speak: `${textTitle}${textSubtitle}${currentNew.text}`\r\n } as RetorikActivity\r\n\r\n dispatch(storeActions.speech.addToStreamingQueue(tempActivity))\r\n }\r\n }, [activity, current])\r\n\r\n const currentMedia = useMemo<Array<Image | Media>>(() => {\r\n const currentNew = news[current]\r\n if (currentNew) {\r\n if (currentNew.media?.length) {\r\n return currentNew.media\r\n } else if (currentNew.image?.url) {\r\n return [currentNew.image]\r\n }\r\n }\r\n\r\n return []\r\n }, [news, current])\r\n\r\n useEffect(() => {\r\n if (retorikNewsEnded) {\r\n if (news.length) {\r\n if (current < news.length - 1) {\r\n const delay = current < news.length - 1 ? intervalInSeconds : intervalInSeconds * 3\r\n timerRef.current && clearTimeout(timerRef.current)\r\n if (route === Routes.News || isRetorikNews) {\r\n timerRef.current = setTimeout(next, delay * 1000)\r\n }\r\n } else {\r\n onEnd()\r\n }\r\n }\r\n\r\n dispatch(storeActions.utils.setRetorikNewsEnded(false))\r\n }\r\n }, [retorikNewsEnded])\r\n\r\n const next = (): void => {\r\n const next = (current + 1) % news.length\r\n changeNews(next)\r\n }\r\n\r\n const changeNews = (next: number): void => {\r\n setCurrent(next)\r\n }\r\n\r\n return news.length && current >= 0 ? (\r\n <React.Fragment>\r\n {/* Carousel in landscape / borne display */}\r\n {!isMobile && (\r\n <div\r\n className='rf-relative rf-col-start-5 rf-col-span-3 large-vertical:rf-col-start-2 large-vertical:rf-col-end-8 rf-flex rf-justify-center rf-items-center'\r\n style={{\r\n gridRow: `${carouselGridRowStart} / span ${carouselGridRowSpan}`\r\n }}\r\n >\r\n {currentMedia.length ? (\r\n <Carousel className='rf-z-[10] rf-max-h-4/5 large-vertical:rf-max-h-11/12 rf-max-w-full' medias={news[current].media || [news[current].image || { url: '' }]} />\r\n ) : (\r\n <React.Fragment />\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* Lower banner with title / subtitle / text */}\r\n <Banner news={news[current]} gridRowStart={bannerGridRowStart} gridRowSpan={bannerGridRowSpan} alignSelfEnd={alignSelfEnd} />\r\n </React.Fragment>\r\n ) : (\r\n <React.Fragment />\r\n )\r\n}\r\n\r\nexport default News\r\n","import { NewsContent } from '../models/attachmentTypes'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState, CONTENT_TYPE_NEWS } from '../store'\r\nimport type { RetorikActivity } from '../store/models/activityTypes'\r\n\r\ntype NewsAttachment = {\r\n contentType: string\r\n content: NewsContent\r\n}\r\n\r\nconst useNews = (): {\r\n newsAttachments: Array<NewsAttachment>\r\n activity?: RetorikActivity\r\n} => {\r\n const activities = useSelector((state: RootState) => state.activityReducer.botEventActivities)\r\n\r\n if (!activities.length) {\r\n return { newsAttachments: [] }\r\n }\r\n\r\n // Filter messages that can income during news, with label = Davi.BringupMessage\r\n const filterBringUpActivities = activities.filter((act: any) => act.label !== 'Davi.BringupMessage')\r\n\r\n const activity = filterBringUpActivities[filterBringUpActivities.length - 1] as any\r\n\r\n if (!activity || !activity.attachments?.length) {\r\n return { newsAttachments: [], activity }\r\n }\r\n\r\n const newsAttachments: NewsAttachment[] = []\r\n activity.attachments.forEach((attachment) => {\r\n if (attachment.contentType === CONTENT_TYPE_NEWS) {\r\n newsAttachments.push({\r\n contentType: CONTENT_TYPE_NEWS,\r\n content: attachment.content || ''\r\n })\r\n }\r\n })\r\n\r\n return { newsAttachments, activity }\r\n}\r\n\r\nexport default useNews\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\nimport type { NewsContent } from '../../models/attachmentTypes'\r\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\r\nimport BannerTopMobile from './BannerTopMobile'\r\nimport BannerTopLarge from './BannerTopLarge'\r\n\r\ninterface BannerProps {\r\n news: NewsContent\r\n gridRowStart: number\r\n gridRowSpan: number\r\n alignSelfEnd: boolean\r\n}\r\n\r\nconst Banner = ({ news, gridRowStart, gridRowSpan, alignSelfEnd }: BannerProps): React.JSX.Element => {\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const locale = useSelector((state: RootState) => state.localeReducer.localeForRetorikStudioContent)\r\n const localizedBannerTitle = useSelector((state: RootState) => state.localeReducer.localizedBannerTitle)\r\n const isRTL = useSelector((state: RootState) => state.localeReducer.isRTL)\r\n const isMobile = useSelector((state: RootState) => state.viewReducer.isMobile)\r\n const currentWidth = useSelector((state: RootState) => state.viewReducer.currentWidth)\r\n const newsConfiguration = useSelector((state: RootState) => state.viewReducer.configurations.views.news)\r\n\r\n const timerRef: React.MutableRefObject<any> = useRef(null)\r\n const [scrollDuration, setScrollDuration] = useState<number>(0)\r\n\r\n const category = useMemo<string>(() => {\r\n return news.category || newsConfiguration?.bannerTitleLocalized?.[locale] || localizedBannerTitle || newsConfiguration?.bannerTitle || translation.news.continuous\r\n }, [news, newsConfiguration, locale, localizedBannerTitle, translation])\r\n\r\n /**\r\n * Set animation for text horizontal scrolling if necessary\r\n */\r\n const updateDuration = (): void => {\r\n // Reset animation\r\n setScrollDuration(0)\r\n // Set animation, after a 1s timeout\r\n timerRef &&\r\n (timerRef.current = setTimeout(() => {\r\n setScrollDuration(Math.floor(news.text.length / 11))\r\n }, 1000))\r\n }\r\n\r\n /**\r\n * On news props change :\r\n * - call updateDuration function\r\n * On component unmount :\r\n * - clear timeout\r\n */\r\n useEffect(() => {\r\n updateDuration()\r\n\r\n return (): void => timerRef && clearTimeout(timerRef.current)\r\n }, [news])\r\n\r\n return (\r\n <div\r\n dir={isRTL ? 'rtl' : 'ltr'}\r\n className='rf-h-fit rf-z-util rf-col-start-1 rf-col-span-full large:rf-mb-6 rf-flex rf-flex-col rf-items-center rf-glass-background rf-text-white'\r\n style={{\r\n alignSelf: alignSelfEnd ? 'flex-end' : 'flex-start',\r\n gridRow: `${gridRowStart} / span ${gridRowSpan}`\r\n }}\r\n >\r\n {/* Category + Image (mobile) + Title + Subtitle */}\r\n {isMobile ? (\r\n <BannerTopMobile category={category} title={news.title} subtitle={news.subtitle} url={news.image?.url} />\r\n ) : (\r\n <BannerTopLarge category={category} title={news.title} subtitle={news.subtitle} />\r\n )}\r\n\r\n {/* Text */}\r\n <div\r\n dir='ltr'\r\n className='rf-w-full rf-pr-4 rf-py-2 large:rf-py-4 rf-subtitle-size-auto rf-text-black rf-bg-white rf-overflow-clip'\r\n style={{\r\n paddingLeft: currentWidth\r\n }}\r\n >\r\n {scrollDuration !== 0 ? (\r\n <p\r\n className='rf-w-max rf-whitespace-nowrap rf-animate-hScroll'\r\n style={{\r\n animation: `rf-hScroll ${scrollDuration}s infinite linear`,\r\n paddingRight: currentWidth\r\n }}\r\n >\r\n {news.text ? capitalizeFirstLetter(news.text) : '...'}\r\n </p>\r\n ) : (\r\n <p className='rf-w-max rf-whitespace-nowrap'>{news.text ? capitalizeFirstLetter(news.text) : '...'}</p>\r\n )}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Banner\r\n","import React from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\r\n\r\ninterface BannerTopMobileProps {\r\n category: string\r\n title?: string\r\n subtitle?: string\r\n url?: string\r\n}\r\n\r\nconst BannerTopMobile = ({ category, title, subtitle, url }: BannerTopMobileProps): React.JSX.Element => {\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n\r\n return (\r\n <React.Fragment>\r\n <div className='rf-w-full rf-px-4 rf-py-2 rf-font-bold rf-bg-red rf-whitespace-nowrap rf-text-size-auto'>{category?.toLocaleUpperCase(locale)}</div>\r\n\r\n <div className='rf-w-full rf-flex rf-flex-row'>\r\n {/* Image */}\r\n {url && (\r\n <div\r\n className='rf-aspect-video rf-w-1/4'\r\n style={{\r\n backgroundImage: `url(${url})`,\r\n backgroundSize: 'cover',\r\n backgroundRepeat: 'no-repeat',\r\n backgroundPosition: 'center'\r\n }}\r\n />\r\n )}\r\n\r\n {/* Title + Subtitle */}\r\n <div className='rf-px-4 rf-py-1 rf-font-bold'>\r\n <div className='rf-text-size-auto rf-line-clamp-1'>{title && title.toLocaleUpperCase(locale)}</div>\r\n <div className='rf-text-basecustom rf-line-clamp-2'>{subtitle ? capitalizeFirstLetter(subtitle) : '...'}</div>\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default BannerTopMobile\r\n","import React from 'react'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../../store'\r\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\r\n\r\ninterface BannerTopLargeProps {\r\n category: string\r\n title?: string\r\n subtitle?: string\r\n}\r\n\r\nconst BannerTopLarge = ({ category, title, subtitle }: BannerTopLargeProps): React.JSX.Element => {\r\n const locale = useSelector((state: RootState) => state.localeReducer.locale)\r\n\r\n return (\r\n <React.Fragment>\r\n {/* Category + title */}\r\n <div className='rf-w-full rf-flex rf-flex-row rf-justify-start rf-text-size-auto'>\r\n <div className='rf-px-4 rf-py-3 rf-font-bold rf-bg-red rf-whitespace-nowrap'>{category?.toLocaleUpperCase(locale)}</div>\r\n <div className='rf-px-4 rf-mb-2 rf-mt-2 large:rf-mt-3 rf-font-bold rf-line-clamp-1'>{title?.toLocaleUpperCase(locale)}</div>\r\n </div>\r\n\r\n {/* Subtitle */}\r\n <div className='rf-w-full rf-h-fit rf-flex rf-flex-row rf-justify-start'>\r\n <div className='rf-px-4 rf-my-2 large:rf-my-3 rf-title-large-size-auto rf-line-clamp-2'>{subtitle ? capitalizeFirstLetter(subtitle) : '...'}</div>\r\n </div>\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default BannerTopLarge\r\n"],"names":[],"version":3,"file":"NewsContainer.ec15c3bb.js.map"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,6BAA6B;AAC7B,CAAA,GAAA,YAAI,EAAE,mBAAmB,CAAC,SAAS,GAAG;AAOtC,MAAM,wCAAkB,CAAC,OAAE,GAAG,mBAAE,eAAe,EAAwB;IACrE,MAAM,WAAW,CAAA,GAAA,kBAAU;IAC3B,MAAM,cAAc,CAAA,GAAA,kBAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAC7F,MAAM,mBAAmB,OAAO,OAAO,CAAC,iBAAiB;IACzD,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAW;IAC9D,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAU;IAC3D,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAU;IAErD,MAAM,wBAAwB,CAAC,YAAE,QAAQ,EAAwB;QAC/D,iBAAiB;QACjB,kBAAkB;IACpB;IAEA,MAAM,cAAc;QAClB,mBAAmB;QACnB;IACF;IAEA,MAAM,cAAc;QAClB,SAAS,CAAA,GAAA,mBAAW,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACxD;IAEA,MAAM,aAAa,CAAC;QAClB,cAAc,CAAC,UAAY,UAAU;IACvC;IAEA,qBACE,iBAAC;QACC,WAAU;QACV,OAAO;YACL,YAAY,iBAAiB,YAAY;QAC3C;;0BAGA,iBAAC;gBAAI,WAAU;;oBACZ,gCACC,iBAAC;wBAAO,WAAU;wBAAsJ,SAAS;;0CAC/K,gBAAC,CAAA,GAAA,gBAAQ;4BACR,YAAY,MAAM,CAAC,KAAK;;uCAG3B,gBAAC;kCAAK;;kCAER,gBAAC;wBAAO,WAAU;wBAAgH,SAAS;kCACzI,cAAA,gBAAC,CAAA,GAAA,gBAAQ;;;;0BAKb,iBAAC;gBAAI,WAAU;;oBAEZ,gBAAgB,mBACf,iBAAC;wBAAI,WAAU;;0CACb,gBAAC;gCAAO,WAAW,GAAG,cAAc,IAAI,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CACjG,cAAA,gBAAC,CAAA,GAAA,sBAAc;oCAAE,WAAU;oCAAS,OAAM;;;0CAE5C,iBAAC;gCAAE,WAAU;;oCACV;oCAAW;oCAAI;;;0CAElB,gBAAC;gCAAO,WAAW,GAAG,cAAc,gBAAgB,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CAC7G,cAAA,gBAAC,CAAA,GAAA,uBAAe;oCAAE,WAAU;oCAAS,OAAM;;;;;kCAMjD,gBAAC,CAAA,GAAA,eAAO;wBAAE,MAAM;wBAAK,eAAe;wBAAuB,aAAa;kCACtE,cAAA,gBAAC,CAAA,GAAA,WAAG;4BAAE,YAAY;4BAAY,uBAAuB;4BAAO,iBAAiB;;;;;;;AAKvF;IAEA,2CAAe","sources":["src/components/Attachments/PrintingPreview.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { pdfjs, Document, Page } from 'react-pdf'\r\nimport * as pdfJsWorker from 'pdfjs-dist/build/pdf.worker.js'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport { PrintIcon } from '../Icons/DetailedPOIIcons'\r\nimport { CloseIcon } from '../Icons/Miscellaneous'\r\nimport { ChevronLeftIcon, ChevronRightIcon } from '../Icons/ChevronIcons'\r\n\r\n// Configure react-pdf worker\r\npdfjs.GlobalWorkerOptions.workerSrc = pdfJsWorker\r\n\r\ninterface PrintingPreviewProps {\r\n url: string\r\n printingAllowed?: boolean\r\n}\r\n\r\nconst PrintingPreview = ({ url, printingAllowed }: PrintingPreviewProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const printingCallback = window.Retorik._printingCallback\r\n const [documentLoaded, setDocumentLoaded] = useState<boolean>(false)\r\n const [numberOfPages, setNumberOfPages] = useState<number>(0)\r\n const [pageNumber, setPageNumber] = useState<number>(1)\r\n\r\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {\r\n setNumberOfPages(numPages)\r\n setDocumentLoaded(true)\r\n }\r\n\r\n const handleClick = (): void => {\r\n printingCallback?.(url)\r\n handleClose()\r\n }\r\n\r\n const handleClose = (): void => {\r\n dispatch(storeActions.utils.setModalFullscreenContent(null))\r\n }\r\n\r\n const changePage = (index: number): void => {\r\n setPageNumber((current) => current + index)\r\n }\r\n\r\n return (\r\n <div\r\n className='rf-h-full large-vertical:rf-mt-[20vh] large-vertical:rf-h-1/2 rf-max-w-1/2 large-vertical:rf-max-w-[60%] rf-py-4 rf-flex rf-flex-col rf-gap-4'\r\n style={{\r\n visibility: documentLoaded ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {/* Upper part */}\r\n <div className='rf-grid rf-grid-cols-printingPreview rf-min-h-12 rf-h-12'>\r\n {printingAllowed ? (\r\n <button className='rf-px-4 rf-py-1 rf-h-full rf-justify-self-center rf-flex rf-flex-row rf-items-center rf-gap-2 rf-font-bold rf-text-sm rf-rounded-lg rf-bg-truewhite' onClick={handleClick}>\r\n <PrintIcon />\r\n {translation.common.print}\r\n </button>\r\n ) : (\r\n <div>{'\\u2800'}</div>\r\n )}\r\n <button className='rf-h-full rf-w-12 rf-justify-self-end rf-flex rf-justify-center rf-items-center rf-rounded-lg rf-bg-truewhite' onClick={handleClose}>\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n {/* Document preview */}\r\n <div className='rf-relative rf-w-full rf-flex rf-flex-col rf-rounded-lg rf-overflow-y-scroll rf-scrollbar-thin'>\r\n {/* Number of pages + navigation between pages */}\r\n {numberOfPages > 1 && (\r\n <div className='rf-w-full rf-px-4 rf-pt-3 rf-pb-2 rf-flex rf-flex-row rf-justify-between rf-items-center rf-bg-truewhite'>\r\n <button className={`${pageNumber <= 1 ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(-1)}>\r\n <ChevronLeftIcon className='rf-h-4' color='#000' />\r\n </button>\r\n <p className='rf-text-xl'>\r\n {pageNumber} / {numberOfPages}\r\n </p>\r\n <button className={`${pageNumber >= numberOfPages ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(1)}>\r\n <ChevronRightIcon className='rf-h-4' color='#000' />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Pdf preview */}\r\n <Document file={url} onLoadSuccess={onDocumentLoadSuccess} onLoadError={handleClose}>\r\n <Page pageNumber={pageNumber} renderAnnotationLayer={false} renderTextLayer={false} />\r\n </Document>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default PrintingPreview\r\n"],"names":[],"version":3,"file":"PrintingPreview.375e62b0.js.map"}
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,6BAA6B;AAC7B,CAAA,GAAA,YAAI,EAAE,mBAAmB,CAAC,SAAS,GAAG;AAOtC,MAAM,wCAAkB,CAAC,OAAE,GAAG,mBAAE,eAAe,EAAwB;IACrE,MAAM,WAAW,CAAA,GAAA,kBAAU;IAC3B,MAAM,cAAc,CAAA,GAAA,kBAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAC7F,MAAM,mBAAmB,OAAO,OAAO,CAAC,iBAAiB;IACzD,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,eAAO,EAAW;IAC9D,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,eAAO,EAAU;IAC3D,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,eAAO,EAAU;IAErD,MAAM,wBAAwB,CAAC,YAAE,QAAQ,EAAwB;QAC/D,iBAAiB;QACjB,kBAAkB;IACpB;IAEA,MAAM,cAAc;QAClB,mBAAmB;QACnB;IACF;IAEA,MAAM,cAAc;QAClB,SAAS,CAAA,GAAA,mBAAW,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACxD;IAEA,MAAM,aAAa,CAAC;QAClB,cAAc,CAAC,UAAY,UAAU;IACvC;IAEA,qBACE,iBAAC;QACC,WAAU;QACV,OAAO;YACL,YAAY,iBAAiB,YAAY;QAC3C;;0BAGA,iBAAC;gBAAI,WAAU;;oBACZ,gCACC,iBAAC;wBAAO,WAAU;wBAAsJ,SAAS;;0CAC/K,gBAAC,CAAA,GAAA,gBAAQ;4BACR,YAAY,MAAM,CAAC,KAAK;;uCAG3B,gBAAC;kCAAK;;kCAER,gBAAC;wBAAO,WAAU;wBAAgH,SAAS;kCACzI,cAAA,gBAAC,CAAA,GAAA,gBAAQ;;;;0BAKb,iBAAC;gBAAI,WAAU;;oBAEZ,gBAAgB,mBACf,iBAAC;wBAAI,WAAU;;0CACb,gBAAC;gCAAO,WAAW,GAAG,cAAc,IAAI,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CACjG,cAAA,gBAAC,CAAA,GAAA,sBAAc;oCAAE,WAAU;oCAAS,OAAM;;;0CAE5C,iBAAC;gCAAE,WAAU;;oCACV;oCAAW;oCAAI;;;0CAElB,gBAAC;gCAAO,WAAW,GAAG,cAAc,gBAAgB,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CAC7G,cAAA,gBAAC,CAAA,GAAA,uBAAe;oCAAE,WAAU;oCAAS,OAAM;;;;;kCAMjD,gBAAC,CAAA,GAAA,eAAO;wBAAE,MAAM;wBAAK,eAAe;wBAAuB,aAAa;kCACtE,cAAA,gBAAC,CAAA,GAAA,WAAG;4BAAE,YAAY;4BAAY,uBAAuB;4BAAO,iBAAiB;;;;;;;AAKvF;IAEA,2CAAe","sources":["src/components/Attachments/PrintingPreview.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { pdfjs, Document, Page } from 'react-pdf'\r\nimport * as pdfJsWorker from 'pdfjs-dist/build/pdf.worker.js'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport { PrintIcon } from '../Icons/DetailedPOIIcons'\r\nimport { CloseIcon } from '../Icons/Miscellaneous'\r\nimport { ChevronLeftIcon, ChevronRightIcon } from '../Icons/ChevronIcons'\r\n\r\n// Configure react-pdf worker\r\npdfjs.GlobalWorkerOptions.workerSrc = pdfJsWorker\r\n\r\ninterface PrintingPreviewProps {\r\n url: string\r\n printingAllowed?: boolean\r\n}\r\n\r\nconst PrintingPreview = ({ url, printingAllowed }: PrintingPreviewProps): React.JSX.Element => {\r\n const dispatch = useDispatch()\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const printingCallback = window.Retorik._printingCallback\r\n const [documentLoaded, setDocumentLoaded] = useState<boolean>(false)\r\n const [numberOfPages, setNumberOfPages] = useState<number>(0)\r\n const [pageNumber, setPageNumber] = useState<number>(1)\r\n\r\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {\r\n setNumberOfPages(numPages)\r\n setDocumentLoaded(true)\r\n }\r\n\r\n const handleClick = (): void => {\r\n printingCallback?.(url)\r\n handleClose()\r\n }\r\n\r\n const handleClose = (): void => {\r\n dispatch(storeActions.utils.setModalFullscreenContent(null))\r\n }\r\n\r\n const changePage = (index: number): void => {\r\n setPageNumber((current) => current + index)\r\n }\r\n\r\n return (\r\n <div\r\n className='rf-h-full large-vertical:rf-mt-[20vh] large-vertical:rf-h-1/2 rf-max-w-1/2 large-vertical:rf-max-w-[60%] rf-py-4 rf-flex rf-flex-col rf-gap-4'\r\n style={{\r\n visibility: documentLoaded ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {/* Upper part */}\r\n <div className='rf-grid rf-grid-cols-printingPreview rf-min-h-12 rf-h-12'>\r\n {printingAllowed ? (\r\n <button className='rf-px-4 rf-py-1 rf-h-full rf-justify-self-center rf-flex rf-flex-row rf-items-center rf-gap-2 rf-font-bold rf-text-sm rf-rounded-lg rf-bg-truewhite' onClick={handleClick}>\r\n <PrintIcon />\r\n {translation.common.print}\r\n </button>\r\n ) : (\r\n <div>{'\\u2800'}</div>\r\n )}\r\n <button className='rf-h-full rf-w-12 rf-justify-self-end rf-flex rf-justify-center rf-items-center rf-rounded-lg rf-bg-truewhite' onClick={handleClose}>\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n {/* Document preview */}\r\n <div className='rf-relative rf-w-full rf-flex rf-flex-col rf-rounded-lg rf-overflow-y-scroll rf-scrollbar-thin'>\r\n {/* Number of pages + navigation between pages */}\r\n {numberOfPages > 1 && (\r\n <div className='rf-w-full rf-px-4 rf-pt-3 rf-pb-2 rf-flex rf-flex-row rf-justify-between rf-items-center rf-bg-truewhite'>\r\n <button className={`${pageNumber <= 1 ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(-1)}>\r\n <ChevronLeftIcon className='rf-h-4' color='#000' />\r\n </button>\r\n <p className='rf-text-xl'>\r\n {pageNumber} / {numberOfPages}\r\n </p>\r\n <button className={`${pageNumber >= numberOfPages ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(1)}>\r\n <ChevronRightIcon className='rf-h-4' color='#000' />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Pdf preview */}\r\n <Document file={url} onLoadSuccess={onDocumentLoadSuccess} onLoadError={handleClose}>\r\n <Page pageNumber={pageNumber} renderAnnotationLayer={false} renderTextLayer={false} />\r\n </Document>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default PrintingPreview\r\n"],"names":[],"version":3,"file":"PrintingPreview.375e62b0.js.map"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,6BAA6B;AAC7B,CAAA,GAAA,qBAAI,EAAE,mBAAmB,CAAC,SAAS,GAAG;AAOtC,MAAM,wCAAkB,CAAC,OAAE,GAAG,mBAAE,eAAe,EAAwB;IACrE,MAAM,WAAW,CAAA,GAAA,6BAAU;IAC3B,MAAM,cAAc,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAC7F,MAAM,mBAAmB,OAAO,OAAO,CAAC,iBAAiB;IACzD,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,qBAAO,EAAW;IAC9D,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAU;IAC3D,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,qBAAO,EAAU;IAErD,MAAM,wBAAwB,CAAC,YAAE,QAAQ,EAAwB;QAC/D,iBAAiB;QACjB,kBAAkB;IACpB;IAEA,MAAM,cAAc;QAClB,6BAAA,uCAAA,iBAAmB;QACnB;IACF;IAEA,MAAM,cAAc;QAClB,SAAS,CAAA,GAAA,mBAAW,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACxD;IAEA,MAAM,aAAa,CAAC;QAClB,cAAc,CAAC,UAAY,UAAU;IACvC;IAEA,qBACE,iCAAC;QACC,WAAU;QACV,OAAO;YACL,YAAY,iBAAiB,YAAY;QAC3C;;0BAGA,iCAAC;gBAAI,WAAU;;oBACZ,gCACC,iCAAC;wBAAO,WAAU;wBAAsJ,SAAS;;0CAC/K,gCAAC,CAAA,GAAA,gBAAQ;4BACR,YAAY,MAAM,CAAC,KAAK;;uCAG3B,gCAAC;kCAAK;;kCAER,gCAAC;wBAAO,WAAU;wBAAgH,SAAS;kCACzI,cAAA,gCAAC,CAAA,GAAA,gBAAQ;;;;0BAKb,iCAAC;gBAAI,WAAU;;oBAEZ,gBAAgB,mBACf,iCAAC;wBAAI,WAAU;;0CACb,gCAAC;gCAAO,WAAW,GAAG,cAAc,IAAI,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CACjG,cAAA,gCAAC,CAAA,GAAA,sBAAc;oCAAE,WAAU;oCAAS,OAAM;;;0CAE5C,iCAAC;gCAAE,WAAU;;oCACV;oCAAW;oCAAI;;;0CAElB,gCAAC;gCAAO,WAAW,GAAG,cAAc,gBAAgB,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CAC7G,cAAA,gCAAC,CAAA,GAAA,uBAAe;oCAAE,WAAU;oCAAS,OAAM;;;;;kCAMjD,gCAAC,CAAA,GAAA,wBAAO;wBAAE,MAAM;wBAAK,eAAe;wBAAuB,aAAa;kCACtE,cAAA,gCAAC,CAAA,GAAA,oBAAG;4BAAE,YAAY;4BAAY,uBAAuB;4BAAO,iBAAiB;;;;;;;AAKvF;IAEA,2CAAe","sources":["src/components/Attachments/PrintingPreview.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { pdfjs, Document, Page } from 'react-pdf'\r\nimport * as pdfJsWorker from 'pdfjs-dist/build/pdf.worker.js'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport { PrintIcon } from '../Icons/DetailedPOIIcons'\r\nimport { CloseIcon } from '../Icons/Miscellaneous'\r\nimport { ChevronLeftIcon, ChevronRightIcon } from '../Icons/ChevronIcons'\r\n\r\n// Configure react-pdf worker\r\npdfjs.GlobalWorkerOptions.workerSrc = pdfJsWorker\r\n\r\ninterface PrintingPreviewProps {\r\n url: string\r\n printingAllowed?: boolean\r\n}\r\n\r\nconst PrintingPreview = ({ url, printingAllowed }: PrintingPreviewProps): JSX.Element => {\r\n const dispatch = useDispatch()\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const printingCallback = window.Retorik._printingCallback\r\n const [documentLoaded, setDocumentLoaded] = useState<boolean>(false)\r\n const [numberOfPages, setNumberOfPages] = useState<number>(0)\r\n const [pageNumber, setPageNumber] = useState<number>(1)\r\n\r\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {\r\n setNumberOfPages(numPages)\r\n setDocumentLoaded(true)\r\n }\r\n\r\n const handleClick = (): void => {\r\n printingCallback?.(url)\r\n handleClose()\r\n }\r\n\r\n const handleClose = (): void => {\r\n dispatch(storeActions.utils.setModalFullscreenContent(null))\r\n }\r\n\r\n const changePage = (index: number): void => {\r\n setPageNumber((current) => current + index)\r\n }\r\n\r\n return (\r\n <div\r\n className='rf-h-full large-vertical:rf-mt-[20vh] large-vertical:rf-h-1/2 rf-max-w-1/2 large-vertical:rf-max-w-[60%] rf-py-4 rf-flex rf-flex-col rf-gap-4'\r\n style={{\r\n visibility: documentLoaded ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {/* Upper part */}\r\n <div className='rf-grid rf-grid-cols-printingPreview rf-min-h-12 rf-h-12'>\r\n {printingAllowed ? (\r\n <button className='rf-px-4 rf-py-1 rf-h-full rf-justify-self-center rf-flex rf-flex-row rf-items-center rf-gap-2 rf-font-bold rf-text-sm rf-rounded-lg rf-bg-truewhite' onClick={handleClick}>\r\n <PrintIcon />\r\n {translation.common.print}\r\n </button>\r\n ) : (\r\n <div>{'\\u2800'}</div>\r\n )}\r\n <button className='rf-h-full rf-w-12 rf-justify-self-end rf-flex rf-justify-center rf-items-center rf-rounded-lg rf-bg-truewhite' onClick={handleClose}>\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n {/* Document preview */}\r\n <div className='rf-relative rf-w-full rf-flex rf-flex-col rf-rounded-lg rf-overflow-y-scroll rf-scrollbar-thin'>\r\n {/* Number of pages + navigation between pages */}\r\n {numberOfPages > 1 && (\r\n <div className='rf-w-full rf-px-4 rf-pt-3 rf-pb-2 rf-flex rf-flex-row rf-justify-between rf-items-center rf-bg-truewhite'>\r\n <button className={`${pageNumber <= 1 ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(-1)}>\r\n <ChevronLeftIcon className='rf-h-4' color='#000' />\r\n </button>\r\n <p className='rf-text-xl'>\r\n {pageNumber} / {numberOfPages}\r\n </p>\r\n <button className={`${pageNumber >= numberOfPages ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(1)}>\r\n <ChevronRightIcon className='rf-h-4' color='#000' />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Pdf preview */}\r\n <Document file={url} onLoadSuccess={onDocumentLoadSuccess} onLoadError={handleClose}>\r\n <Page pageNumber={pageNumber} renderAnnotationLayer={false} renderTextLayer={false} />\r\n </Document>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default PrintingPreview\r\n"],"names":[],"version":3,"file":"PrintingPreview.c0ca7706.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,6BAA6B;AAC7B,CAAA,GAAA,qBAAI,EAAE,mBAAmB,CAAC,SAAS,GAAG;AAOtC,MAAM,wCAAkB,CAAC,OAAE,GAAG,mBAAE,eAAe,EAAwB;IACrE,MAAM,WAAW,CAAA,GAAA,6BAAU;IAC3B,MAAM,cAAc,CAAA,GAAA,6BAAU,EAAE,CAAC,QAAqB,MAAM,aAAa,CAAC,mBAAmB;IAC7F,MAAM,mBAAmB,OAAO,OAAO,CAAC,iBAAiB;IACzD,MAAM,CAAC,gBAAgB,kBAAkB,GAAG,CAAA,GAAA,qBAAO,EAAW;IAC9D,MAAM,CAAC,eAAe,iBAAiB,GAAG,CAAA,GAAA,qBAAO,EAAU;IAC3D,MAAM,CAAC,YAAY,cAAc,GAAG,CAAA,GAAA,qBAAO,EAAU;IAErD,MAAM,wBAAwB,CAAC,YAAE,QAAQ,EAAwB;QAC/D,iBAAiB;QACjB,kBAAkB;IACpB;IAEA,MAAM,cAAc;QAClB,6BAAA,uCAAA,iBAAmB;QACnB;IACF;IAEA,MAAM,cAAc;QAClB,SAAS,CAAA,GAAA,mBAAW,EAAE,KAAK,CAAC,yBAAyB,CAAC;IACxD;IAEA,MAAM,aAAa,CAAC;QAClB,cAAc,CAAC,UAAY,UAAU;IACvC;IAEA,qBACE,iCAAC;QACC,WAAU;QACV,OAAO;YACL,YAAY,iBAAiB,YAAY;QAC3C;;0BAGA,iCAAC;gBAAI,WAAU;;oBACZ,gCACC,iCAAC;wBAAO,WAAU;wBAAsJ,SAAS;;0CAC/K,gCAAC,CAAA,GAAA,gBAAQ;4BACR,YAAY,MAAM,CAAC,KAAK;;uCAG3B,gCAAC;kCAAK;;kCAER,gCAAC;wBAAO,WAAU;wBAAgH,SAAS;kCACzI,cAAA,gCAAC,CAAA,GAAA,gBAAQ;;;;0BAKb,iCAAC;gBAAI,WAAU;;oBAEZ,gBAAgB,mBACf,iCAAC;wBAAI,WAAU;;0CACb,gCAAC;gCAAO,WAAW,GAAG,cAAc,IAAI,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CACjG,cAAA,gCAAC,CAAA,GAAA,sBAAc;oCAAE,WAAU;oCAAS,OAAM;;;0CAE5C,iCAAC;gCAAE,WAAU;;oCACV;oCAAW;oCAAI;;;0CAElB,gCAAC;gCAAO,WAAW,GAAG,cAAc,gBAAgB,iBAAiB,cAAc;gCAAE,SAAS,IAAM,WAAW;0CAC7G,cAAA,gCAAC,CAAA,GAAA,uBAAe;oCAAE,WAAU;oCAAS,OAAM;;;;;kCAMjD,gCAAC,CAAA,GAAA,wBAAO;wBAAE,MAAM;wBAAK,eAAe;wBAAuB,aAAa;kCACtE,cAAA,gCAAC,CAAA,GAAA,oBAAG;4BAAE,YAAY;4BAAY,uBAAuB;4BAAO,iBAAiB;;;;;;;AAKvF;IAEA,2CAAe","sources":["src/components/Attachments/PrintingPreview.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { pdfjs, Document, Page } from 'react-pdf'\r\nimport * as pdfJsWorker from 'pdfjs-dist/build/pdf.worker.js'\r\nimport { useSelector, useDispatch } from 'react-redux'\r\nimport { RootState, storeActions } from '../../store'\r\nimport { PrintIcon } from '../Icons/DetailedPOIIcons'\r\nimport { CloseIcon } from '../Icons/Miscellaneous'\r\nimport { ChevronLeftIcon, ChevronRightIcon } from '../Icons/ChevronIcons'\r\n\r\n// Configure react-pdf worker\r\npdfjs.GlobalWorkerOptions.workerSrc = pdfJsWorker\r\n\r\ninterface PrintingPreviewProps {\r\n url: string\r\n printingAllowed?: boolean\r\n}\r\n\r\nconst PrintingPreview = ({ url, printingAllowed }: PrintingPreviewProps): React.JSX.Element => {\r\n const dispatch = useDispatch()\r\n const translation = useSelector((state: RootState) => state.localeReducer.currentTranslations)\r\n const printingCallback = window.Retorik._printingCallback\r\n const [documentLoaded, setDocumentLoaded] = useState<boolean>(false)\r\n const [numberOfPages, setNumberOfPages] = useState<number>(0)\r\n const [pageNumber, setPageNumber] = useState<number>(1)\r\n\r\n const onDocumentLoadSuccess = ({ numPages }: { numPages: number }): void => {\r\n setNumberOfPages(numPages)\r\n setDocumentLoaded(true)\r\n }\r\n\r\n const handleClick = (): void => {\r\n printingCallback?.(url)\r\n handleClose()\r\n }\r\n\r\n const handleClose = (): void => {\r\n dispatch(storeActions.utils.setModalFullscreenContent(null))\r\n }\r\n\r\n const changePage = (index: number): void => {\r\n setPageNumber((current) => current + index)\r\n }\r\n\r\n return (\r\n <div\r\n className='rf-h-full large-vertical:rf-mt-[20vh] large-vertical:rf-h-1/2 rf-max-w-1/2 large-vertical:rf-max-w-[60%] rf-py-4 rf-flex rf-flex-col rf-gap-4'\r\n style={{\r\n visibility: documentLoaded ? 'visible' : 'hidden'\r\n }}\r\n >\r\n {/* Upper part */}\r\n <div className='rf-grid rf-grid-cols-printingPreview rf-min-h-12 rf-h-12'>\r\n {printingAllowed ? (\r\n <button className='rf-px-4 rf-py-1 rf-h-full rf-justify-self-center rf-flex rf-flex-row rf-items-center rf-gap-2 rf-font-bold rf-text-sm rf-rounded-lg rf-bg-truewhite' onClick={handleClick}>\r\n <PrintIcon />\r\n {translation.common.print}\r\n </button>\r\n ) : (\r\n <div>{'\\u2800'}</div>\r\n )}\r\n <button className='rf-h-full rf-w-12 rf-justify-self-end rf-flex rf-justify-center rf-items-center rf-rounded-lg rf-bg-truewhite' onClick={handleClose}>\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n {/* Document preview */}\r\n <div className='rf-relative rf-w-full rf-flex rf-flex-col rf-rounded-lg rf-overflow-y-scroll rf-scrollbar-thin'>\r\n {/* Number of pages + navigation between pages */}\r\n {numberOfPages > 1 && (\r\n <div className='rf-w-full rf-px-4 rf-pt-3 rf-pb-2 rf-flex rf-flex-row rf-justify-between rf-items-center rf-bg-truewhite'>\r\n <button className={`${pageNumber <= 1 ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(-1)}>\r\n <ChevronLeftIcon className='rf-h-4' color='#000' />\r\n </button>\r\n <p className='rf-text-xl'>\r\n {pageNumber} / {numberOfPages}\r\n </p>\r\n <button className={`${pageNumber >= numberOfPages ? 'rf-invisible' : 'rf-visible'}`} onClick={() => changePage(1)}>\r\n <ChevronRightIcon className='rf-h-4' color='#000' />\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* Pdf preview */}\r\n <Document file={url} onLoadSuccess={onDocumentLoadSuccess} onLoadError={handleClose}>\r\n <Page pageNumber={pageNumber} renderAnnotationLayer={false} renderTextLayer={false} />\r\n </Document>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default PrintingPreview\r\n"],"names":[],"version":3,"file":"PrintingPreview.c0ca7706.js.map","sourceRoot":"../"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import {jsx as $asYsR$jsx} from "react/jsx-runtime";
|
|
2
|
+
import $asYsR$react, {useState as $asYsR$useState, useRef as $asYsR$useRef, useEffect as $asYsR$useEffect} from "react";
|
|
3
|
+
import {createSpeechRecognitionPonyfill as $asYsR$createSpeechRecognitionPonyfill, SpeechGrammarList as $asYsR$SpeechGrammarList} from "@davi-ai/web-speech-cognitive-services-davi";
|
|
4
|
+
import {useDispatch as $asYsR$useDispatch, useSelector as $asYsR$useSelector} from "react-redux";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
function $parcel$defineInteropFlag(a) {
|
|
8
|
+
Object.defineProperty(a, '__esModule', {value: true, configurable: true});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function $parcel$export(e, n, v, s) {
|
|
12
|
+
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
var $parcel$global = globalThis;
|
|
16
|
+
var parcelRequire = $parcel$global["parcelRequirea39d"];
|
|
17
|
+
var parcelRegister = parcelRequire.register;
|
|
18
|
+
parcelRegister("kzWGI", function(module, exports) {
|
|
19
|
+
|
|
20
|
+
$parcel$defineInteropFlag(module.exports);
|
|
21
|
+
|
|
22
|
+
$parcel$export(module.exports, "default", () => $e5415612407dd579$export$2e2bcd8739ae039);
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
var $8ItUL = parcelRequire("8ItUL");
|
|
29
|
+
|
|
30
|
+
var $cW5Dh = parcelRequire("cW5Dh");
|
|
31
|
+
const $e5415612407dd579$var$timeoutDuration = 1000;
|
|
32
|
+
const $e5415612407dd579$var$RecognitionManager = ()=>{
|
|
33
|
+
const dispatch = (0, $asYsR$useDispatch)();
|
|
34
|
+
const locale = (0, $asYsR$useSelector)((state)=>state.localeReducer.locale);
|
|
35
|
+
const mode = (0, $asYsR$useSelector)((state)=>state.speechReducer.mode);
|
|
36
|
+
const appAvailable = (0, $asYsR$useSelector)((state)=>state.retorikReducer.appAvailable);
|
|
37
|
+
const loaderClosed = (0, $asYsR$useSelector)((state)=>state.retorikReducer.loaderClosed);
|
|
38
|
+
const agentData = (0, $asYsR$useSelector)((state)=>state.retorikReducer.agentData);
|
|
39
|
+
const delay = (0, $asYsR$useSelector)((state)=>state.retorikReducer.submitDelayBeforeSendingMessage);
|
|
40
|
+
const speechRecognitionOptions = (0, $asYsR$useSelector)((state)=>state.retorikReducer.configuration.speechRecognitionOptions);
|
|
41
|
+
const ponyfillCredentials = (0, $asYsR$useSelector)((state)=>state.speechReducer.ponyfillCredentials);
|
|
42
|
+
const useContinuousRecognition = (0, $asYsR$useSelector)((state)=>state.speechReducer.useContinuousRecognition);
|
|
43
|
+
const activeRecognitionState = (0, $asYsR$useSelector)((state)=>state.speechReducer.activeRecognitionState);
|
|
44
|
+
const lastRecognitionInterim = (0, $asYsR$useSelector)((state)=>state.speechReducer.lastRecognitionInterim);
|
|
45
|
+
const speechRecognitionDynamicGrammars = (0, $asYsR$useSelector)((state)=>state.speechReducer.speechRecognitionDynamicGrammars);
|
|
46
|
+
const route = (0, $asYsR$useSelector)((state)=>state.viewReducer.route);
|
|
47
|
+
const [ponyfill, setPonyfill] = (0, $asYsR$useState)(null);
|
|
48
|
+
const [recognitionAllowed, setRecognitionAllowed] = (0, $asYsR$useState)(false);
|
|
49
|
+
const [ponyfillReady, setPonyfillReady] = (0, $asYsR$useState)(false);
|
|
50
|
+
const activeModeRef = (0, $asYsR$useRef)(undefined);
|
|
51
|
+
const timerRef = (0, $asYsR$useRef)(null);
|
|
52
|
+
const localeRef = (0, $asYsR$useRef)(undefined);
|
|
53
|
+
const getCommonAndLocalizedWakeWords = (currentLocale, agentName)=>{
|
|
54
|
+
let commonAndlocalizedWakeWords = [];
|
|
55
|
+
if (speechRecognitionOptions?.wakeWords) {
|
|
56
|
+
if (speechRecognitionOptions.wakeWords.common) commonAndlocalizedWakeWords = [
|
|
57
|
+
...speechRecognitionOptions.wakeWords.common
|
|
58
|
+
];
|
|
59
|
+
if (speechRecognitionOptions.wakeWords.localized) {
|
|
60
|
+
const localizedWakeWords = speechRecognitionOptions.wakeWords.localized[currentLocale] || [];
|
|
61
|
+
localizedWakeWords.length && (commonAndlocalizedWakeWords = [
|
|
62
|
+
...commonAndlocalizedWakeWords,
|
|
63
|
+
...localizedWakeWords
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Add agent's name to wake words
|
|
68
|
+
agentName && (commonAndlocalizedWakeWords = [
|
|
69
|
+
...commonAndlocalizedWakeWords,
|
|
70
|
+
agentName
|
|
71
|
+
]);
|
|
72
|
+
return commonAndlocalizedWakeWords;
|
|
73
|
+
};
|
|
74
|
+
const getCommonAndLocalizedGrammars = (currentLocale)=>{
|
|
75
|
+
let commonAndlocalizedGrammars = [];
|
|
76
|
+
if (speechRecognitionOptions?.grammars) {
|
|
77
|
+
if (speechRecognitionOptions.grammars.common) commonAndlocalizedGrammars = [
|
|
78
|
+
...speechRecognitionOptions.grammars.common
|
|
79
|
+
];
|
|
80
|
+
if (speechRecognitionOptions.grammars.localized) {
|
|
81
|
+
const localizedGrammars = speechRecognitionOptions.grammars.localized[currentLocale] || [];
|
|
82
|
+
localizedGrammars.length && (commonAndlocalizedGrammars = [
|
|
83
|
+
...commonAndlocalizedGrammars,
|
|
84
|
+
...localizedGrammars
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return commonAndlocalizedGrammars;
|
|
89
|
+
};
|
|
90
|
+
const askPermission = ()=>{
|
|
91
|
+
if (recognitionAllowed) ponyfill?.speechRecognition.start();
|
|
92
|
+
else (0, $cW5Dh.default)().then((permission)=>{
|
|
93
|
+
setRecognitionAllowed(permission === (0, $8ItUL.PermissionStatus).allowed);
|
|
94
|
+
}).catch(console.log);
|
|
95
|
+
};
|
|
96
|
+
(0, $asYsR$useEffect)(()=>{
|
|
97
|
+
// Clear data on component unmount
|
|
98
|
+
return ()=>{
|
|
99
|
+
timerRef?.current && clearTimeout(timerRef.current);
|
|
100
|
+
ponyfill?.speechRecognition?.abort?.();
|
|
101
|
+
};
|
|
102
|
+
}, []);
|
|
103
|
+
(0, $asYsR$useEffect)(()=>{
|
|
104
|
+
recognitionAllowed && useContinuousRecognition && ponyfill?.speechRecognition.start();
|
|
105
|
+
}, [
|
|
106
|
+
recognitionAllowed
|
|
107
|
+
]);
|
|
108
|
+
(0, $asYsR$useEffect)(()=>{
|
|
109
|
+
if (ponyfillCredentials && locale && agentData) {
|
|
110
|
+
let currentPonyfill = ponyfill;
|
|
111
|
+
if (locale !== localeRef.current) {
|
|
112
|
+
localeRef.current = locale;
|
|
113
|
+
// We create the ponyfill if it isn't created yet. We recreate a new one if we are using custom endpoints for speech recognition.
|
|
114
|
+
if (!ponyfill || ponyfillCredentials?.speechRecognitionHostnamesRecord) {
|
|
115
|
+
// Check if we need to use a custom endpoint from speechRecognitionHostnamesRecord
|
|
116
|
+
const speechRecognitionHostname = ponyfillCredentials?.speechRecognitionHostnamesRecord ? ponyfillCredentials.speechRecognitionHostnamesRecord[locale] || Object.values(ponyfillCredentials.speechRecognitionHostnamesRecord)[0] : undefined;
|
|
117
|
+
const options = {
|
|
118
|
+
autoStart: false,
|
|
119
|
+
continuous: useContinuousRecognition,
|
|
120
|
+
interimResults: true,
|
|
121
|
+
grammarsList: getCommonAndLocalizedGrammars(locale),
|
|
122
|
+
lang: locale,
|
|
123
|
+
passive: useContinuousRecognition,
|
|
124
|
+
wakeWords: getCommonAndLocalizedWakeWords(locale),
|
|
125
|
+
debug: false,
|
|
126
|
+
timerBeforeSpeechEnd: speechRecognitionOptions?.timerBeforeSpeechEnd
|
|
127
|
+
};
|
|
128
|
+
const processedCredentials = {
|
|
129
|
+
credentials: speechRecognitionHostname ? {
|
|
130
|
+
region: undefined,
|
|
131
|
+
subscriptionKey: ponyfillCredentials.subscriptionKey || 'mandatory_subscription_key',
|
|
132
|
+
speechRecognitionHostname: speechRecognitionHostname,
|
|
133
|
+
speechSynthesisHostname: 'mandatory_synthesis_host_name'
|
|
134
|
+
} : {
|
|
135
|
+
region: ponyfillCredentials.region,
|
|
136
|
+
subscriptionKey: ponyfillCredentials.subscriptionKey,
|
|
137
|
+
authorizationToken: ponyfillCredentials.authorizationToken
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
// Abort current recognition before setting the new recognition ponyfill if there is a need to
|
|
141
|
+
currentPonyfill?.speechRecognition?.abort?.();
|
|
142
|
+
currentPonyfill = (0, $asYsR$createSpeechRecognitionPonyfill)(processedCredentials, options);
|
|
143
|
+
} else if (currentPonyfill) {
|
|
144
|
+
// Set wakeworkds
|
|
145
|
+
currentPonyfill.speechRecognition.wakeWords = getCommonAndLocalizedWakeWords(locale, agentData?.name);
|
|
146
|
+
// Set language
|
|
147
|
+
activeRecognitionState === (0, $8ItUL.RecognitionState).Listening ? currentPonyfill?.speechRecognition.changeLanguage(locale) : currentPonyfill.speechRecognition.lang = locale;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (currentPonyfill) {
|
|
151
|
+
// Set grammar list
|
|
152
|
+
const grammarList = new (0, $asYsR$SpeechGrammarList)();
|
|
153
|
+
grammarList.phrases = getCommonAndLocalizedGrammars(locale);
|
|
154
|
+
if (speechRecognitionDynamicGrammars.length) speechRecognitionDynamicGrammars.forEach((grammar)=>{
|
|
155
|
+
!grammarList.phrases.includes(grammar) && grammarList.phrases.push(grammar);
|
|
156
|
+
});
|
|
157
|
+
if (agentData?.name) {
|
|
158
|
+
// Add raw name
|
|
159
|
+
!grammarList.phrases.includes(agentData.name) && grammarList.phrases.push(agentData.name);
|
|
160
|
+
// Add lower-cased name
|
|
161
|
+
!grammarList.phrases.includes(agentData.name.toLocaleLowerCase(locale)) && grammarList.phrases.push(agentData.name.toLocaleLowerCase(locale));
|
|
162
|
+
}
|
|
163
|
+
currentPonyfill.speechRecognition.grammars = grammarList;
|
|
164
|
+
setPonyfill(currentPonyfill);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}, [
|
|
168
|
+
ponyfillCredentials,
|
|
169
|
+
locale,
|
|
170
|
+
speechRecognitionDynamicGrammars,
|
|
171
|
+
agentData
|
|
172
|
+
]);
|
|
173
|
+
/**
|
|
174
|
+
* Abort recognition if we are not on the 'home' page
|
|
175
|
+
*/ (0, $asYsR$useEffect)(()=>{
|
|
176
|
+
route !== (0, $8ItUL.Routes).Home && dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closed));
|
|
177
|
+
}, [
|
|
178
|
+
route
|
|
179
|
+
]);
|
|
180
|
+
(0, $asYsR$useEffect)(()=>{
|
|
181
|
+
if (ponyfill && appAvailable && loaderClosed) {
|
|
182
|
+
if (ponyfill.speechRecognition) {
|
|
183
|
+
ponyfill.speechRecognition.onstart = ()=>{
|
|
184
|
+
dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Listening));
|
|
185
|
+
};
|
|
186
|
+
// onend callback is called only whithout using passive speech recognition
|
|
187
|
+
ponyfill.speechRecognition.onend = ()=>{
|
|
188
|
+
activeModeRef.current !== (0, $8ItUL.RecognitionState).Closed && dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closing));
|
|
189
|
+
};
|
|
190
|
+
ponyfill.speechRecognition.onabort = ()=>{
|
|
191
|
+
dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closed));
|
|
192
|
+
};
|
|
193
|
+
ponyfill.speechRecognition.onwakeup = ()=>{
|
|
194
|
+
if (activeModeRef.current === (0, $8ItUL.RecognitionState).Closed) {
|
|
195
|
+
console.log('Retorik Framework > wake word found, trying to open microphone');
|
|
196
|
+
activeModeRef.current === (0, $8ItUL.RecognitionState).Closed && dispatch((0, $8ItUL.storeActions).speech.toggleMicrophone(false));
|
|
197
|
+
} else console.log('Retorik Framework > wake word found, but microphone not ready');
|
|
198
|
+
};
|
|
199
|
+
ponyfill.speechRecognition.onresult = (result)=>{
|
|
200
|
+
const lastMessage = result.length ? result[result.length - 1].transcript : null;
|
|
201
|
+
// Only get result in Active mode
|
|
202
|
+
if (lastMessage && activeModeRef.current === (0, $8ItUL.RecognitionState).Listening) dispatch((0, $8ItUL.storeActions).speech.setLastRecognitionInterim(lastMessage));
|
|
203
|
+
};
|
|
204
|
+
setPonyfillReady(true);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}, [
|
|
208
|
+
ponyfill,
|
|
209
|
+
appAvailable,
|
|
210
|
+
loaderClosed
|
|
211
|
+
]);
|
|
212
|
+
(0, $asYsR$useEffect)(()=>{
|
|
213
|
+
if (ponyfillReady && mode === (0, $8ItUL.Mode).vocal) // Start passive recognition if not done yet
|
|
214
|
+
useContinuousRecognition && !ponyfill?.speechRecognition.started && askPermission();
|
|
215
|
+
}, [
|
|
216
|
+
mode,
|
|
217
|
+
ponyfillReady
|
|
218
|
+
]);
|
|
219
|
+
const togglePassiveToActive = ()=>{
|
|
220
|
+
if (ponyfill?.speechRecognition.started) ponyfill.speechRecognition.toggleContinuousPassiveToActive();
|
|
221
|
+
else if (ponyfill) {
|
|
222
|
+
ponyfill.speechRecognition.passive = false;
|
|
223
|
+
ponyfill.speechRecognition.continuous = false;
|
|
224
|
+
ponyfill.speechRecognition.start();
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
(0, $asYsR$useEffect)(()=>{
|
|
228
|
+
activeModeRef.current = activeRecognitionState;
|
|
229
|
+
if (ponyfill?.speechRecognition && appAvailable && loaderClosed) {
|
|
230
|
+
timerRef?.current && clearTimeout(timerRef.current);
|
|
231
|
+
switch(activeRecognitionState){
|
|
232
|
+
// Do nothing if we are in a transition state
|
|
233
|
+
case (0, $8ItUL.RecognitionState).Initializing:
|
|
234
|
+
useContinuousRecognition ? togglePassiveToActive() : ponyfill.speechRecognition.start();
|
|
235
|
+
break;
|
|
236
|
+
case (0, $8ItUL.RecognitionState).Listening:
|
|
237
|
+
break;
|
|
238
|
+
case (0, $8ItUL.RecognitionState).Closing:
|
|
239
|
+
if (lastRecognitionInterim) {
|
|
240
|
+
if (!delay) timerRef.current = setTimeout(()=>{
|
|
241
|
+
dispatch((0, $8ItUL.storeActions).directline.sendMessage({
|
|
242
|
+
text: lastRecognitionInterim
|
|
243
|
+
}));
|
|
244
|
+
dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closed));
|
|
245
|
+
}, $e5415612407dd579$var$timeoutDuration);
|
|
246
|
+
} else dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closed));
|
|
247
|
+
break;
|
|
248
|
+
case (0, $8ItUL.RecognitionState).ForceClosing:
|
|
249
|
+
dispatch((0, $8ItUL.storeActions).speech.setLastRecognitionInterim(''));
|
|
250
|
+
// Let's abort the current recognition
|
|
251
|
+
ponyfill.speechRecognition.started ? ponyfill.speechRecognition.abort?.() : dispatch((0, $8ItUL.storeActions).speech.setActiveRecognitionState((0, $8ItUL.RecognitionState).Closed));
|
|
252
|
+
break;
|
|
253
|
+
case (0, $8ItUL.RecognitionState).Closed:
|
|
254
|
+
if (useContinuousRecognition && mode === (0, $8ItUL.Mode).vocal) timerRef.current = setTimeout(()=>{
|
|
255
|
+
ponyfill.speechRecognition.toggleContinuousActiveToPassive();
|
|
256
|
+
}, $e5415612407dd579$var$timeoutDuration);
|
|
257
|
+
dispatch((0, $8ItUL.storeActions).speech.setLastRecognitionInterim(''));
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}, [
|
|
262
|
+
activeRecognitionState
|
|
263
|
+
]);
|
|
264
|
+
return /*#__PURE__*/ (0, $asYsR$jsx)((0, $asYsR$react).Fragment, {});
|
|
265
|
+
};
|
|
266
|
+
var $e5415612407dd579$export$2e2bcd8739ae039 = $e5415612407dd579$var$RecognitionManager;
|
|
267
|
+
|
|
268
|
+
});
|
|
269
|
+
parcelRegister("cW5Dh", function(module, exports) {
|
|
270
|
+
|
|
271
|
+
$parcel$export(module.exports, "default", () => $1c5c9ed09d1921fe$export$2e2bcd8739ae039);
|
|
272
|
+
|
|
273
|
+
var $8ItUL = parcelRequire("8ItUL");
|
|
274
|
+
const $1c5c9ed09d1921fe$var$getMicrophonePermission = async ()=>{
|
|
275
|
+
try {
|
|
276
|
+
return navigator.mediaDevices.getUserMedia({
|
|
277
|
+
audio: true
|
|
278
|
+
}).then((stream)=>{
|
|
279
|
+
return stream ? (0, $8ItUL.PermissionStatus).allowed : (0, $8ItUL.PermissionStatus).refused;
|
|
280
|
+
}, (reason)=>{
|
|
281
|
+
console.log('Retorik Framework > microphone permission refused : ', reason);
|
|
282
|
+
return (0, $8ItUL.PermissionStatus).refused;
|
|
283
|
+
}).catch((error)=>{
|
|
284
|
+
console.log('Retorik Framework > microphone permission refused : ', error);
|
|
285
|
+
return (0, $8ItUL.PermissionStatus).error;
|
|
286
|
+
});
|
|
287
|
+
} catch (error) {
|
|
288
|
+
console.log('Retorik Framework > microphone permission refused : ', error);
|
|
289
|
+
return (0, $8ItUL.PermissionStatus).error;
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
var $1c5c9ed09d1921fe$export$2e2bcd8739ae039 = $1c5c9ed09d1921fe$var$getMicrophonePermission;
|
|
293
|
+
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=RecognitionManager.c58b8a3d.js.map
|