@davi-ai/retorik-framework 3.2.3 → 3.2.5

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 (48) hide show
  1. package/dist/{AttachmentDetail.1e06c2a5.js → AttachmentDetail.0a576bf3.js} +12 -13
  2. package/dist/AttachmentDetail.0a576bf3.js.map +1 -0
  3. package/dist/{AttachmentDetail.c6c297df.js → AttachmentDetail.c4286a45.js} +12 -13
  4. package/dist/AttachmentDetail.c4286a45.js.map +1 -0
  5. package/dist/{CustomView.90d2a13d.js → CustomView.913a9f32.js} +6 -7
  6. package/dist/CustomView.913a9f32.js.map +1 -0
  7. package/dist/{CustomView.080c8028.js → CustomView.edf84de1.js} +6 -7
  8. package/dist/CustomView.edf84de1.js.map +1 -0
  9. package/dist/{Emergency.a21f837c.js → Emergency.0cf005ce.js} +2 -3
  10. package/dist/Emergency.0cf005ce.js.map +1 -0
  11. package/dist/{Emergency.423214ad.js → Emergency.897ee3c7.js} +2 -3
  12. package/dist/Emergency.897ee3c7.js.map +1 -0
  13. package/dist/{HistoryList.5fd6aa12.js → HistoryList.03a56119.js} +3 -7
  14. package/dist/HistoryList.03a56119.js.map +1 -0
  15. package/dist/{HistoryList.50ff0fd9.js → HistoryList.4c303dc6.js} +3 -7
  16. package/dist/HistoryList.4c303dc6.js.map +1 -0
  17. package/dist/{LanguageChoice.61e36c1d.js → LanguageChoice.623ee802.js} +2 -5
  18. package/dist/LanguageChoice.623ee802.js.map +1 -0
  19. package/dist/{LanguageChoice.1579b654.js → LanguageChoice.ff0cd04c.js} +2 -5
  20. package/dist/LanguageChoice.ff0cd04c.js.map +1 -0
  21. package/dist/{NewsContainer.932174e9.js → NewsContainer.a91d9131.js} +17 -14
  22. package/dist/NewsContainer.a91d9131.js.map +1 -0
  23. package/dist/{NewsContainer.67f04b19.js → NewsContainer.f0d2ee9c.js} +17 -14
  24. package/dist/NewsContainer.f0d2ee9c.js.map +1 -0
  25. package/dist/{Weather.661c2cac.js → Weather.99917b66.js} +2 -3
  26. package/dist/Weather.99917b66.js.map +1 -0
  27. package/dist/{Weather.fb22fba3.js → Weather.cf58823d.js} +2 -3
  28. package/dist/Weather.cf58823d.js.map +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +500 -689
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.modern.js +485 -682
  33. package/dist/index.modern.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/AttachmentDetail.1e06c2a5.js.map +0 -1
  36. package/dist/AttachmentDetail.c6c297df.js.map +0 -1
  37. package/dist/CustomView.080c8028.js.map +0 -1
  38. package/dist/CustomView.90d2a13d.js.map +0 -1
  39. package/dist/Emergency.423214ad.js.map +0 -1
  40. package/dist/Emergency.a21f837c.js.map +0 -1
  41. package/dist/HistoryList.50ff0fd9.js.map +0 -1
  42. package/dist/HistoryList.5fd6aa12.js.map +0 -1
  43. package/dist/LanguageChoice.1579b654.js.map +0 -1
  44. package/dist/LanguageChoice.61e36c1d.js.map +0 -1
  45. package/dist/NewsContainer.67f04b19.js.map +0 -1
  46. package/dist/NewsContainer.932174e9.js.map +0 -1
  47. package/dist/Weather.661c2cac.js.map +0 -1
  48. package/dist/Weather.fb22fba3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/History/HistoryList.tsx","src/hooks/useMessageActivities.ts","src/components/History/HistoryItem.tsx","src/components/History/HistoryQA.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react'\r\nimport { useViewStore } from '../Contexts/ViewContext'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\nimport useMessageActivities from '../../hooks/useMessageActivities'\r\nimport { SubMenuClosing as Template } from '../Templates'\r\nimport HistoryItem from './HistoryItem'\r\nimport { CurrentSubView } from '../../models/enums'\r\nimport preventEvents from '../../utils/preventEvents'\r\n\r\nconst HistoryList = (): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const isWidget = useViewStore((state) => state.isWidget)\r\n const isBorne = useViewStore((state) => state.isBorne)\r\n const setCurrentSubView = useUtilsStore((state) => state.actions.setCurrentSubView)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\r\n\r\n const activities = useMessageActivities()\r\n const scrollRef = useRef<HTMLDivElement>(null)\r\n const divRef = useRef<HTMLDivElement>(null)\r\n\r\n /**\r\n * On call :\r\n * - scroll to the scrollRef HTML element at the bottom of the view\r\n */\r\n const scrollToRef = (): void => {\r\n if (scrollRef && scrollRef.current !== null) {\r\n scrollRef.current.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest'\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * On component mount :\r\n * - call scrollToRef method\r\n */\r\n useEffect(() => {\r\n setTimeout(() => {\r\n scrollToRef()\r\n }, 200)\r\n }, [])\r\n\r\n useEffect(() => {\r\n divRef?.current && isWidget && preventEvents(null, divRef)\r\n }, [divRef?.current])\r\n\r\n const handleClose = (): void => {\r\n setCurrentSubView(CurrentSubView.none)\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowHistory', null))\r\n }\r\n\r\n return (\r\n <Template handleClose={handleClose} backIsConversation={true} title={translation.history.title}>\r\n <div ref={divRef} className={`rf-pb-4 rf-overflow-y-scroll ${isBorne ? 'rf-scrollbar-thin' : 'rf-scrollbar-hidden'}`}>\r\n {/* History items */}\r\n {activities.map((activity, key) => {\r\n return <HistoryItem key={key} activity={activity} />\r\n })}\r\n <div ref={scrollRef} />\r\n </div>\r\n </Template>\r\n )\r\n}\r\n\r\nexport default HistoryList\r\n","import type { HistoryActivity, RetorikActivity } from '../models/activityTypes'\r\nimport { createNewQuestionForTimestamp } from '../utils/activityUtils'\r\nimport { useActivityStore } from '../components/Contexts/ActivityContext'\r\n\r\nexport default function useMessageActivities(): Array<HistoryActivity> {\r\n const activities = useActivityStore((state) => state.messageActivities)\r\n // processedId contains the ids of the activities already processed (because useActivities gives duplicate activities with different state depending on if it's been spoken or not )\r\n const processedId: Array<string> = []\r\n const history: HistoryActivity[] = []\r\n\r\n activities.forEach((activity) => {\r\n if (activity.id && !processedId.includes(activity.id)) {\r\n processedId.push(activity.id)\r\n // Check if this is a question or an answer (questions from the user don't have a replyToId field)\r\n if (activity.replyToId) {\r\n const question: HistoryActivity | undefined = history.find(\r\n (historyItem) => historyItem.question.id === activity.replyToId\r\n )\r\n if (question) {\r\n question.answers.push(activity)\r\n } else {\r\n const newQuestion: RetorikActivity =\r\n createNewQuestionForTimestamp(activity)\r\n\r\n history.push({\r\n question: newQuestion,\r\n answers: [activity]\r\n })\r\n }\r\n } else {\r\n if (\r\n (activity as RetorikActivity).label === 'Davi.BringupMessage' &&\r\n (activity as RetorikActivity).text\r\n ) {\r\n const newQuestion: RetorikActivity =\r\n createNewQuestionForTimestamp(activity)\r\n history.push({\r\n question: newQuestion,\r\n answers: [activity]\r\n })\r\n } else {\r\n history.push({\r\n question: activity,\r\n answers: []\r\n })\r\n }\r\n }\r\n }\r\n })\r\n\r\n return history\r\n}\r\n","import React from 'react'\r\nimport type { HistoryActivity } from '../../models/activityTypes'\r\nimport HistoryQA from './HistoryQA'\r\n\r\ninterface HistoryItemProps {\r\n activity: HistoryActivity\r\n}\r\n\r\nconst HistoryItem = ({ activity }: HistoryItemProps): JSX.Element => {\r\n return (\r\n <div className='rf-mb-4 rf-flex rf-flex-col rf-justify-start rf-items-start rf-gap-4 rf-text-size-auto'>\r\n {/* Question */}\r\n {activity?.question && activity.question.type === 'message' && (\r\n <HistoryQA activity={activity.question} isQuestion={true} />\r\n )}\r\n\r\n {/* Answers */}\r\n {activity.answers.map((answer, j) => {\r\n return answer.type === 'message' ? (\r\n <HistoryQA key={j} activity={answer} isQuestion={false} />\r\n ) : (\r\n <React.Fragment />\r\n )\r\n })}\r\n </div>\r\n )\r\n}\r\n\r\nexport default HistoryItem\r\n","import React from 'react'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport type { RetorikActivity } from '../../models/activityTypes'\r\nimport { getTextWithoutSpeechMarkdown } from '../../utils/speechMarkdownUtils'\r\nimport Attachments from '../Attachments/Attachments'\r\n\r\ninterface HistoryQAProps {\r\n activity: RetorikActivity\r\n isQuestion: boolean\r\n}\r\n\r\nconst HistoryQA = ({ activity, isQuestion }: HistoryQAProps): JSX.Element => {\r\n const locale = useLocaleStore((state) => state.locale)\r\n const time = activity.localTimestamp ? new Date(activity.localTimestamp) : activity.timestamp ? new Date(activity.timestamp) : new Date()\r\n\r\n return activity.text || !!activity.attachments?.length ? (\r\n <div className='rf-w-full rf-flex rf-flex-col rf-gap-1'>\r\n {/* Time */}\r\n <div className='rf-text-[#9A9A9A]'>\r\n {time.toLocaleString(locale, {\r\n hour: 'numeric',\r\n minute: 'numeric'\r\n })}\r\n </div>\r\n\r\n {/* Question or Answer */}\r\n <div className={`${isQuestion ? 'rf-text-secondary' : 'rf-text-textModePanelConversationBot'}`}>\r\n {activity.htmlText ? (\r\n <div\r\n dangerouslySetInnerHTML={{\r\n __html: activity.htmlText\r\n }}\r\n />\r\n ) : activity.text ? (\r\n getTextWithoutSpeechMarkdown(activity.text)\r\n ) : (\r\n ''\r\n )}\r\n {/* Display attachments if there are some and the display mode wasn't a list */}\r\n {!!activity.attachments?.length && !(activity.attachmentLayout && activity.attachmentLayout.toLowerCase() === 'davilist') && (\r\n <div className={`rf-w-full rf-min-h-16 rf-overflow-x-hidden rf-overflow-y-auto ${activity.text && 'rf-pt-4'}`}>\r\n <Attachments activity={activity} history={true} />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <React.Fragment />\r\n )\r\n}\r\n\r\nexport default HistoryQA\r\n"],"names":[],"version":3,"file":"HistoryList.4c303dc6.js.map","sourceRoot":"../"}
@@ -54,10 +54,7 @@ const $4545a6dcb65287bd$var$LanguageChoice = ()=>{
54
54
  const handleClose = (changed)=>{
55
55
  setCurrentSubView((0, $4ucVo.CurrentSubView).none);
56
56
  // Only send events when language has not been changed, either way it will collide with the TriggerWelcome event
57
- if (!changed) {
58
- sendEvent('Davi.CloseWindow', null);
59
- sendEvent('Davi.CloseWindowLanguages', null);
60
- }
57
+ if (!changed) sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowLanguages', null));
61
58
  };
62
59
  const handleChange = (language)=>{
63
60
  setCurrentLanguage(language);
@@ -113,4 +110,4 @@ var $4545a6dcb65287bd$export$2e2bcd8739ae039 = $4545a6dcb65287bd$var$LanguageCho
113
110
  });
114
111
 
115
112
 
116
- //# sourceMappingURL=LanguageChoice.61e36c1d.js.map
113
+ //# sourceMappingURL=LanguageChoice.623ee802.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,uCAAiB;IACrB,MAAM,cAAc,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,mBAAmB;IACvE,MAAM,SAAS,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,MAAM;IACrD,MAAM,YAAY,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,SAAS;IAC3D,MAAM,cAAc,CAAA,GAAA,sBAAc,EAAE,CAAC,QAAU,MAAM,aAAa,CAAC,WAAW;IAC9E,MAAM,oBAAoB,CAAA,GAAA,oBAAY,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,iBAAiB;IAClF,MAAM,YAAY,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,SAAS;IACnE,MAAM,YAAY,CAAA,GAAA,yBAAiB,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,SAAS;IAEvE,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,eAAO,EAAU;IAE/D,MAAM,cAAc,CAAC;QACnB,kBAAkB,CAAA,GAAA,qBAAa,EAAE,IAAI;QAErC,gHAAgH;QAChH,IAAI,CAAC,SACH,UAAU,oBAAoB,MAAM,IAAM,UAAU,6BAA6B;IAErF;IAEA,MAAM,eAAe,CAAC;QACpB,mBAAmB;IACrB;IAEA;;;;GAIC,GACD,MAAM,eAAe,CAAC;QACpB,MAAM,UAAU,aAAa;QAC7B,IAAI,SAAS;YACX,UAAU;YACV,CAAC,eACC,WAAW;gBACT,UAAU,kBAAkB;YAC9B,GAAG;QACP;QAEA,YAAY;IACd;IAEA,qBACE,iBAAC,CAAA,GAAA,qBAAO;QAAE,aAAa,IAAM,YAAY;;0BAEvC,gBAAC;gBAAI,WAAU;0BAAiF,CAAA,GAAA,4BAAoB,EAAE,YAAY,QAAQ,CAAC,MAAM,EAAE;;0BAGnJ,gBAAC;gBAAI,WAAU;0BAAqC,CAAA,GAAA,4BAAoB,EAAE,YAAY,QAAQ,CAAC,MAAM,EAAE;;YAGtG,UAAU,GAAG,CAAC,CAAC,UAAU;gBACxB,qBACE,gBAAC;oBAAc,WAAW,CAAC,qDAAqD,EAAE,QAAQ,KAAK,uBAAuB;8BACpH,cAAA,gBAAC,CAAA,GAAA,YAAI;wBAAE,OAAO,CAAA,GAAA,6CAAqB,CAAC,CAAC,SAAS;wBAAE,SAAS,aAAa;wBAAiB,cAAc,IAAY,aAAa;;mBADtH;YAId;0BAGA,gBAAC;gBAAI,WAAU;0BACb,cAAA,gBAAC;oBAAO,WAAU;oBAA+F,SAAS,IAAY,aAAa;8BAChJ,CAAA,GAAA,4BAAoB,EAAE,YAAY,MAAM,CAAC,QAAQ,EAAE;;;;;AAK9D;IAEA,2CAAe","sources":["src/components/Language/LanguageChoice.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\n\r\nimport languageInMotherTongue from '../../translations/languageCodeToMotherTongue.json'\r\nimport { CurrentSubView } from '../../models/enums'\r\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\r\n\r\nimport { SubMenuClosing as Template } from '../Templates'\r\nimport { Radio } from '../Utils'\r\n\r\nconst LanguageChoice = (): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.locale)\r\n const supported = useLocaleStore((state) => state.supported)\r\n const skipWelcome = useRetorikStore((state) => state.configuration.skipWelcome)\r\n const setCurrentSubView = useUtilsStore((state) => state.actions.setCurrentSubView)\r\n const setLocale = useLocaleStore((state) => state.actions.setLocale)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\r\n\r\n const [currentLanguage, setCurrentLanguage] = useState<string>(locale)\r\n\r\n const handleClose = (changed?: boolean): void => {\r\n setCurrentSubView(CurrentSubView.none)\r\n\r\n // Only send events when language has not been changed, either way it will collide with the TriggerWelcome event\r\n if (!changed) {\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowLanguages', null))\r\n }\r\n }\r\n\r\n const handleChange = (language: string): void => {\r\n setCurrentLanguage(language)\r\n }\r\n\r\n /**\r\n * Change current locale with the one selected if they are different.\r\n * Send a 'TriggerWelcome' event to get the welcome message in the new language.\r\n * @param language string\r\n */\r\n const handleSelect = (language: string): void => {\r\n const changed = language !== locale\r\n if (changed) {\r\n setLocale(language)\r\n !skipWelcome &&\r\n setTimeout(() => {\r\n sendEvent('TriggerWelcome', undefined)\r\n }, 150)\r\n }\r\n\r\n handleClose(changed)\r\n }\r\n\r\n return (\r\n <Template handleClose={() => handleClose(false)}>\r\n {/* Title */}\r\n <div className='large:rf-mt-[20vh] large-tactile:rf-mt-0 rf-title-bold-size-auto rf-font-bold'>{capitalizeFirstLetter(translation.language.change, locale)}</div>\r\n\r\n {/* Subtitle */}\r\n <div className='rf-text-lightgray rf-pt-1 rf-pb-2'>{capitalizeFirstLetter(translation.language.select, locale)}</div>\r\n\r\n {/* Languages */}\r\n {supported.map((language, key) => {\r\n return (\r\n <div key={key} className={`rf-w-full rf-py-4 rf-border-t rf-border-t-menuBorder ${key === 0 && 'large:rf-border-t-0'}`}>\r\n <Radio title={languageInMotherTongue[language]} checked={language === currentLanguage} handleChange={(): void => handleChange(language)} />\r\n </div>\r\n )\r\n })}\r\n\r\n {/* Validation button */}\r\n <div className='rf-w-full rf-mt-8 rf-flex rf-justify-center'>\r\n <button className='rf-px-8 rf-py-3 rf-text-secondary rf-font-bold rf-border-2 rf-border-secondary rf-rounded-lg' onClick={(): void => handleSelect(currentLanguage)}>\r\n {capitalizeFirstLetter(translation.common.validate, locale)}\r\n </button>\r\n </div>\r\n </Template>\r\n )\r\n}\r\n\r\nexport default LanguageChoice\r\n"],"names":[],"version":3,"file":"LanguageChoice.623ee802.js.map"}
@@ -63,10 +63,7 @@ const $6bd994e5ef61a032$var$LanguageChoice = ()=>{
63
63
  const handleClose = (changed)=>{
64
64
  setCurrentSubView((0, $7WHA7.CurrentSubView).none);
65
65
  // Only send events when language has not been changed, either way it will collide with the TriggerWelcome event
66
- if (!changed) {
67
- sendEvent('Davi.CloseWindow', null);
68
- sendEvent('Davi.CloseWindowLanguages', null);
69
- }
66
+ if (!changed) sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowLanguages', null));
70
67
  };
71
68
  const handleChange = (language)=>{
72
69
  setCurrentLanguage(language);
@@ -122,4 +119,4 @@ var $6bd994e5ef61a032$export$2e2bcd8739ae039 = $6bd994e5ef61a032$var$LanguageCho
122
119
  });
123
120
 
124
121
 
125
- //# sourceMappingURL=LanguageChoice.1579b654.js.map
122
+ //# sourceMappingURL=LanguageChoice.ff0cd04c.js.map
@@ -0,0 +1 @@
1
+ {"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,uCAAiB;IACrB,MAAM,cAAc,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,mBAAmB;IACvE,MAAM,SAAS,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,MAAM;IACrD,MAAM,YAAY,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,SAAS;IAC3D,MAAM,cAAc,CAAA,GAAA,sBAAc,EAAE,CAAC,QAAU,MAAM,aAAa,CAAC,WAAW;IAC9E,MAAM,oBAAoB,CAAA,GAAA,oBAAY,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,iBAAiB;IAClF,MAAM,YAAY,CAAA,GAAA,qBAAa,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,SAAS;IACnE,MAAM,YAAY,CAAA,GAAA,yBAAiB,EAAE,CAAC,QAAU,MAAM,OAAO,CAAC,SAAS;IAEvE,MAAM,CAAC,iBAAiB,mBAAmB,GAAG,CAAA,GAAA,qBAAO,EAAU;IAE/D,MAAM,cAAc,CAAC;QACnB,kBAAkB,CAAA,GAAA,qBAAa,EAAE,IAAI;QAErC,gHAAgH;QAChH,IAAI,CAAC,SACH,UAAU,oBAAoB,MAAM,IAAM,UAAU,6BAA6B;IAErF;IAEA,MAAM,eAAe,CAAC;QACpB,mBAAmB;IACrB;IAEA;;;;GAIC,GACD,MAAM,eAAe,CAAC;QACpB,MAAM,UAAU,aAAa;QAC7B,IAAI,SAAS;YACX,UAAU;YACV,CAAC,eACC,WAAW;gBACT,UAAU,kBAAkB;YAC9B,GAAG;QACP;QAEA,YAAY;IACd;IAEA,qBACE,iCAAC,CAAA,GAAA,qBAAO;QAAE,aAAa,IAAM,YAAY;;0BAEvC,gCAAC;gBAAI,WAAU;0BAAiF,CAAA,GAAA,4BAAoB,EAAE,YAAY,QAAQ,CAAC,MAAM,EAAE;;0BAGnJ,gCAAC;gBAAI,WAAU;0BAAqC,CAAA,GAAA,4BAAoB,EAAE,YAAY,QAAQ,CAAC,MAAM,EAAE;;YAGtG,UAAU,GAAG,CAAC,CAAC,UAAU;gBACxB,qBACE,gCAAC;oBAAc,WAAW,CAAC,qDAAqD,EAAE,QAAQ,KAAK,uBAAuB;8BACpH,cAAA,gCAAC,CAAA,GAAA,YAAI;wBAAE,OAAO,CAAA,GAAA,6CAAqB,CAAC,CAAC,SAAS;wBAAE,SAAS,aAAa;wBAAiB,cAAc,IAAY,aAAa;;mBADtH;YAId;0BAGA,gCAAC;gBAAI,WAAU;0BACb,cAAA,gCAAC;oBAAO,WAAU;oBAA+F,SAAS,IAAY,aAAa;8BAChJ,CAAA,GAAA,4BAAoB,EAAE,YAAY,MAAM,CAAC,QAAQ,EAAE;;;;;AAK9D;IAEA,2CAAe","sources":["src/components/Language/LanguageChoice.tsx"],"sourcesContent":["import React, { useState } from 'react'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\n\r\nimport languageInMotherTongue from '../../translations/languageCodeToMotherTongue.json'\r\nimport { CurrentSubView } from '../../models/enums'\r\nimport { capitalizeFirstLetter } from '../../utils/capitalizeFirstLetter'\r\n\r\nimport { SubMenuClosing as Template } from '../Templates'\r\nimport { Radio } from '../Utils'\r\n\r\nconst LanguageChoice = (): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.locale)\r\n const supported = useLocaleStore((state) => state.supported)\r\n const skipWelcome = useRetorikStore((state) => state.configuration.skipWelcome)\r\n const setCurrentSubView = useUtilsStore((state) => state.actions.setCurrentSubView)\r\n const setLocale = useLocaleStore((state) => state.actions.setLocale)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\r\n\r\n const [currentLanguage, setCurrentLanguage] = useState<string>(locale)\r\n\r\n const handleClose = (changed?: boolean): void => {\r\n setCurrentSubView(CurrentSubView.none)\r\n\r\n // Only send events when language has not been changed, either way it will collide with the TriggerWelcome event\r\n if (!changed) {\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowLanguages', null))\r\n }\r\n }\r\n\r\n const handleChange = (language: string): void => {\r\n setCurrentLanguage(language)\r\n }\r\n\r\n /**\r\n * Change current locale with the one selected if they are different.\r\n * Send a 'TriggerWelcome' event to get the welcome message in the new language.\r\n * @param language string\r\n */\r\n const handleSelect = (language: string): void => {\r\n const changed = language !== locale\r\n if (changed) {\r\n setLocale(language)\r\n !skipWelcome &&\r\n setTimeout(() => {\r\n sendEvent('TriggerWelcome', undefined)\r\n }, 150)\r\n }\r\n\r\n handleClose(changed)\r\n }\r\n\r\n return (\r\n <Template handleClose={() => handleClose(false)}>\r\n {/* Title */}\r\n <div className='large:rf-mt-[20vh] large-tactile:rf-mt-0 rf-title-bold-size-auto rf-font-bold'>{capitalizeFirstLetter(translation.language.change, locale)}</div>\r\n\r\n {/* Subtitle */}\r\n <div className='rf-text-lightgray rf-pt-1 rf-pb-2'>{capitalizeFirstLetter(translation.language.select, locale)}</div>\r\n\r\n {/* Languages */}\r\n {supported.map((language, key) => {\r\n return (\r\n <div key={key} className={`rf-w-full rf-py-4 rf-border-t rf-border-t-menuBorder ${key === 0 && 'large:rf-border-t-0'}`}>\r\n <Radio title={languageInMotherTongue[language]} checked={language === currentLanguage} handleChange={(): void => handleChange(language)} />\r\n </div>\r\n )\r\n })}\r\n\r\n {/* Validation button */}\r\n <div className='rf-w-full rf-mt-8 rf-flex rf-justify-center'>\r\n <button className='rf-px-8 rf-py-3 rf-text-secondary rf-font-bold rf-border-2 rf-border-secondary rf-rounded-lg' onClick={(): void => handleSelect(currentLanguage)}>\r\n {capitalizeFirstLetter(translation.common.validate, locale)}\r\n </button>\r\n </div>\r\n </Template>\r\n )\r\n}\r\n\r\nexport default LanguageChoice\r\n"],"names":[],"version":3,"file":"LanguageChoice.ff0cd04c.js.map","sourceRoot":"../"}
@@ -1,4 +1,4 @@
1
- require("./Weather.661c2cac.js");
1
+ require("./Weather.99917b66.js");
2
2
  var $4L16K$reactjsxruntime = require("react/jsx-runtime");
3
3
  var $4L16K$react = require("react");
4
4
 
@@ -101,10 +101,7 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
101
101
  muted && setMuted(false);
102
102
  return ()=>{
103
103
  // Send closing events unless we are using RetorikNews component
104
- if (!isRetorikNews) {
105
- sendEvent('Davi.CloseWindow', null);
106
- sendEvent('Davi.CloseWindowNews', null);
107
- }
104
+ if (!isRetorikNews) sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowNews', null));
108
105
  };
109
106
  }, []);
110
107
  /**
@@ -214,12 +211,12 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
214
211
  onVideoEnded: handleVideoEnd
215
212
  }),
216
213
  isMobile && !isRetorikNews && !hideMenu ? /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
217
- className: "rf-relative rf-z-util ltr:rf-col-start-1 rtl:rf-col-end-1 rf-col-span-full rf-row-start-1 rf-flex rf-flex-col rf-gap-2 rf-items-start",
214
+ 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",
218
215
  children: [
219
216
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $7v7LH.BackButton), {
220
217
  title: translation.common.back,
221
218
  handleBack: handleBack,
222
- className: "ltr:rf-pr-2 rtl:rf-pl-2 rf-mt-4 ltr:rf-ml-4 rtl:rf-mr-4 rf-text-size-auto rf-bg-truewhite rf-rounded-lg"
219
+ className: "rf-pr-2 rf-mt-4 rf-ml-4 rf-text-size-auto rf-bg-truewhite rf-rounded-lg"
223
220
  }),
224
221
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $dMQiv.default), {
225
222
  belowReturnButton: true
@@ -285,9 +282,9 @@ const $01d9bb41fd368021$var$Time = ({ belowReturnButton: belowReturnButton })=>{
285
282
  return ()=>timerRef && clearInterval(timerRef.current);
286
283
  }, []);
287
284
  return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
288
- className: `rf-relative ${belowReturnButton ? 'ltr:rf-ml-4 rtl:rf-mr-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'}`,
285
+ 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'}`,
289
286
  children: /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
290
- className: "rf-w-fit rf-h-fit rf-flex rf-flex-col ltr:rf-justify-start rtl:rf-justify-end ltr:rf-items-start rtl:rf-items-end rf-text-white",
287
+ className: "rf-w-fit rf-h-fit rf-flex rf-flex-col rf-justify-start rf-items-start rf-text-white",
291
288
  children: [
292
289
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
293
290
  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",
@@ -315,6 +312,8 @@ var $kUiCn = parcelRequire("kUiCn");
315
312
 
316
313
  var $6QoTL = parcelRequire("6QoTL");
317
314
 
315
+ var $jgaO0 = parcelRequire("jgaO0");
316
+
318
317
  var $7eio0 = parcelRequire("7eio0");
319
318
 
320
319
  var $aNVXv = parcelRequire("aNVXv");
@@ -331,7 +330,8 @@ const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
331
330
  const newsConfiguration = (0, $kUiCn.useViewStore)((state)=>state.configurations.views.news);
332
331
  const currentDeviceType = (0, $kUiCn.useViewStore)((state)=>state.currentDeviceType);
333
332
  const retorikNewsEnded = (0, $7eio0.useUtilsStore)((state)=>state.retorikNewsEnded);
334
- const { setCurrentNewsActivity: setCurrentNewsActivity, setRetorikNewsEnded: setRetorikNewsEnded } = (0, $7eio0.useUtilsStore)((state)=>state.actions);
333
+ const addToStreamingQueue = (0, $jgaO0.useSpeechStore)((state)=>state.actions.addToStreamingQueue);
334
+ const setRetorikNewsEnded = (0, $7eio0.useUtilsStore)((state)=>state.actions.setRetorikNewsEnded);
335
335
  const sendEvent = (0, $6QoTL.useDirectlineStore)((state)=>state.actions.sendEvent);
336
336
  const [carouselGridRowStart, setCarouselGridRowStart] = (0, $4L16K$react.useState)();
337
337
  const [carouselGridRowSpan, setCarouselGridRowSpan] = (0, $4L16K$react.useState)();
@@ -455,8 +455,8 @@ const $d399eaf5da71d3d6$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
455
455
  ...activity,
456
456
  speak: `${textTitle}${textSubtitle}${currentNew.text}`
457
457
  };
458
- setCurrentNewsActivity(tempActivity);
459
- } else setCurrentNewsActivity(undefined);
458
+ addToStreamingQueue(tempActivity);
459
+ }
460
460
  }, [
461
461
  activity,
462
462
  current
@@ -579,6 +579,7 @@ const $24072221965576dd$var$Banner = ({ news: news, gridRowStart: gridRowStart,
579
579
  var _news_image;
580
580
  const translation = (0, $6Q0mk.useLocaleStore)((state)=>state.currentTranslations);
581
581
  const locale = (0, $6Q0mk.useLocaleStore)((state)=>state.localeForRetorikStudioContent);
582
+ const isRTL = (0, $6Q0mk.useLocaleStore)((state)=>state.isRTL);
582
583
  const isMobile = (0, $kUiCn.useViewStore)((state)=>state.isMobile);
583
584
  const currentWidth = (0, $kUiCn.useViewStore)((state)=>state.currentWidth);
584
585
  const newsConfiguration = (0, $kUiCn.useViewStore)((state)=>state.configurations.views.news);
@@ -618,6 +619,7 @@ const $24072221965576dd$var$Banner = ({ news: news, gridRowStart: gridRowStart,
618
619
  news
619
620
  ]);
620
621
  return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
622
+ dir: isRTL ? 'rtl' : 'ltr',
621
623
  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",
622
624
  style: {
623
625
  alignSelf: alignSelfEnd ? 'flex-end' : 'flex-start',
@@ -635,7 +637,8 @@ const $24072221965576dd$var$Banner = ({ news: news, gridRowStart: gridRowStart,
635
637
  subtitle: news.subtitle
636
638
  }),
637
639
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
638
- className: "rf-w-full ltr:rf-pr-4 rtl:rf-pl-4 rf-py-2 large:rf-py-4 rf-subtitle-size-auto rf-text-black rf-bg-white rf-overflow-clip",
640
+ dir: "ltr",
641
+ 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",
639
642
  style: {
640
643
  paddingLeft: currentWidth
641
644
  },
@@ -752,4 +755,4 @@ var $a94481e954312e6d$export$2e2bcd8739ae039 = $a94481e954312e6d$var$BannerTopLa
752
755
 
753
756
 
754
757
 
755
- //# sourceMappingURL=NewsContainer.932174e9.js.map
758
+ //# sourceMappingURL=NewsContainer.a91d9131.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 { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useViewStore } from '../Contexts/ViewContext'\r\nimport { useSpeechStore } from '../Contexts/SpeechContext'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\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 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, handleEndedWithoutloop }: NewsContainerProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const configuration = useRetorikStore((state) => state.configuration)\r\n const muted = useSpeechStore((state) => state.muted)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const isLandscape = useViewStore((state) => state.isLandscape)\r\n const isBorne = useViewStore((state) => state.isBorne)\r\n const configurations = useViewStore((state) => state.configurations)\r\n const { setRoute, setDisplayControls } = useViewStore((state) => state.actions)\r\n const setMuted = useSpeechStore((state) => state.actions.setMuted)\r\n const setDisplayAgentInNews = useRetorikStore((state) => state.actions.setDisplayAgentInNews)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\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: React.MutableRefObject<any> = useRef(null)\r\n const newsEndedTimerRef: React.MutableRefObject<any> = useRef(null)\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 setRoute(Routes.Home)\r\n }\r\n\r\n useEffect(() => {\r\n configuration.useOldRemote && setDisplayControls(false)\r\n muted && setMuted(false)\r\n\r\n return () => {\r\n // Send closing events unless we are using RetorikNews component\r\n if (!isRetorikNews) {\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowNews', null))\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 setDisplayAgentInNews(false)\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl ? setViewContextCurrentConfiguration(videoUrl as string) : setStep(Steps.news)\r\n break\r\n }\r\n case Steps.news:\r\n 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 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 setDisplayAgentInNews(false)\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl ? 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 && clearTimeout(timerRef.current)\r\n newsEndedTimerRef && 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 * - send the event 'newsEnded' used in retorik Kiosk\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 // Send event 'newsEnded'\r\n const endEvent = new Event('newsEnded')\r\n document.dispatchEvent(endEvent)\r\n // Relaunch from the start if this is a news-only component and loop hasn't explicitly been set to false\r\n isRetorikNews\r\n ? displayData.loop !== false\r\n ? setStep(Steps.news)\r\n : handleEndedWithoutloop\r\n ? handleEndedWithoutloop()\r\n : handleBack()\r\n : // Relaunch from the start if the loop is activated, otherwise get back to homepage\r\n displayData.loop\r\n ? setStep(Steps.news)\r\n : handleBack()\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 <React.Fragment>\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 && <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} className='rf-z-menu' showLabel={true} />}\r\n\r\n {!hideMenu && isBorne && !configuration.useOldRemote && !isRetorikNews && <MenuDisplayer hideMenu={configuration?.hideMenu} />}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default NewsContainer\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\n\r\ninterface TimeProps {\r\n belowReturnButton?: boolean\r\n}\r\n\r\nconst Time = ({ belowReturnButton }: TimeProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.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 { useViewStore } from '../Contexts/ViewContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\nimport { useSpeechStore } from '../Contexts/SpeechContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\n\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 { newsAttachments, activity } = useNews()\r\n const route = useViewStore((state) => state.route)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const newsConfiguration = useViewStore((state) => state.configurations.views.news)\r\n const currentDeviceType = useViewStore((state) => state.currentDeviceType)\r\n const retorikNewsEnded = useUtilsStore((state) => state.retorikNewsEnded)\r\n const addToStreamingQueue = useSpeechStore((state) => state.actions.addToStreamingQueue)\r\n const setRetorikNewsEnded = useUtilsStore((state) => state.actions.setRetorikNewsEnded)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\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: React.MutableRefObject<any> = useRef(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 sendEvent('news.getAllNews', null)\r\n }, 2000)\r\n }\r\n\r\n return (): void => {\r\n timerRef && 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 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 && 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 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 type { RetorikActivity } from '../models/activityTypes'\r\nimport { useActivityStore } from '../components/Contexts/ActivityContext'\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 = useActivityStore((state) => state.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(\r\n (act: any) => act.label !== 'Davi.BringupMessage'\r\n )\r\n\r\n const activity = filterBringUpActivities[\r\n filterBringUpActivities.length - 1\r\n ] 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 { useViewStore } from '../Contexts/ViewContext'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\n\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 = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.localeForRetorikStudioContent)\r\n const isRTL = useLocaleStore((state) => state.isRTL)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const currentWidth = useViewStore((state) => state.currentWidth)\r\n const newsConfiguration = useViewStore((state) => state.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 if (news.category) {\r\n return news.category\r\n } else if (newsConfiguration?.bannerTitleLocalized?.[locale]) {\r\n return newsConfiguration.bannerTitleLocalized[locale]\r\n } else if (newsConfiguration?.bannerTitle) {\r\n return newsConfiguration.bannerTitle\r\n }\r\n\r\n return translation.news.continuous\r\n }, [news, newsConfiguration, locale, 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 { useLocaleStore } from '../Contexts/LocaleContext'\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 = useLocaleStore((state) => state.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 { useLocaleStore } from '../Contexts/LocaleContext'\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 = useLocaleStore((state) => state.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.a91d9131.js.map","sourceRoot":"../"}
@@ -1,4 +1,4 @@
1
- import "./Weather.fb22fba3.js";
1
+ import "./Weather.cf58823d.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
 
@@ -87,10 +87,7 @@ const $aedc1e5f954603b8$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
87
87
  muted && setMuted(false);
88
88
  return ()=>{
89
89
  // Send closing events unless we are using RetorikNews component
90
- if (!isRetorikNews) {
91
- sendEvent('Davi.CloseWindow', null);
92
- sendEvent('Davi.CloseWindowNews', null);
93
- }
90
+ if (!isRetorikNews) sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowNews', null));
94
91
  };
95
92
  }, []);
96
93
  /**
@@ -197,12 +194,12 @@ const $aedc1e5f954603b8$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
197
194
  onVideoEnded: handleVideoEnd
198
195
  }),
199
196
  isMobile && !isRetorikNews && !hideMenu ? /*#__PURE__*/ (0, $7qgKV$jsxs)("div", {
200
- className: "rf-relative rf-z-util ltr:rf-col-start-1 rtl:rf-col-end-1 rf-col-span-full rf-row-start-1 rf-flex rf-flex-col rf-gap-2 rf-items-start",
197
+ 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",
201
198
  children: [
202
199
  /*#__PURE__*/ (0, $7qgKV$jsx)((0, $28ved.BackButton), {
203
200
  title: translation.common.back,
204
201
  handleBack: handleBack,
205
- className: "ltr:rf-pr-2 rtl:rf-pl-2 rf-mt-4 ltr:rf-ml-4 rtl:rf-mr-4 rf-text-size-auto rf-bg-truewhite rf-rounded-lg"
202
+ className: "rf-pr-2 rf-mt-4 rf-ml-4 rf-text-size-auto rf-bg-truewhite rf-rounded-lg"
206
203
  }),
207
204
  /*#__PURE__*/ (0, $7qgKV$jsx)((0, $hifTx.default), {
208
205
  belowReturnButton: true
@@ -268,9 +265,9 @@ const $c1e5018217fb7fb5$var$Time = ({ belowReturnButton: belowReturnButton })=>{
268
265
  return ()=>timerRef && clearInterval(timerRef.current);
269
266
  }, []);
270
267
  return /*#__PURE__*/ (0, $7qgKV$jsx)("div", {
271
- className: `rf-relative ${belowReturnButton ? 'ltr:rf-ml-4 rtl:rf-mr-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'}`,
268
+ 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'}`,
272
269
  children: /*#__PURE__*/ (0, $7qgKV$jsxs)("div", {
273
- className: "rf-w-fit rf-h-fit rf-flex rf-flex-col ltr:rf-justify-start rtl:rf-justify-end ltr:rf-items-start rtl:rf-items-end rf-text-white",
270
+ className: "rf-w-fit rf-h-fit rf-flex rf-flex-col rf-justify-start rf-items-start rf-text-white",
274
271
  children: [
275
272
  /*#__PURE__*/ (0, $7qgKV$jsx)("div", {
276
273
  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",
@@ -298,6 +295,8 @@ var $1Qww3 = parcelRequire("1Qww3");
298
295
 
299
296
  var $aNpqK = parcelRequire("aNpqK");
300
297
 
298
+ var $i1rfm = parcelRequire("i1rfm");
299
+
301
300
  var $j67YK = parcelRequire("j67YK");
302
301
 
303
302
  var $kThjX = parcelRequire("kThjX");
@@ -314,7 +313,8 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
314
313
  const newsConfiguration = (0, $1Qww3.useViewStore)((state)=>state.configurations.views.news);
315
314
  const currentDeviceType = (0, $1Qww3.useViewStore)((state)=>state.currentDeviceType);
316
315
  const retorikNewsEnded = (0, $j67YK.useUtilsStore)((state)=>state.retorikNewsEnded);
317
- const { setCurrentNewsActivity: setCurrentNewsActivity, setRetorikNewsEnded: setRetorikNewsEnded } = (0, $j67YK.useUtilsStore)((state)=>state.actions);
316
+ const addToStreamingQueue = (0, $i1rfm.useSpeechStore)((state)=>state.actions.addToStreamingQueue);
317
+ const setRetorikNewsEnded = (0, $j67YK.useUtilsStore)((state)=>state.actions.setRetorikNewsEnded);
318
318
  const sendEvent = (0, $aNpqK.useDirectlineStore)((state)=>state.actions.sendEvent);
319
319
  const [carouselGridRowStart, setCarouselGridRowStart] = (0, $7qgKV$useState)();
320
320
  const [carouselGridRowSpan, setCarouselGridRowSpan] = (0, $7qgKV$useState)();
@@ -434,8 +434,8 @@ const $c6bafeb4a00d3b53$var$News = ({ intervalInSeconds: intervalInSeconds = 3,
434
434
  ...activity,
435
435
  speak: `${textTitle}${textSubtitle}${currentNew.text}`
436
436
  };
437
- setCurrentNewsActivity(tempActivity);
438
- } else setCurrentNewsActivity(undefined);
437
+ addToStreamingQueue(tempActivity);
438
+ }
439
439
  }, [
440
440
  activity,
441
441
  current
@@ -555,6 +555,7 @@ var $6q7hI = parcelRequire("6q7hI");
555
555
  const $de1f380ff3be314f$var$Banner = ({ news: news, gridRowStart: gridRowStart, gridRowSpan: gridRowSpan, alignSelfEnd: alignSelfEnd })=>{
556
556
  const translation = (0, $2fuDN.useLocaleStore)((state)=>state.currentTranslations);
557
557
  const locale = (0, $2fuDN.useLocaleStore)((state)=>state.localeForRetorikStudioContent);
558
+ const isRTL = (0, $2fuDN.useLocaleStore)((state)=>state.isRTL);
558
559
  const isMobile = (0, $1Qww3.useViewStore)((state)=>state.isMobile);
559
560
  const currentWidth = (0, $1Qww3.useViewStore)((state)=>state.currentWidth);
560
561
  const newsConfiguration = (0, $1Qww3.useViewStore)((state)=>state.configurations.views.news);
@@ -593,6 +594,7 @@ const $de1f380ff3be314f$var$Banner = ({ news: news, gridRowStart: gridRowStart,
593
594
  news
594
595
  ]);
595
596
  return /*#__PURE__*/ (0, $7qgKV$jsxs)("div", {
597
+ dir: isRTL ? 'rtl' : 'ltr',
596
598
  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",
597
599
  style: {
598
600
  alignSelf: alignSelfEnd ? 'flex-end' : 'flex-start',
@@ -610,7 +612,8 @@ const $de1f380ff3be314f$var$Banner = ({ news: news, gridRowStart: gridRowStart,
610
612
  subtitle: news.subtitle
611
613
  }),
612
614
  /*#__PURE__*/ (0, $7qgKV$jsx)("div", {
613
- className: "rf-w-full ltr:rf-pr-4 rtl:rf-pl-4 rf-py-2 large:rf-py-4 rf-subtitle-size-auto rf-text-black rf-bg-white rf-overflow-clip",
615
+ dir: "ltr",
616
+ 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",
614
617
  style: {
615
618
  paddingLeft: currentWidth
616
619
  },
@@ -727,4 +730,4 @@ var $5485971f80937390$export$2e2bcd8739ae039 = $5485971f80937390$var$BannerTopLa
727
730
 
728
731
 
729
732
 
730
- //# sourceMappingURL=NewsContainer.67f04b19.js.map
733
+ //# sourceMappingURL=NewsContainer.f0d2ee9c.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 { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useViewStore } from '../Contexts/ViewContext'\r\nimport { useSpeechStore } from '../Contexts/SpeechContext'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\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 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, handleEndedWithoutloop }: NewsContainerProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const configuration = useRetorikStore((state) => state.configuration)\r\n const muted = useSpeechStore((state) => state.muted)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const isLandscape = useViewStore((state) => state.isLandscape)\r\n const isBorne = useViewStore((state) => state.isBorne)\r\n const configurations = useViewStore((state) => state.configurations)\r\n const { setRoute, setDisplayControls } = useViewStore((state) => state.actions)\r\n const setMuted = useSpeechStore((state) => state.actions.setMuted)\r\n const setDisplayAgentInNews = useRetorikStore((state) => state.actions.setDisplayAgentInNews)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\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: React.MutableRefObject<any> = useRef(null)\r\n const newsEndedTimerRef: React.MutableRefObject<any> = useRef(null)\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 setRoute(Routes.Home)\r\n }\r\n\r\n useEffect(() => {\r\n configuration.useOldRemote && setDisplayControls(false)\r\n muted && setMuted(false)\r\n\r\n return () => {\r\n // Send closing events unless we are using RetorikNews component\r\n if (!isRetorikNews) {\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowNews', null))\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 setDisplayAgentInNews(false)\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl ? setViewContextCurrentConfiguration(videoUrl as string) : setStep(Steps.news)\r\n break\r\n }\r\n case Steps.news:\r\n 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 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 setDisplayAgentInNews(false)\r\n const videoUrl = configurations.views.news?.openingVideo\r\n videoUrl ? 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 && clearTimeout(timerRef.current)\r\n newsEndedTimerRef && 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 * - send the event 'newsEnded' used in retorik Kiosk\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 // Send event 'newsEnded'\r\n const endEvent = new Event('newsEnded')\r\n document.dispatchEvent(endEvent)\r\n // Relaunch from the start if this is a news-only component and loop hasn't explicitly been set to false\r\n isRetorikNews\r\n ? displayData.loop !== false\r\n ? setStep(Steps.news)\r\n : handleEndedWithoutloop\r\n ? handleEndedWithoutloop()\r\n : handleBack()\r\n : // Relaunch from the start if the loop is activated, otherwise get back to homepage\r\n displayData.loop\r\n ? setStep(Steps.news)\r\n : handleBack()\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 <React.Fragment>\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 && <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} className='rf-z-menu' showLabel={true} />}\r\n\r\n {!hideMenu && isBorne && !configuration.useOldRemote && !isRetorikNews && <MenuDisplayer hideMenu={configuration?.hideMenu} />}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default NewsContainer\r\n","import React, { useEffect, useState, useRef } from 'react'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\n\r\ninterface TimeProps {\r\n belowReturnButton?: boolean\r\n}\r\n\r\nconst Time = ({ belowReturnButton }: TimeProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.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 { useViewStore } from '../Contexts/ViewContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\nimport { useSpeechStore } from '../Contexts/SpeechContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\n\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 { newsAttachments, activity } = useNews()\r\n const route = useViewStore((state) => state.route)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const newsConfiguration = useViewStore((state) => state.configurations.views.news)\r\n const currentDeviceType = useViewStore((state) => state.currentDeviceType)\r\n const retorikNewsEnded = useUtilsStore((state) => state.retorikNewsEnded)\r\n const addToStreamingQueue = useSpeechStore((state) => state.actions.addToStreamingQueue)\r\n const setRetorikNewsEnded = useUtilsStore((state) => state.actions.setRetorikNewsEnded)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\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: React.MutableRefObject<any> = useRef(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 sendEvent('news.getAllNews', null)\r\n }, 2000)\r\n }\r\n\r\n return (): void => {\r\n timerRef && 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 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 && 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 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 type { RetorikActivity } from '../models/activityTypes'\r\nimport { useActivityStore } from '../components/Contexts/ActivityContext'\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 = useActivityStore((state) => state.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(\r\n (act: any) => act.label !== 'Davi.BringupMessage'\r\n )\r\n\r\n const activity = filterBringUpActivities[\r\n filterBringUpActivities.length - 1\r\n ] 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 { useViewStore } from '../Contexts/ViewContext'\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\n\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 = useLocaleStore((state) => state.currentTranslations)\r\n const locale = useLocaleStore((state) => state.localeForRetorikStudioContent)\r\n const isRTL = useLocaleStore((state) => state.isRTL)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const currentWidth = useViewStore((state) => state.currentWidth)\r\n const newsConfiguration = useViewStore((state) => state.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 if (news.category) {\r\n return news.category\r\n } else if (newsConfiguration?.bannerTitleLocalized?.[locale]) {\r\n return newsConfiguration.bannerTitleLocalized[locale]\r\n } else if (newsConfiguration?.bannerTitle) {\r\n return newsConfiguration.bannerTitle\r\n }\r\n\r\n return translation.news.continuous\r\n }, [news, newsConfiguration, locale, 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 { useLocaleStore } from '../Contexts/LocaleContext'\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 = useLocaleStore((state) => state.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 { useLocaleStore } from '../Contexts/LocaleContext'\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 = useLocaleStore((state) => state.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.f0d2ee9c.js.map"}
@@ -70,8 +70,7 @@ const $becba6a72493aae8$var$Weather = ({ handleClose: handleClose })=>{
70
70
  * On call :
71
71
  * - set RetorikContext's displayWeather state to false
72
72
  */ const handleBack = ()=>{
73
- sendEvent('Davi.CloseWindow', null);
74
- sendEvent('Davi.CloseWindowWeather', null);
73
+ sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowWeather', null));
75
74
  handleClose ? handleClose() : setCurrentSubView((0, $7WHA7.CurrentSubView).none);
76
75
  };
77
76
  return isMobile ? /*#__PURE__*/ (0, $avS3e$reactjsxruntime.jsxs)((0, $a3uH3.FullScreenMobile), {
@@ -279,4 +278,4 @@ var $ca477ffba32efc70$export$2e2bcd8739ae039 = $ca477ffba32efc70$var$OpenMeteoAt
279
278
 
280
279
 
281
280
 
282
- //# sourceMappingURL=Weather.661c2cac.js.map
281
+ //# sourceMappingURL=Weather.99917b66.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/components/Weather/Weather.tsx","src/components/Utils/SubView/MobileTopContainer.tsx","src/components/Utils/SubView/MobileIconAndTitle.tsx","src/components/Utils/SubView/LargeIconAndTitle.tsx","src/components/Weather/OpenMeteoAttribution.tsx"],"sourcesContent":["import React from 'react'\r\nimport WeatherContent from '@davi-ai/retorik-weather'\r\n\r\nimport { useLocaleStore } from '../Contexts/LocaleContext'\r\nimport { useUtilsStore } from '../Contexts/UtilsContext'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport { useViewStore } from '../Contexts/ViewContext'\r\nimport { useDirectlineStore } from '../Contexts/DirectlineContext'\r\n\r\nimport { AvailableViews, CurrentSubView, Depth } from '../../models/enums'\r\n\r\nimport { FullScreen, FullScreenMobile } from '../Templates'\r\nimport MobileTopContainer from '../Utils/SubView/MobileTopContainer'\r\nimport LargeIconAndTitle from '../Utils/SubView/LargeIconAndTitle'\r\nimport AbsoluteLargeClosingButton from '../Utils/SubView/AbsoluteLargeClosingButton'\r\nimport OpenMeteoAttribution from './OpenMeteoAttribution'\r\n\r\ninterface WeatherProps {\r\n handleClose?: () => void\r\n}\r\n\r\nconst Weather = ({ handleClose }: WeatherProps): JSX.Element => {\r\n const locale = useLocaleStore((state) => state.locale)\r\n const configuration = useRetorikStore((state) => state.configuration)\r\n const currentDeviceType = useViewStore((state) => state.currentDeviceType)\r\n const isMobile = useViewStore((state) => state.isMobile)\r\n const setCurrentSubView = useUtilsStore((state) => state.actions.setCurrentSubView)\r\n const sendEvent = useDirectlineStore((state) => state.actions.sendEvent)\r\n\r\n /**\r\n * On call :\r\n * - set RetorikContext's displayWeather state to false\r\n */\r\n const handleBack = (): void => {\r\n sendEvent('Davi.CloseWindow', null, () => sendEvent('Davi.CloseWindowWeather', null))\r\n handleClose ? handleClose() : setCurrentSubView(CurrentSubView.none)\r\n }\r\n\r\n return isMobile ? (\r\n <FullScreenMobile depth={Depth.dropdown} background='#FFFFFF'>\r\n {/* Top container : back button + weather icon + title */}\r\n <MobileTopContainer subView={AvailableViews.weather} className='rf-border-b rf-border-b-menuBorder' handleBack={handleBack} />\r\n\r\n {/* Weather data */}\r\n <WeatherContent\r\n locale={locale}\r\n deviceType={currentDeviceType}\r\n position={{\r\n latitude: configuration.position?.latitude || 0,\r\n longitude: configuration.position?.longitude || 0\r\n }}\r\n />\r\n\r\n <OpenMeteoAttribution />\r\n </FullScreenMobile>\r\n ) : (\r\n <FullScreen depth={Depth.dropdown} background='linear-gradient(to right bottom, #F2F8F8FC , #F2E1E2E8)' onClick={handleBack}>\r\n <div className='rf-h-full rf-w-full rf-flex rf-flex-col rf-items-center'>\r\n {/* Weather icon + text */}\r\n <LargeIconAndTitle subView={AvailableViews.weather} />\r\n\r\n {/* Weather data */}\r\n <WeatherContent\r\n locale={locale}\r\n deviceType={currentDeviceType}\r\n position={{\r\n latitude: configuration.position?.latitude || 0,\r\n longitude: configuration.position?.longitude || 0\r\n }}\r\n />\r\n\r\n <OpenMeteoAttribution />\r\n </div>\r\n\r\n {/* Closing button */}\r\n <AbsoluteLargeClosingButton dashboardVisible={true} onClick={handleBack} />\r\n </FullScreen>\r\n )\r\n}\r\n\r\nexport default Weather\r\n","import React from 'react'\r\nimport { useLocaleStore } from '../../Contexts/LocaleContext'\r\nimport { BackButton } from '../../Menu/Common'\r\nimport MobileIconAndTitle from './MobileIconAndTitle'\r\n\r\ninterface MobileTopContainerProps {\r\n subView?: number\r\n className?: string\r\n handleBack: () => void\r\n}\r\n\r\nconst MobileTopContainer = ({\r\n subView,\r\n className,\r\n handleBack\r\n}: MobileTopContainerProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n\r\n return (\r\n <React.Fragment>\r\n <BackButton\r\n title={translation.common.back}\r\n className='rf-text-sm'\r\n handleBack={handleBack}\r\n />\r\n {subView && (\r\n <MobileIconAndTitle subView={subView} className={className} />\r\n )}\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default MobileTopContainer\r\n","import React from 'react'\r\nimport { AvailableViews } from '../../../models/enums'\r\nimport { useLocaleStore } from '../../Contexts/LocaleContext'\r\nimport * as Icons from '../../Icons/ViewIcons'\r\n\r\ninterface MobileIconAndTitleProps {\r\n subView: number\r\n className?: string\r\n}\r\n\r\nconst iconClassname = 'rf-h-8 rf-w-8'\r\n\r\nconst MobileIconAndTitle = ({\r\n subView,\r\n className\r\n}: MobileIconAndTitleProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n\r\n return (\r\n <div\r\n className={`large:rf-hidden rf-py-2 rf-flex rf-flex-row rf-items-end ${className}`}\r\n >\r\n {/* Icon */}\r\n {subView === AvailableViews.weather ? (\r\n <Icons.WeatherIcon className={iconClassname} />\r\n ) : subView === AvailableViews.emergency ? (\r\n <Icons.EmergencyIcon className={iconClassname} />\r\n ) : (\r\n <React.Fragment />\r\n )}\r\n {/* Title */}\r\n <div className='rf-ml-2 rf-capitalize rf-subtitle-size-auto'>\r\n {translation[subView]}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default MobileIconAndTitle\r\n","import React from 'react'\r\nimport { AvailableViews } from '../../../models/enums'\r\nimport { useLocaleStore } from '../../Contexts/LocaleContext'\r\nimport * as Icons from '../../Icons/ViewIcons'\r\n\r\ninterface LargeIconAndTitleProps {\r\n subView: number\r\n className?: string\r\n}\r\n\r\nconst iconClassname =\r\n 'rf-h-16 rf-w-16 large-vertical:rf-h-24 large-vertical:rf-w-24'\r\n\r\nconst LargeIconAndTitle = ({\r\n subView,\r\n className\r\n}: LargeIconAndTitleProps): JSX.Element => {\r\n const translation = useLocaleStore((state) => state.currentTranslations)\r\n\r\n return (\r\n <div\r\n className={`rf-hidden large:rf-flex rf-w-full rf-pt-4 large-vertical:rf-pt-8 rf-pl-4 large-vertical:rf-pl-0 rf-flex-row rf-justify-start large-vertical:rf-justify-center rf-items-center ${className}`}\r\n >\r\n {/* Icon */}\r\n {subView === AvailableViews.weather ? (\r\n <Icons.WeatherIcon className={iconClassname} />\r\n ) : subView === AvailableViews.emergency ? (\r\n <Icons.EmergencyIcon className={iconClassname} />\r\n ) : (\r\n <React.Fragment />\r\n )}\r\n {/* Title */}\r\n <div className='rf-ml-2 rf-uppercase rf-text-[#575F6B] rf-subtitle-size-auto'>\r\n {translation[subView]}\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default LargeIconAndTitle\r\n","import React, { useEffect, useState } from 'react'\r\nimport QRCode from 'qrcode'\r\nimport { useRetorikStore } from '../Contexts/RetorikContext'\r\nimport QRCodeComponent from '../Utils/QRCodeComponent'\r\n\r\nconst OpenMeteoAttribution = (): JSX.Element => {\r\n const isUsedOnBorne = useRetorikStore(\r\n (state) => state.configuration.isUsedOnBorne\r\n )\r\n const [qrCodeData, setQrCodeData] = useState<string>()\r\n const [showQrCode, setShowQrCode] = useState<boolean>(false)\r\n\r\n const setQrCodeDataAsync = async (): Promise<void> => {\r\n const qrCodeString = await QRCode.toDataURL('https://open-meteo.com/')\r\n setQrCodeData(qrCodeString)\r\n }\r\n\r\n useEffect(() => {\r\n isUsedOnBorne && setQrCodeDataAsync()\r\n }, [isUsedOnBorne])\r\n\r\n const handleClick = (): void => {\r\n setShowQrCode((current) => !current)\r\n }\r\n\r\n return (\r\n <div className='rf-w-full rf-py-2 rf-flex rf-justify-center'>\r\n {isUsedOnBorne ? (\r\n <React.Fragment>\r\n <div\r\n className='rf-relative rf-text-sm hover:rf-cursor-pointer'\r\n onClick={handleClick}\r\n >\r\n Weather data by Open-Meteo.com\r\n {showQrCode && qrCodeData ? (\r\n <div className='rf-absolute rf-left-1/2 rf-top-0 -rf-translate-x-1/2 -rf-translate-y-full'>\r\n <QRCodeComponent src={qrCodeData} />\r\n </div>\r\n ) : (\r\n <React.Fragment />\r\n )}\r\n </div>\r\n </React.Fragment>\r\n ) : (\r\n <a\r\n href='https://open-meteo.com/'\r\n target='_blank'\r\n rel='noreferrer noopener'\r\n className='rf-text-sm'\r\n >\r\n Weather data by open-meteo.com\r\n </a>\r\n )}\r\n </div>\r\n )\r\n}\r\n\r\nexport default OpenMeteoAttribution\r\n"],"names":[],"version":3,"file":"Weather.99917b66.js.map","sourceRoot":"../"}
@@ -56,8 +56,7 @@ const $c2365f1c5aa7ab18$var$Weather = ({ handleClose: handleClose })=>{
56
56
  * On call :
57
57
  * - set RetorikContext's displayWeather state to false
58
58
  */ const handleBack = ()=>{
59
- sendEvent('Davi.CloseWindow', null);
60
- sendEvent('Davi.CloseWindowWeather', null);
59
+ sendEvent('Davi.CloseWindow', null, ()=>sendEvent('Davi.CloseWindowWeather', null));
61
60
  handleClose ? handleClose() : setCurrentSubView((0, $4ucVo.CurrentSubView).none);
62
61
  };
63
62
  return isMobile ? /*#__PURE__*/ (0, $cCOLM$jsxs)((0, $gQ55S.FullScreenMobile), {
@@ -265,4 +264,4 @@ var $954e5588fc9f219b$export$2e2bcd8739ae039 = $954e5588fc9f219b$var$OpenMeteoAt
265
264
 
266
265
 
267
266
 
268
- //# sourceMappingURL=Weather.fb22fba3.js.map
267
+ //# sourceMappingURL=Weather.cf58823d.js.map