@davi-ai/retorik-framework 3.2.4 → 3.2.6

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 (36) hide show
  1. package/README.md +1 -1
  2. package/dist/{AttachmentDetail.cfd86776.js → AttachmentDetail.0a576bf3.js} +11 -11
  3. package/dist/AttachmentDetail.0a576bf3.js.map +1 -0
  4. package/dist/{AttachmentDetail.fdcd1737.js → AttachmentDetail.c4286a45.js} +11 -11
  5. package/dist/AttachmentDetail.c4286a45.js.map +1 -0
  6. package/dist/{CustomView.c24a0e74.js → CustomView.913a9f32.js} +5 -5
  7. package/dist/{CustomView.c24a0e74.js.map → CustomView.913a9f32.js.map} +1 -1
  8. package/dist/{CustomView.ba7af9b6.js → CustomView.edf84de1.js} +5 -5
  9. package/dist/{CustomView.ba7af9b6.js.map → CustomView.edf84de1.js.map} +1 -1
  10. package/dist/{Emergency.0cf005ce.js → Emergency.1f855b66.js} +17 -1
  11. package/dist/Emergency.1f855b66.js.map +1 -0
  12. package/dist/{Emergency.897ee3c7.js → Emergency.cd492aab.js} +17 -1
  13. package/dist/Emergency.cd492aab.js.map +1 -0
  14. package/dist/{NewsContainer.05bb1b19.js → NewsContainer.24a4ba84.js} +10 -7
  15. package/dist/NewsContainer.24a4ba84.js.map +1 -0
  16. package/dist/{NewsContainer.5e80336b.js → NewsContainer.76f5b60f.js} +10 -7
  17. package/dist/NewsContainer.76f5b60f.js.map +1 -0
  18. package/dist/{Weather.cf58823d.js → Weather.87ab2128.js} +10 -2
  19. package/dist/Weather.87ab2128.js.map +1 -0
  20. package/dist/{Weather.99917b66.js → Weather.8d8aa06a.js} +10 -1
  21. package/dist/Weather.8d8aa06a.js.map +1 -0
  22. package/dist/index.d.ts +22 -17
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1214 -1586
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.modern.js +1198 -1580
  27. package/dist/index.modern.js.map +1 -1
  28. package/package.json +3 -3
  29. package/dist/AttachmentDetail.cfd86776.js.map +0 -1
  30. package/dist/AttachmentDetail.fdcd1737.js.map +0 -1
  31. package/dist/Emergency.0cf005ce.js.map +0 -1
  32. package/dist/Emergency.897ee3c7.js.map +0 -1
  33. package/dist/NewsContainer.05bb1b19.js.map +0 -1
  34. package/dist/NewsContainer.5e80336b.js.map +0 -1
  35. package/dist/Weather.99917b66.js.map +0 -1
  36. package/dist/Weather.cf58823d.js.map +0 -1
@@ -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.24a4ba84.js.map"}
@@ -1,4 +1,4 @@
1
- require("./Weather.99917b66.js");
1
+ require("./Weather.8d8aa06a.js");
2
2
  var $4L16K$reactjsxruntime = require("react/jsx-runtime");
3
3
  var $4L16K$react = require("react");
4
4
 
@@ -211,12 +211,12 @@ const $39527ef13f22f094$var$NewsContainer = ({ hideMenu: hideMenu, isRetorikNews
211
211
  onVideoEnded: handleVideoEnd
212
212
  }),
213
213
  isMobile && !isRetorikNews && !hideMenu ? /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
214
- 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",
215
215
  children: [
216
216
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $7v7LH.BackButton), {
217
217
  title: translation.common.back,
218
218
  handleBack: handleBack,
219
- 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"
220
220
  }),
221
221
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)((0, $dMQiv.default), {
222
222
  belowReturnButton: true
@@ -282,9 +282,9 @@ const $01d9bb41fd368021$var$Time = ({ belowReturnButton: belowReturnButton })=>{
282
282
  return ()=>timerRef && clearInterval(timerRef.current);
283
283
  }, []);
284
284
  return /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
285
- 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'}`,
286
286
  children: /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsxs)("div", {
287
- 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",
288
288
  children: [
289
289
  /*#__PURE__*/ (0, $4L16K$reactjsxruntime.jsx)("div", {
290
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",
@@ -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.5e80336b.js.map
758
+ //# sourceMappingURL=NewsContainer.76f5b60f.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.76f5b60f.js.map","sourceRoot":"../"}
@@ -1,5 +1,5 @@
1
1
  import {jsxs as $cCOLM$jsxs, jsx as $cCOLM$jsx} from "react/jsx-runtime";
2
- import $cCOLM$react, {useState as $cCOLM$useState, useEffect as $cCOLM$useEffect} from "react";
2
+ import $cCOLM$react, {useLayoutEffect as $cCOLM$useLayoutEffect, useState as $cCOLM$useState, useEffect as $cCOLM$useEffect} from "react";
3
3
  import $cCOLM$daviairetorikweather from "@davi-ai/retorik-weather";
4
4
  import $cCOLM$qrcode from "qrcode";
5
5
 
@@ -52,6 +52,14 @@ const $c2365f1c5aa7ab18$var$Weather = ({ handleClose: handleClose })=>{
52
52
  const isMobile = (0, $1Qww3.useViewStore)((state)=>state.isMobile);
53
53
  const setCurrentSubView = (0, $j67YK.useUtilsStore)((state)=>state.actions.setCurrentSubView);
54
54
  const sendEvent = (0, $aNpqK.useDirectlineStore)((state)=>state.actions.sendEvent);
55
+ (0, $cCOLM$useLayoutEffect)(()=>{
56
+ if (!configuration.position?.latitude || !configuration.position?.longitude) {
57
+ console.log('Retorik Framework > asked for weather display but no position data given');
58
+ setCurrentSubView((0, $4ucVo.CurrentSubView).none);
59
+ }
60
+ }, [
61
+ configuration.position
62
+ ]);
55
63
  /**
56
64
  * On call :
57
65
  * - set RetorikContext's displayWeather state to false
@@ -264,4 +272,4 @@ var $954e5588fc9f219b$export$2e2bcd8739ae039 = $954e5588fc9f219b$var$OpenMeteoAt
264
272
 
265
273
 
266
274
 
267
- //# sourceMappingURL=Weather.cf58823d.js.map
275
+ //# sourceMappingURL=Weather.87ab2128.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, { useLayoutEffect } 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 useLayoutEffect(() => {\r\n if (!configuration.position?.latitude || !configuration.position?.longitude) {\r\n console.log('Retorik Framework > asked for weather display but no position data given')\r\n setCurrentSubView(CurrentSubView.none)\r\n }\r\n }, [configuration.position])\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.87ab2128.js.map"}
@@ -66,6 +66,15 @@ const $becba6a72493aae8$var$Weather = ({ handleClose: handleClose })=>{
66
66
  const isMobile = (0, $kUiCn.useViewStore)((state)=>state.isMobile);
67
67
  const setCurrentSubView = (0, $7eio0.useUtilsStore)((state)=>state.actions.setCurrentSubView);
68
68
  const sendEvent = (0, $6QoTL.useDirectlineStore)((state)=>state.actions.sendEvent);
69
+ (0, $avS3e$react.useLayoutEffect)(()=>{
70
+ var _configuration_position, _configuration_position1;
71
+ if (!((_configuration_position = configuration.position) === null || _configuration_position === void 0 ? void 0 : _configuration_position.latitude) || !((_configuration_position1 = configuration.position) === null || _configuration_position1 === void 0 ? void 0 : _configuration_position1.longitude)) {
72
+ console.log('Retorik Framework > asked for weather display but no position data given');
73
+ setCurrentSubView((0, $7WHA7.CurrentSubView).none);
74
+ }
75
+ }, [
76
+ configuration.position
77
+ ]);
69
78
  /**
70
79
  * On call :
71
80
  * - set RetorikContext's displayWeather state to false
@@ -278,4 +287,4 @@ var $ca477ffba32efc70$export$2e2bcd8739ae039 = $ca477ffba32efc70$var$OpenMeteoAt
278
287
 
279
288
 
280
289
 
281
- //# sourceMappingURL=Weather.99917b66.js.map
290
+ //# sourceMappingURL=Weather.8d8aa06a.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, { useLayoutEffect } 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 useLayoutEffect(() => {\r\n if (!configuration.position?.latitude || !configuration.position?.longitude) {\r\n console.log('Retorik Framework > asked for weather display but no position data given')\r\n setCurrentSubView(CurrentSubView.none)\r\n }\r\n }, [configuration.position])\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.8d8aa06a.js.map","sourceRoot":"../"}
package/dist/index.d.ts CHANGED
@@ -235,7 +235,6 @@ export interface Configuration extends RetorikMenusConfiguration {
235
235
  disableSound?: boolean;
236
236
  timerForFilterSelectionListMode?: number;
237
237
  useOldRemote?: boolean;
238
- showTemporaryBanner?: boolean;
239
238
  preventVirtualKeyboard?: boolean;
240
239
  channelData?: Record<string, string | number | boolean | Array<string | number> | Record<string, any>>;
241
240
  }
@@ -427,9 +426,12 @@ export type AgentData = null | {
427
426
  useBodyEngineThree: boolean;
428
427
  };
429
428
  export interface PonyfillFactoryCredentials {
430
- region: string;
429
+ region?: string;
431
430
  subscriptionKey?: string;
432
431
  authorizationToken?: string;
432
+ speechRecognitionHostnamesRecord?: Record<string, string>;
433
+ speechRecognitionHostname?: string;
434
+ speechSynthesisHostname?: string;
433
435
  }
434
436
  export interface AddressData {
435
437
  baseURI?: string;
@@ -675,6 +677,21 @@ interface TranslationFile extends TranslationViews {
675
677
  anghello: TranslationAnghello;
676
678
  microphone: TranslationMicrophone;
677
679
  }
680
+ export const characters: {
681
+ alice: string;
682
+ greg: string;
683
+ jeanmarc: string;
684
+ jessica: string;
685
+ jessica_short: string;
686
+ ikaa: string;
687
+ karine: string;
688
+ lea: string;
689
+ prosper: string;
690
+ raphael: string;
691
+ rowan: string;
692
+ rowan_short: string;
693
+ zahra: string;
694
+ };
678
695
  interface CommonColors {
679
696
  primary: string;
680
697
  secondary: string;
@@ -851,21 +868,6 @@ export interface RetorikThemeColors {
851
868
  };
852
869
  };
853
870
  }
854
- export const characters: {
855
- alice: string;
856
- greg: string;
857
- jeanmarc: string;
858
- jessica: string;
859
- jessica_short: string;
860
- ikaa: string;
861
- karine: string;
862
- lea: string;
863
- prosper: string;
864
- raphael: string;
865
- rowan: string;
866
- rowan_short: string;
867
- zahra: string;
868
- };
869
871
  export const CONTENT_TYPE_ADAPTIVE_CARD = "application/vnd.microsoft.card.adaptive";
870
872
  export const CONTENT_TYPE_NEWS = "application/vnd.davi.retorik.card.news";
871
873
  export const CONTENT_TYPE_POI = "application/vnd.davi.retorik.card.poi";
@@ -933,6 +935,9 @@ export const showAgent: (instanceId?: string) => void;
933
935
  export const hideAgent: (instanceId?: string) => void;
934
936
  export const setCurrentCustomView: (value: CustomMenu, instanceId?: string) => void;
935
937
  export const setCurrentSubView: (value: number, instanceId?: string) => void;
938
+ /**
939
+ * deprecated since v3.2.6
940
+ */
936
941
  export const sendActivity: (value: RetorikActivity | undefined, instanceId?: string) => void;
937
942
  export const addDetailedAttachmentTrigger: (value: DetailedAttachmentAction, instanceId?: string) => void;
938
943
  export const setModalFullscreenContent: (value: JSX.Element | null, instanceId?: string) => void;