@davi-ai/retorik-framework 3.2.5 → 4.0.0

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.
Files changed (88) hide show
  1. package/dist/{AttachmentDetail.0a576bf3.js → AttachmentDetail.37a709af.js} +160 -174
  2. package/dist/AttachmentDetail.37a709af.js.map +1 -0
  3. package/dist/{AttachmentDetail.c4286a45.js → AttachmentDetail.53ba969a.js} +159 -173
  4. package/dist/AttachmentDetail.53ba969a.js.map +1 -0
  5. package/dist/{CustomView.913a9f32.js → CustomView.9930c671.js} +16 -20
  6. package/dist/CustomView.9930c671.js.map +1 -0
  7. package/dist/{CustomView.edf84de1.js → CustomView.bf84bdf3.js} +16 -20
  8. package/dist/CustomView.bf84bdf3.js.map +1 -0
  9. package/dist/{Emergency.0cf005ce.js → Emergency.1e63c85f.js} +38 -30
  10. package/dist/Emergency.1e63c85f.js.map +1 -0
  11. package/dist/{Emergency.897ee3c7.js → Emergency.89b4d9ed.js} +37 -29
  12. package/dist/Emergency.89b4d9ed.js.map +1 -0
  13. package/dist/{FullScreenImage.9a9b978e.js → FullScreenImage.17df27bf.js} +11 -18
  14. package/dist/FullScreenImage.17df27bf.js.map +1 -0
  15. package/dist/{FullScreenImage.1fe27198.js → FullScreenImage.99e19e10.js} +11 -18
  16. package/dist/FullScreenImage.99e19e10.js.map +1 -0
  17. package/dist/{HistoryList.4c303dc6.js → HistoryList.3b4b1ffb.js} +35 -36
  18. package/dist/HistoryList.3b4b1ffb.js.map +1 -0
  19. package/dist/{HistoryList.03a56119.js → HistoryList.e5c01f21.js} +35 -36
  20. package/dist/HistoryList.e5c01f21.js.map +1 -0
  21. package/dist/LanguageChoice.1d866cfa.js +119 -0
  22. package/dist/LanguageChoice.1d866cfa.js.map +1 -0
  23. package/dist/LanguageChoice.cce361a3.js +128 -0
  24. package/dist/LanguageChoice.cce361a3.js.map +1 -0
  25. package/dist/{LittleWeatherContainer.07937cf3.js → LittleWeatherContainer.7e41105e.js} +3 -3
  26. package/dist/LittleWeatherContainer.7e41105e.js.map +1 -0
  27. package/dist/{LittleWeatherContainer.d27a6b8a.js → LittleWeatherContainer.ee087e22.js} +3 -3
  28. package/dist/LittleWeatherContainer.ee087e22.js.map +1 -0
  29. package/dist/MapContainer.14c28128.js +117 -0
  30. package/dist/MapContainer.14c28128.js.map +1 -0
  31. package/dist/MapContainer.f22ad81f.js +104 -0
  32. package/dist/MapContainer.f22ad81f.js.map +1 -0
  33. package/dist/{NewsContainer.a91d9131.js → NewsContainer.c0a24775.js} +84 -88
  34. package/dist/NewsContainer.c0a24775.js.map +1 -0
  35. package/dist/{NewsContainer.f0d2ee9c.js → NewsContainer.c3331d80.js} +79 -83
  36. package/dist/NewsContainer.c3331d80.js.map +1 -0
  37. package/dist/PrintingPreview.5351c733.js +147 -0
  38. package/dist/PrintingPreview.5351c733.js.map +1 -0
  39. package/dist/PrintingPreview.6d70355b.js +138 -0
  40. package/dist/PrintingPreview.6d70355b.js.map +1 -0
  41. package/dist/{SpiritEngineWrapper.1d8db53d.js → SpiritEngineWrapper.21ea10d4.js} +8 -7
  42. package/dist/SpiritEngineWrapper.21ea10d4.js.map +1 -0
  43. package/dist/{SpiritEngineWrapper.27e9c120.js → SpiritEngineWrapper.39627300.js} +8 -7
  44. package/dist/SpiritEngineWrapper.39627300.js.map +1 -0
  45. package/dist/{ThreeJsWrapper.09c689b8.js → ThreeJsWrapper.8f15a85b.js} +13 -16
  46. package/dist/ThreeJsWrapper.8f15a85b.js.map +1 -0
  47. package/dist/{ThreeJsWrapper.7918143f.js → ThreeJsWrapper.a46ee0e9.js} +13 -16
  48. package/dist/ThreeJsWrapper.a46ee0e9.js.map +1 -0
  49. package/dist/VeilleManager.443b366e.js +569 -0
  50. package/dist/VeilleManager.443b366e.js.map +1 -0
  51. package/dist/VeilleManager.d8bde1ee.js +550 -0
  52. package/dist/VeilleManager.d8bde1ee.js.map +1 -0
  53. package/dist/{Weather.99917b66.js → Weather.bb414852.js} +73 -117
  54. package/dist/Weather.bb414852.js.map +1 -0
  55. package/dist/{Weather.cf58823d.js → Weather.ced9b467.js} +70 -115
  56. package/dist/Weather.ced9b467.js.map +1 -0
  57. package/dist/index.d.ts +401 -366
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +47604 -19604
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.modern.js +43539 -15580
  62. package/dist/index.modern.js.map +1 -1
  63. package/package.json +10 -10
  64. package/README.md +0 -6
  65. package/dist/AttachmentDetail.0a576bf3.js.map +0 -1
  66. package/dist/AttachmentDetail.c4286a45.js.map +0 -1
  67. package/dist/CustomView.913a9f32.js.map +0 -1
  68. package/dist/CustomView.edf84de1.js.map +0 -1
  69. package/dist/Emergency.0cf005ce.js.map +0 -1
  70. package/dist/Emergency.897ee3c7.js.map +0 -1
  71. package/dist/FullScreenImage.1fe27198.js.map +0 -1
  72. package/dist/FullScreenImage.9a9b978e.js.map +0 -1
  73. package/dist/HistoryList.03a56119.js.map +0 -1
  74. package/dist/HistoryList.4c303dc6.js.map +0 -1
  75. package/dist/LanguageChoice.623ee802.js +0 -113
  76. package/dist/LanguageChoice.623ee802.js.map +0 -1
  77. package/dist/LanguageChoice.ff0cd04c.js +0 -122
  78. package/dist/LanguageChoice.ff0cd04c.js.map +0 -1
  79. package/dist/LittleWeatherContainer.07937cf3.js.map +0 -1
  80. package/dist/LittleWeatherContainer.d27a6b8a.js.map +0 -1
  81. package/dist/NewsContainer.a91d9131.js.map +0 -1
  82. package/dist/NewsContainer.f0d2ee9c.js.map +0 -1
  83. package/dist/SpiritEngineWrapper.1d8db53d.js.map +0 -1
  84. package/dist/SpiritEngineWrapper.27e9c120.js.map +0 -1
  85. package/dist/ThreeJsWrapper.09c689b8.js.map +0 -1
  86. package/dist/ThreeJsWrapper.7918143f.js.map +0 -1
  87. package/dist/Weather.99917b66.js.map +0 -1
  88. package/dist/Weather.cf58823d.js.map +0 -1
@@ -1,12 +1,9 @@
1
- require("./Weather.99917b66.js");
1
+ require("./Weather.bb414852.js");
2
2
  var $4L16K$reactjsxruntime = require("react/jsx-runtime");
3
3
  var $4L16K$react = require("react");
4
+ var $4L16K$reactredux = require("react-redux");
4
5
 
5
6
 
6
- function $parcel$interopDefault(a) {
7
- return a && a.__esModule ? a.default : a;
8
- }
9
-
10
7
  function $parcel$defineInteropFlag(a) {
11
8
  Object.defineProperty(a, '__esModule', {value: true, configurable: true});
12
9
  }
@@ -15,6 +12,10 @@ function $parcel$export(e, n, v, s) {
15
12
  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
16
13
  }
17
14
 
15
+ function $parcel$interopDefault(a) {
16
+ return a && a.__esModule ? a.default : a;
17
+ }
18
+
18
19
  var $parcel$global =
19
20
  typeof globalThis !== 'undefined'
20
21
  ? globalThis
@@ -35,15 +36,8 @@ $parcel$export(module.exports, "default", () => $39527ef13f22f094$export$2e2bcd8
35
36
 
36
37
 
37
38
 
38
- var $6Q0mk = parcelRequire("6Q0mk");
39
-
40
- var $kUiCn = parcelRequire("kUiCn");
41
39
 
42
- var $jgaO0 = parcelRequire("jgaO0");
43
-
44
- var $6EkQS = parcelRequire("6EkQS");
45
-
46
- var $6QoTL = parcelRequire("6QoTL");
40
+ var $kpW3P = parcelRequire("kpW3P");
47
41
 
48
42
  var $7WHA7 = parcelRequire("7WHA7");
49
43
 
@@ -71,37 +65,52 @@ var $39527ef13f22f094$var$Steps = /*#__PURE__*/ function(Steps) {
71
65
  Steps[Steps["ending"] = 5] = "ending";
72
66
  return Steps;
73
67
  }($39527ef13f22f094$var$Steps || {});
74
- const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews: isRetorikNews, handleEndedWithoutloop: handleEndedWithoutloop })=>{
75
- var _configurations_views_news;
76
- const translation = (0, $6Q0mk.useLocaleStore)((state)=>state.currentTranslations);
77
- const configuration = (0, $6EkQS.useRetorikStore)((state)=>state.configuration);
78
- const muted = (0, $jgaO0.useSpeechStore)((state)=>state.muted);
79
- const isMobile = (0, $kUiCn.useViewStore)((state)=>state.isMobile);
80
- const isLandscape = (0, $kUiCn.useViewStore)((state)=>state.isLandscape);
81
- const isBorne = (0, $kUiCn.useViewStore)((state)=>state.isBorne);
82
- const configurations = (0, $kUiCn.useViewStore)((state)=>state.configurations);
83
- const { setRoute: setRoute, setDisplayControls: setDisplayControls } = (0, $kUiCn.useViewStore)((state)=>state.actions);
84
- const setMuted = (0, $jgaO0.useSpeechStore)((state)=>state.actions.setMuted);
85
- const setDisplayAgentInNews = (0, $6EkQS.useRetorikStore)((state)=>state.actions.setDisplayAgentInNews);
86
- const sendEvent = (0, $6QoTL.useDirectlineStore)((state)=>state.actions.sendEvent);
68
+ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews: isRetorikNews, loop: loop, fromVeille: fromVeille, handleEndedWithoutloop: handleEndedWithoutloop })=>{
69
+ var _configurations_views_news, _configuration_position, _configuration_position1;
70
+ const dispatch = (0, $4L16K$reactredux.useDispatch)();
71
+ const translation = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.currentTranslations);
72
+ const configuration = (0, $4L16K$reactredux.useSelector)((state)=>state.retorikReducer.configuration);
73
+ const displaySubtitles = (0, $4L16K$reactredux.useSelector)((state)=>state.retorikReducer.displaySubtitles);
74
+ const muted = (0, $4L16K$reactredux.useSelector)((state)=>state.speechReducer.muted);
75
+ const isMobile = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.isMobile);
76
+ const isLandscape = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.isLandscape);
77
+ const isBorne = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.isBorne);
78
+ const configurations = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.configurations);
79
+ const conversationId = (0, $4L16K$reactredux.useSelector)((state)=>state.activityReducer.conversationId);
80
+ const storedConversationData = (0, $4L16K$reactredux.useSelector)((state)=>state.directlineReducer.storedVeilleConversationData);
87
81
  const [displayData, setDisplayData] = (0, $4L16K$react.useState)(configurations.views.news || configurations.views.home);
88
82
  const [step, setStep] = (0, $4L16K$react.useState)(((_configurations_views_news = configurations.views.news) === null || _configurations_views_news === void 0 ? void 0 : _configurations_views_news.openingVideo) ? 1 : 2);
89
83
  const timerRef = (0, $4L16K$react.useRef)(null);
90
84
  const newsEndedTimerRef = (0, $4L16K$react.useRef)(null);
85
+ const oldDiplaySubtitles = (0, $4L16K$react.useRef)(displaySubtitles);
91
86
  /**
92
87
  * On call :
93
88
  * - if the component is news-only, return
94
89
  * - else set ViewContext's route state to 'home'
95
90
  */ const handleBack = ()=>{
96
91
  if (isRetorikNews) return;
97
- setRoute((0, $7WHA7.Routes).Home);
92
+ dispatch((0, $kpW3P.storeActions).view.setRoute((0, $7WHA7.Routes).Home));
98
93
  };
99
94
  (0, $4L16K$react.useEffect)(()=>{
100
- configuration.useOldRemote && setDisplayControls(false);
101
- muted && setMuted(false);
95
+ configuration.useOldRemote && dispatch((0, $kpW3P.storeActions).view.setDisplayControls(false));
96
+ // Force muted state to false if we are not in the veille
97
+ muted && !fromVeille && dispatch((0, $kpW3P.storeActions).speech.setMuted(false));
98
+ // Force hiding subtitles if we are in the veille
99
+ fromVeille && dispatch((0, $kpW3P.storeActions).retorik.setDisplaySubtitles(false));
102
100
  return ()=>{
101
+ // If we exit news from the veille, let's store the conversation id for next turn, clear activity store and set back subtitles
102
+ if (fromVeille) {
103
+ !(storedConversationData === null || storedConversationData === void 0 ? void 0 : storedConversationData.id) && conversationId && dispatch((0, $kpW3P.storeActions).directline.setStoredVeilleConversationData(conversationId));
104
+ dispatch((0, $kpW3P.storeActions).activity.resetActivityStore());
105
+ dispatch((0, $kpW3P.storeActions).retorik.setDisplaySubtitles(oldDiplaySubtitles.current));
106
+ }
103
107
  // Send closing events unless we are using RetorikNews component
104
- if (!isRetorikNews) sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowNews', null));
108
+ if (!isRetorikNews) dispatch((0, $kpW3P.storeActions).directline.sendEvent({
109
+ name: 'Davi.CloseWindow',
110
+ callback: ()=>dispatch((0, $kpW3P.storeActions).directline.sendEvent({
111
+ name: 'Davi.CloseWindowNews'
112
+ }))
113
+ }));
105
114
  };
106
115
  }, []);
107
116
  /**
@@ -114,13 +123,13 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
114
123
  case 1:
115
124
  {
116
125
  var _configurations_views_news;
117
- setDisplayAgentInNews(false);
126
+ dispatch((0, $kpW3P.storeActions).retorik.setDisplayAgentInNews(false));
118
127
  const videoUrl = (_configurations_views_news = configurations.views.news) === null || _configurations_views_news === void 0 ? void 0 : _configurations_views_news.openingVideo;
119
- videoUrl ? setViewContextCurrentConfiguration(videoUrl) : setStep(2);
128
+ videoUrl && !fromVeille ? setViewContextCurrentConfiguration(videoUrl) : setStep(2);
120
129
  break;
121
130
  }
122
131
  case 2:
123
- setDisplayAgentInNews(true);
132
+ dispatch((0, $kpW3P.storeActions).retorik.setDisplayAgentInNews(true));
124
133
  setDisplayData(configurations.views.news || configurations.views.home);
125
134
  break;
126
135
  case 3:
@@ -128,7 +137,7 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
128
137
  case 4:
129
138
  var // If the position is known, display the weather page during 10 seconds, otherwise switch to the next step directly
130
139
  _configuration_position, _configuration_position1;
131
- setDisplayAgentInNews(false);
140
+ dispatch((0, $kpW3P.storeActions).retorik.setDisplayAgentInNews(false));
132
141
  ((_configuration_position = configuration.position) === null || _configuration_position === void 0 ? void 0 : _configuration_position.latitude) && ((_configuration_position1 = configuration.position) === null || _configuration_position1 === void 0 ? void 0 : _configuration_position1.longitude) ? timerRef.current = setTimeout(()=>{
133
142
  setStep(5);
134
143
  }, 10000) : setStep(5);
@@ -136,17 +145,17 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
136
145
  case 5:
137
146
  {
138
147
  var _configurations_views_news1;
139
- setDisplayAgentInNews(false);
148
+ dispatch((0, $kpW3P.storeActions).retorik.setDisplayAgentInNews(false));
140
149
  const videoUrl = (_configurations_views_news1 = configurations.views.news) === null || _configurations_views_news1 === void 0 ? void 0 : _configurations_views_news1.openingVideo;
141
- videoUrl ? setViewContextCurrentConfiguration(videoUrl) : exitNewsOrLoop();
150
+ videoUrl && !fromVeille ? setViewContextCurrentConfiguration(videoUrl) : exitNewsOrLoop();
142
151
  break;
143
152
  }
144
153
  default:
145
154
  break;
146
155
  }
147
156
  return ()=>{
148
- timerRef && clearTimeout(timerRef.current);
149
- newsEndedTimerRef && clearTimeout(newsEndedTimerRef.current);
157
+ (timerRef === null || timerRef === void 0 ? void 0 : timerRef.current) && clearTimeout(timerRef.current);
158
+ (newsEndedTimerRef === null || newsEndedTimerRef === void 0 ? void 0 : newsEndedTimerRef.current) && clearTimeout(newsEndedTimerRef.current);
150
159
  };
151
160
  }, [
152
161
  step
@@ -166,17 +175,17 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
166
175
  };
167
176
  /**
168
177
  * On call :
169
- * - send the event 'newsEnded' used in retorik Kiosk
170
178
  * - if the component is news-only :
171
179
  * + if 'loop' is explicitly set to false, call props' handleEndedWithoutloop method if defined. Call handleBack method otherwise
172
180
  * + if 'loop' is not false, loop by setting step state to Steps.news
173
181
  * - or else if 'loop' parameter in configuration is true, get back to Steps.news step. Call handleBack method otherwise
174
182
  */ const exitNewsOrLoop = ()=>{
175
- // Send event 'newsEnded'
176
- const endEvent = new Event('newsEnded');
177
- document.dispatchEvent(endEvent);
178
183
  // Relaunch from the start if this is a news-only component and loop hasn't explicitly been set to false
179
- isRetorikNews ? displayData.loop !== false ? setStep(2) : handleEndedWithoutloop ? handleEndedWithoutloop() : handleBack() : displayData.loop ? setStep(2) : handleBack();
184
+ if (isRetorikNews) {
185
+ if (fromVeille) loop ? setStep(2) : handleEndedWithoutloop === null || handleEndedWithoutloop === void 0 ? void 0 : handleEndedWithoutloop();
186
+ else displayData.loop !== false || loop ? setStep(2) : handleEndedWithoutloop ? handleEndedWithoutloop() : handleBack();
187
+ } else // Relaunch from the start if the loop is activated, otherwise get back to homepage
188
+ displayData.loop || loop ? setStep(2) : handleBack();
180
189
  };
181
190
  /**
182
191
  * On video end :
@@ -202,7 +211,8 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
202
211
  setStep(4);
203
212
  }, 3000));
204
213
  };
205
- return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)((0, ($parcel$interopDefault($4L16K$react))).Fragment, {
214
+ return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
215
+ 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",
206
216
  children: [
207
217
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $lo3s5.default), {
208
218
  config: displayData.background,
@@ -228,7 +238,7 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
228
238
  onEnd: handleNewsEnd,
229
239
  isRetorikNews: isRetorikNews
230
240
  }),
231
- step === 4 && /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $j5z2A.default), {
241
+ step === 4 && ((_configuration_position = configuration.position) === null || _configuration_position === void 0 ? void 0 : _configuration_position.latitude) && ((_configuration_position1 = configuration.position) === null || _configuration_position1 === void 0 ? void 0 : _configuration_position1.longitude) && /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $j5z2A.default), {
232
242
  handleClose: handleBack
233
243
  }),
234
244
  !hideMenu && /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $lONbp.default), {
@@ -237,7 +247,6 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
237
247
  }),
238
248
  !hideMenu && isLandscape && !configuration.useOldRemote && !isRetorikNews && /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $7k0ZL.default), {
239
249
  onClick: handleBack,
240
- className: "rf-z-menu",
241
250
  showLabel: true
242
251
  }),
243
252
  !hideMenu && isBorne && !configuration.useOldRemote && !isRetorikNews && /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $gpEnv.default), {
@@ -255,10 +264,9 @@ $parcel$export(module.exports, "default", () => $01d9bb41fd368021$export$2e2bcd8
255
264
 
256
265
 
257
266
 
258
- var $6Q0mk = parcelRequire("6Q0mk");
259
267
  const $01d9bb41fd368021$var$Time = ({ belowReturnButton: belowReturnButton })=>{
260
- const translation = (0, $6Q0mk.useLocaleStore)((state)=>state.currentTranslations);
261
- const locale = (0, $6Q0mk.useLocaleStore)((state)=>state.locale);
268
+ const translation = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.currentTranslations);
269
+ const locale = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.locale);
262
270
  const [time, setTime] = (0, $4L16K$react.useState)('');
263
271
  const timerRef = (0, $4L16K$react.useRef)(null);
264
272
  /**
@@ -308,13 +316,8 @@ $parcel$export(module.exports, "default", () => $d399eaf5da71d3d6$export$2e2bcd8
308
316
 
309
317
 
310
318
 
311
- var $kUiCn = parcelRequire("kUiCn");
312
-
313
- var $6QoTL = parcelRequire("6QoTL");
314
319
 
315
- var $jgaO0 = parcelRequire("jgaO0");
316
-
317
- var $7eio0 = parcelRequire("7eio0");
320
+ var $kpW3P = parcelRequire("kpW3P");
318
321
 
319
322
  var $aNVXv = parcelRequire("aNVXv");
320
323
 
@@ -324,15 +327,13 @@ var $31VZU = parcelRequire("31VZU");
324
327
 
325
328
  var $fpnh0 = parcelRequire("fpnh0");
326
329
  const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3, onEnd: onEnd, isRetorikNews: isRetorikNews })=>{
330
+ const dispatch = (0, $4L16K$reactredux.useDispatch)();
327
331
  const { newsAttachments: newsAttachments, activity: activity } = (0, $aNVXv.default)();
328
- const route = (0, $kUiCn.useViewStore)((state)=>state.route);
329
- const isMobile = (0, $kUiCn.useViewStore)((state)=>state.isMobile);
330
- const newsConfiguration = (0, $kUiCn.useViewStore)((state)=>state.configurations.views.news);
331
- const currentDeviceType = (0, $kUiCn.useViewStore)((state)=>state.currentDeviceType);
332
- const retorikNewsEnded = (0, $7eio0.useUtilsStore)((state)=>state.retorikNewsEnded);
333
- const addToStreamingQueue = (0, $jgaO0.useSpeechStore)((state)=>state.actions.addToStreamingQueue);
334
- const setRetorikNewsEnded = (0, $7eio0.useUtilsStore)((state)=>state.actions.setRetorikNewsEnded);
335
- const sendEvent = (0, $6QoTL.useDirectlineStore)((state)=>state.actions.sendEvent);
332
+ const route = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.route);
333
+ const isMobile = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.isMobile);
334
+ const newsConfiguration = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.configurations.views.news);
335
+ const currentDeviceType = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.currentDeviceType);
336
+ const retorikNewsEnded = (0, $4L16K$reactredux.useSelector)((state)=>state.utilsReducer.retorikNewsEnded);
336
337
  const [carouselGridRowStart, setCarouselGridRowStart] = (0, $4L16K$react.useState)();
337
338
  const [carouselGridRowSpan, setCarouselGridRowSpan] = (0, $4L16K$react.useState)();
338
339
  const [bannerGridRowStart, setBannerGridRowStart] = (0, $4L16K$react.useState)(10);
@@ -348,10 +349,12 @@ const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
348
349
  ]);
349
350
  (0, $4L16K$react.useEffect)(()=>{
350
351
  if (!newsAttachments.length) setTimeout(()=>{
351
- sendEvent('news.getAllNews', null);
352
+ dispatch((0, $kpW3P.storeActions).directline.sendEvent({
353
+ name: 'news.getAllNews'
354
+ }));
352
355
  }, 2000);
353
356
  return ()=>{
354
- timerRef && clearTimeout(timerRef.current);
357
+ timerRef.current && clearTimeout(timerRef.current);
355
358
  };
356
359
  }, []);
357
360
  (0, $4L16K$react.useEffect)(()=>{
@@ -455,7 +458,7 @@ const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
455
458
  ...activity,
456
459
  speak: `${textTitle}${textSubtitle}${currentNew.text}`
457
460
  };
458
- addToStreamingQueue(tempActivity);
461
+ dispatch((0, $kpW3P.storeActions).speech.addToStreamingQueue(tempActivity));
459
462
  }
460
463
  }, [
461
464
  activity,
@@ -480,11 +483,11 @@ const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
480
483
  if (news.length) {
481
484
  if (current < news.length - 1) {
482
485
  const delay = current < news.length - 1 ? intervalInSeconds : intervalInSeconds * 3;
483
- timerRef && clearTimeout(timerRef.current);
486
+ timerRef.current && clearTimeout(timerRef.current);
484
487
  if (route === (0, $7WHA7.Routes).News || isRetorikNews) timerRef.current = setTimeout(next, delay * 1000);
485
488
  } else onEnd();
486
489
  }
487
- setRetorikNewsEnded(false);
490
+ dispatch((0, $kpW3P.storeActions).utils.setRetorikNewsEnded(false));
488
491
  }
489
492
  }, [
490
493
  retorikNewsEnded
@@ -530,10 +533,9 @@ $parcel$export(module.exports, "default", () => $d3f2491623efa760$export$2e2bcd8
530
533
 
531
534
  var $guzQO = parcelRequire("guzQO");
532
535
 
533
- var $e53vj = parcelRequire("e53vj");
534
536
  const $d3f2491623efa760$var$useNews = ()=>{
535
537
  var _activity_attachments;
536
- const activities = (0, $e53vj.useActivityStore)((state)=>state.botEventActivities);
538
+ const activities = (0, $4L16K$reactredux.useSelector)((state)=>state.activityReducer.botEventActivities);
537
539
  if (!activities.length) return {
538
540
  newsAttachments: []
539
541
  };
@@ -566,9 +568,6 @@ $parcel$export(module.exports, "default", () => $24072221965576dd$export$2e2bcd8
566
568
 
567
569
 
568
570
 
569
- var $kUiCn = parcelRequire("kUiCn");
570
-
571
- var $6Q0mk = parcelRequire("6Q0mk");
572
571
 
573
572
  var $9JtA7 = parcelRequire("9JtA7");
574
573
 
@@ -577,24 +576,23 @@ var $eu1bT = parcelRequire("eu1bT");
577
576
  var $2MBUX = parcelRequire("2MBUX");
578
577
  const $24072221965576dd$var$Banner = ({ news: news, gridRowStart: gridRowStart, gridRowSpan: gridRowSpan, alignSelfEnd: alignSelfEnd })=>{
579
578
  var _news_image;
580
- const translation = (0, $6Q0mk.useLocaleStore)((state)=>state.currentTranslations);
581
- const locale = (0, $6Q0mk.useLocaleStore)((state)=>state.localeForRetorikStudioContent);
582
- const isRTL = (0, $6Q0mk.useLocaleStore)((state)=>state.isRTL);
583
- const isMobile = (0, $kUiCn.useViewStore)((state)=>state.isMobile);
584
- const currentWidth = (0, $kUiCn.useViewStore)((state)=>state.currentWidth);
585
- const newsConfiguration = (0, $kUiCn.useViewStore)((state)=>state.configurations.views.news);
579
+ const translation = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.currentTranslations);
580
+ const locale = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.localeForRetorikStudioContent);
581
+ const localizedBannerTitle = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.localizedBannerTitle);
582
+ const isRTL = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.isRTL);
583
+ const isMobile = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.isMobile);
584
+ const currentWidth = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.currentWidth);
585
+ const newsConfiguration = (0, $4L16K$reactredux.useSelector)((state)=>state.viewReducer.configurations.views.news);
586
586
  const timerRef = (0, $4L16K$react.useRef)(null);
587
587
  const [scrollDuration, setScrollDuration] = (0, $4L16K$react.useState)(0);
588
588
  const category = (0, $4L16K$react.useMemo)(()=>{
589
589
  var _newsConfiguration_bannerTitleLocalized;
590
- if (news.category) return news.category;
591
- else if (newsConfiguration === null || newsConfiguration === void 0 ? void 0 : (_newsConfiguration_bannerTitleLocalized = newsConfiguration.bannerTitleLocalized) === null || _newsConfiguration_bannerTitleLocalized === void 0 ? void 0 : _newsConfiguration_bannerTitleLocalized[locale]) return newsConfiguration.bannerTitleLocalized[locale];
592
- else if (newsConfiguration === null || newsConfiguration === void 0 ? void 0 : newsConfiguration.bannerTitle) return newsConfiguration.bannerTitle;
593
- return translation.news.continuous;
590
+ return news.category || (newsConfiguration === null || newsConfiguration === void 0 ? void 0 : (_newsConfiguration_bannerTitleLocalized = newsConfiguration.bannerTitleLocalized) === null || _newsConfiguration_bannerTitleLocalized === void 0 ? void 0 : _newsConfiguration_bannerTitleLocalized[locale]) || localizedBannerTitle || (newsConfiguration === null || newsConfiguration === void 0 ? void 0 : newsConfiguration.bannerTitle) || translation.news.continuous;
594
591
  }, [
595
592
  news,
596
593
  newsConfiguration,
597
594
  locale,
595
+ localizedBannerTitle,
598
596
  translation
599
597
  ]);
600
598
  /**
@@ -666,11 +664,10 @@ $parcel$export(module.exports, "default", () => $5ffb87b569a304f8$export$2e2bcd8
666
664
 
667
665
 
668
666
 
669
- var $6Q0mk = parcelRequire("6Q0mk");
670
667
 
671
668
  var $9JtA7 = parcelRequire("9JtA7");
672
669
  const $5ffb87b569a304f8$var$BannerTopMobile = ({ category: category, title: title, subtitle: subtitle, url: url })=>{
673
- const locale = (0, $6Q0mk.useLocaleStore)((state)=>state.locale);
670
+ const locale = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.locale);
674
671
  return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)((0, ($parcel$interopDefault($4L16K$react))).Fragment, {
675
672
  children: [
676
673
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
@@ -717,11 +714,10 @@ $parcel$export(module.exports, "default", () => $a94481e954312e6d$export$2e2bcd8
717
714
 
718
715
 
719
716
 
720
- var $6Q0mk = parcelRequire("6Q0mk");
721
717
 
722
718
  var $9JtA7 = parcelRequire("9JtA7");
723
719
  const $a94481e954312e6d$var$BannerTopLarge = ({ category: category, title: title, subtitle: subtitle })=>{
724
- const locale = (0, $6Q0mk.useLocaleStore)((state)=>state.locale);
720
+ const locale = (0, $4L16K$reactredux.useSelector)((state)=>state.localeReducer.locale);
725
721
  return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)((0, ($parcel$interopDefault($4L16K$react))).Fragment, {
726
722
  children: [
727
723
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
@@ -755,4 +751,4 @@ var $a94481e954312e6d$export$2e2bcd8739ae039 = $a94481e954312e6d$var$BannerTopLa
755
751
 
756
752
 
757
753
 
758
- //# sourceMappingURL=NewsContainer.a91d9131.js.map
754
+ //# sourceMappingURL=NewsContainer.c0a24775.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 } from '../../store'\r\n\r\nimport type { NewsConfig } from '../../models/types'\r\nimport { Routes } from '../../models/enums'\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): 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<NodeJS.Timer | null>(null)\r\n const newsEndedTimerRef = useRef<NodeJS.Timer | 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 }\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): 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-600 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 } from '../../store'\r\nimport useNews from '../../hooks/useNews'\r\n\r\nimport type { Image, Media } from '../../models/attachmentTypes'\r\nimport { RetorikActivity } from '../../models/activityTypes'\r\nimport { DeviceType, Routes } from '../../models/enums'\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): 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 }, 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 { CONTENT_TYPE_NEWS, NewsContent } from '../models/attachmentTypes'\r\nimport { useSelector } from 'react-redux'\r\nimport { RootState } from '../store'\r\nimport type { RetorikActivity } from '../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): 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): 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-600 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): 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-600 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.c0a24775.js.map","sourceRoot":"../"}