react-covideo-embed 1.0.82-test.2 → 1.0.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +56 -0
- package/build/index.js +623 -623
- package/build/index.js.map +1 -1
- package/build/react-covideo-embed.esm.js +6082 -6105
- package/build/react-covideo-embed.esm.js.map +1 -1
- package/dist/app/pages/preview/PreviewVideoPlayer.d.ts +1 -0
- package/dist/app/pages/recordv1/ChooseRecordingOptions.d.ts +2 -1
- package/dist/app/pages/recordv1/ModalRecordingVideoSettings.d.ts +2 -1
- package/dist/app/pages/recordv1/RecordCam.d.ts +3 -1
- package/dist/app/pages/recordv1/RecordingHeadingWithRouteGuard.d.ts +2 -1
- package/dist/app/pages/recordv1/detailsPreview/DetailsPreview.d.ts +1 -1
- package/dist/app/pages/recordv1/detailsPreview/types.d.ts +2 -1
- package/dist/index.d.ts +24 -0
- package/dist/lib/api/analytics/index.d.ts +3 -0
- package/dist/lib/api/analytics/types.d.ts +19 -0
- package/dist/lib/api/analytics/useUpdateStatsHotspotMutation.d.ts +3 -0
- package/dist/lib/api/analytics/useUpdateViewMutation.d.ts +3 -0
- package/dist/lib/api/analytics/utils.d.ts +1 -0
- package/dist/lib/api/index.d.ts +1 -0
- package/dist/lib/context/ConfigurationContext.d.ts +7 -1
- package/package.json +42 -37
- package/.vscode/settings.json +0 -12
- package/dist/index.js +0 -4567
- package/dist/index.js.map +0 -1
- package/dist/react-covideo-embed.css +0 -1
- package/dist/react-covideo-embed.esm.js +0 -18407
- package/dist/react-covideo-embed.esm.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-covideo-embed.esm.js","sources":["../src/lib/config.ts","../src/lib/utils/functions.ts","../src/lib/context/ConfigurationContext.tsx","../src/lib/api/authApi.ts","../src/lib/const/Folder.tsx","../src/lib/api/videosApi.tsx","../src/lib/api/inventoryApi.ts","../src/lib/api/videoRequestApi.ts","../src/lib/api/voiceOverApi.ts","../src/lib/api/wtvApi.ts","../src/lib/api/attributesApi.tsx","../src/lib/images/CovideoLogo.svg?react","../src/lib/images/CovideoLogo.jsx","../src/lib/images/cdkLogo.svg?react","../src/lib/images/CdkLogo.jsx","../src/lib/components/Logo.tsx","../src/lib/style/theme.ts","../src/lib/components/TopBar.tsx","../src/lib/components/Container.tsx","../src/lib/components/Input.tsx","../src/lib/components/ButtonDropdown.tsx","../src/lib/components/Spinner.tsx","../src/lib/components/LoadingIndicator.tsx","../src/lib/context/authReducer.ts","../src/lib/context/AuthorizationContext.tsx","../src/lib/const/AutomotiveRole.tsx","../src/lib/const/MarkAsSentOptions.tsx","../src/lib/utils/automotiveRolePermissionChecks.tsx","../src/lib/components/CheckboxInput.tsx","../src/lib/components/inputs/RadioInput.tsx","../src/lib/components/modal/Modal.tsx","../src/lib/components/CloseButton.tsx","../src/lib/components/toast-notifications/ToastNotification.tsx","../src/lib/components/toast-notifications/index.jsx","../src/lib/components/MainWrapper.tsx","../src/lib/components/ButtonSwitch.tsx","../src/lib/components/NewTextInput.tsx","../src/lib/const/VideoActivity.ts","../src/lib/images/close.svg?react","../src/lib/images/CloseIcon.jsx","../src/lib/components/modal/ModalQuickShareMarkAsSent.tsx","../src/app/pages/library/components/const.ts","../src/lib/api/quckshareApi.tsx","../src/lib/hooks/useCopyClipboard.ts","../src/lib/hooks/query/markAsSent/useQuickShareMarkAsSentMutation.tsx","../src/lib/hooks/useQuickShare.tsx","../src/lib/hooks/useImageLoadRetry.tsx","../src/lib/const/VideoStatus.tsx","../src/lib/hooks/useVideoLoadRetry.tsx","../src/app/pages/library/components/VideoItemThumbnail.tsx","../src/lib/utils/UseOnClickOutside.jsx","../src/lib/components/modals/Modal.tsx","../src/app/pages/video/components/videoPlayer/components/progressBar.tsx","../src/lib/images/volumeOff.jsx","../src/lib/images/icon-play.svg?react","../src/lib/images/playButton.jsx","../src/lib/images/icon-pause.svg?react","../src/lib/images/pauseButton.jsx","../src/lib/images/Vector.svg?react","../src/lib/images/VectorIcon.jsx","../src/lib/images/checkmark.svg?react","../src/lib/images/CheckmarkIcon.jsx","../src/lib/images/CdkSmallLogo.svg?react","../src/lib/images/CdkSmallLogo.jsx","../src/lib/images/CovideoSmallLogo.svg?react","../src/lib/images/CovideoSmallLogo.jsx","../src/app/pages/video/components/videoPlayer/components/videoControls.tsx","../src/lib/hooks/GTM/actions/videoPlayer/types.ts","../src/lib/hooks/GTM/types.ts","../src/lib/hooks/GTM/utils.ts","../src/lib/hooks/GTM/pushToDataLayer.ts","../src/lib/hooks/GTM/actions/video/interaction.ts","../src/lib/hooks/GTM/actions/video/utils.ts","../src/lib/hooks/GTM/actions/video/messageInteraction.ts","../src/lib/hooks/GTM/actions/video/attributesInteraction.ts","../src/lib/hooks/GTM/actions/video/saveNewVideoInteraction.ts","../src/lib/hooks/GTM/actions/video/types.ts","../src/lib/hooks/GTM/actions/recording/selectType.ts","../src/lib/hooks/GTM/actions/recording/toolInteraction.ts","../src/lib/hooks/GTM/actions/recording/discardVideo.ts","../src/lib/hooks/GTM/actions/recording/start.ts","../src/lib/hooks/GTM/actions/recording/stop.ts","../src/lib/hooks/GTM/actions/recording/addVideoAttribute.tsx","../src/lib/hooks/GTM/actions/videoPlayer/interaction.ts","../src/lib/hooks/GTM/useGTMAnalytics.ts","../src/app/pages/video/components/videoPlayer/VideoPlayer.tsx","../src/lib/components/modals/ModalVideoPreview.tsx","../src/app/pages/library/components/VideoItem.tsx","../src/app/pages/library/components/Search.tsx","../src/app/pages/library/components/NoVideos.tsx","../src/lib/api/multilocation/locationKeys.ts","../src/lib/api/multilocation/getUserLocations.ts","../src/lib/api/multilocation/signIntoLocation.ts","../src/lib/components/NewDropdown.tsx","../src/app/pages/library/components/UserDropdown.tsx","../src/app/pages/library/components/PageInfo.tsx","../src/lib/const/VideoType.tsx","../src/lib/const/PackageName.tsx","../src/lib/hooks/useQueryState.ts","../src/lib/hooks/useQueryFetch.ts","../src/lib/hooks/useCreateVideo.ts","../src/lib/hooks/useEncodeVideo.ts","../src/lib/hooks/usePresignedUrl.tsx","../src/lib/context/ActionDispatchContext.tsx","../src/lib/context/actionCreators.ts","../src/lib/hooks/useS3Upload.ts","../src/lib/hooks/useVideoTranscriptionStart.tsx","../src/lib/images/add.svg?react","../src/lib/images/AddIcon.jsx","../src/lib/components/DragAndDrop.tsx","../src/lib/components/videoUpload/styles.tsx","../src/lib/components/videoUpload/MultipleUploadList.tsx","../src/lib/components/videoUpload/VideoUpload.tsx","../src/lib/components/modals/ModalUpload.tsx","../src/lib/api/inventory/useGtmVinInventoryQuery.ts","../src/lib/hooks/GTM/useGTMTrackPageView.ts","../src/lib/utils/folders/folderSelection.ts","../src/lib/hooks/ai/features/utils.ts","../src/lib/hooks/ai/features/useAIFeatureFlags.tsx","../src/lib/hooks/ai/features/useAiFeatureAvailability.tsx","../src/lib/components/AddonDropdown.tsx","../src/lib/components/styles/typography.ts","../src/lib/components/mediaTools/index.tsx","../src/app/pages/library/Library.tsx","../src/app/pages/login/styles.ts","../src/lib/components/formik/FormikErrorMessage.tsx","../src/lib/components/formik/FormikLabel.tsx","../src/lib/components/styles/layout.ts","../src/lib/components/formik/FormikInputField.tsx","../src/app/pages/login/types.ts","../src/app/pages/login/utils.ts","../src/lib/api/auth/useCheckUsernameMutation.ts","../src/app/pages/login/UsernameForm.tsx","../src/app/pages/login/SSOVerifying.tsx","../src/lib/api/auth/useLoginMutation.ts","../src/app/pages/login/PasswordForm.tsx","../src/app/pages/login/Login.tsx","../src/app/pages/insertVideo/utils.ts","../src/app/pages/insertVideo/components/InsertVideoSettings.tsx","../src/lib/hooks/query/inventoryItem/useGetInventoryItems.tsx","../src/app/pages/insertVideo/components/VehicleSearch.tsx","../src/lib/utils/reactions.ts","../src/app/pages/video/components/videoPlayer/components/trim/VideoPreviewTrack.tsx","../src/app/pages/video/components/videoPlayer/components/trim/SliderRail.tsx","../src/app/pages/video/components/videoPlayer/components/trim/Handle.tsx","../src/app/pages/video/components/videoPlayer/components/trim/Track.tsx","../src/app/pages/video/components/videoPlayer/components/trim/Tick.tsx","../src/app/pages/video/components/videoPlayer/components/trim/TimelineRange.tsx","../src/app/pages/video/components/videoPlayer/components/trim/Trim.tsx","../src/app/pages/insertVideo/components/InsertButton.tsx","../src/app/pages/insertVideo/components/CopyVideoButton.tsx","../src/lib/api/useGetTemplatesQuery.tsx","../src/lib/api/videos/useVideoQuery.ts","../src/lib/api/exitlinksets/useExitLinksetsQuery.ts","../src/lib/api/overlays/useWebsiteOverlayQuery.ts","../src/app/pages/insertVideo/InsertVideo.tsx","../src/app/pages/voiceover/components/VideoPreview.tsx","../src/lib/hooks/useMediaRecorder.tsx","../src/lib/components/modals/ModalPrompt.tsx","../src/app/pages/voiceover/components/AudioRecorder.tsx","../src/lib/components/modals/ModalInputText.tsx","../src/app/pages/voiceover/components/util.ts","../src/app/pages/lesaTV/components/Search.tsx","../src/app/pages/lesaTV/components/PageInfo.tsx","../src/lib/api/lesa/lesaKeys.ts","../src/lib/api/lesa/useLesaTvVideosQuery.ts","../src/lib/api/lesa/useLesaVideosMutation.ts","../src/app/pages/lesaTV/LesaTV.tsx","../src/app/pages/voiceover/Voiceover.tsx","../src/app/pages/wheelsTV/components/Search.tsx","../src/app/pages/wheelsTV/components/PageInfo.tsx","../src/app/pages/wheelsTV/WheelsTV.tsx","../src/app/pages/merge/components/VideoRow.tsx","../src/lib/images/drag-icon.svg?react","../src/lib/images/Drag.jsx","../src/app/pages/merge/components/VideoThumbnail.tsx","../src/lib/images/zoom-out.svg?react","../src/lib/images/ZoomOutIcon.jsx","../src/lib/images/zoom-in.svg?react","../src/lib/images/ZoomInIcon.jsx","../src/app/pages/video/components/videoPlayer/components/onScreenPlayButton.tsx","../src/app/pages/merge/components/Player.tsx","../src/lib/images/close-circle.svg?react","../src/lib/images/CloseCircleIcon.jsx","../src/lib/components/InformationBox.tsx","../src/app/pages/merge/components/VideoMerge.tsx","../src/lib/images/save.svg?react","../src/lib/images/SaveIcon.jsx","../src/lib/images/delete.svg?react","../src/lib/images/DeleteIcon.jsx","../src/lib/components/modals/ModalLeave.tsx","../src/lib/components/RouteLeavingGuard.tsx","../src/app/pages/merge/types.ts","../src/app/pages/merge/Merge.tsx","../src/lib/components/PreviewVideoBar.tsx","../src/lib/api/videoTagsApi.tsx","../src/lib/components/Label.tsx","../src/lib/images/icon-car.svg?react","../src/lib/images/CarIcon.jsx","../src/lib/images/hashtag.svg?react","../src/lib/images/HashtagIcon.jsx","../src/app/pages/video/Upload.tsx","../src/app/pages/video/videoDetails/components/AttributesFields.tsx","../src/app/pages/video/components/Preview.tsx","../src/app/pages/previewUpload/PreviewUpload.tsx","../src/app/pages/recordv1/utils/media.ts","../src/lib/context/record/functions.ts","../src/lib/context/record/types.tsx","../src/lib/context/record/provider.tsx","../src/app/pages/recordv1/ModalRecordingVideoSettings.tsx","../src/app/pages/recordv1/types.ts","../src/app/pages/recordv1/RecordingHeadingWithRouteGuard.tsx","../src/app/pages/recordv1/Countdown.tsx","../src/app/pages/recordv1/RecorderBody.tsx","../src/app/pages/recordv1/useRecorderCountdown.tsx","../src/app/pages/recordv1/useRecordingTime.tsx","../src/app/pages/recordv1/useRecorder.tsx","../src/app/pages/recordv1/VideoRecorderActions.tsx","../src/app/pages/recordv1/utils/browserChecks.ts","../src/lib/api/videoAttributes/videoAttributesKeys.ts","../src/lib/api/videoAttributes/useGetAllVideoAttributesQuery.ts","../src/app/pages/recordv1/detailsPreview/form/DetailsPreviewHeader.tsx","../src/app/pages/recordv1/VideoTag.tsx","../src/app/pages/recordv1/ModalVideoTags.tsx","../src/app/pages/recordv1/detailsPreview/form/DetailsRecordPreviewTags.tsx","../src/lib/components/formik/FormikTextAreaField.tsx","../src/lib/components/formik/FormikDropdown.tsx","../src/app/pages/recordv1/detailsPreview/form/DetailsPreviewVideoAttributes.tsx","../src/app/pages/recordv1/detailsPreview/types.ts","../src/app/pages/recordv1/detailsPreview/form/VideoRequestDetails.tsx","../src/app/pages/recordv1/detailsPreview/form/DetailsPreviewAtrributesHeader.tsx","../src/lib/api/users/automotive/queryKeys.ts","../src/lib/api/users/automotive/useUsersByAutomotiveRolesQuery.ts","../src/lib/api/aws/useAwsSignedUrlQuery.ts","../src/lib/api/aws/useS3UploadMutation.ts","../src/lib/api/videos/useCreateVideoMutation.ts","../src/lib/api/videos/useEncodeVideoMutation.ts","../src/app/pages/recordv1/useVideoRecorderUpload.tsx","../src/app/pages/recordv1/ProgressCircle.tsx","../src/app/pages/recordv1/UploadLoader.tsx","../src/app/pages/recordv1/utils/functions.ts","../src/lib/api/folders/foldersKeys.ts","../src/lib/api/folders/getFolders.ts","../src/app/pages/recordv1/FolderDropdown.tsx","../src/lib/utils/productFeature.ts","../src/app/pages/recordv1/VideoUploadFolderDropdown.tsx","../src/app/pages/recordv1/detailsPreview/DetailsPreview.tsx","../src/app/pages/recordv1/RecordBoth.tsx","../src/app/pages/recordv1/ScreenRecorder.tsx","../src/lib/hooks/GTM/actions/recording/types.ts","../src/lib/context/teleprompter/provider.tsx","../src/app/pages/recordv1/Teleprompter/BaseTeleprompterActions.tsx","../src/app/pages/recordv1/Teleprompter/RecordingTeleprompterActions.tsx","../src/app/pages/recordv1/Teleprompter/TeleprompterActions.tsx","../src/app/pages/recordv1/Scroller.tsx","../src/app/pages/recordv1/Teleprompter/TeleprompterDisplay.tsx","../src/app/pages/recordv1/RecordCamLoader.tsx","../src/app/pages/recordv1/utils/virtualBackgrounds.tsx","../src/lib/api/customVirtualBackground/customVirtualBackgroundKeys.ts","../src/lib/api/customVirtualBackground/useCustomVirtualBackgroundQuery.ts","../src/lib/images/virtualBackground.svg?react","../src/lib/images/VirtualBgIcon.jsx","../src/app/pages/recordv1/webgl/webglUtils.ts","../src/app/pages/recordv1/useImageSegmenter.ts","../src/lib/api/droplr/droplrAuth.ts","../src/lib/api/droplr/uploadDrop.ts","../src/lib/api/droplr/getBoards.ts","../src/lib/api/droplr/getDrop.ts","../src/lib/api/droplr/getDrops.ts","../src/app/pages/recordv1/virtualBackgrounds/FilesTabContent.tsx","../src/app/pages/recordv1/virtualBackgrounds/VirtualBackgroundLibraryModal.tsx","../src/app/pages/recordv1/virtualBackgrounds/VirtualBackgrounds.tsx","../src/app/pages/recordv1/VirtualBackgroundsButton.tsx","../src/lib/api/teleprompterApi.tsx","../src/lib/images/covideoSmallLogoActive.svg?react","../src/lib/images/CovideoSmallLogoActive.jsx","../src/lib/images/cdkSmallLogoActive.svg?react","../src/lib/images/CdkSmallLogoActive.jsx","../src/app/pages/recordv1/ModalTeleprompterRecord.tsx","../src/app/pages/recordv1/RecordCam.tsx","../src/app/pages/recordv1/utils/recorderSettings.ts","../src/app/pages/recordv1/ChooseRecordingOptions.tsx","../src/app/pages/recordv1/RecordHome.tsx","../src/app/pages/recordv1/routes.tsx","../src/i18n.ts","../src/app/pages/vinReels/style.tsx","../src/app/pages/vinReels/ModalVideoPreview.tsx","../src/lib/api/vinReel/useGetVINReelsQuery.tsx","../src/lib/api/vinReel/useCopyVINReelMutation.tsx","../src/lib/images/imagePlaceholder.webp","../src/lib/images/Images.jsx","../src/app/pages/vinReels/VinReels.tsx","../src/lib/const/AccessRole.tsx","../src/app/pages/noAccess/NoAccess.tsx","../src/app/App.tsx","../src/lib/hooks/GTM/useGTMInject.ts","../src/index.tsx"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\n\nconst REACT_COVIDEO_EMBED_VERSION_HEADER_KEY = 'React-Covideo-Embed-Version';\n\nconst API_EXPRESS_MAP = {\n default: 'https://api-sandbox.covideo.com/',\n development: 'https://localhost:3000/api/',\n sandbox: 'https://api-sandbox.covideo.com/',\n staging: 'https://api-staging.covideo.com/',\n production: 'https://api.covideo.com/',\n};\nexport type ENVIRONMENT = 'development' | 'sandbox' | 'staging' | 'production';\n\nexport enum COOKIE_NAMES {\n jwt = 'react-covideo-embed-jwt',\n merge = 'react-covideo-merge',\n recordSettings = 'record_settings',\n recordError = 'react-covideo-record-error',\n}\n\nexport let token: any = localStorage.getItem(COOKIE_NAMES.jwt);\n\nexport let apiExpress = API_EXPRESS_MAP.default;\nexport let apiKey: string | undefined = undefined;\n\nexport const updateToken = (\n tokenNew: string,\n hasExternalJwt: boolean = false\n) => {\n if (!hasExternalJwt) {\n localStorage.setItem(COOKIE_NAMES.jwt, tokenNew);\n }\n token = tokenNew;\n EXPRESS_API.defaults.headers.Authorization = `Bearer ${token}`;\n options.headers.Authorization = `Bearer ${token}`;\n};\n\nexport const updateEnv = (env: ENVIRONMENT) => {\n apiExpress = API_EXPRESS_MAP[env] || API_EXPRESS_MAP.default;\n EXPRESS_API.defaults.baseURL = apiExpress;\n};\n\nexport const updateApiKey = (key: string | undefined) => {\n apiKey = key;\n (EXPRESS_API.defaults.headers as any).ApiKey = apiKey;\n (options.headers as any).ApiKey = apiKey;\n};\n\nexport let options = {\n headers: {\n Authorization: `Bearer ${token}`,\n ...(apiKey !== undefined ? { ApiKey: apiKey as string } : {}),\n [REACT_COVIDEO_EMBED_VERSION_HEADER_KEY]:\n process.env.REACT_COVIDEO_EMBED_VERSION,\n },\n};\n\nexport const EXPRESS_API: AxiosInstance = axios.create({\n baseURL: apiExpress,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...(apiKey !== undefined ? { ApiKey: apiKey } : {}),\n [REACT_COVIDEO_EMBED_VERSION_HEADER_KEY]:\n process.env.REACT_COVIDEO_EMBED_VERSION,\n },\n});\n","import dayjs from 'dayjs';\nimport { UserData } from 'lib/context';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport { COOKIE_NAMES } from 'lib/config';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport const toString = (o: any) => {\n if (!o) {\n return o;\n }\n Object.keys(o).forEach(k => {\n if (typeof o[k] === 'object') {\n return toString(o[k]);\n }\n\n if (typeof o[k] !== 'boolean') {\n o[k] = '' + o[k];\n }\n });\n\n return o;\n};\n\nexport const toHHMMSSFF = (sec_num: number, frame_rate: number = 30) => {\n const hours = Math.floor(sec_num / 3600);\n const minutes = Math.floor((sec_num - hours * 3600) / 60);\n let seconds = sec_num - hours * 3600 - minutes * 60;\n const milliseconds = parseInt((seconds % 1).toFixed(3).substring(2));\n let frame = parseInt(\n Math.floor(milliseconds / (1000 / frame_rate)).toFixed(0)\n );\n seconds = parseInt(Math.floor(seconds).toFixed(0));\n\n if (isNaN(minutes)) {\n return '00:00:00:00';\n }\n\n let time = '';\n if (hours < 10) {\n time = '0';\n }\n time += hours + ':';\n if (minutes < 10) {\n time += '0';\n }\n time += minutes + ':';\n if (seconds < 10) {\n time += '0';\n }\n time += seconds + ':';\n\n if (frame < 10) {\n time += '0';\n }\n return time + frame;\n};\n\nexport const toMMSS = (sec_num: number, fractionDigits = 1) => {\n const hours = Math.floor(sec_num / 3600);\n const minutes = Math.floor((sec_num - hours * 3600) / 60);\n const seconds = sec_num - hours * 3600 - minutes * 60;\n\n if (isNaN(minutes)) {\n return '00:00.0';\n }\n\n let time = '';\n // if (hours < 10) { hours = \"0\" + hours; }\n if (minutes < 10) {\n time += '0';\n }\n time += minutes + ':';\n if (seconds < 10) {\n time += '0';\n }\n time += seconds.toFixed(fractionDigits);\n return time;\n};\n\nexport const toMMSSSimplified = (length: number) => {\n return new Date(length).toISOString().substring(14, 19);\n};\n\nexport const generateFileName = (userData: UserData, fileExt: string) => {\n return (\n userData.userId +\n '_' +\n userData.customerId +\n '_' +\n (Math.random() + 1).toString(36).substring(2) +\n '.' +\n fileExt\n );\n};\n\nexport const generateVideoTitle = () => {\n const dateOfMonth = dayjs(new Date()).date();\n let ordinalLetters = 'th';\n if (dateOfMonth === 1 || dateOfMonth === 21 || dateOfMonth === 31) {\n ordinalLetters = 'st';\n } else if (dateOfMonth === 2 || dateOfMonth === 22) {\n ordinalLetters = 'nd';\n } else if (dateOfMonth === 3 || dateOfMonth === 23) {\n ordinalLetters = 'rd';\n }\n return dayjs(new Date()).format(`MMM D[${ordinalLetters}] YYYY @ h:mm A`);\n};\n\nexport const serverTimeToUserTime = (\n time: string,\n userData: UserData,\n format = 'YYYY-MM-DD HH:mm:ss'\n) => {\n const userTimeZone =\n userData.timeZone ||\n Intl.DateTimeFormat().resolvedOptions().timeZone ||\n dayjs.tz.guess();\n\n const videoDate = dayjs(time, [\n 'M/DD/YYYY h:mm:ss A',\n 'M/DD/YYYY, h:mm:ss A',\n 'M/D/YYYY h:mm:ss A',\n 'M/D/YYYY, h:mm:ss A',\n 'MM/DD/YYYY',\n ]);\n\n const serverUtcOffset = -dayjs().tz('America/New_York').utcOffset();\n\n const userTimezoneOffset = dayjs().tz(userTimeZone).utcOffset();\n\n const utcDateTime = videoDate.add(serverUtcOffset, 'minute');\n\n return dayjs(utcDateTime).add(userTimezoneOffset, 'minute').format(format);\n};\n\nexport const reorder = (list: any[], startIndex: number, endIndex: number) => {\n const result = Array.from(list);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n return result;\n};\n\ntype CheckIfVideoIsTrimmedProps = {\n trimStart: number;\n trimEnd: number;\n videoDuration: number;\n};\n\nexport const checkIfVideoIsTrimmed = ({\n trimStart,\n trimEnd,\n videoDuration,\n}: CheckIfVideoIsTrimmedProps) => {\n // check if video and trim initialized, if not video not trimmed\n if (videoDuration === 0 || trimEnd === 0) {\n return false;\n }\n // if trim has a start, video is trimmed\n if (trimStart !== 0) {\n return true;\n }\n // if trim end too far from video end, video is trimmed\n if (videoDuration - trimEnd > 0.3) {\n return true;\n }\n return false;\n};\n\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n);\n\nexport const toMB = (KB: number) => {\n return (KB / 1000).toFixed(2);\n};\n\nexport function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function clearCookies() {\n for (let name in COOKIE_NAMES) {\n localStorage.removeItem(COOKIE_NAMES[name as keyof typeof COOKIE_NAMES]);\n }\n}\n\nexport const toMMSSTimestamp = (sec_num: number, fractionDigits = 1) => {\n const minutes = Math.floor(sec_num / 60);\n const seconds = sec_num - minutes * 60;\n\n if (isNaN(minutes)) {\n return '00.0';\n }\n\n let time = '';\n if (minutes < 10) {\n time += '0';\n }\n time += minutes + ':';\n if (seconds < 10) {\n time += '0';\n }\n\n time += seconds.toFixed(fractionDigits);\n\n return time;\n};\n\nexport function checkIfMobileDevice(): boolean {\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n );\n}\n","import { ENVIRONMENT, updateApiKey, updateEnv, updateToken } from 'lib/config';\nimport { createContext, ReactNode, useContext } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport { capitalizeFirstLetter } from 'lib/utils/functions';\nimport { Feature } from '../../index';\nimport { CovideoThemeProvider } from 'react-covideo-common';\nimport { createGlobalStyle } from 'styled-components';\n\nexport enum WHITELABEL {\n CDK = 'cdk',\n}\n\nexport enum THEME_NAME {\n AUTOMOTIVE = 'automotive',\n COVIDEO = 'covideo',\n KENNECTED = 'kennected',\n PROVIDEO = 'provideo',\n APP_2_VID = 'app2vid',\n BRANDING = 'branding',\n CDK = 'cdk',\n}\n\ninterface ConfigurationProviderProps {\n token?: string;\n env?: ENVIRONMENT;\n onVideoInsert?: (shareData: {\n url: string;\n thumbnail: string;\n image: string;\n html: string;\n token: string;\n }) => void;\n onVideoInsertError?: (error: unknown) => void;\n children?: ReactNode;\n hideFeatures?: string[];\n apikey?: string;\n onRecordButtonClick?: (data: { token: string }) => void;\n onUploadButtonClick?: (data: { token: string }) => void;\n reRender: () => void;\n whitelabel?: WHITELABEL;\n}\n\ntype ShowFeature = {\n showInsertFeature: boolean;\n showRecordScreenFeature: boolean;\n showRecordBothFeature: boolean;\n showRecordCamFeature: boolean;\n showRecordFeature: boolean;\n showUploadFeature: boolean;\n showTrimFeature: boolean;\n showMergeFeature: boolean;\n showWheelsTVFeature: boolean;\n showVoiceoverFeature: boolean;\n showQuickshareFeature: boolean;\n showFolderFeature: boolean;\n showLandingPageFeature: boolean;\n showCTAFeature: boolean;\n showReactionsFeature: boolean;\n showAiAssistFeature: boolean;\n showUpgradeMessageFeature: boolean;\n showLesaTVFeature: boolean;\n showMultiLocationFeature: boolean;\n showTeleprompterFeature: boolean;\n showVirtualBgFeature: boolean;\n showWebsiteOverlayFeature: boolean;\n showLanguageDropdownFeature: boolean;\n showSsoFeature: boolean;\n showVinReelsFeature: boolean;\n};\n\ntype IConfigurationContext = ConfigurationProviderProps &\n ShowFeature & {\n hasExternalJwt: boolean;\n containerWidth: number;\n containerHeight: number;\n };\n\nconst ConfigurationContext = createContext({} as IConfigurationContext);\n\nconst GlobalStyle = createGlobalStyle<{ $isCdk?: boolean }>`\n * {\n font-family: ${props => (props.$isCdk ? \"'Roboto', sans-serif\" : \"'Work Sans', sans-serif\")};\n }\n button span {\n font-family: ${props => (props.$isCdk ? \"'Roboto', sans-serif!important\" : \"'Work Sans', sans-serif\")};\n`;\n\nexport const ConfigurationProvider: React.FC<ConfigurationProviderProps> = ({\n children,\n ...props\n}) => {\n const { width, height, ref } = useResizeDetector({\n refreshMode: 'debounce',\n refreshRate: 100,\n });\n\n const {\n token,\n env,\n onVideoInsert,\n onVideoInsertError,\n hideFeatures,\n apikey,\n onRecordButtonClick,\n onUploadButtonClick,\n reRender,\n } = props;\n const featureVisibility = Object.fromEntries(\n Object.values(Feature).map(feature => [\n `show${capitalizeFirstLetter(feature)}Feature`,\n !hideFeatures?.includes(feature),\n ])\n ) as ShowFeature;\n if (env) {\n updateEnv(env);\n }\n if (apikey) {\n updateApiKey(apikey);\n }\n\n const hasExternalJwt = !!token;\n if (hasExternalJwt) {\n updateToken(token, hasExternalJwt);\n }\n const showRecordFeature =\n !!onRecordButtonClick ||\n featureVisibility.showRecordBothFeature ||\n featureVisibility.showRecordCamFeature ||\n featureVisibility.showRecordScreenFeature;\n const showUploadFeature =\n !!onUploadButtonClick || featureVisibility.showUploadFeature;\n const showInsertFeature =\n featureVisibility.showInsertFeature && !!onVideoInsert;\n const value = {\n token,\n env,\n onVideoInsert,\n onVideoInsertError,\n hasExternalJwt,\n containerWidth: width || 0,\n containerHeight: height || 0,\n ...featureVisibility,\n showRecordFeature,\n showInsertFeature,\n onRecordButtonClick,\n onUploadButtonClick,\n showUploadFeature,\n reRender,\n whitelabel: props.whitelabel,\n };\n\n const themeName = (props?.whitelabel || 'branding') as THEME_NAME;\n\n const isCdkEnviroment = props?.whitelabel === WHITELABEL.CDK;\n\n return (\n <ConfigurationContext.Provider value={value}>\n <GlobalStyle $isCdk={isCdkEnviroment} />\n <CovideoThemeProvider\n themeName={themeName}\n additionalStyles={{\n themeName,\n // should update additonal styles types to Record<string, any>\n isCdkEnviroment: isCdkEnviroment as any,\n containerWidth: width as any,\n containerHeight: height as any,\n }}\n >\n <div ref={ref}>{children}</div>\n </CovideoThemeProvider>\n </ConfigurationContext.Provider>\n );\n};\n\nexport const useConfigurationContext = () => {\n const context = useContext(ConfigurationContext);\n if (!context)\n throw new Error(\n 'useConfigurationContext must be used within ConfigurationProvider'\n );\n return context;\n};\n","import { EXPRESS_API } from '../config';\n\ntype AuthParams = {\n username: string;\n password: string;\n};\n\ntype AuthResponse = {\n tokenType: string;\n accessToken: string;\n};\n\nexport const login = async ({ username, password }: AuthParams) => {\n const response = await EXPRESS_API.post(`/auth`, { username, password });\n return response.data as AuthResponse;\n};\n\nexport const fetchUserData = async () => {\n const { data } = await EXPRESS_API.get('/auth/user');\n return data;\n};\n","export const DEFAULT_FOLDER_NAMES = {\n EMPTY: '',\n COMPANY: 'Company',\n PRIMARY: 'Primary',\n PRIVATE: 'Private',\n VAULT: 'Vault',\n VIDEO_REPLIES: 'Video Replies',\n VEHICLE_WALKAROUNDS: 'Vehicle Walkarounds',\n APPOINTMENT_REMINDERS: 'Appointment Reminders',\n INTRODUCTIONS: 'Introductions',\n POST_SALE_THANK_YOU: 'Post - Sale Thank You',\n};\n\nexport const COMPANY_FOLDER_ID = -1;\nexport const SHARED_FOLDER_PREFIX = '~~shared~~';\n","import { Folder, TrimVideoData } from 'lib/context';\nimport { EXPRESS_API } from '../config';\nimport { saveAs } from 'file-saver';\nimport { DEFAULT_FOLDER_NAMES } from 'lib/const/Folder';\nimport { VideoTranscriptionResponse } from './types';\n\nexport interface InventoryItem {\n title: string;\n vin: string;\n stockNumber: string;\n}\n\nexport const ALL_FOLDERS = {\n value: '_all',\n label: 'All folders',\n};\n\nexport type VideoListParams = {\n size: number | undefined;\n page: number | undefined;\n search?: string | null;\n folder?: string;\n};\nexport type VideoRequest = {\n videoRequestId: number;\n userId: number;\n advisorId: number;\n customerId: number;\n videoId: number;\n videoType: string;\n repairOrderNumber: string;\n vin: string;\n automotiveDepartment: number;\n sharedWithCompany: boolean;\n note: null;\n deniedNote: null;\n customerName: string;\n status: string;\n emailStatus: string;\n createdAt: Date;\n deletedAt: null;\n inventoryItem: InventoryItem;\n};\n\nexport type VideoListItem = {\n processing: number;\n id: string;\n title: string;\n recordDate: string;\n views: string;\n videoLength: number;\n thumbnail: string;\n videoSource: string;\n tags: object[];\n videoRequest: VideoRequest;\n folder: string;\n autogeneratedThumbnail: string;\n};\n\nexport type VideoUpdateBody = {\n title?: string;\n thumbnail?: string;\n playerBackgroundColor?: string;\n playerIconsAndTextColor?: string;\n playButtonPosition?: string;\n reactionsPreference?: boolean;\n};\n\nexport type UpdateVideoParams = {\n videoId: string;\n videoBody: VideoUpdateBody;\n};\n\nexport type DeleteVideoApiParams = {\n videoIds: (string | number)[];\n deleteMultiple: boolean;\n companyVideos?: boolean;\n};\n\nexport const getFolders = async () => {\n const { data } = await EXPRESS_API.get('/folders/new?getShared=true');\n\n const folders: Folder[] = (data && data.folders) || [];\n folders.push({\n folderId: ALL_FOLDERS.value,\n name: ALL_FOLDERS.label,\n isDeletable: false,\n });\n return folders;\n};\n\nexport const getVideos = async (props: VideoListParams) => {\n const start = (props.page || 0) * (props.size || 10);\n const params = {\n start,\n limit: props.size,\n search: props.search,\n folder: props.folder,\n };\n const { data } = await EXPRESS_API.get('/videos', { params });\n const videos: VideoListItem[] = data?.data?.videos || data?.videos || [];\n const count: number = data?.data?.count || data?.count || 0;\n return { count, videos };\n};\n\nexport const getVideo = async (videoId: string) => {\n const response = await EXPRESS_API.get(`/videos/${videoId}`);\n return response.data;\n};\n\nexport const deleteVideo = async ({\n videoIds,\n deleteMultiple,\n companyVideos,\n}: DeleteVideoApiParams): Promise<{ [key: string]: string }> => {\n let data: {\n [key: string]: string | boolean | (string | number)[] | undefined;\n } = { isCompanyVideo: companyVideos };\n let url = `/videos/${videoIds[0]}`;\n if (deleteMultiple) {\n url = '/videos';\n data = { ids: videoIds, isCompanyVideo: companyVideos };\n }\n const response = await EXPRESS_API.delete(url, { data });\n return response.data;\n};\n\nexport const mergeVideos = async (data: any) => {\n const response = await EXPRESS_API.post(`/videos/merge`, data);\n return response.data;\n};\n\nexport const updateVideo = async ({\n videoId,\n videoBody: data,\n}: UpdateVideoParams) => {\n const response = await EXPRESS_API.put(`/videos/${videoId}`, data);\n return { video: response.data };\n};\n\nexport const trimVideo = async (videoId: string, data: TrimVideoData) => {\n const response = await EXPRESS_API.put(`/videos/${videoId}/trim`, data);\n return response.data;\n};\n\nexport const downloadVideo = async (videoId: string, fileName: string) => {\n const response = await EXPRESS_API.get(`/videos/${videoId}/download`, {\n responseType: 'blob',\n });\n return saveAs(new Blob([response.data], { type: 'video/mp4' }), fileName);\n};\n\nexport const copyCompanyVideoToPrimary = async (videoId: string) => {\n const response = await EXPRESS_API.put(`/videos/${videoId}/move`, {\n videoId,\n copy: true,\n videoFolder: DEFAULT_FOLDER_NAMES.PRIMARY,\n });\n return response.data;\n};\n\nexport const startTranscription = async (\n videoId: string\n): Promise<VideoTranscriptionResponse> => {\n const response = await EXPRESS_API.post(\n `/videos/${videoId}/transcripts/start`\n );\n return response.data;\n};\n","import { EXPRESS_API } from '../config';\n\nexport interface IInventoryItemsResponse {\n count: number;\n items: Item[];\n}\n\nexport interface Item {\n itemId: number;\n customerId: number;\n sold: boolean;\n detailsPageUrl: string;\n price: string;\n title: string;\n vin: string;\n stockNumber: string;\n itemCondition: string;\n engine: string;\n make: string;\n model: string;\n trim: string;\n year: string;\n mileage: string;\n exteriorColor: string;\n interiorColor: string;\n transmission: string;\n integrationDealerId: string;\n description: string;\n manufacturer: null;\n vehicleType: null;\n createdAt: Date;\n updatedAt: Date;\n media: Media[];\n}\n\nexport interface Media {\n mediaType: number;\n mediaSource: string;\n inventoryItemMediaId: number;\n}\n\nexport type GetInventoryParams = {\n search?: string;\n start?: number;\n limit?: number;\n sort?: string;\n soldFilter?: string;\n videosRecordedFilter?: string;\n countRecorded?: boolean;\n};\n\nexport const getInventoryItems = async (\n params: GetInventoryParams\n): Promise<IInventoryItemsResponse> => {\n const response = await EXPRESS_API.get(`/inventory`, { params });\n return response.data;\n};\n","import { EXPRESS_API } from '../config';\n\nexport type CreateVideoRequestParams = {\n data: object;\n videoRequestId?: string | number;\n};\n\nexport interface VideoReqResponse {\n videoRequestId: number;\n userId: number;\n advisorId: number;\n customerId: number;\n videoId: number;\n videoType: string;\n repairOrderNumber: string;\n vin: string;\n automotiveDepartment: number;\n sharedWithCompany: boolean;\n note: null;\n deniedNote: null;\n customerName: string;\n status: string;\n emailStatus: string;\n createdAt: Date;\n deletedAt: null;\n advisor: Advisor;\n user: Advisor;\n video: Video;\n}\n\nexport interface Advisor {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n phone2: string;\n website: string;\n title: string;\n}\n\nexport interface Video {\n createdAt: Date;\n updatedAt: Date;\n id: number;\n userId: number;\n title: string;\n flvName: string;\n animatedGifPath: string;\n processing: number;\n totalViews: number;\n folderName: string;\n recordDate: string;\n sendReply: number;\n customerId: number;\n resellerId: number;\n videoLength: number;\n templateText: string;\n forwardCount: number;\n notes: string;\n securityCode: string;\n androidLocation: string;\n serverID: number;\n wtvID: number;\n organizationVideoId: null;\n protected: number;\n isGuide: number;\n deleted: number;\n deletedAt: null;\n reactionsPreference: number;\n isDemoVideo: number;\n merged: number;\n duplicated: number;\n isVoiceover: number;\n videoReplyEnabled: number;\n chapters: null;\n recordDateUnix: number;\n recorderId: number;\n apiProviderId: null;\n tags: any[];\n statsViewers: any[];\n thumbnail: string;\n videoSource: string;\n}\n\nexport const getVideoRequestByVideoId = async (id: string) => {\n const response = await EXPRESS_API.get(\n `/video-requests/${id}/get-by-videoid`\n );\n return response.data;\n};\n\nexport const createVideoRequest = async ({\n data,\n}: CreateVideoRequestParams): Promise<VideoReqResponse> => {\n const response = await EXPRESS_API.post(`/video-requests`, data);\n return response.data;\n};\n","import axios from 'axios';\nimport { EXPRESS_API } from 'lib/config';\nimport { GetSignedUrlsParams, GetSignedUrlsResponse, QueryListParams } from '.';\nexport type UploadVoiceoverAudioParams = {\n data: {\n uploadURL: string;\n file: File;\n mimeType: string;\n };\n};\n\nexport type CreateVoiceoverParams = {\n videoId: string;\n file: File;\n};\n\nexport const getVoiceoverSignedURLs = async (\n data: GetSignedUrlsParams\n): Promise<GetSignedUrlsResponse> => {\n const response = await EXPRESS_API.post(\n '/aws/signedurl/voiceover-audio',\n data\n );\n return response.data;\n};\n\nexport const uploadVoiceoverAudio = async ({\n data,\n}: UploadVoiceoverAudioParams): Promise<any> => {\n const response = await axios.put(data.uploadURL, data.file, {\n headers: {\n 'Content-Type': data.mimeType,\n },\n });\n return response.data;\n};\n\nexport const addVoiceoverToVideo = async ({\n videoId,\n audioFileName,\n newVideoTitle = '',\n overwriteOriginal = false,\n}: {\n videoId: string;\n audioFileName: string;\n newVideoTitle?: string;\n overwriteOriginal?: boolean;\n}): Promise<any> => {\n const response = await EXPRESS_API.post(`/videos/${videoId}/voiceover`, {\n newVideoTitle,\n audioFileName,\n overwriteOriginal,\n });\n return response.data;\n};\n\nconst cachedTags = {\n all: [] as object[],\n user: [] as object[],\n};\n\nexport type Tag = {\n id?: number;\n tagId?: string;\n tag?: string;\n label?: string;\n value?: string;\n};\n\nexport const getTags = async ({\n page = 0,\n size = 50,\n search = '',\n all = false,\n sort,\n refresh = true,\n}: QueryListParams) => {\n const start = page * size;\n const params = {\n start,\n limit: size,\n search: search,\n sort: sort,\n all: '',\n };\n\n if (all) {\n params.all = 'true';\n }\n\n if (!refresh) {\n if (all && cachedTags?.all?.length) {\n return cachedTags.all;\n }\n if (!all && cachedTags?.user?.length) {\n return cachedTags.user;\n }\n }\n\n const response = await EXPRESS_API.get('/video-tags', { params });\n if (all) {\n cachedTags.all = response.data;\n } else {\n cachedTags.user = response.data;\n }\n return response.data;\n};\n\nexport const getVideoTags = async ({ videoId }: any) => {\n const response = await EXPRESS_API.get(`/videos/${videoId}/video-tags`);\n const videoTags: object[] = response.data || [];\n return { videoTags };\n};\n\nexport const putVideoTags = async (videoId: string, data: object[]) => {\n const response = await EXPRESS_API.put(`/videos/${videoId}/video-tags`, data);\n return { videoTags: response.data };\n};\n","import { EXPRESS_API } from 'lib/config';\n\nexport type WTVListParams = {\n limit?: number;\n page?: number;\n search?: string;\n year?: number;\n ascOrder?: boolean;\n};\n\nexport type WTVListItem = {\n wtvId: number;\n year: string;\n make: string;\n model: string;\n style: string;\n trim: string;\n wtvVideoId: string;\n bodyStyle: string;\n vehicleClass: string;\n animatedGifPath: string;\n createdAt: string;\n};\n\nexport type WTVCopyParams = {\n title: string;\n flvName: string;\n animatedGifPath: string;\n year: number;\n make: string;\n model: string;\n wtvId: number;\n};\n\nexport const getWTVVideos = async (props: WTVListParams) => {\n const start = ((props.page || 1) - 1) * (props.limit || 12);\n const params = {\n start,\n limit: props.limit,\n search: props.search,\n year: props.year,\n };\n const { data } = await EXPRESS_API.get('/wtv', { params });\n const count: number = (data && data.count) || 0;\n const videos: WTVListItem[] = (data && data.videos) || [];\n return { count, videos };\n};\n\nexport const copyWTVVideo = async (props: WTVCopyParams) => {\n const data = {\n title: props.title,\n flvName: props.flvName,\n wtvId: parseInt(props.wtvId.toString(), 10),\n animatedGifPath: props.animatedGifPath,\n notes:\n props.year + ';' + props.make + ';' + props.model + ';' + props.title,\n };\n const response = await EXPRESS_API.post('/wtv/videos', data);\n return response.data;\n};\n","import { QueryListParams, AttributeListItem } from '.';\nimport { EXPRESS_API } from '../config';\n\nexport const getAttributes = async ({\n page = 0,\n size = 10,\n search,\n sort,\n filterByDepartment = false,\n}: QueryListParams) => {\n const params = {\n start: page * size,\n limit: size,\n search: search,\n sort: sort,\n filterByDepartment,\n };\n const { data } = await EXPRESS_API.get('/video-attributes', { params });\n const videoAttributes: AttributeListItem[] =\n (data && data.videoAttributes) || [];\n const count: number = (data && data.count) || 0;\n return { count, attributes: videoAttributes };\n};\n\nexport const putVideoAttributes = async (videoId: string, data: object[]) => {\n const response = await EXPRESS_API.put(\n `/videos/${videoId}/video-attributes`,\n data\n );\n return { videoAttributes: response.data };\n};\n","import * as React from \"react\";\nconst SvgCovideoLogo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 133, height: 33, viewBox: \"0 0 133 33\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M48.4811 22.7098C44.7502 22.7098 42.0752 20.0065 42.0752 16.208C42.0752 12.3628 44.8206 9.65956 48.6219 9.65956C51.0857 9.65956 53.268 10.8947 54.2301 12.8755L53.0803 13.528C52.2355 11.9667 50.5695 10.9413 48.6219 10.9413C45.6653 10.9413 43.4831 13.1085 43.4831 16.208C43.4831 19.2608 45.5949 21.428 48.4811 21.428C50.4287 21.428 52.2121 20.3328 53.0099 18.8413L54.1597 19.5404C53.1507 21.4746 50.9215 22.7098 48.4811 22.7098Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M61.8263 22.7331C58.0484 22.7331 55.303 19.8434 55.303 16.1847C55.303 12.5492 58.0484 9.65956 61.8263 9.65956C65.6042 9.65956 68.3496 12.5492 68.3496 16.1847C68.3496 19.8434 65.6042 22.7331 61.8263 22.7331ZM61.8263 21.4513C64.7829 21.4513 66.9417 19.121 66.9417 16.1847C66.9417 13.2717 64.7829 10.9413 61.8263 10.9413C58.8932 10.9413 56.7109 13.2717 56.7109 16.1847C56.7109 19.121 58.8932 21.4513 61.8263 21.4513Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M78.8263 9.65956H82.8388L77.2776 22.4068H74.3914L68.8537 9.65956H72.9131L75.8932 17.4897L78.8263 9.65956Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M85.617 8.35455C84.3734 8.35455 83.4113 7.42239 83.4113 6.18728C83.4113 4.95218 84.3969 4.02002 85.617 4.02002C86.8607 4.02002 87.8227 4.95218 87.8227 6.18728C87.8227 7.42239 86.8607 8.35455 85.617 8.35455ZM87.4473 22.4301H83.7633V9.65956H87.4473V22.4301Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M98.9292 4.69583H102.613V22.4301H99.0465V21.0552C98.1783 22.0339 96.9581 22.7564 95.2217 22.7564C91.6316 22.7564 88.8862 19.9133 88.8862 16.0448C88.8862 12.1997 91.6316 9.33331 95.2217 9.33331C96.8877 9.33331 98.061 10.0091 98.9292 10.8947V4.69583ZM95.8318 19.4239C97.7794 19.4239 99.1169 17.9091 99.1169 16.0215C99.1169 14.1805 97.7794 12.6658 95.8318 12.6658C93.8842 12.6658 92.5467 14.1805 92.5467 16.0215C92.5467 17.9091 93.8842 19.4239 95.8318 19.4239Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M117.413 15.7419C117.413 16.2546 117.366 16.7673 117.295 17.2799H107.839C108.238 18.6782 109.341 19.6802 111.335 19.6802C112.72 19.6802 114.315 19.1443 115.348 18.4451L116.803 20.9387C115.559 21.8708 113.565 22.7098 111.171 22.7098C106.361 22.7098 104.132 19.4938 104.132 16.0215C104.132 12.223 106.83 9.33331 110.913 9.33331C114.597 9.33331 117.413 11.687 117.413 15.7419ZM110.913 12.2929C109.411 12.2929 108.238 13.1785 107.816 14.6699H113.87C113.541 13.2251 112.462 12.2929 110.913 12.2929Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M125.152 22.7797C120.999 22.7797 118.23 19.7502 118.23 16.0448C118.23 12.3395 120.999 9.31001 125.152 9.31001C129.329 9.31001 132.122 12.3395 132.122 16.0448C132.122 19.7502 129.329 22.7797 125.152 22.7797ZM125.152 19.3773C127.006 19.3773 128.438 17.9091 128.438 16.0215C128.438 14.1805 127.006 12.7124 125.152 12.7124C123.322 12.7124 121.891 14.1805 121.891 16.0215C121.891 17.9091 123.322 19.3773 125.152 19.3773Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M15.438 25.0699V6.95488L8.33453 2.43408L0 10.7149V21.4334L8.33453 29.77L15.438 25.0699Z\", fill: \"#1C8578\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M24.6235 15.8128L35.6432 15.765V10.7185L24.9183 0H10.791L8.33688 2.43765L24.6235 15.8128Z\", fill: \"url(#paint0_linear_11_13017)\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M24.6235 15.8134L8.33688 29.7741L10.7233 32.16H24.9183L35.6432 21.4375V15.7656L24.6235 15.8134Z\", fill: \"#11A694\" }), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"linearGradient\", { id: \"paint0_linear_11_13017\", x1: 18.7201, y1: 1.67911, x2: 27.9868, y2: 15.5693, gradientUnits: \"userSpaceOnUse\" }, /* @__PURE__ */ React.createElement(\"stop\", { offset: 0.0483, stopColor: \"#11A694\" }), /* @__PURE__ */ React.createElement(\"stop\", { offset: 1, stopColor: \"#2FE0C7\" }))));\nexport default SvgCovideoLogo;\n","import styled from 'styled-components';\nimport Svg from './CovideoLogo.svg?react';\n\nconst CovideoLogo = styled(Svg)`\n max-height: 48px;\n max-width: 200px;\n`;\n\nexport default CovideoLogo;\n","import * as React from \"react\";\nconst SvgCdkLogo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 1024, height: 219, viewBox: \"0 0 1024 219\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M99.8311 97.6852V121.3H107.851C112.249 121.3 114.486 120.31 116.404 118.468C118.641 116.29 119.889 113.596 119.889 109.591C119.889 105.846 118.778 103.075 116.738 100.913C114.836 98.8728 112.599 97.6852 107.866 97.6852H99.8311Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M109.449 0C49.0938 0 0 49.1166 0 109.5C0 169.883 49.0938 219 109.449 219C169.804 219 218.898 169.883 218.898 109.5C218.898 49.1166 169.804 0 109.449 0ZM58.4834 132.292C44.087 132.292 34.5452 122.03 34.5452 109.47C34.5452 96.9087 44.1479 86.7078 58.1486 86.7078C66.0316 86.7078 74.0516 89.7376 79.5758 94.0768L72.6667 101.568C68.6491 98.279 63.4597 96.3758 59.5791 96.3758C51.62 96.3758 46.4915 102.359 46.4915 109.53C46.4915 116.702 51.7569 122.685 59.8987 122.685C64.8902 122.685 70.0948 119.731 73.8994 116.169L80.8693 123.538C75.6799 128.136 67.9186 132.292 58.4529 132.292H58.4834ZM125.732 124.847C121.989 128.532 116.602 130.968 108.11 130.968H88.3262V88.0172H108.11C116.13 88.0172 122.05 90.2553 126.052 94.4575C129.735 98.3399 131.774 103.593 131.774 109.454C131.774 115.316 129.674 120.965 125.732 124.847ZM172.544 130.968L157.888 112.484L152.699 117.417V130.968H141.133V88.0172H152.699V104.125L169.591 88.0172H184.185L165.969 105.054L186.803 130.968H172.544Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M988.664 158.418C981.983 158.418 975.962 156.923 970.6 153.933C965.326 150.855 961.151 146.678 958.074 141.401C954.998 136.037 953.459 129.925 953.459 123.065C953.459 116.118 954.998 110.006 958.074 104.729C961.151 99.4527 965.326 95.3194 970.6 92.3293C975.874 89.3393 981.895 87.8443 988.664 87.8443C995.52 87.8443 1001.59 89.3393 1006.86 92.3293C1012.22 95.3194 1016.4 99.4527 1019.39 104.729C1022.46 110.006 1024 116.118 1024 123.065C1024 129.925 1022.46 136.037 1019.39 141.401C1016.4 146.678 1012.22 150.855 1006.86 153.933C1001.5 156.923 995.432 158.418 988.664 158.418ZM988.664 150.107C993.674 150.107 998.113 149.008 1001.98 146.81C1005.85 144.523 1008.88 141.357 1011.08 137.312C1013.36 133.178 1014.51 128.43 1014.51 123.065C1014.51 117.613 1013.36 112.864 1011.08 108.818C1008.88 104.773 1005.85 101.651 1001.98 99.4527C998.113 97.1662 993.718 96.0229 988.796 96.0229C983.873 96.0229 979.478 97.1662 975.61 99.4527C971.743 101.651 968.666 104.773 966.381 108.818C964.095 112.864 962.953 117.613 962.953 123.065C962.953 128.43 964.095 133.178 966.381 137.312C968.666 141.357 971.743 144.523 975.61 146.81C979.478 149.008 983.829 150.107 988.664 150.107Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M910.276 158.418C903.068 158.418 896.739 156.923 891.289 153.933C885.839 150.855 881.576 146.678 878.499 141.401C875.423 136.037 873.885 129.925 873.885 123.065C873.885 116.206 875.335 110.138 878.236 104.861C881.224 99.5846 885.268 95.4513 890.366 92.4613C895.552 89.3833 901.354 87.8443 907.771 87.8443C914.275 87.8443 920.033 89.3393 925.043 92.3293C930.141 95.2314 934.141 99.3647 937.042 104.729C939.942 110.006 941.393 116.118 941.393 123.065C941.393 123.505 941.349 123.989 941.261 124.516C941.261 124.956 941.261 125.44 941.261 125.967H881.005V118.976H936.251L932.559 121.746C932.559 116.733 931.46 112.292 929.262 108.423C927.153 104.465 924.252 101.387 920.56 99.1888C916.868 96.9903 912.605 95.891 907.771 95.891C903.024 95.891 898.761 96.9903 894.981 99.1888C891.201 101.387 888.256 104.465 886.147 108.423C884.037 112.38 882.982 116.909 882.982 122.01V123.461C882.982 128.737 884.125 133.398 886.411 137.444C888.784 141.401 892.036 144.523 896.168 146.81C900.387 149.008 905.177 150.107 910.539 150.107C914.759 150.107 918.67 149.36 922.274 147.865C925.966 146.37 929.131 144.083 931.768 141.005L937.042 147.073C933.965 150.767 930.097 153.581 925.439 155.516C920.868 157.451 915.813 158.418 910.276 158.418Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M819.069 158.418C812.477 158.418 806.543 156.923 801.269 153.933C796.083 150.943 791.996 146.809 789.007 141.533C786.018 136.168 784.524 130.012 784.524 123.065C784.524 116.03 786.018 109.874 789.007 104.597C791.996 99.3207 796.083 95.2314 801.269 92.3293C806.543 89.3392 812.477 87.8442 819.069 87.8442C825.134 87.8442 830.54 89.2073 835.287 91.9335C840.122 94.6597 843.945 98.6611 846.758 103.938C849.659 109.126 851.109 115.502 851.109 123.065C851.109 130.54 849.703 136.916 846.89 142.192C844.077 147.469 840.254 151.514 835.419 154.329C830.672 157.055 825.222 158.418 819.069 158.418ZM819.729 150.107C824.651 150.107 829.046 149.008 832.914 146.809C836.869 144.523 839.946 141.357 842.143 137.312C844.429 133.178 845.572 128.43 845.572 123.065C845.572 117.613 844.429 112.864 842.143 108.818C839.946 104.773 836.869 101.651 832.914 99.4526C829.046 97.1661 824.651 96.0228 819.729 96.0228C814.894 96.0228 810.543 97.1661 806.675 99.4526C802.808 101.651 799.731 104.773 797.446 108.818C795.16 112.864 794.017 117.613 794.017 123.065C794.017 128.43 795.16 133.178 797.446 137.312C799.731 141.357 802.808 144.523 806.675 146.809C810.543 149.008 814.894 150.107 819.729 150.107ZM845.835 157.758V136.916L846.758 122.933L845.44 108.95V59.8786H854.801V157.758H845.835Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M756.103 157.758V88.5038H765.464V157.758H756.103ZM760.849 73.2018C758.915 73.2018 757.289 72.5423 755.971 71.2231C754.652 69.904 753.993 68.3211 753.993 66.4743C753.993 64.6275 754.652 63.0885 755.971 61.8573C757.289 60.5382 758.915 59.8786 760.849 59.8786C762.783 59.8786 764.409 60.4942 765.728 61.7254C767.046 62.9566 767.705 64.4956 767.705 66.3423C767.705 68.2771 767.046 69.904 765.728 71.2231C764.497 72.5423 762.871 73.2018 760.849 73.2018Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M694.572 157.758L653.698 65.4186H664.246L702.484 152.349H696.682L735.183 65.4186H745.072L704.198 157.758H694.572Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M503.809 157.758V65.4186H521.477L560.769 130.584H551.408L590.04 65.4186H607.577L607.84 157.758H587.799L587.667 96.1544H591.359L560.505 147.996H550.88L519.368 96.1544H523.851V157.758H503.809Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M406.852 157.758V65.4186H446.803C455.066 65.4186 462.186 66.7817 468.163 69.5079C474.14 72.1462 478.755 75.9717 482.007 80.9844C485.26 85.9971 486.886 91.9771 486.886 98.9246C486.886 105.784 485.26 111.72 482.007 116.733C478.755 121.658 474.14 125.439 468.163 128.077C462.186 130.716 455.066 132.035 446.803 132.035H418.718L428.212 122.669V157.758H406.852ZM465.526 157.758L442.452 124.252H465.262L488.6 157.758H465.526ZM428.212 125.043L418.718 115.018H445.616C452.209 115.018 457.131 113.611 460.384 110.797C463.636 107.895 465.262 103.937 465.262 98.9246C465.262 93.8239 463.636 89.8665 460.384 87.0524C457.131 84.2382 452.209 82.8312 445.616 82.8312H418.718L428.212 72.6738V125.043Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M354.323 159.341C347.203 159.341 340.566 158.198 334.413 155.911C328.348 153.537 323.074 150.195 318.591 145.886C314.108 141.577 310.592 136.52 308.043 130.716C305.581 124.912 304.351 118.536 304.351 111.588C304.351 104.641 305.581 98.2652 308.043 92.461C310.592 86.6568 314.108 81.6002 318.591 77.291C323.162 72.9818 328.48 69.684 334.545 67.3975C340.61 65.023 347.247 63.8358 354.454 63.8358C362.453 63.8358 369.661 65.2429 376.078 68.0571C382.583 70.7833 388.033 74.8286 392.428 80.1931L378.715 92.8568C375.551 89.2511 372.035 86.5689 368.167 84.81C364.299 82.9633 360.08 82.0399 355.509 82.0399C351.202 82.0399 347.247 82.7434 343.643 84.1505C340.039 85.5575 336.918 87.5802 334.281 90.2185C331.644 92.8568 329.578 95.9787 328.084 99.5843C326.678 103.19 325.974 107.191 325.974 111.588C325.974 115.986 326.678 119.987 328.084 123.593C329.578 127.198 331.644 130.32 334.281 132.958C336.918 135.597 340.039 137.619 343.643 139.026C347.247 140.433 351.202 141.137 355.509 141.137C360.08 141.137 364.299 140.258 368.167 138.499C372.035 136.652 375.551 133.882 378.715 130.188L392.428 142.852C388.033 148.216 382.583 152.306 376.078 155.12C369.661 157.934 362.41 159.341 354.323 159.341Z\", fill: \"white\" }));\nexport default SvgCdkLogo;\n","import styled from 'styled-components';\nimport Svg from './cdkLogo.svg?react';\n\nconst CdkLogo = styled(Svg)`\n max-height: 48px;\n max-width: 200px;\n`;\n\nexport default CdkLogo;\n","import CovideoLogo from 'lib/images/CovideoLogo';\nimport CdkLogo from 'lib/images/CdkLogo';\nimport { useTheme } from 'styled-components';\n\nexport const Logo = () => {\n const { isCdkEnviroment } = useTheme();\n return isCdkEnviroment ? <CdkLogo /> : <CovideoLogo />;\n};\n","export const screenSizes = {\n mb: 420,\n xs: 660,\n sm: 768,\n // breaking points from covideo v1 (c is for covideo)\n cmd: 812,\n md: 1024,\n lg: 1200,\n xlg: 1368,\n xxlg: 1750,\n};\n// fonts\nexport const systemFontStack = 'var(--font-family-secondary)';\nconst fontCommon = {\n fontFamily: systemFontStack,\n};\nexport const fontNormal400 = { ...fontCommon, fontWeight: 400 };\nexport const fontNormal500 = { ...fontCommon, fontWeight: 500 };\nexport const fontNormal600 = { ...fontCommon, fontWeight: 600 };\nexport const fontBold700 = { ...fontCommon, fontWeight: 700 };\nexport const fontBold800 = { ...fontCommon, fontWeight: 800 };\n\nexport const fontSizes = {\n xxs: '12px',\n xs: '13px',\n sm: '14px',\n m: '15px',\n md: '16px',\n lg: '18px',\n xl: '24px',\n xxl: '32px',\n};\n\nexport const mediaQueryMinWidth = {\n mb: `@media (min-width: ${screenSizes.mb}px)`,\n xs: `@media (min-width: ${screenSizes.xs}px)`,\n sm: `@media (min-width: ${screenSizes.sm}px)`,\n md: `@media (min-width: ${screenSizes.md}px)`,\n lg: `@media (min-width: ${screenSizes.lg}px)`,\n xlg: `@media (min-width: ${screenSizes.xlg}px)`,\n xxlg: `@media (min-width: ${screenSizes.xxlg}px)`,\n // breaking points from covideo v1 (c is for covideo)\n cmd: `@media (min-width: ${screenSizes.cmd}px)`,\n};\n\nexport const mediaQueryMaxWidth = {\n mb: `@media (max-width: ${screenSizes.mb}px)`,\n xs: `@media (max-width: ${screenSizes.xs}px)`,\n sm: `@media (max-width: ${screenSizes.sm}px)`,\n md: `@media (max-width: ${screenSizes.md}px)`,\n lg: `@media (max-width: ${screenSizes.lg}px)`,\n xlg: `@media (max-width: ${screenSizes.xlg}px)`,\n xxlg: `@media (max-width: ${screenSizes.xxlg}px)`,\n};\n\nexport const palette = {\n grayBorder: '#dfe3e6',\n white: '#fff',\n gray: '#f7f8fa',\n black_1_100: '#000',\n blackRgb60: 'rgba(52,58,64, .6)',\n blackRgba75: 'rgba(0,0,0, .75)',\n themeDark: '#343A40',\n gray10: '#F6F7F9',\n gray20: '#EEEFF2',\n gray40: '#D0D3D9',\n gray60: '#9297A2',\n gray80: '#4E5461',\n gray100: '#272A32',\n transparent: 'transparent',\n error: 'rgba(232, 76, 61, 1)',\n black: '#000',\n black05: 'rgba(39, 42, 50, 0.05)',\n black25: 'rgba(39, 42, 50, 0.25)',\n black40: 'rgba(39, 42, 50, 0.4)',\n red02: 'rgba(232, 76, 61, 0.02)',\n red40: 'rgba(232, 76, 61, 0.4)',\n red10: 'rgba(232, 76, 61, 0.1)',\n red100: '#E84C3D',\n whiteRgb85: 'rgba(255,255,255, .85)',\n primaryDarkBlue: '#041640',\n lightgray40: 'rgba(213,214,217,0.4)',\n covideoGray100: 'rgba(78, 84, 97, 1)',\n themeDark50Percent: '#B3B9BF',\n themeDark75Percent: '#676D73',\n secondaryButtonBlueBg: '#F2F4F6',\n label: '#9297a2',\n lightgray: 'rgba(213,214,217,1)',\n blackRgb75: 'rgba(52,58,64, .75)',\n primaryBlack25Percent: 'rgba(36, 39, 46, 0.25)',\n secondaryBlue: '#007BFF',\n midGrey: '#9297a2',\n coal: '#272a32',\n covideoGray40: 'rgba(208, 211, 217, 1)',\n};\n","import { useAuthorizationContext } from 'lib/context';\nimport { screenSizes } from 'lib/style/theme';\nimport styled, { css } from 'styled-components';\n\nconst Wrapper = styled.div`\n height: 64px;\n position: relative;\n z-index: 9;\n top: 0;\n right: 0;\n left: 0;\n background: rgb(2, 21, 19);\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n`;\n\nconst DektopChildrenWrapper = styled.div`\n height: 64px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n z-index: 8;\n padding: 0 12px;\n`;\n\nconst Left = styled.div`\n margin-right: auto;\n width: 42%;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 49%;\n `}\n`;\n\nconst Center = styled.div`\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n white-space: nowrap;\n ${({ theme }) =>\n theme.containerWidth < 480 &&\n css`\n display: none;\n `}\n }\n`;\n\nconst Right = styled.div`\n margin-left: auto;\n width: 42%;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n button {\n flex-shrink: 0;\n }\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 49%;\n `}\n`;\n\nconst EmptyDiv = styled.div`\n min-height: 1px;\n`;\n\ntype Props = {\n left?: React.ReactNode;\n center?: React.ReactNode;\n right?: React.ReactNode;\n justify?: 'center' | 'space-between';\n};\n\nexport const TopBar = ({ left, right, center }: Props) => {\n return (\n <Wrapper>\n <DektopChildrenWrapper>\n <Left>{left || <EmptyDiv />}</Left>\n <Center>{center || <EmptyDiv />}</Center>\n <Right>{right || <EmptyDiv />}</Right>\n </DektopChildrenWrapper>\n </Wrapper>\n );\n};\n","import { CSSProperties } from 'react';\nimport styled from 'styled-components';\n\nconst Wrapper = styled.div`\n width: 928px;\n max-width: 100%;\n margin: 0 auto 0;\n padding: 32px 16px;\n position: relative;\n`;\n\ntype Props = {\n children: React.ReactNode;\n extendStyle?: {\n wrapper?: CSSProperties;\n };\n};\n\nexport const Container = ({ children, extendStyle }: Props) => {\n return <Wrapper style={extendStyle?.wrapper}>{children}</Wrapper>;\n};\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\n\ntype Props = {\n type?: string;\n width?: string;\n padding?: string;\n borderColor?: string;\n};\nexport const Input = styled.input.attrs(({ type = 'text' }) => ({\n type: type,\n}))<Props>`\n background: ${theme.palette.white};\n border: 1px solid\n ${props => props.borderColor || props.theme.colors.primary[20]};\n border-radius: 6px;\n outline: none;\n height: 40px;\n padding: ${({ padding }) => padding || '8px'};\n font-size: 15px;\n line-height: 24px;\n width: ${({ width }) => width};\n &::placeholder {\n color: ${theme.palette.gray60};\n opacity: 1;\n }\n &:focus {\n border: 1px solid ${({ theme }) => theme.colors.primary[100]};\n }\n`;\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\n\ntype ButtonProps = {\n icon?: JSX.Element;\n backgroundColor?: string;\n borderColor?: string;\n textColor?: string;\n disabled?: boolean;\n margin?: string;\n width?: string;\n fontSize?: string;\n padding?: string;\n height?: string;\n hoverBorderColor?: string;\n};\n\nconst ButtonStyled = styled.button<ButtonProps>`\n background-color: ${({ backgroundColor }) => backgroundColor};\n box-sizing: border-box;\n color: ${({ textColor, theme }) => textColor || theme.colors.primary[100]};\n border: 1px solid;\n border-color: ${({ borderColor, theme }) =>\n borderColor || theme.colors.primary[5]};\n width: ${({ width }) => width};\n height: ${props => props.height || '40px'};\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${props => props.padding || '0 16px'};\n cursor: pointer;\n border-radius: 6px;\n font-weight: 600;\n font-size: ${({ fontSize }) => fontSize};\n line-height: 24px;\n margin: ${props => props.margin};\n > span {\n white-space: nowrap;\n }\n ${({ disabled }) =>\n disabled &&\n css`\n pointer-events: none;\n opacity: 0.4;\n `}\n &:hover {\n ${({ hoverBorderColor }) =>\n hoverBorderColor &&\n css`\n border-color: ${hoverBorderColor};\n `}\n }\n`;\n\nconst IconWrapper = styled.div<{ margin: string }>`\n display: flex;\n align-items: center;\n justify-content: center;\n margin: ${({ margin }) => margin};\n`;\n\nconst IconOtherWrapper = styled.div<{ margin: string }>`\n display: flex;\n align-items: center;\n justify-content: center;\n margin: ${({ margin }) => margin};\n`;\n\nconst TextWrapper = styled.div`\n display: flex;\n align-items: flex-start;\n flex-direction: column;\n flex-wrap: nowrap;\n > span {\n max-width: 200px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n`;\n\nconst SubText = styled.div`\n font-size: 10px;\n line-height: 10px;\n opacity: 0.8;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 115px;\n`;\n\ntype Props = {\n padding?: string;\n text?: string;\n subtext?: string;\n icon?: JSX.Element;\n iconOther?: JSX.Element;\n backgroundColor?: string;\n borderColor?: string;\n hoverBorderColor?: string;\n fontSize?: string;\n textColor?: string;\n disabled?: boolean;\n margin?: string;\n width?: string;\n height?: string;\n type?: 'button' | 'submit' | 'reset' | undefined;\n onClick?: (\n e?: React.SyntheticEvent | React.SyntheticEvent<Element, Event>\n ) => void;\n title?: string;\n};\n\nexport const ButtonDropdown = ({\n text,\n subtext,\n type = 'button',\n icon,\n iconOther,\n backgroundColor = theme.palette.white,\n borderColor,\n hoverBorderColor,\n textColor,\n disabled = false,\n margin = '0',\n width = 'auto',\n fontSize = '13px',\n padding = '0 16px',\n height,\n onClick,\n title,\n}: Props) => {\n const buttonPadding = padding ? padding : !!icon ? '0 16px 0 12px' : '0 16px';\n return (\n <ButtonStyled\n backgroundColor={backgroundColor}\n borderColor={borderColor}\n textColor={textColor}\n disabled={disabled}\n margin={margin}\n onClick={onClick}\n type={type}\n width={width}\n fontSize={fontSize}\n padding={buttonPadding}\n height={height}\n hoverBorderColor={hoverBorderColor}\n title={title}\n >\n {!!icon && (\n <IconWrapper margin={!!text ? '0 6px 0 0' : '0'}>{icon}</IconWrapper>\n )}\n <TextWrapper>\n <span>{text}</span>\n <SubText>{subtext}</SubText>\n </TextWrapper>\n {!!iconOther && (\n <IconOtherWrapper margin={!!text ? '0 0 0 8px' : '0'}>\n {iconOther}\n </IconOtherWrapper>\n )}\n </ButtonStyled>\n );\n};\n","import styled, { keyframes } from 'styled-components';\n\nconst animation = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\ntype Props = {\n size?: number;\n thickness?: number;\n};\nexport const Spinner = styled.div<Props>`\n display: inline-block;\n width: ${props => (props.size ? '15' : '24')}px;\n height: ${props => (props.size ? '15' : '24')}px;\n\n &:after {\n content: ' ';\n display: block;\n width: ${props => (props.size ? props.size : '14')}px;\n height: ${props => (props.size ? props.size : '14')}px;\n margin: 1px;\n border-radius: 50%;\n border: ${props => (props.thickness ? props.thickness : '3')}px solid\n ${props => (props.color ? props.color : '#fff')};\n border-color: ${props => (props.color ? props.color : '#fff')} transparent\n ${props => (props.color ? props.color : '#fff')} transparent;\n animation: ${animation} 1.2s linear infinite;\n }\n`;\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport * as theme from '../style/theme';\n\nimport { Spinner } from './index';\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n isLoading?: boolean;\n error?: boolean | null;\n text?: string;\n color?: string;\n height?: number | string;\n zIndex?: number;\n onRetry?: () => void;\n hideLoaderText?: boolean;\n};\n\ntype ContainerProps = {\n height?: number | string;\n zIndex?: number;\n};\n\nconst LoadingOverlay = styled.div<ContainerProps>`\n font-weight: 700;\n color: ${theme.palette.gray100};\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n box-sizing: border-box;\n line-height: 50px;\n margin: 0;\n z-index: ${props => (props.zIndex !== undefined ? props.zIndex : 99)};\n`;\n\nconst LoadingSection = styled.div`\n width: 100%;\n display: flex;\n flex-direction: column;\n text-align: center;\n justify-content: center;\n\n h1 {\n font-size: 18px;\n margin: 0;\n letter-spacing: 1px;\n }\n`;\n\nconst LoadingContainer = styled.div<ContainerProps>`\n position: ${props => (props.height ? 'relative' : 'inherit')};\n height: ${props => {\n if (typeof props.height === 'string') {\n return props.height;\n } else if (typeof props.height === 'number') {\n return `${props.height}px`;\n } else if (typeof props.height === 'undefined') {\n return 0;\n }\n }};\n`;\n\nexport const LoadingIndicator = ({\n isLoading = false,\n error = false,\n text,\n color,\n height,\n zIndex,\n onRetry,\n hideLoaderText,\n}: Props) => {\n const { t } = useTranslation();\n\n return (\n <LoadingContainer height={height}>\n {isLoading && !error && (\n <LoadingOverlay zIndex={zIndex}>\n <LoadingSection>\n <div>\n <Spinner color={color ? color : theme.palette.gray100} />\n </div>\n\n {!hideLoaderText && (\n <h1 style={{ color: color }}>{text ? text : t('Loading...')}</h1>\n )}\n </LoadingSection>\n </LoadingOverlay>\n )}\n {error && (\n <LoadingOverlay zIndex={zIndex}>\n <LoadingSection\n style={{ cursor: onRetry ? 'pointer' : 'auto' }}\n onClick={() => onRetry && onRetry()}\n >\n <h1>Try Again...</h1>\n </LoadingSection>\n </LoadingOverlay>\n )}\n </LoadingContainer>\n );\n};\n","import { IContextProps } from './AuthorizationContext';\nimport { toString } from '../utils/functions';\n\nconst JWT_DECODED = 'JWT_DECODED';\nconst GET_USER_START = 'GET_USER_START';\nconst GET_USER_ERROR = 'GET_USER_ERROR';\nconst GET_USER_SUCCESS = 'GET_USER_SUCCESS';\n\ntype GlobalAction = {\n continueLoading?: boolean;\n type: string;\n payload?: any;\n error?: string;\n pathname?: string;\n};\n\nexport const authReducer = (\n state: IContextProps,\n action: GlobalAction\n): IContextProps => {\n const { payload, type } = action;\n switch (type) {\n case GET_USER_SUCCESS: {\n return {\n ...state,\n userData: { ...state.userData, ...toString(payload) },\n };\n }\n case JWT_DECODED: {\n return {\n ...state,\n userData: { ...state.userData, ...payload },\n };\n }\n default:\n return state;\n }\n};\n\nexport const AUTH_ACTIONS = {\n JWT_DECODED,\n GET_USER_START,\n GET_USER_ERROR,\n GET_USER_SUCCESS,\n};\n","import React, {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useReducer,\n useState,\n} from 'react';\nimport jwtDecode from 'jwt-decode';\nimport { token } from '../config';\nimport { AUTH_ACTIONS, authReducer } from './authReducer';\nimport { GlobalAction } from './types';\ninterface Intercom {\n app_id: string;\n name: string;\n email: string;\n user_id: number;\n user_hash: string;\n cv_user_id: number;\n free_trial: boolean;\n signup_date: string; // e.g. \"09/14/2010\"\n purchase_date: string; // e.g. \"May 21, 2020\"\n customer_id: number;\n customer_name: string;\n reseller_id: number;\n reseller_name: string;\n auto: boolean;\n admin: boolean;\n resellerAdmin: boolean;\n user_active: boolean;\n last_active: string; // e.g. \"07/01/2020\"\n v1: boolean;\n v2: boolean;\n v3: boolean;\n}\n\nenum VideoQualityType {\n 'FHD' = '1080',\n '4K' = '4096',\n}\n\nenum VideoEditingType {\n 'Basic' = 'Basic',\n 'Advanced' = 'Advanced',\n}\nexport interface PackageProduct {\n id: number;\n name: string;\n value?: string;\n}\nexport interface PackageDetails {\n id: number;\n stripePackageId: string;\n products: { [key: number]: PackageProduct };\n maxVideosCreated: number;\n monthlyVideos: number;\n maxLength: number;\n maxQuality: VideoQualityType;\n editingType: VideoEditingType;\n}\n\nexport interface UserData {\n user?: any;\n uid: string;\n id: string;\n userId: string;\n customerId: string;\n resellerId: string;\n firstName: string;\n lastName: string;\n eleadEnabled: boolean;\n admin: boolean | string;\n resellerAdmin: boolean | string;\n trial: boolean;\n notifyMe: boolean;\n access: string;\n verified: number;\n captions: boolean;\n vin: boolean;\n iat: number;\n exp: number;\n intercom: Intercom;\n showWelcome: boolean;\n salesforceIntegration: boolean;\n autoTranscribe: boolean;\n wheelsTV: boolean;\n webEmailEnabled: Boolean;\n allowDelete: Boolean;\n webShare: Boolean;\n timeZone: string;\n isCompanyAdmin: boolean;\n reseller?: {\n dealer: number;\n customerId: string;\n resellerReportingEnabled: number;\n };\n eleadDMSEmployeeID: string | null;\n videoCount: number;\n totalLogins: number;\n droplrAccess: boolean;\n affiliateAccess: boolean;\n customer?: any;\n email: string;\n phone1: string;\n onboarded?: boolean;\n transcriptionAccess?: boolean;\n playButtonPosition?: string;\n signupDate?: string;\n trialAccount: boolean;\n automotiveRole: string;\n vdpEnabled: boolean;\n markVideosAsSent: number | null;\n reactionsPreference: number | null;\n spotlightEnabled?: number;\n quickVideoAvatarEnabled?: number;\n}\nconst defaultUseData = {\n id: '0',\n uid: '0',\n userId: '0',\n customerId: '0',\n resellerId: '0',\n firstName: '0',\n lastName: '0',\n eleadEnabled: false,\n admin: false,\n resellerAdmin: false,\n trial: false,\n notifyMe: false,\n access: '0',\n verified: 0,\n captions: false,\n vin: false,\n iat: 0,\n exp: 0,\n totalLogins: 0,\n showWelcome: false,\n salesforceIntegration: false,\n autoTranscribe: false,\n wheelsTV: false,\n webEmailEnabled: false,\n allowDelete: true,\n webShare: true,\n timeZone: '',\n intercom: {} as Intercom,\n videoCount: 0,\n droplrAccess: false,\n affiliateAccess: false,\n email: '',\n phone1: '',\n customer: {},\n transcriptionAccess: false,\n playButtonPosition: '0',\n trialAccount: false,\n automotiveRole: '0',\n vdpEnabled: false,\n markVideosAsSent: null,\n packageDetails: null,\n reactionsPreference: null,\n isCompanyAdmin: false,\n eleadDMSEmployeeID: null,\n};\nexport interface IContextProps {\n userData: UserData;\n jwt: string | undefined;\n setJwt: (jwt: string | undefined) => void;\n dispatch?: React.Dispatch<GlobalAction>;\n}\n\nconst AuthorizationContext = createContext({} as IContextProps);\n\ntype Props = {\n initialUser?: any;\n children: ReactNode;\n};\n\nexport const AuthorizationContextProvider = ({\n initialUser = {},\n children,\n}: Props) => {\n const [jwt, setJwt] = useState<string | undefined>(token);\n const [state, dispatch] = useReducer(authReducer, {\n userData: {\n ...defaultUseData,\n ...initialUser,\n },\n jwt: '',\n setJwt,\n });\n\n useEffect(() => {\n if (Object.keys(initialUser).length !== 0)\n dispatch({ type: AUTH_ACTIONS.GET_USER_SUCCESS, payload: initialUser });\n }, [JSON.stringify(initialUser)]);\n\n useEffect(() => {\n try {\n const decodedToken: UserData = (jwt && jwtDecode(jwt)) || defaultUseData;\n dispatch({ type: AUTH_ACTIONS.JWT_DECODED, payload: decodedToken });\n } catch (error) {\n console.log('Invalid token.');\n }\n }, [jwt]);\n\n const value = {\n ...state,\n dispatch,\n };\n\n return (\n <AuthorizationContext.Provider value={value}>\n {children}\n </AuthorizationContext.Provider>\n );\n};\n\nexport const useAuthorizationContext = () => {\n const value = useContext(AuthorizationContext);\n return value;\n};\n","export enum AutomotiveRole {\n NO_ROLE = '0',\n TECHNICIAN = '1',\n SERVICE_ADVISOR = '2',\n SERVICE_MANAGER = '3',\n SALESPERSON = '4',\n SALES_MANAGER = '5',\n BDC = '6',\n}\n","export const MarkAsSentOptions = {\n ASK_VERY_TIME: { label: 'Ask every time', value: 2 },\n NEVER: { label: 'Never', value: 0 },\n ALWAYS: { label: 'Always', value: 1 },\n};\n","import { AutomotiveRole } from 'lib/const/AutomotiveRole';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport { UserData } from 'lib/context';\n\nconst hasCustomIMSLink = (userData: UserData) => {\n const customIMSLinkCustomers = [\n '64604', // Adonis Auto Group\n '65425', // McDonald Nissan\n ];\n const hasCustomIMSLink =\n !!userData?.customerId &&\n customIMSLinkCustomers.includes(userData.customerId.toString());\n return hasCustomIMSLink;\n};\n\nenum IMS_PROVIDERS_VALUES {\n VAUTO = 'vAutoDealerId',\n EDEALER = 'eDealerId',\n HOMENET = 'homeNetId',\n MAX_DIGITAL = 'maxDigitalId',\n DEALERS_LINK = 'dealersLinkId',\n DEALER_CUE = 'dealerCueId',\n AUTO_REVOLUTION = 'autoRevolutionId',\n VINSOLUTIONS = 'vinsolutionsIMSDealerId',\n DEALER_CENTER = 'dealerCenterDealerId',\n DEALR_CLOUD = 'dealrCloudId',\n VIN_MOTION = 'vinMotionId',\n AUTO_SWEET = 'autoSweetId',\n DEALERSOCKET = 'dealerSocketIMSDealerId',\n PREDIAN = 'predianId',\n DEALER_INSPIRE = 'dealerInspireId',\n CARS_FOR_SALE = 'carsForSaleId',\n DEALER_CAR_SEARCH = 'dealerCarSearchId',\n INVENTORY_PLUS = 'inventoryPlusId',\n PRO_MAX = 'proMaxId',\n JD_POWER = 'jdPowerId',\n AUTOVERIFY = 'autoVerifyDealerId',\n DEALER_DOT_COM = 'dealerDotComIMS',\n ASTRAWEBIDS = 'astraWebIDSId',\n AGENCY360 = 'agency360Id',\n SINCRO = 'sincroId',\n DEALER_SYNC = 'dealerSyncId',\n DAELER_E_PROCESS = 'dealerEProcessId',\n CDK = 'cdkStoreId',\n DEAL_PACK = 'dealPackDealerId',\n CARPRAZE = 'carprazeId',\n AUTOTRADER = 'autoTraderId',\n NET_LOOK = 'netLookId',\n}\n\nexport const checkIfAutomotive = (userData: UserData) => {\n return (\n checkIfAutomotiveServiceRole(userData) ||\n checkIfAutomotiveSalesRole(userData)\n );\n};\n\nexport const checkIfAutomotiveServiceRole = (userData: UserData) => {\n const { customer, automotiveRole } = userData;\n return (\n customer.automotiveAccess === '1' &&\n [\n AutomotiveRole.TECHNICIAN.toString(),\n AutomotiveRole.SERVICE_ADVISOR.toString(),\n AutomotiveRole.SERVICE_MANAGER.toString(),\n ].includes(automotiveRole)\n );\n};\n\nexport const checkIfAutomotiveSalesRole = (userData: UserData) => {\n const { customer, automotiveRole } = userData;\n return (\n customer.automotiveAccess === '1' &&\n [\n AutomotiveRole.SALESPERSON.toString(),\n AutomotiveRole.SALES_MANAGER.toString(),\n AutomotiveRole.BDC.toString(),\n ].includes(automotiveRole)\n );\n};\n\nexport const checkIfVideoRequestFieldsRequired = (userData: UserData) => {\n const { customer, automotiveRole } = userData;\n return (\n customer.automotiveAccess === '1' &&\n automotiveRole === AutomotiveRole.TECHNICIAN\n );\n};\n\nexport const getMarkAsSentValue = (userData: UserData) => {\n const isAutomotive = checkIfAutomotive(userData);\n return !isAutomotive\n ? MarkAsSentOptions.NEVER.value\n : userData.customer.markVideosAsSent === null\n ? MarkAsSentOptions.ASK_VERY_TIME.value\n : parseInt(userData.customer.markVideosAsSent.toString(), 10);\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useAuthorizationContext } from '../context';\nimport { checkIfAutomotive } from '../utils/automotiveRolePermissionChecks';\n\ninterface CheckboxI {\n id?: string;\n style?: object;\n className?: string;\n boxSize?: 'sm' | 'lg' | null;\n onChange?: any;\n onClick?: any;\n checked?: boolean;\n disabled?: boolean;\n name?: string;\n checkGroupIndicator?: boolean;\n width?: string;\n isAutomotive?: boolean;\n}\n\nconst Icon = styled.svg`\n fill: none;\n stroke: white;\n stroke-width: 5px;\n display: flex;\n`;\n\nconst CheckboxContainer = styled.label`\n display: block;\n position: relative;\n margin: 0 auto;\n width: 24px;\n height: 24px;\n ${theme.mediaQueryMinWidth.mb} {\n width: 24px;\n height: 24px;\n }\n`;\n\nconst HiddenCheckbox = styled.input.attrs({ type: 'checkbox' })`\n position: absolute;\n border: 0;\n z-index: -1;\n width: 0;\n height: 0;\n top: -1px;\n left: -5px;\n &:focus {\n outline: 0;\n }\n`;\n\nconst CheckboxWrapper = styled.div<CheckboxI>`\n width: ${props => (props.width ? props.width : 'auto')};\n`;\n\nconst StyledCheckbox = styled.div<CheckboxI>`\n border-radius: 4px;\n box-sizing: border-box;\n background-color: ${props =>\n props.checked ? `${props.theme.colors.primary[100]}` : 'white'};\n border: ${props =>\n props.checked ? 'none' : `1px solid ${props.theme.colors.black[20]}`};\n\n position: absolute;\n margin-right: 0.25rem;\n top: 0;\n left: 0px;\n width: 24px;\n height: 24px;\n vertical-align: middle;\n opacity: ${props => (props.disabled ? 0.6 : 1)};\n cursor: ${props => (props.disabled ? 'normal' : 'pointer')};\n color: white;\n transition: all 150ms;\n ${Icon} {\n visibility: ${props => (props.checked ? 'visible' : 'hidden')};\n ${props => props.checkGroupIndicator && 'visibility: visible;'}\n }\n ${theme.mediaQueryMinWidth.mb} {\n width: 24px;\n height: 24px;\n }\n`;\n\nexport const CheckboxInput = (props: CheckboxI) => {\n const {\n boxSize,\n checked,\n checkGroupIndicator = false,\n disabled,\n width,\n onClick,\n style = {},\n } = props;\n\n const { userData } = useAuthorizationContext();\n const isAutomotive = checkIfAutomotive(userData);\n\n return (\n <CheckboxWrapper width={width}>\n <CheckboxContainer\n className={props.className}\n onClick={event => {\n if (onClick) {\n onClick(event);\n }\n }}\n >\n <HiddenCheckbox\n type='checkbox'\n {...props}\n disabled={disabled}\n aria-label='Hidden'\n />\n <StyledCheckbox\n boxSize={boxSize}\n checked={checked}\n checkGroupIndicator={checkGroupIndicator}\n disabled={disabled}\n isAutomotive={isAutomotive}\n style={style}\n >\n {checkGroupIndicator ? (\n <Icon viewBox='0 0 24 24'>\n <polyline points='4,12 20,12' />\n </Icon>\n ) : (\n <Icon viewBox='0 0 24 24'>\n <polyline points='20 6 9 17 4 12' />\n </Icon>\n )}\n </StyledCheckbox>\n </CheckboxContainer>\n </CheckboxWrapper>\n );\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\n\ninterface RadioProps {\n name: string;\n disabled?: boolean;\n text?: string | React.ReactNode;\n removePadding?: boolean;\n onChange?: (e?: any) => void;\n checked?: any;\n value: string | number | string[];\n onClick?: (e?: any) => void;\n checkedColor?: string;\n}\n\ninterface ContainerProps {\n removePadding?: boolean;\n htmlFor: string;\n onClick?: () => void;\n value: string | number | string[];\n}\n\nconst Container = styled.label<ContainerProps>`\n display: flex;\n padding: ${({ removePadding }) => (removePadding === true ? '0' : '5px 0')};\n align-items: center;\n justify-content: flex-start;\n box-sizing: border-box;\n cursor: pointer;\n user-select: none;\n &:hover ~ span {\n opacity: 0.5;\n }\n`;\n\nconst Dot = styled.span<RadioProps>`\n box-sizing: border-box;\n position: relative;\n height: 24px;\n width: 24px;\n background-color: rgba(0, 27, 83, 0.05);\n border-radius: 50%;\n border: solid 1px #d0d3d9;\n margin-right: 0.5rem;\n margin-left: -5px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst InsideDot = styled.span`\n background: #fff;\n border-radius: 50%;\n height: 8px;\n width: 8px;\n`;\n\nconst Radio = styled.input.attrs({ type: 'radio' })`\n appearance: none;\n width: 0px;\n cursor: pointer;\n &:checked ~ span {\n background-color: ${({ theme }) => theme.colors.primary[100]};\n border: 3px solid\n ${({ theme }) => theme.colors.primary[100]}};\n }\n`;\n\nexport const RadioInput = (props: RadioProps) => {\n const { value, text, removePadding, ...rest } = props;\n return (\n <Container\n onClick={props.onClick}\n htmlFor={rest.name}\n removePadding={removePadding}\n value={value}\n >\n <Radio value={value} {...rest} />\n <Dot value={value} {...rest}>\n {props.checked && <InsideDot />}\n </Dot>\n {text}\n </Container>\n );\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useEffect } from 'react';\n\ntype Props = {\n children?: React.ReactNode;\n widthOnDesktop?: string | number;\n disableFullScreen?: boolean;\n style?: object;\n maxHeight?: string;\n overrideBodyHeight?: boolean;\n bodyOverflowY?: string;\n bodyOverflowX?: string;\n};\n\ntype ModalStyles = {\n widthOnDesktop?: string | number;\n heightOnDesktop?: string | number;\n disableFullScreen?: boolean;\n maxHeight?: string;\n overrideBodyHeight?: boolean;\n overflowY?: string;\n overflowX?: string;\n};\n\nconst DarkBackground = styled.div`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n height: 100vh;\n background-color: ${theme.palette.blackRgba75};\n z-index: 998;\n width: 100% !important;\n`;\n\nconst ModalContainer = styled.div`\n width: auto;\n height: 100vh;\n ${theme.mediaQueryMinWidth.mb} {\n width: 100vw;\n }\n transition: height 0.5s ease-in-out;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999;\n`;\n\nconst ModalBody = styled.div<ModalStyles>`\n background-color: #fff;\n overflow-y: ${props => props.overflowY};\n overflow-x: ${props => props.overflowX};\n border-radius: 4px;\n ${props => {\n if (props.disableFullScreen) {\n return `\n height: ${\n props.overrideBodyHeight && props.maxHeight ? props.maxHeight : 'auto'\n };\n width: ${props.widthOnDesktop ? props.widthOnDesktop : 'auto'};\n `;\n }\n }}\n ${theme.mediaQueryMinWidth.cmd} {\n height: ${props =>\n props.overrideBodyHeight && props.maxHeight ? props.maxHeight : 'auto'};\n width: ${props => (props.widthOnDesktop ? props.widthOnDesktop : 'auto')};\n max-height: ${props => (props.maxHeight ? props.maxHeight : '90%')};\n }\n`;\n\nexport const Modal = ({\n style = {},\n children,\n widthOnDesktop,\n disableFullScreen,\n maxHeight,\n overrideBodyHeight = false,\n bodyOverflowY = 'auto',\n bodyOverflowX = 'hidden',\n}: Props) => {\n useEffect(() => {\n if (document && document.body) {\n const orig = document.body.className;\n document.body.className = orig + (orig ? ' ' : '') + 'modal-open';\n }\n\n return () => {\n if (document && document.body) {\n document.body.className = document.body.className.replace(\n / ?modal-open/,\n ''\n );\n }\n };\n }, []);\n\n return (\n <DarkBackground style={style}>\n <ModalContainer>\n <ModalBody\n disableFullScreen={disableFullScreen}\n widthOnDesktop={widthOnDesktop}\n maxHeight={maxHeight}\n overrideBodyHeight={overrideBodyHeight}\n overflowX={bodyOverflowX}\n overflowY={bodyOverflowY}\n >\n {children}\n </ModalBody>\n </ModalContainer>\n </DarkBackground>\n );\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport { MdClose } from 'react-icons/md';\n\nimport * as theme from 'lib/style/theme';\n\ntype BtnProps = {\n light?: boolean;\n zIndex?: boolean;\n padding?: string;\n marginTop?: string;\n marginRight?: string;\n};\n\nconst Close = styled.button<BtnProps>`\n border: none;\n cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};\n width: 60px;\n height: 60px;\n position: absolute;\n right: 0;\n color: ${props =>\n props.light ? 'rgba(255, 255, 255, 0.87)' : 'rgba(0, 0, 0, 0.87)'};\n opacity: 0.6;\n background-color: transparent;\n transition: all 0.3s;\n font-size: 20px;\n padding: ${props => props.padding || '34px 10px 0px'};\n margin-top: ${props => props.marginTop || ''};\n margin-right: ${props => props.marginRight || ''};\n display: flex;\n z-index: ${props => (props.zIndex ? '1' : 'auto')};\n &:focus {\n outline: 0;\n }\n\n &:hover {\n color: ${props =>\n props.light ? theme.palette.white : theme.palette.themeDark};\n opacity: 1;\n }\n\n span {\n transform: rotate(45deg);\n display: block;\n }\n`;\n\ntype Props = {\n disabled?: boolean;\n light?: boolean;\n zIndex?: boolean;\n padding?: string;\n marginTop?: string;\n marginRight?: string;\n onClick: () => void;\n style?: React.CSSProperties;\n};\n\nconst Component = ({\n disabled = false,\n onClick,\n light = false,\n zIndex = false,\n padding = '',\n marginTop = '',\n marginRight = '',\n style,\n}: Props) => {\n return (\n <Close\n disabled={disabled}\n onClick={onClick}\n light={light}\n zIndex={zIndex}\n padding={padding}\n marginTop={marginTop}\n marginRight={marginRight}\n style={style}\n >\n <MdClose />\n </Close>\n );\n};\n\nexport const CloseButton = React.memo(Component);\n","import styled from 'styled-components';\n\nimport * as theme from 'lib/style/theme';\n\nconst Container = styled.div`\n box-shadow:\n 0 2px 4px 0 rgba(52, 58, 64, 0.1),\n 0 4px 24px 0 rgba(52, 58, 64, 0.15);\n background-color: ${({ theme }) => theme.colors.white[100]};\n display: flex;\n align-items: center;\n border-radius: 5px;\n`;\n\nconst Message = styled.div`\n ${theme.fontNormal500};\n font-size: ${theme.fontSizes.sm};\n line-height: 1.14;\n color: ${theme.palette.themeDark};\n padding: 10px 16px;\n margin: 0;\n`;\n\ntype Props = {\n message: string;\n};\n\nexport const ToastNotification = (props: Props) => {\n const { message } = props;\n\n return (\n <Container>\n <Message>{message}</Message>\n </Container>\n );\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\nimport { ToastNotification } from './ToastNotification';\n\nconst ToastNotificationGroup = styled.div`\n position: absolute;\n top: 72px;\n right: 16px;\n z-index: 999;\n display: grid;\n gap: 8px;\n`;\n\nconst Context = React.createContext();\n\nexport const ToastNotificationsProvider = ({ children }) => {\n const [scheduledNotification, setScheduledNotification] = React.useState();\n const [notifications, setNotifications] = React.useState([]);\n\n React.useEffect(() => {\n if (scheduledNotification) {\n const { message, type, timeout = 3000 } = scheduledNotification;\n const maxAge = new Date().getTime() + timeout;\n const notification = {\n id: Math.random(),\n message,\n type,\n maxAge,\n };\n setNotifications([...notifications, notification]);\n setScheduledNotification();\n }\n }, [scheduledNotification, notifications]);\n\n React.useEffect(() => {\n const removeExpiredNotifications = setInterval(() => {\n const isExpired = ({ maxAge }) => maxAge && maxAge < new Date().getTime();\n const nextNotifications = notifications.filter(n => !isExpired(n));\n\n if (nextNotifications.length !== notifications.length) {\n setNotifications(nextNotifications);\n }\n }, 500);\n\n return () => clearInterval(removeExpiredNotifications);\n }, [notifications]);\n\n const value = { toast: setScheduledNotification };\n\n return (\n <Context.Provider value={value}>\n <>\n {notifications.length > 0 && (\n <ToastNotificationGroup>\n {notifications.map(({ id, message }) => (\n <ToastNotification key={id} message={message} />\n ))}\n </ToastNotificationGroup>\n )}\n {children}\n </>\n </Context.Provider>\n );\n};\n\nexport const useToastNotifications = () => {\n const value = React.useContext(Context);\n\n return value;\n};\n","type Props = {\n children: JSX.Element | JSX.Element[];\n};\nexport const MainWrapper = ({ children }: Props) => {\n return <div id='covideo-embeddable-recorder'>{children}</div>;\n};\n","import styled, { css } from 'styled-components';\nimport { Button } from 'react-covideo-common';\nimport { useState } from 'react';\n\nconst Switch = styled.div<{ disabled?: boolean }>`\n box-sizing: border-box;\n height: 40px;\n border-radius: 6px;\n border: solid 1px #d0d3d9;\n background-color: rgba(0, 27, 83, 0.05);\n display: flex;\n align-items: center;\n & > span {\n margin: 12px;\n }\n ${({ disabled }) =>\n disabled &&\n css`\n pointer-events: none;\n > button {\n opacity: 0.5;\n }\n `}\n`;\n\nconst NonSelectedBtn = styled.span<any>`\n font-size: 15px;\n font-weight: 600;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.6;\n letter-spacing: normal;\n text-align: center;\n color: #9297a2;\n cursor: pointer;\n`;\n\ntype Value = {\n text: string;\n value: string;\n width?: string;\n};\ntype Props = {\n defaultValue: string;\n onChange: (value: string) => void;\n values: Value[];\n skipConfirmation?: boolean;\n className?: string;\n disabled?: boolean;\n};\n\nexport const ButtonSwitch = (props: Props) => {\n const {\n defaultValue,\n values,\n onChange,\n className,\n skipConfirmation = true,\n } = props;\n\n const [value, setValue] = useState(defaultValue);\n\n return (\n <Switch\n {...(className && { className: className })}\n disabled={props.disabled}\n >\n {values.map(btn => {\n if (btn.value === value) {\n return (\n <div style={{ width: btn.width }} key={btn.value}>\n <Button text={btn.text} size='large' />\n </div>\n );\n }\n return (\n <NonSelectedBtn\n key={btn.value}\n onClick={() => {\n onChange(btn.value);\n if (skipConfirmation) setValue(btn.value);\n }}\n >\n {btn.text}\n </NonSelectedBtn>\n );\n })}\n </Switch>\n );\n};\n","import { theme } from 'lib/style';\nimport styled from 'styled-components';\n\nexport const NewTextInput = styled.input.attrs({\n type: 'text',\n})<any>`\n display: block;\n width: 100%;\n max-width: 800px;\n font-size: 16px;\n &::placeholder {\n font-size: 16px;\n color: ${theme.palette.black_1_100};\n opacity: 0.6;\n ${theme.fontNormal500}\n }\n border: ${({ error, theme }) =>\n error ? `1px solid ${theme.colors.danger[100]}` : 'solid 1px #dfe3e6'};\n height: 40px;\n padding: 12px;\n box-sizing: border-box;\n border-radius: 4px;\n transition:\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out;\n &:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: 0;\n }\n`;\n","export enum VIDE0_ACTIVITY_TYPE {\n QUOTE_SEND = 'Quote-Send',\n OPENED_EMAIL = 'Opened-Email',\n WATCHED_VIDEO = 'Watched-Video',\n APPROVED_ITEMS = 'Approved-Items',\n UPDATE_QUOTE = 'Update-Quote',\n RECORDED_VIDEO = 'Recorded-Video',\n APPROVED_VIDEO = 'Approved-Video',\n DENIED_VIDEO = 'Denied-Video',\n DELETE_VIDEO = 'Delete-Video',\n QUOTE_RESEND = 'Quote-Resend',\n UPDATE_RO = 'RO-Update',\n QUICKSHARE = 'Quickshare',\n CRM_SHARE = 'Crm-Share',\n WATCHED_VIDEO_UNKNOWN = 'WATCHED_VIDEO_UNKNOWN',\n}\n","import * as React from \"react\";\nconst SvgClose = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#272A32\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M18.3 5.71c-.187-.187-.44-.292-.705-.292-.265 0-.518.105-.705.292L12 10.59 7.11 5.7c-.187-.187-.44-.292-.705-.292-.265 0-.518.105-.705.292-.39.39-.39 1.02 0 1.41L10.59 12 5.7 16.89c-.39.39-.39 1.02 0 1.41.39.39 1.02.39 1.41 0L12 13.41l4.89 4.89c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z\" })));\nexport default SvgClose;\n","import styled from 'styled-components';\nimport CloseSvg from './close.svg?react';\n\nconst CloseIcon = styled(CloseSvg)`\n width: ${props => props.width || '16px'};\n height: ${props => props.height || '16px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CloseIcon;\n","import { VideoShareSetData } from 'app/pages/insertVideo/InsertVideo';\nimport { Modal } from 'lib/components';\nimport { VIDE0_ACTIVITY_TYPE } from 'lib/const/VideoActivity';\nimport { useAuthorizationContext } from 'lib/context';\nimport { IQuickShareMarkAsSentParams } from 'lib/hooks/query/markAsSent/useQuickShareMarkAsSentMutation';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { theme } from 'lib/style';\nimport { AiFillInfoCircle } from 'react-icons/ai';\nimport styled, { css, useTheme } from 'styled-components';\nimport { Button } from 'react-covideo-common';\nimport { screenSizes } from 'lib/style/theme';\nimport { useTranslation } from 'react-i18next';\n\nconst ModalItem = styled.div`\n box-sizing: border-box;\n width: 592px;\n padding: 32px;\n background-color: ${theme.palette.white};\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\nconst Title = styled.div`\n color: ${theme.palette.gray100};\n font-weight: bold;\n font-size: 18px;\n line-height: 24px;\n`;\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst Text = styled.div`\n font-style: normal;\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${({ theme }) => theme.colors.primary[100]};\n`;\n\nconst ButtonsWrapper = styled.section`\n display: flex;\n justify-content: flex-end;\n margin-top: 32px;\n gap: 12px;\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n justify-content: space-between;\n `}\n`;\n\nconst BlueBox = styled.div`\n display: flex;\n flex-direction: row;\n width: 500px;\n max-width: 528px;\n height: 80%;\n margin-top: 24px;\n margin-bottom: 24px;\n padding: 20px 16px;\n border-radius: 5px;\n background-color: ${theme.palette.secondaryButtonBlueBg};\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst Disclaimer = styled.section`\n display: flex;\n flex-direction: column;\n height: 100%;\n`;\n\nconst DisclaimerIconWrap = styled.section`\n margin-right: 14px;\n height: 100%;\n color: ${({ theme }) => theme.colors.primary[40]};\n`;\n\ntype Props = {\n handleModalClose: () => void;\n quickShareMarkAsSentHandler: (\n params: Omit<IQuickShareMarkAsSentParams, 'videoId'>\n ) => void;\n isQuickShareLoading?: boolean;\n markAsSentPayload: Omit<\n IQuickShareMarkAsSentParams,\n 'videoId' | 'markAsSentConfirmed'\n >;\n getMarkAsSentPayload?: () => Promise<{\n videoShareSetData: VideoShareSetData;\n useAutomotive: boolean;\n }>;\n};\n\nexport const ModalQuickShareMarkAsSent = ({\n handleModalClose,\n quickShareMarkAsSentHandler,\n isQuickShareLoading,\n markAsSentPayload,\n getMarkAsSentPayload,\n}: Props) => {\n const { t } = useTranslation();\n const { isCdkEnviroment } = useTheme();\n const { userData } = useAuthorizationContext();\n const { isCompanyAdmin } = userData;\n\n const onSubmit = async (markAsSentConfirmed: boolean) => {\n const payload = await getMarkAsSentPayload?.();\n const finalPayload: Omit<IQuickShareMarkAsSentParams, 'videoId'> = {\n markAsSentConfirmed,\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n ...markAsSentPayload,\n ...payload?.videoShareSetData,\n ...(payload?.useAutomotive !== undefined\n ? { useAutomotive: payload.useAutomotive }\n : {}),\n };\n quickShareMarkAsSentHandler(finalPayload);\n };\n\n return (\n <Modal>\n <ModalItem>\n <Header>\n <Title>{t('Mark Video as ‘Sent’?')}</Title>\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n disabled={isQuickShareLoading}\n />\n </CloseButtonWrapper>\n </Header>\n <BlueBox>\n <DisclaimerIconWrap>\n <AiFillInfoCircle size={24} color={'inherit'} />\n </DisclaimerIconWrap>\n <Disclaimer>\n <Text>\n {isCompanyAdmin\n ? t(\n \"If you don't want to answer this question with each QuickShare, you can change QuickShare preferences.\"\n )\n : t(\n \"If you don't want to answer this question with each QuickShare, your admin can change QuickShare preferences.\"\n )}\n </Text>\n </Disclaimer>\n </BlueBox>\n\n <ButtonsWrapper>\n <Button\n text={t(`Leave as ‘Not Sent’`)}\n variant={isCdkEnviroment ? 'text' : 'white'}\n disabled={isQuickShareLoading}\n onClick={() => onSubmit(false)}\n />\n <Button\n text={t(`Mark as Sent`)}\n disabled={isQuickShareLoading}\n onClick={() => onSubmit(true)}\n />\n </ButtonsWrapper>\n </ModalItem>\n </Modal>\n );\n};\n","export enum PROMPT_TYPE {\n TELEPROPTER_SCRIPT = 'Teleprompter Script',\n EMAIL = 'Email',\n SMS = 'SMS',\n CRM_MESSAGE = 'CRM Message',\n}\n","import { EXPRESS_API } from '../config';\n\ntype GetQuickshareParams = {\n videoId: number | string;\n linksetId?: number | string;\n templateId?: number | string;\n overlayId?: number | string;\n vin?: number | string;\n markAsSentConfirmed?: boolean | undefined;\n videoActivityType?: string | undefined;\n iconId?: number;\n format?: string;\n useAutomotive?: string | boolean | undefined;\n allowVideoReply?: string | boolean | undefined;\n allowReactions?: string | boolean | undefined;\n notifyUser?: string | boolean | undefined;\n reuseShortUrl?: boolean;\n};\n\nexport const getQuickshareDetails = async (\n videoId: string | number,\n params?: Omit<GetQuickshareParams, 'videoId'>\n) => {\n const response = await EXPRESS_API.get(`/share/quickshare/${videoId}`, {\n params,\n });\n return response.data;\n};\n","import { getQuickshareDetails } from 'lib/api/quckshareApi';\nimport { useToastNotifications } from 'lib/components';\nimport { isSafari } from 'lib/utils/functions';\nimport { IQuickShareMarkAsSentParams } from './query/markAsSent/useQuickShareMarkAsSentMutation';\nimport { useTranslation } from 'react-i18next';\n\nexport const useCopyClipboard = () => {\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n const copyToClipboardNonSafari = async (url: string, html?: string) => {\n const listener = (e: ClipboardEvent) => {\n if (e.clipboardData) {\n e.clipboardData.setData('text/html', html || '');\n e.clipboardData.setData('text/plain', url);\n }\n e.preventDefault();\n };\n\n document.addEventListener('copy', e => listener(e), {\n once: true,\n });\n document.execCommand('copy');\n };\n\n const copyToClipboardSafari = async (\n payload: IQuickShareMarkAsSentParams\n ) => {\n const quickshareDetails = async () => {\n const { videoId, toastType: _, ...rest } = payload;\n const getQuickshareData = await getQuickshareDetails(videoId, {\n ...rest,\n });\n return {\n url: getQuickshareData.data.url,\n html: getQuickshareData.data.html,\n };\n };\n\n const textArea = document.createElement('textArea') as HTMLTextAreaElement;\n\n await navigator.clipboard\n // @ts-ignore\n .write([\n // @ts-ignore\n await new ClipboardItem({\n 'text/plain': new Promise(async resolve => {\n resolve(\n new Blob([(await quickshareDetails()).url], {\n type: 'text/plain',\n })\n );\n }),\n\n 'text/html': new Promise(async resolve => {\n textArea.style.visibility = 'hidden';\n textArea.setAttribute('contenteditable', 'true');\n textArea.value = (await quickshareDetails()).html;\n document.body.appendChild(textArea);\n const range = document.createRange();\n range.selectNodeContents(textArea);\n const selection = window.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n textArea?.setSelectionRange(0, 999999);\n resolve(\n new Blob([textArea.value], {\n type: 'text/html',\n })\n );\n }),\n }),\n ]);\n\n if (textArea && textArea.remove) {\n textArea.remove();\n }\n };\n\n const copyClipboard = async (\n url: string,\n html: string,\n params: IQuickShareMarkAsSentParams\n ) => {\n try {\n if (isSafari) {\n await copyToClipboardSafari(params);\n } else {\n await copyToClipboardNonSafari(url, html);\n }\n } catch (error) {\n toast({\n message: t('Failed to copy to clipboard'),\n });\n }\n };\n\n return { copyClipboard };\n};\n","import { useToastNotifications } from 'lib/components';\nimport { EXPRESS_API, token } from 'lib/config';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useCopyClipboard } from 'lib/hooks/useCopyClipboard';\nimport { getMarkAsSentValue } from 'lib/utils/automotiveRolePermissionChecks';\nimport { isSafari } from 'lib/utils/functions';\nimport { useTranslation } from 'react-i18next';\nimport { useMutation } from 'react-query';\n\nexport interface MarkAsSentResponse {\n key: string;\n url: string;\n html: string;\n thumbnail: string;\n legacyHtml: string;\n shortUrlCode: string;\n image: string;\n}\n\ntype QuickShareTypes =\n | 'html_code'\n | 'url'\n | 'crm_code'\n | 'quickshare'\n | 'insert'\n | '';\n\nexport interface IQuickShareMarkAsSentParams {\n videoId: number | string;\n linksetId?: number | string;\n templateId?: number | string;\n overlayId?: number | string;\n vin?: number | string;\n\n markAsSentConfirmed?: boolean | undefined;\n videoActivityType?: string | undefined;\n iconId?: number;\n format?: string;\n useAutomotive?: string | boolean | undefined;\n allowVideoReply?: string | boolean | undefined;\n allowReactions?: string | boolean | undefined;\n notifyUser?: string | boolean | undefined;\n toastType?: QuickShareTypes;\n reuseShortUrl?: boolean;\n}\n\nconst markQuickShareAsSent = async (params: IQuickShareMarkAsSentParams) => {\n const { videoId, toastType: _, ...rest } = params;\n\n const body = {\n ...rest,\n ...(isSafari ? { reuseShortUrl: true } : {}),\n };\n\n const { data } = await EXPRESS_API.post(\n `/share/quickshare/${videoId}/mark-as-sent`,\n body\n );\n\n return data;\n};\n\nconst showProperToastAndCopyToClipboard = (\n data: MarkAsSentResponse,\n variables: IQuickShareMarkAsSentParams\n) => {\n switch (variables.toastType) {\n case 'crm_code':\n return {\n title: `CRM Code Copied!`,\n clipboardText: data.url,\n clipboardHtml: data.html,\n };\n case 'url':\n return {\n title: 'URL Copied!',\n clipboardText: data.url,\n };\n case 'html_code':\n return {\n title: 'Raw HTML Copied!',\n clipboardText: data.legacyHtml,\n };\n case 'quickshare':\n return {\n title: 'Link copied to clipboard!',\n clipboardText: data.url,\n clipboardHtml: data.html,\n };\n case 'insert':\n return {\n title: 'Inserting video...',\n };\n\n default:\n break;\n }\n};\n\nexport const useQuickShareMarkAsSentMutation = (\n onSuccessCallback: () => void\n) => {\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n const { toast } = useToastNotifications();\n const { copyClipboard } = useCopyClipboard();\n const { onVideoInsert, onVideoInsertError } = useConfigurationContext();\n const markAsSent = getMarkAsSentValue(userData);\n\n return useMutation(markQuickShareAsSent, {\n onSuccess: (data: MarkAsSentResponse, variables) => {\n const dataToShow = showProperToastAndCopyToClipboard(data, variables);\n\n if (markAsSent === MarkAsSentOptions.ALWAYS.value) {\n toast({\n message: t(`Video marked as Sent`),\n });\n }\n if (markAsSent === MarkAsSentOptions.ASK_VERY_TIME.value) {\n variables.markAsSentConfirmed &&\n toast({\n message: t(`Video marked as Sent`),\n });\n }\n if (dataToShow) {\n if (dataToShow.clipboardText) {\n try {\n if (!isSafari && dataToShow.clipboardText) {\n copyClipboard(\n dataToShow.clipboardText,\n dataToShow?.clipboardHtml || '',\n {} as IQuickShareMarkAsSentParams\n );\n }\n } catch (error) {\n console.log('Failed to copy to clipboard...', error);\n }\n }\n if (dataToShow.title) {\n // Copied message\n setTimeout(() => {\n toast({ message: t(dataToShow.title) });\n }, 100);\n }\n }\n // insert video only on insert\n if (variables.toastType === 'insert') {\n onVideoInsert?.({\n url: data.url,\n thumbnail: data.thumbnail,\n image: data?.image || '',\n html: data.html,\n token,\n });\n }\n onSuccessCallback();\n },\n onError: error => {\n onVideoInsertError?.(error);\n },\n });\n};\n","import { VideoListItem } from 'lib/api';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport {\n useAuthorizationContext,\n VideoListAutomotiveItem,\n VideoRequest,\n} from 'lib/context';\nimport {\n IQuickShareMarkAsSentParams,\n useQuickShareMarkAsSentMutation,\n} from 'lib/hooks/query/markAsSent/useQuickShareMarkAsSentMutation';\nimport { getMarkAsSentValue } from 'lib/utils/automotiveRolePermissionChecks';\nimport { isSafari } from 'lib/utils/functions';\nimport { useCopyClipboard } from './useCopyClipboard';\n\ninterface IProps {\n video: VideoListAutomotiveItem | VideoListItem | number | undefined;\n videoRequest?: VideoRequest;\n setShowModalQuickShareMarkAsSent: (\n showModalQuickShareMarkAsSent: boolean\n ) => void;\n handleOnMarkAsSentSuccessCallback?: () => void;\n}\n\nexport const useQuickShare = ({\n video,\n videoRequest,\n setShowModalQuickShareMarkAsSent,\n handleOnMarkAsSentSuccessCallback,\n}: IProps) => {\n const { userData } = useAuthorizationContext();\n const { copyClipboard } = useCopyClipboard();\n\n const onSuccessCallback = () => {\n handleOnMarkAsSentSuccessCallback?.();\n setShowModalQuickShareMarkAsSent(false);\n };\n\n // mutation\n const {\n isLoading: isQuickshareLoading,\n mutateAsync: quickShareMarkAsSentAsync,\n } = useQuickShareMarkAsSentMutation(onSuccessCallback);\n\n // mutation handler\n const onQuickShareMutationHandler = async ({\n markAsSentConfirmed,\n videoActivityType,\n ...rest\n }: Omit<IQuickShareMarkAsSentParams, 'videoId'>) => {\n const payload: IQuickShareMarkAsSentParams = {\n videoId: typeof video === 'number' ? video.toString() : video?.id || '',\n vin: videoRequest?.vin || '',\n useAutomotive: !!videoRequest?.vin,\n ...(videoActivityType ? { videoActivityType: videoActivityType } : {}),\n ...(markAsSentConfirmed !== undefined\n ? { markAsSentConfirmed: markAsSentConfirmed }\n : {}),\n ...rest,\n };\n if (isSafari) {\n try {\n await copyClipboard('', '', payload);\n } catch (error) {\n console.log('Failed to copy to clipboard...', error);\n }\n }\n return await quickShareMarkAsSentAsync(payload);\n };\n\n // on button click\n const onQuickShareButtonClick = ({\n videoActivityType,\n ...rest\n }: Omit<IQuickShareMarkAsSentParams, 'videoId'>) => {\n const markAsSent = getMarkAsSentValue(userData);\n\n // if markVideosAsSent set to NEVER -> do not mark as sent\n if (markAsSent === MarkAsSentOptions.NEVER.value) {\n return onQuickShareMutationHandler({\n videoActivityType,\n ...rest,\n });\n }\n // if markVideosAsSent not set or set to always ask -> show modal\n if (markAsSent === MarkAsSentOptions.ASK_VERY_TIME.value) {\n return setShowModalQuickShareMarkAsSent(true);\n }\n // if markVideosAsSent is set to ALWAYS -> mark it as sent\n if (markAsSent === MarkAsSentOptions.ALWAYS.value) {\n return onQuickShareMutationHandler({\n videoActivityType,\n ...rest,\n });\n }\n };\n\n return {\n onQuickShareButtonClick,\n isQuickshareLoading,\n onQuickShareMutationHandler,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\n\ntype Props = {\n src: string;\n onLoad?: (width: number, height: number) => void;\n};\n\nconst useImageLoadRetry = ({ src, onLoad }: Props) => {\n const MAX_RETRIES = 30;\n const MAX_DELAY = 5_000;\n const imgRef = useRef<HTMLImageElement>(null);\n const [retryCount, setRetryCount] = useState(0);\n const [error, setError] = useState(false);\n\n const handleLoad = () => {\n setError(false);\n setRetryCount(0);\n if (onLoad) {\n onLoad(\n imgRef.current?.offsetWidth ?? 0,\n imgRef.current?.offsetHeight ?? 0\n );\n }\n };\n\n const handleError = () => {\n setError(true);\n if (retryCount >= MAX_RETRIES) {\n return;\n }\n let timeout = Math.pow(2, retryCount) * 1000;\n if (timeout > MAX_DELAY) {\n timeout = MAX_DELAY;\n }\n setTimeout(() => setRetryCount(retryCount + 1), timeout);\n };\n\n useEffect(() => {\n if (imgRef?.current) {\n imgRef.current.onload = handleLoad;\n imgRef.current.onerror = handleError;\n imgRef.current.src = src;\n }\n\n return () => {\n if (imgRef?.current) {\n imgRef.current.onload = null;\n imgRef.current.onerror = null;\n }\n };\n }, [src, retryCount]);\n\n return { imgRef, retryCount, error };\n};\n\nexport default useImageLoadRetry;\n","export enum VideoStatus {\n NoStatus = '',\n Pending = 'pending',\n Denied = 'denied',\n Approved = 'approved',\n}\n\nexport enum VideoEncodingStatus {\n READY = 0,\n PROCESSING = 1,\n FAILED = 2,\n}\n","import { VideoListItem, getVideo } from 'lib/api';\nimport { COOKIE_NAMES } from 'lib/config';\nimport { VideoEncodingStatus } from 'lib/const/VideoStatus';\nimport { useEffect, useState } from 'react';\n\ntype Props = {\n videoId: string | number;\n checkField?: keyof VideoListItem;\n enabled: boolean;\n};\n\nconst useVideoLoadRetry = ({ videoId, checkField, enabled }: Props) => {\n const MAX_RETRIES = 30;\n const MAX_DELAY = 5_000;\n const [videoData, setVideoData] = useState<VideoListItem | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n const fetchData = async () => {\n try {\n const video = await getVideo(videoId.toString());\n const isProcessed =\n video?.processing === VideoEncodingStatus.FAILED ||\n video?.processing === VideoEncodingStatus.READY;\n\n if (!!checkField && !!video[checkField]) {\n setVideoData(video);\n return;\n }\n\n if (isProcessed) {\n const cache = localStorage.getItem(COOKIE_NAMES.merge);\n if (cache) {\n const selectedVideos = JSON.parse(cache) || [];\n // find current video\n selectedVideos.forEach((v: any, index: number) => {\n if (v.id === video.id) {\n selectedVideos[index] = video;\n }\n });\n\n // LS update\n localStorage.setItem(\n COOKIE_NAMES.merge,\n JSON.stringify(selectedVideos)\n );\n }\n setVideoData(video);\n return;\n }\n if (retryCount < MAX_RETRIES) {\n let timeout = Math.pow(2, retryCount) * 1000;\n if (timeout > MAX_DELAY) {\n timeout = MAX_DELAY;\n }\n setTimeout(() => {\n setRetryCount(retryCount + 1);\n }, timeout);\n return;\n }\n setError(true);\n } catch (error) {\n setError(true);\n }\n };\n\n fetchData();\n }, [videoId, checkField, retryCount, enabled]);\n\n return { videoData, retryCount, error };\n};\n\nexport default useVideoLoadRetry;\n","import React from 'react';\nimport { theme } from 'lib/style';\nimport { BsPlayFill } from 'react-icons/bs';\nimport styled from 'styled-components';\nimport { Spinner } from 'lib/components';\nimport useImageLoadRetry from 'lib/hooks/useImageLoadRetry';\nimport { toMMSSTimestamp } from 'lib/utils/functions';\nimport useVideoLoadRetry from 'lib/hooks/useVideoLoadRetry';\nimport { useTranslation } from 'react-i18next';\n\nexport enum VideoEncodingStatus {\n READY = 0,\n PROCESSING = 1,\n FAILED = 2,\n}\n\ntype VideoThumbnailWrapperProps = {\n status?: string;\n thumbnailHeight?: string;\n thumbnailWidth?: string;\n};\nconst VideoThumbnailWrapper = styled.div<VideoThumbnailWrapperProps>`\n position: relative;\n width: ${props => (props.thumbnailWidth ? props.thumbnailWidth : '100%')};\n height: ${props => (props.thumbnailHeight ? props.thumbnailHeight : '100%')};\n border-radius: 5px;\n background: ${theme.palette.black};\n cursor: pointer;\n overflow: hidden;\n opacity: ${props => (props.status === 'deleted' ? 0.5 : 1)};\n`;\ntype VideoThumbnailProps = {\n visible: boolean;\n};\nconst VideoThumbnail = styled.img<VideoThumbnailProps>`\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n height: 100%;\n opacity: ${props => (props.visible ? 1 : 0)};\n`;\nconst VideoPlay = styled.div`\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n`;\nconst SpinnerWrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: ${theme.palette.black};\n`;\n\nconst Label = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n color: ${theme.palette.red100};\n background-color: ${theme.palette.black};\n`;\n\nconst VideoDuration = styled.div`\n position: absolute;\n left: 8px;\n bottom: 6px;\n color: ${theme.palette.white};\n font-weight: 500;\n font-size: 13px;\n line-height: 16px;\n padding: 2px 4px;\n border-radius: 5px;\n background: ${theme.palette.blackRgba75};\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 36px;\n`;\n\ntype Props = {\n onClick: () => void;\n thumbnail: string;\n duration?: number;\n videoId: string;\n emailStatus?: string;\n processing?: VideoEncodingStatus;\n thumbnailHeight?: string;\n thumbnailWidth?: string;\n refreshVideoList?: () => void;\n};\n\nexport const VideoItemThumbnail = ({\n onClick,\n thumbnail,\n duration,\n videoId,\n emailStatus,\n processing,\n thumbnailHeight,\n thumbnailWidth,\n refreshVideoList,\n}: Props) => {\n const { t } = useTranslation();\n const prepareTime = (d: number) => {\n return toMMSSTimestamp(d / 1000).split('.')[0];\n };\n\n const { videoData } = useVideoLoadRetry({\n videoId,\n enabled: processing === VideoEncodingStatus.PROCESSING,\n });\n\n React.useEffect(() => {\n if (processing !== videoData?.processing && refreshVideoList) {\n refreshVideoList();\n }\n }, [videoData]);\n\n const {\n imgRef,\n retryCount,\n error: imageLoadError,\n } = useImageLoadRetry({\n src: videoData?.autogeneratedThumbnail || thumbnail,\n });\n\n const thumbnailAvailable = !imageLoadError && retryCount === 0;\n\n const newDuration = duration\n ? prepareTime(duration)\n : videoData?.videoLength\n ? prepareTime(videoData?.videoLength)\n : '...';\n const isProcessingFailed =\n processing === VideoEncodingStatus.FAILED ||\n videoData?.processing === VideoEncodingStatus.FAILED;\n\n const isVideoReady =\n processing === VideoEncodingStatus.READY ||\n videoData?.processing === VideoEncodingStatus.READY;\n\n const isVideoFinishedProcessing = isProcessingFailed || isVideoReady;\n\n return (\n <VideoThumbnailWrapper\n onClick={() => onClick()}\n status={emailStatus}\n thumbnailHeight={thumbnailHeight}\n thumbnailWidth={thumbnailWidth}\n >\n <VideoThumbnail\n src={thumbnail}\n key={retryCount}\n ref={imgRef}\n visible={thumbnailAvailable}\n />\n {isVideoReady && (\n <VideoPlay>\n <BsPlayFill color={theme.palette.white} size={30} />\n </VideoPlay>\n )}\n {!isVideoFinishedProcessing && (\n <SpinnerWrapper>\n <Spinner />\n </SpinnerWrapper>\n )}\n {isProcessingFailed && <Label>{t('Failed')}</Label>}\n {!isProcessingFailed && duration && (\n <VideoDuration>{newDuration}</VideoDuration>\n )}\n </VideoThumbnailWrapper>\n );\n};\n","import * as React from 'react';\n\nexport const useOnClickOutside = callback => {\n const [node, setNode] = React.useState(null);\n\n React.useEffect(() => {\n if (!node) return;\n\n const handleClickOutside = e => {\n if (!node.contains(e.target)) {\n callback();\n }\n };\n\n document.addEventListener('click', handleClickOutside, true);\n\n return () =>\n document.removeEventListener('click', handleClickOutside, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [node]);\n\n // Pass ref as callback so that it runs when node mounts:\n // https://reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node\n const ref = React.useCallback(node => setNode(node), []);\n\n return { ref };\n};\n","import * as React from 'react';\nimport styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useEffect } from 'react';\nimport { screenSizes } from 'lib/style/theme';\nimport { useOnClickOutside } from 'lib/utils/UseOnClickOutside';\n\ntype Props = {\n children?: React.ReactNode;\n widthOnDesktop?: string | number;\n disableFullScreen?: boolean;\n style?: object;\n maxHeight?: string;\n overrideBodyHeight?: boolean;\n bodyOverflowY?: string;\n bodyOverflowX?: string;\n onOutsideClick?: () => void;\n};\n\ntype ModalStyles = {\n widthOnDesktop?: string | number;\n heightOnDesktop?: string | number;\n disableFullScreen?: boolean;\n maxHeight?: string;\n overrideBodyHeight?: boolean;\n overflowY?: string;\n overflowX?: string;\n};\n\nconst DarkBackground = styled.div`\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n height: 100vh;\n background-color: ${theme.palette.blackRgba75};\n z-index: 998;\n width: 100% !important;\n`;\n\nconst ModalContainer = styled.div`\n width: auto;\n height: 100vh;\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.mb &&\n css`\n width: 100vw;\n `}\n transition: height 0.5s ease-in-out;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 999;\n`;\n\nconst ModalBody = styled.div<ModalStyles>`\n height: ${props => (props.maxHeight ? props.maxHeight : '100vh')};\n background-color: #fff;\n overflow-y: ${props => props.overflowY};\n overflow-x: ${props => props.overflowX};\n border-radius: 4px;\n ${props => {\n if (props.disableFullScreen) {\n return `\n height: ${\n props.overrideBodyHeight && props.maxHeight ? props.maxHeight : 'auto'\n };\n width: ${props.widthOnDesktop ? props.widthOnDesktop : 'auto'};\n `;\n }\n }}\n`;\n\nexport const Modal = ({\n style = {},\n children,\n widthOnDesktop,\n disableFullScreen,\n maxHeight,\n overrideBodyHeight = false,\n bodyOverflowY = 'auto',\n bodyOverflowX = 'hidden',\n onOutsideClick,\n}: Props) => {\n useEffect(() => {\n if (document && document.body) {\n const orig = document.body.className;\n document.body.className = orig + (orig ? ' ' : '') + 'modal-open';\n }\n\n return () => {\n if (document && document.body) {\n document.body.className = document.body.className.replace(\n / ?modal-open/,\n ''\n );\n }\n };\n }, []);\n\n const { ref } = useOnClickOutside(onOutsideClick);\n\n return (\n <DarkBackground style={style}>\n <ModalContainer>\n <ModalBody\n disableFullScreen={disableFullScreen}\n widthOnDesktop={widthOnDesktop}\n maxHeight={maxHeight}\n overrideBodyHeight={overrideBodyHeight}\n overflowX={bodyOverflowX}\n overflowY={bodyOverflowY}\n ref={!!onOutsideClick ? ref : null}\n >\n {children}\n </ModalBody>\n </ModalContainer>\n </DarkBackground>\n );\n};\n","import * as React from 'react';\nimport styled from 'styled-components';\n\ntype ProgressProps = {\n value?: string;\n min?: string;\n max?: string;\n color?: string;\n small?: boolean;\n};\ntype ProgressWrapperProps = {\n small?: boolean;\n};\n\nconst ProgressWrapper = styled.div<ProgressWrapperProps>`\n width: 100%;\n display: flex;\n cursor: pointer;\n flex: 1;\n padding-bottom: ${props => `${props.small ? '0px' : ' 0px 12px'}`};\n`;\n\nconst Progress = styled.progress<ProgressProps>`\n width: 100%;\n color: white;\n opacity: 1;\n height: ${props =>\n `${props.small ? '4px' : '4px'}`}; /* TODO: it's 4px in design */\n border-radius: ${props => `${props.small ? '1px' : '4px'}`};\n border: 1px solid transparent;\n box-sizing: border-box;\n\n &::-webkit-progress-bar {\n border-radius: 4px;\n }\n &::-webkit-progress-value {\n background-color: white;\n border-radius: 4px;\n }\n`;\n\ntype Props = {\n duration?: number;\n currentTime?: number;\n scrub: (e: any, progressRef: React.RefObject<HTMLProgressElement>) => void;\n color?: string;\n small?: boolean;\n};\n\nexport const ProgressBar = (props: Props) => {\n const { duration = 0.1, currentTime = 0, scrub, color, small } = props;\n const progressRef = React.createRef<HTMLProgressElement>();\n return (\n <ProgressWrapper small={small}>\n <Progress\n ref={progressRef}\n onClick={event => scrub(event, progressRef)}\n value={currentTime.toString()}\n min='0'\n max={duration.toString()}\n color={color}\n small={small}\n />\n </ProgressWrapper>\n );\n};\n","import * as React from 'react';\n\nexport const VolumeOffIcon = props => (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n xmlnsXlink='http://www.w3.org/1999/xlink'\n viewBox='0 0 24 24'\n >\n <defs>\n <path\n id='volumeOff-a'\n d='M3.63 3.635a.996.996 0 0 0 0 1.41l3.66 3.66-.29.3H4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h3l3.29 3.29c.63.63 1.71.18 1.71-.71v-4.17l4.18 4.18c-.49.37-1.02.68-1.6.91-.36.15-.58.53-.58.92 0 .72.73 1.18 1.39.91.8-.33 1.55-.77 2.22-1.31l1.34 1.34a.996.996 0 1 0 1.41-1.41L5.05 3.635c-.39-.39-1.02-.39-1.42 0zM19 12.005c0 .82-.15 1.61-.41 2.34l1.53 1.53c.56-1.17.88-2.48.88-3.87 0-3.83-2.4-7.11-5.78-8.4-.59-.23-1.22.23-1.22.86v.19c0 .38.25.71.61.85 2.57 1.04 4.39 3.56 4.39 6.5zm-8.71-6.29l-.17.17L12 7.765v-1.35c0-.89-1.08-1.33-1.71-.7zm6.21 6.29a4.5 4.5 0 0 0-2.5-4.03v1.79l2.48 2.48c.01-.08.02-.16.02-.24z'\n />\n </defs>\n <g fill='none' fillRule='evenodd'>\n <mask id='volumeOff-b' fill='#fff'>\n <use xlinkHref='#volumeOff-a' />\n </mask>\n <g fill='#fff' fillOpacity='1' mask='url(#volumeOff-b)'>\n <path d='M0 0h24v24H0z' />\n </g>\n </g>\n </svg>\n);\n","import * as React from \"react\";\nconst SvgIconPlay = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#FFF\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7.928 6.82v10.36c0 .79.87 1.27 1.54.84l8.14-5.18c.62-.39.62-1.29 0-1.69l-8.14-5.17c-.67-.43-1.54.05-1.54.84z\" })));\nexport default SvgIconPlay;\n","import styled from 'styled-components';\nimport PlaySvg from './icon-play.svg?react';\n\nconst PlayIcon = styled(PlaySvg)`\n width: ${props => props.width || '40px'};\n height: ${props => props.height || '40px'};\n path {\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default PlayIcon;\n","import * as React from \"react\";\nconst SvgIconPause = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#272A32\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8 19c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2s-2 .9-2 2v10c0 1.1.9 2 2 2zm6-12v10c0 1.1.9 2 2 2s2-.9 2-2V7c0-1.1-.9-2-2-2s-2 .9-2 2z\" })));\nexport default SvgIconPause;\n","import styled from 'styled-components';\nimport PauseSvg from './icon-pause.svg?react';\n\nconst PauseIcon = styled(PauseSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default PauseIcon;\n","import * as React from \"react\";\nconst SvgVector = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 17, viewBox: \"0 0 20 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17.2907 7.4906C17.3029 7.31501 17.3614 7.14578 17.46 7C17.5559 6.84858 17.6907 6.72571 17.8504 6.64426C18.0101 6.56281 18.1887 6.52577 18.3676 6.53701C18.5464 6.54826 18.719 6.60738 18.8672 6.70818C19.0154 6.80898 19.1338 6.94776 19.21 7.11C19.8115 8.53356 20.0749 10.0772 19.9794 11.6196C19.884 13.1621 19.4324 14.6614 18.66 16C18.4838 16.3052 18.2301 16.5584 17.9245 16.734C17.619 16.9097 17.2724 17.0014 16.92 17H3.07C2.72098 16.9979 2.37858 16.9045 2.07683 16.7291C1.77509 16.5536 1.52451 16.3023 1.35 16C0.294996 14.182 -0.160348 12.0779 0.0486524 9.98638C0.257653 7.89489 1.12037 5.92243 2.51426 4.34919C3.90815 2.77594 5.76232 1.68191 7.81341 1.2225C9.8645 0.763091 12.0082 0.961661 13.94 1.79C14.1082 1.85914 14.2544 1.97285 14.3628 2.11888C14.4712 2.26492 14.5377 2.43776 14.5552 2.61879C14.5727 2.79982 14.5405 2.98219 14.462 3.14628C14.3836 3.31036 14.2619 3.44995 14.11 3.55C13.9642 3.64865 13.795 3.70707 13.6194 3.71936C13.4438 3.73165 13.2681 3.69738 13.11 3.62C12.4369 3.33395 11.7264 3.14538 11 3.06C9.56439 2.8728 8.10489 3.07868 6.77709 3.6557C5.44928 4.23271 4.30294 5.15924 3.46028 6.3365C2.61762 7.51376 2.11023 8.89763 1.99219 10.3406C1.87414 11.7835 2.14988 13.2314 2.79 14.53C2.87447 14.6931 3.0022 14.8297 3.1592 14.9249C3.31619 15.0202 3.49638 15.0704 3.68 15.07H16.33C16.5126 15.0713 16.6921 15.0227 16.849 14.9292C17.0059 14.8358 17.1342 14.7012 17.22 14.54C17.9267 13.0705 18.1674 11.4201 17.91 9.81C17.8129 9.18733 17.6382 8.57927 17.39 8C17.3126 7.84191 17.2784 7.66618 17.2907 7.4906Z\", fill: \"#001B53\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M8.00391 11.005C8.00391 10.4743 8.21474 9.96527 8.59002 9.58999L17.08 3.92999L11.42 12.42C11.0447 12.7953 10.5357 13.0061 10.005 13.0061C9.74223 13.0061 9.48201 12.9543 9.23923 12.8538C8.99644 12.7532 8.77584 12.6058 8.59002 12.42C8.4042 12.2342 8.2568 12.0136 8.15623 11.7708C8.05567 11.528 8.00391 11.2678 8.00391 11.005Z\", fill: \"#001B53\" }));\nexport default SvgVector;\n","import styled from 'styled-components';\nimport VectorSvg from './Vector.svg?react';\n\nconst VectorIcon = styled(VectorSvg)`\n width: ${props => props.width || '16px'};\n height: ${props => props.height || '16px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default VectorIcon;\n","import * as React from \"react\";\nconst SvgCheckmark = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, viewBox: \"0 0 16 16\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#FFF\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"1i74dgfm6a\", d: \"M5.867 10.603L3.533 8.27c-.123-.125-.291-.195-.466-.195-.176 0-.344.07-.467.195-.26.26-.26.673 0 .933l2.793 2.794c.26.26.68.26.94 0l7.067-7.06c.26-.26.26-.674 0-.934-.123-.124-.291-.195-.467-.195-.175 0-.343.07-.466.195l-6.6 6.6z\" })));\nexport default SvgCheckmark;\n","import styled from 'styled-components';\nimport CheckmarkSvg from './checkmark.svg?react';\n\nconst CheckmarkIcon = styled(CheckmarkSvg)`\n width: ${props => props.width || '21px'};\n height: ${props => props.height || '21px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CheckmarkIcon;\n","import * as React from \"react\";\nconst SvgCdkSmallLogo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 290 290\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"mask\", { id: \"mask0_16_1171\", style: {\n maskType: \"luminance\"\n}, maskUnits: \"userSpaceOnUse\", x: 0, y: 0, width: 290, height: 290 }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M290 0H0V290H290V0Z\", fill: \"white\" })), /* @__PURE__ */ React.createElement(\"g\", { mask: \"url(#mask0_16_1171)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M143.64 129.1H133.1V160.12H143.64C149.42 160.12 152.36 158.82 154.88 156.4C157.82 153.54 159.46 150 159.46 144.74C159.46 139.82 158 136.18 155.32 133.34C152.82 130.66 149.88 129.1 143.66 129.1H143.64Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M145.74 0.78C66.42 0.78 1.9 65.3 1.9 144.62C1.9 223.94 66.42 288.46 145.74 288.46C225.06 288.46 289.58 223.94 289.58 144.62C289.58 65.3 225.06 0.78 145.74 0.78ZM78.76 174.56C59.84 174.56 47.3 161.08 47.3 144.58C47.3 128.08 59.92 114.68 78.32 114.68C88.68 114.68 98.22 118.66 106.48 124.36L97.4 134.2C92.12 129.88 85.3 127.38 80.2 127.38C69.74 127.38 63 135.24 63 144.66C63 154.08 69.92 161.94 80.62 161.94C87.18 161.94 94.02 158.06 99.02 153.38L108.18 163.06C101.36 169.1 91.16 174.56 78.72 174.56H78.76ZM167.14 164.78C162.22 169.62 155.14 172.82 143.98 172.82H117.98V116.4H143.98C154.52 116.4 162.3 119.34 167.56 124.86C172.4 129.96 175.08 136.86 175.08 144.56C175.08 152.26 172.32 159.68 167.14 164.78ZM228.66 172.82L209.4 148.54L202.58 155.02V172.82H187.38V116.4H202.58V137.56L224.78 116.4H243.96L220.02 138.78L247.4 172.82H228.66Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M264.54 269.48H262.68V274.18H261.34V269.48H259.48V268.4H264.54V269.48Z\", fill: \"white\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M270.52 270.7L268.82 273.56H268.2L266.52 270.78V274.18H265.26V268.4H266.36L268.54 271.98L270.66 268.4H271.76L271.78 274.18H270.52V270.7Z\", fill: \"white\" })));\nexport default SvgCdkSmallLogo;\n","import styled from 'styled-components';\nimport SmallLogo from './CdkSmallLogo.svg?react';\n\nconst CdkSmallLogo = styled(SmallLogo)`\n width: ${props => props.width || '21px'};\n height: ${props => props.height || '21px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CdkSmallLogo;\n","import * as React from \"react\";\nconst SvgCovideoSmallLogo = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 32, height: 32, viewBox: \"0 0 32 32\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_169_7893)\" }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M13.8611 22.8365V8.99684L7.47923 3.75562L0 11.1862V20.81L7.483 28.2956L7.52376 28.2684L13.8611 22.8365Z\", fill: \"white\", fillOpacity: 0.4 }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M32 12.9316V11.1862L22.3706 1.5625H9.68686L7.48309 3.75112L22.1049 15.761H32V12.9316Z\", fill: \"url(#paint0_linear_169_7893)\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M22.1049 15.761L7.48309 28.2956L9.62573 30.4375H22.3706L32 20.81V15.761H22.1049Z\", fill: \"white\", fillOpacity: 0.6 })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"linearGradient\", { id: \"paint0_linear_169_7893\", x1: 16.8056, y1: 3.07019, x2: 25.1265, y2: 15.5418, gradientUnits: \"userSpaceOnUse\" }, /* @__PURE__ */ React.createElement(\"stop\", { offset: 0.0483, stopColor: \"white\", stopOpacity: 0.5 }), /* @__PURE__ */ React.createElement(\"stop\", { offset: 1, stopColor: \"white\", stopOpacity: 0.8 })), /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_169_7893\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 32, height: 32, fill: \"white\" }))));\nexport default SvgCovideoSmallLogo;\n","import styled from 'styled-components';\nimport SmallLogo from './CovideoSmallLogo.svg?react';\n\nconst CovideoSmallLogo = styled(SmallLogo)`\n width: ${props => props.width || '21px'};\n height: ${props => props.height || '21px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CovideoSmallLogo;\n","import * as React from 'react';\nimport styled, { useTheme } from 'styled-components';\n\nimport { IoIosVolumeHigh } from 'react-icons/io';\nimport { MdFullscreen } from 'react-icons/md';\nimport { VolumeOffIcon } from 'lib/images/volumeOff';\nimport PlayIcon from 'lib/images/playButton';\nimport PauseIcon from 'lib/images/pauseButton';\nimport { ProgressBar } from './';\nimport VectorIcon from 'lib/images/VectorIcon';\nimport { theme } from 'lib/style';\nimport CheckmarkIcon from 'lib/images/CheckmarkIcon';\nimport CdkSmallLogo from 'lib/images/CdkSmallLogo';\nimport CovideoSmallLogo from 'lib/images/CovideoSmallLogo';\nimport { useTranslation } from 'react-i18next';\n\ntype DimensionProps = {\n small?: boolean;\n};\n\nconst VideoControlsLayout = styled.div<DimensionProps>`\n display: flex;\n align-items: center;\n color: white;\n font-size: 14px;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst BottomControlsLayout = styled.div<DimensionProps>`\n margin-top: 6px;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n color: white;\n font-size: 14px;\n`;\n\nconst LeftControls = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: max-content;\n`;\n\nconst RightControls = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst PlayButton = styled.div<DimensionProps>`\n width: ${props => `${props.small ? '16px' : '20px'}`};\n height: ${props => `${props.small ? '16px' : '20px'}`};\n cursor: pointer;\n margin-right: ${props => `${props.small ? '6px' : '8px'}`};\n transition: all 0.3s;\n\n &:hover {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 2px;\n }\n`;\n\nconst VolRange = styled.input<DimensionProps>`\n /* RESET */\n width: 74px;\n opacity: 1;\n visibility: visible;\n transition: all 0.4s;\n -webkit-appearance: none; /* Hides the slider so that custom slider can be made */\n background: transparent; /* Otherwise white in Chrome */\n\n &:focus {\n outline: none; /* Removes the blue border. We should probably do some kind of focus styling for accessibility reasons though. */\n }\n &::-ms-track {\n width: 96px;\n cursor: pointer;\n /* Hides the slider so custom styles can be added */\n background: transparent;\n border-color: transparent;\n color: transparent;\n height: ${props => `${props.small ? '2px' : '2px'}`};\n }\n\n &::-webkit-slider-runnable-track {\n width: 100%;\n height: ${props => `${props.small ? '2px' : '2px'}`};\n cursor: pointer;\n opacity: 0.75;\n background: ${props => props.color};\n border-radius: ${props => `${props.small ? '2px' : '2px'}`};\n border: 0.2px solid transparent;\n }\n\n &::-webkit-slider-thumb {\n border: 1px solid transparent;\n height: ${props => `${props.small ? '6px' : '6px'}`};\n width: ${props => `${props.small ? '6px' : '6px'}`};\n border-radius: 50%;\n background: ${props => props.color};\n cursor: pointer;\n -webkit-appearance: none;\n margin-top: -3px;\n }\n`;\n\nconst VolControls = styled.div`\n display: flex;\n width: 100px;\n align-items: center;\n overflow: hidden;\n transition: all 0.4s;\n margin-right: 8px;\n`;\n\nconst VolumeIconWrapper = styled.div<DimensionProps>`\n height: ${props => `${props.small ? '15px' : '20px'}`};\n width: ${props => `${props.small ? '15px' : '20px'}`};\n cursor: pointer;\n &:hover {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 2px;\n }\n`;\n\nconst TimeDisplay = styled.div<DropDownProps>`\n margin-right: 16px;\n color: ${props => props.color};\n\n ${props => {\n if (props.width && props.width < 330) {\n return `font-size: 11px;`;\n }\n }}\n`;\n\ninterface ButtonProps {\n active?: boolean;\n color?: string;\n}\n\nconst ControlsButton = styled.div<ButtonProps>`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 20px;\n height: 20px;\n cursor: pointer;\n transition: all 0.3s;\n margin-left: 3px;\n border-radius: 5px;\n\n &:hover {\n background: rgba(255, 255, 255, 0.2);\n }\n\n ${props => {\n if (props.active && props.color === '#000000') {\n return `\n background-color: white;\n &:hover {\n background: white;\n }\n path {\n fill: ${props.color};\n }`;\n }\n }}\n`;\n\ninterface DropDownProps {\n width?: number;\n}\n\nconst PlaybackSpeed = styled.div<DropDownProps>`\n z-index: 200;\n overflow-y: auto;\n right: 40px;\n bottom: 60px;\n min-width: 110px;\n max-width: 160px;\n max-height: 160px;\n\n cursor: pointer;\n position: absolute;\n background-color: white;\n border: 1px solid #f7f8fa;\n box-sizing: border-box;\n box-shadow: 0px 6px 16px rgba(29, 30, 36, 0.06);\n border-radius: 5px;\n color: ${theme.palette.primaryDarkBlue};\n display: flex;\n flex-direction: column;\n\n p {\n padding: 8px 24px;\n color: #9297a2;\n font-size: 14px;\n margin: 0;\n ${props => {\n if (props.width && props.width < 330) {\n return `font-size: 9px;\n \n padding: 8px 16px;`;\n }\n if (props.width && props.width < 500) {\n return `font-size: 11px;\n `;\n }\n }}\n }\n\n div {\n display: flex;\n justify-content: space-between;\n font-weight: 600;\n font-size: 15px;\n line-height: 24px;\n color: #272a32;\n padding: 0 24px;\n ${props => {\n if (props.width && props.width < 330) {\n return `font-size: 10px;\n `;\n }\n if (props.width && props.width < 500) {\n return `font-size: 12px;\n `;\n }\n }}\n path {\n fill: #272a32;\n }\n\n &:hover {\n background-color: ${theme.palette.lightgray40};\n }\n }\n`;\n\nconst PLAYBACK_SPEEDS = [\n {\n value: 2,\n label: '2.0x',\n },\n {\n value: 1.5,\n label: '1.5x',\n },\n {\n value: 1.25,\n label: '1.25x',\n },\n {\n value: 1,\n label: '1.0x',\n },\n {\n value: 0.75,\n label: '0.75x',\n },\n {\n value: 0.5,\n label: '0.5x',\n },\n];\n\ntype Props = {\n isVideoPaused?: boolean;\n togglePlay?: () => void;\n isVideoMuted?: boolean;\n handleMute?: () => void;\n handleFullScreen?: () => void;\n setPlayBack?: (rate: number) => void;\n setTranslate?: (rate: string) => void;\n captionsEnabled?: boolean;\n captions?: string;\n duration?: number;\n currentTime?: number;\n handleVolumeControl: (\n e: any,\n progressRef: React.RefObject<HTMLInputElement>\n ) => void;\n volumeRange: number;\n playerIconsColor: string;\n small?: boolean;\n isVisible?: boolean;\n scrub: (e: any, progressRef: React.RefObject<HTMLProgressElement>) => void;\n playerBackgroundColor: string;\n videoRef?: any;\n isAutomotive?: boolean;\n showPlaybackSpeed?: boolean;\n hideControls: () => void;\n setShowPlaybackSpeed: React.Dispatch<React.SetStateAction<boolean>>;\n};\n\nexport const VideoControls = (props: Props) => {\n const { t } = useTranslation();\n const { isCdkEnviroment } = useTheme();\n const {\n isVideoPaused,\n isVideoMuted,\n togglePlay,\n handleMute,\n handleFullScreen,\n duration = 0,\n currentTime = 0,\n handleVolumeControl,\n volumeRange,\n playerIconsColor,\n playerBackgroundColor,\n setPlayBack,\n isVisible,\n small,\n videoRef,\n scrub,\n hideControls,\n showPlaybackSpeed,\n setShowPlaybackSpeed,\n } = props;\n const [playbackSpeed, setPlaybackSpeed] = React.useState(1);\n\n const formatTimeToString = (time: number) => {\n let timeMinutes = Math.floor(time / 60);\n let timeMinutesString = timeMinutes.toString();\n let timeSeconds = `${Math.floor(time - timeMinutes * 60)}`;\n if (timeMinutesString.length === 1) timeMinutesString = `0${timeMinutes}`;\n if (timeSeconds.length === 1) timeSeconds = `0${timeSeconds}`;\n return `${timeMinutes}:${timeSeconds}`;\n };\n\n const currentTimeString = formatTimeToString(currentTime);\n const volRangeRef = React.createRef<HTMLInputElement>();\n\n const volumeMultiplied = volumeRange * 100;\n\n React.useEffect(() => {\n if (!isVisible) {\n setShowPlaybackSpeed(false);\n }\n }, [isVisible]);\n\n const setPlaybackRate = (rate: number) => {\n setPlayBack && setPlayBack(rate);\n setPlaybackSpeed(rate);\n hideControls && hideControls();\n };\n\n const openPlaybackSpeed = () => {\n setShowPlaybackSpeed(!showPlaybackSpeed);\n };\n\n return (\n <VideoControlsLayout small={small}>\n <ProgressBar\n duration={duration}\n currentTime={currentTime}\n scrub={scrub}\n color={playerIconsColor}\n small={small}\n />\n <BottomControlsLayout>\n <LeftControls>\n <PlayButton small={small} onClick={togglePlay}>\n {isVideoPaused ? (\n <PlayIcon color={playerIconsColor} width={20} height={20} />\n ) : (\n <PauseIcon color={playerIconsColor} width={20} height={20} />\n )}\n </PlayButton>\n {!small && (\n <>\n <VolControls>\n <VolumeIconWrapper small={small} onClick={handleMute}>\n {isVideoMuted ? (\n <VolumeOffIcon color={playerIconsColor} />\n ) : (\n <IoIosVolumeHigh\n style={{\n color: playerIconsColor,\n fontSize: 20,\n }}\n />\n )}\n </VolumeIconWrapper>\n <VolRange\n ref={volRangeRef}\n aria-label='Volume Range'\n type='range'\n min='0'\n value={volumeMultiplied.toString()}\n onChange={event => handleVolumeControl(event, volRangeRef)}\n max='100'\n step='1'\n color={playerIconsColor}\n small={small}\n />\n </VolControls>\n <TimeDisplay\n width={videoRef.current && videoRef.current.clientWidth}\n color={playerIconsColor}\n >\n {currentTimeString}\n {' / '}\n {formatTimeToString(duration)}\n </TimeDisplay>\n </>\n )}\n </LeftControls>\n {!small && (\n <RightControls>\n <ControlsButton\n active={showPlaybackSpeed}\n color={playerBackgroundColor}\n onClick={openPlaybackSpeed}\n >\n <VectorIcon color={playerIconsColor} />\n </ControlsButton>\n {showPlaybackSpeed && (\n <PlaybackSpeed\n width={videoRef.current && videoRef.current.clientWidth}\n >\n <p>{t('Playback Speed')}</p>\n {PLAYBACK_SPEEDS.map(ps => (\n <div key={ps.value} onClick={() => setPlaybackRate(ps.value)}>\n <span>{ps.label}</span>{' '}\n {playbackSpeed == ps.value && (\n <CheckmarkIcon\n width={\n videoRef.current && videoRef.current.clientWidth < 500\n ? '16px'\n : '20px'\n }\n height={\n videoRef.current && videoRef.current.clientWidth < 500\n ? '16px'\n : '20px'\n }\n />\n )}\n </div>\n ))}\n </PlaybackSpeed>\n )}\n\n <ControlsButton onClick={handleFullScreen}>\n <MdFullscreen\n style={{\n color: playerIconsColor,\n fontSize: 20,\n }}\n />\n </ControlsButton>\n {isCdkEnviroment ? (\n <CdkSmallLogo\n style={{ marginLeft: 4 }}\n fill={theme.palette.white}\n />\n ) : (\n <CovideoSmallLogo\n style={{ marginLeft: 4 }}\n fill={theme.palette.white}\n />\n )}\n </RightControls>\n )}\n </BottomControlsLayout>\n </VideoControlsLayout>\n );\n};\n","export enum VideoPlayerInteraction {\n PLAY = 'Play',\n PAUSE = 'Pause',\n COMPLETE = 'Complete',\n}\n","export enum GTMEvent {\n COVIDEO_EVENT = 'covideo-event',\n COVIDEO_PAGEVIEW = 'covideo-pageview',\n}\n\nexport enum GTMPageApplication {\n CRM_VIDEO_EMBED = 'CDK Video Whitelabel',\n}\n\nexport enum GTMEventName {\n VIDEO_INTERACTION = 'Video Interaction',\n INVENTORY_INTERACTION = 'Inventory Interaction',\n MEETING_INTERACTION = 'Meeting Interaction',\n SCHEDULE_MEETING = 'Schedule Meeting',\n SAVED_NEW_VIDEO = 'Saved New Video',\n VIDEO_ATTRIBUTE_INTERACTION = 'Video Attribute Interaction',\n VIDEO_MESSAGE_INTERACTION = 'Video Message Interaction',\n SELECT_RECORDING_TYPE = 'Select Recording Type',\n RECORDING_TOOL_INTERACTION = 'Recording Tool Interaction',\n START_RECORDING = 'Start Recording',\n STOP_RECORDING = 'Stop Recording',\n ADD_VIDEO_ATTRIBUTES = 'Add Video Attributes',\n DISCARD_VIDEO = 'Discard Video',\n RECENTLY_DELETED_INTERACTION = 'Recently Deleted Interaction',\n NEW_LEAD_ADDED = 'New Lead Added',\n CREATE_NEW_MEETING = 'Create New Meeting',\n VIDEO_PLAYER_INTERACTION = 'Video Player Interaction',\n}\n\nexport enum PageLocation {\n SEND_SHARE = 'Send & Share',\n VIDEOS = 'Videos',\n RECORD = 'Record',\n MERGE = 'Merge',\n DETAILS = 'Details',\n}\n\nexport enum PageUrl {\n SEND_SHARE = 'https://video.connectcdk.com/embed/send',\n HOME = 'https://video.connectcdk.com/embed/home',\n MERGE = 'https://video.connectcdk.com/embed/merge',\n RECORD = 'https://video.connectcdk.com/embed/record',\n VOICE_RECORDER = 'https://video.connectcdk.com/embed/voice-recorder',\n}\n\nexport enum PageSection {\n SHARE = 'Share',\n OVERVIEW = 'Overview',\n RECORD = 'Record',\n RECORDER = 'Recorder',\n DETAILS = 'Details',\n VOICE_RECORDER = 'Voice Recorder',\n}\n\n// Pageview Attributes\nexport interface GTMPageviewAttributes {\n /**\n * Event name for GTM or analytics tracking.\n * Always set to `'covideo-pageview'`.\n * @example \"covideo-pageview\"\n */\n event: GTMEvent.COVIDEO_PAGEVIEW;\n\n /**\n * Application or product identifier where the pageview originated.\n * Typically fixed to `'CRM Video Embed'`.\n * @example \"'CRM Video Embed'\"\n */\n application: GTMPageApplication.CRM_VIDEO_EMBED;\n\n /**\n * Full URL of the page viewed, including protocol, domain, and path.\n * @example \"https://video.connectcdk.com/reports/companies\"\n */\n page_url: string;\n\n /**\n * Higher-level section or context of the page being viewed\n * (e.g., \"Reports\", \"Library\", \"Dashboard\").\n * @example \"Reports\"\n */\n page_location?: string;\n /**\n * **Lower-level location within the selected `page_section`.**\n * Represents a specific page or sub-route under that section.\n * @example \"My Team\"\n */\n page_section?: string;\n}\n\n// Event Attributes\nexport interface GTMEventAttributes {\n /**\n * Event name for GTM or analytics tracking.\n * Always set to `'covideo-name'`.\n * @example \"covideo-name\"\n */\n event: GTMEvent.COVIDEO_EVENT;\n\n // problably missing video message interaction\n /**\n * Specific name of the event being tracked.\n * Examples include 'Video Interaction', 'Inventory Interaction', 'Meeting Interaction', 'Schedule Meeting', 'Save New Video', and 'Video Attribute Interaction'.\n * @example \"Video Interaction\"\n */\n event_name: GTMEventName;\n}\n\n// CDK User Attributes\nexport interface GTMCDKUserAttributes {\n /**\n * Unique identifier of the user within our system.\n * @example \"2343564\"\n */\n user_id?: string;\n\n /**\n * One or more roles assigned to the user.\n * @example [\"Sales Person\", \"F&I Manager\"]\n */\n user_role?: string[];\n\n /**\n * Enterprise identifier (CDK enterprise code).\n * @example \"E000118\"\n */\n enterprise_id?: string;\n\n /**\n * Enterprise (dealer group) display name.\n * @example \"Excellence Motors\"\n */\n enterprise_name?: string;\n\n /**\n * Store identifier (CDK store code).\n * @example \"S13552\"\n */\n store_id?: string;\n\n /**\n * Store display name.\n * @example \"Toyota Boston\"\n */\n store_name?: string;\n\n /**\n * Customer identifier from the CRM (if present).\n * @example \"123454\"\n */\n customer_id?: string;\n\n /**\n * Flag indicating whether the user is an internal user (CDK/Covideo staff).\n * @example true\n */\n is_internal_user?: boolean;\n}\n\n// Video Attributes\nexport interface GTMVideoAttributes {\n /**\n * The ID of the video that is selected, created, or currently present on the page.\n * @example 987654\n */\n video_id?: number;\n\n /**\n * The category/type associated with the video.\n * Common examples: \"Marketing\", \"Prospecting\", \"Respond to Inquiry\", \"Thanks for Your Business\".\n * @example \"Marketing\"\n */\n video_type?: string | undefined;\n\n /**\n * Whether the video has the customer's name filled in.\n * NOTE: By cdk documentation this is a boolean check if that is correct.\n * @example true\n */\n video_customer_name?: boolean;\n\n /**\n * Length of the video in **minutes** as a decimal value.\n * For example, \"00:02:45\" (2 minutes 45 seconds) -> 2.75 minutes.\n * @example 2.75\n */\n video_length?: number;\n\n /**\n * Title of the video.\n * NOTE: By cdk documentation this is The inventory ID of the vehicle related to this video (as provided for tracking).\n * @example 123456\n */\n video_title?: string;\n}\n\n// Vehicle Attributes\nexport interface GTMVehicleAttributes {\n /**\n * Vehicle description.\n * @example \"2019 Ford Taurus\"\n */\n vehicle?: string;\n\n /**\n * Vehicle price in numeric form (no currency symbol).\n * @example 17499\n */\n price?: number;\n\n /**\n * Vehicle Identification Number (VIN).\n * @example \"1FAHP2E89KG117472\"\n */\n vin?: string;\n\n /**\n * Dealer stock number.\n * @example \"AU117472\"\n */\n stock_number?: string;\n\n /**\n * Vehicle condition (e.g., New, Used, CPO).\n * @example \"Used\"\n */\n condition?: string;\n\n /**\n * Engine details or code.\n * @example \"3.5L Ti-VCT V6 (FFV)\"\n */\n engine?: string;\n\n /**\n * Manufacturer / make.\n * @example \"Ford\"\n */\n make?: string;\n\n /**\n * Vehicle model.\n * @example \"Taurus\"\n */\n model?: string;\n\n /**\n * Trim and/or body style.\n * @example \"SEL 4dr Front-wheel Drive Sedan\"\n */\n trim?: string;\n\n /**\n * Model year.\n * @example 2019\n */\n year?: number;\n\n /**\n * Odometer reading in miles.\n * @example 39231\n */\n mileage?: number;\n\n /**\n * Exterior color.\n * @example \"Red\"\n */\n ext_color?: string;\n\n /**\n * Interior color.\n * @example \"Dune\"\n */\n int_color?: string;\n\n /**\n * Transmission type.\n * @example \"Automatic\"\n */\n transmission?: string;\n}\n\n// covideo mapper video and vehicle attributes\nexport interface CovideoGTMVideoAttributes {\n videoId?: number;\n videoType?: string;\n videoCustomerName?: boolean;\n videoLength?: number;\n videoTitle?: string;\n}\n\nexport interface CovideoGTMVehicleItem {\n title: string;\n price: string | number;\n year: string | number;\n mileage: string | number;\n vin: string;\n stockNumber: string | number;\n itemCondition: string;\n engine: string;\n make: string;\n model: string;\n trim: string;\n exteriorColor: string;\n interiorColor: string;\n transmission: string;\n}\n","import {\n CovideoGTMVehicleItem,\n CovideoGTMVideoAttributes,\n GTMVehicleAttributes,\n GTMVideoAttributes,\n PageLocation,\n PageSection,\n PageUrl,\n} from './types';\n\n/**\n * Convert a duration to decimal minutes.\n * Pass API value (ms or s) and get minutes rounded to 2 decimals.\n *\n * @example toDecimalMinutes(50600, 'ms') // 0.84 (≈ 50.6s)\n * @example toDecimalMinutes(50, 's') // 0.83 (50s)\n * @example toDecimalMinutes(165, 's') // 2.75 (2m45s)\n */\nexport function toDecimalMinutes(\n value: number,\n unit: 'ms' | 's' = 'ms',\n fractionDigits = 2\n): number {\n if (!Number.isFinite(value) || value < 0) return 0;\n const seconds = unit === 'ms' ? value / 1000 : value;\n const minutes = seconds / 60;\n const factor = 10 ** fractionDigits;\n return Math.round(minutes * factor) / factor;\n}\n\nexport function mapToGTMVideoAttributes(\n src?: CovideoGTMVideoAttributes\n): GTMVideoAttributes {\n if (!src) {\n return {} as GTMVideoAttributes;\n }\n\n return {\n video_id: Number(src.videoId),\n video_title: src?.videoTitle || undefined,\n video_type: src?.videoType ?? undefined,\n video_customer_name: Boolean(src?.videoCustomerName),\n video_length: toDecimalMinutes(Number(src?.videoLength)) || 0,\n };\n}\n\n/**\n * Map app-level meeting attributes to GTM meeting attributes.\n */\n\nexport function mapToGtmVehicleAttributes(\n item?: CovideoGTMVehicleItem\n): GTMVehicleAttributes {\n const vehicleData: GTMVehicleAttributes = !!item\n ? {\n vehicle: item?.title || undefined,\n price: item?.price ? parseFloat(item?.price.toString()) : undefined,\n vin: item?.vin || undefined,\n stock_number: item?.stockNumber?.toString() || undefined,\n condition: item?.itemCondition || undefined,\n engine: item?.engine || undefined,\n make: item?.make || undefined,\n model: item?.model || undefined,\n trim: item?.trim || undefined,\n year: item?.year ? parseInt(item?.year.toString(), 10) : undefined,\n mileage: item?.mileage\n ? parseInt(item?.mileage.toString(), 10)\n : undefined,\n ext_color: item?.exteriorColor || undefined,\n int_color: item?.interiorColor || undefined,\n transmission: item?.transmission || undefined,\n }\n : {};\n return vehicleData;\n}\n\n// deliveryTime format: \"YYYY-MM-DD;HH:MM;AM/PM\" (example)\n// Returns { meetingDate?: string, meetingTime?: string }\nexport function mapDeliveryTimeToGtmMeeting(deliveryTime?: string) {\n const [date, t1, t2] = (deliveryTime ?? '').split(';');\n\n const meetingDate = date?.trim() ? date.trim() : undefined;\n const meetingTime =\n t1?.trim() && t2?.trim() ? `${t1.trim()} ${t2.trim()}` : undefined;\n\n return { meetingDate, meetingTime };\n}\n\nexport const TRACKED_PAGES = {\n SEND_SHARE: {\n pageUrl: PageUrl.SEND_SHARE,\n pageLocation: PageLocation.SEND_SHARE,\n pageSection: PageSection.SHARE,\n },\n VIDEOS_OVERVIEW: {\n pageUrl: PageUrl.HOME,\n pageLocation: PageLocation.VIDEOS,\n pageSection: PageSection.OVERVIEW,\n },\n VIDEOS_MERGE: {\n pageUrl: PageUrl.MERGE,\n pageLocation: PageLocation.MERGE,\n pageSection: PageSection.DETAILS,\n },\n VIDEOS_RECORD: {\n pageUrl: PageUrl.RECORD,\n pageLocation: PageLocation.RECORD,\n pageSection: PageSection.RECORDER,\n },\n VIDEOS_RECORDER: {\n pageUrl: PageUrl.RECORD,\n pageLocation: PageLocation.RECORD,\n pageSection: PageSection.RECORDER,\n },\n RECORD_VIDEOS_DETAILS: {\n pageUrl: PageUrl.RECORD,\n pageLocation: PageLocation.RECORD,\n pageSection: PageSection.DETAILS,\n },\n VIDEOS_VOICE_RECORDER: {\n pageUrl: PageUrl.VOICE_RECORDER,\n pageSection: PageLocation.DETAILS,\n pageLocation: PageSection.VOICE_RECORDER,\n },\n} as const;\n","declare global {\n interface Window {\n dataLayer?: Array<Record<string, any>>;\n }\n}\nfunction hasDataLayer(): boolean {\n return typeof window !== 'undefined' && Array.isArray(window.dataLayer);\n}\n\nexport function pushToDataLayer(data: Record<string, any>) {\n if (!hasDataLayer()) {\n return;\n }\n\n window.dataLayer?.push({\n ...data,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport {\n GTMEvent,\n GTMEventAttributes,\n GTMEventName,\n GTMVideoAttributes,\n} from '../../types';\nimport { mapToGTMVideoAttributes } from '../../utils';\nimport { GTMVideoInteractonEventArguments } from './types';\n\nexport function videoInteractonEvent({\n action,\n videoIds,\n videoAttributes,\n vehicleData,\n}: GTMVideoInteractonEventArguments) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.VIDEO_INTERACTION,\n };\n\n const gtmVideoAttributes: GTMVideoAttributes =\n mapToGTMVideoAttributes(videoAttributes);\n\n pushToDataLayer({\n ...eventAttributes,\n action,\n video_ids: videoIds,\n ...gtmVideoAttributes,\n ...vehicleData,\n });\n}\n","import {\n CovideoGTMVideoMessageProperties,\n GTMVideoMessageProperties,\n} from './types';\n\nexport function mapToGtmVideoMessageProperties(\n item?: CovideoGTMVideoMessageProperties\n): GTMVideoMessageProperties {\n if (!item) return {} as GTMVideoMessageProperties;\n\n return {\n customer_id: item?.customerId || undefined,\n sms: item?.sms || undefined,\n email: item?.email || undefined,\n notification_viewed: item?.notificationViewed || false,\n landing_page: item?.landingPage || undefined,\n call_to_action: item?.callToAction || undefined,\n thumbnails: item?.thumbnails || undefined,\n };\n}\n\nexport function getVideoDurationMs(\n file: File,\n timeoutMs = 8000\n): Promise<number> {\n return new Promise((resolve, reject) => {\n const url = URL.createObjectURL(file);\n const video = document.createElement('video');\n\n video.preload = 'metadata';\n video.muted = true;\n (video as any).playsInline = true;\n\n let settled = false;\n const timer = setTimeout(\n () => fail(new Error('Timed out reading video duration')),\n timeoutMs\n );\n\n const cleanup = () => {\n clearTimeout(timer);\n video.removeEventListener('loadedmetadata', onLoadedMetadata);\n video.removeEventListener('canplay', onCanPlay);\n video.removeEventListener('timeupdate', onTimeUpdate);\n video.removeEventListener('error', onError);\n URL.revokeObjectURL(url);\n video.removeAttribute('src');\n try {\n video.load();\n } catch {}\n };\n\n const finish = (ms: number) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(Math.round(ms));\n };\n\n const fail = (err: Error) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(err);\n };\n\n const onTimeUpdate = () => {\n if (isFinite(video.duration) && video.duration > 0) {\n finish(video.duration * 1000);\n }\n };\n\n const forceComputeDuration = () => {\n // force a seek to end; some browsers compute duration only after a seek\n video.addEventListener('timeupdate', onTimeUpdate);\n try {\n video.currentTime = 1e101;\n } catch {\n setTimeout(() => {\n try {\n video.currentTime = Number.MAX_VALUE;\n } catch {}\n }, 0);\n }\n };\n\n const onLoadedMetadata = () => {\n if (isFinite(video.duration) && video.duration > 0) {\n finish(video.duration * 1000);\n } else {\n forceComputeDuration();\n }\n };\n\n const onCanPlay = () => {\n if (isFinite(video.duration) && video.duration > 0) {\n finish(video.duration * 1000);\n }\n };\n\n const onError = () => fail(new Error('Failed to load video metadata'));\n\n video.addEventListener('loadedmetadata', onLoadedMetadata);\n video.addEventListener('canplay', onCanPlay);\n video.addEventListener('error', onError);\n\n // Start loading\n video.src = url;\n try {\n video.load();\n } catch {}\n });\n}\n\ninterface GetChangedFieldsOptions {\n initialValues: Record<string, any>;\n currentValues: Record<string, any>;\n trackedFields?: string[];\n trackedArrayFields?: Record<string, string[]>;\n onlyChangedList?: boolean;\n}\n\nfunction flattenObject(\n obj: Record<string, any>,\n trackedFields: string[],\n trackedArrayFields: Record<string, string[]>,\n prefix = ''\n): Record<string, string> {\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n const rootKey = fullKey.split('.')[0];\n\n // At root level, check if this key (or any tracked field/array) starts with it\n if (!prefix) {\n const isTrackedField = trackedFields.some(\n f => f === key || f.startsWith(`${key}.`)\n );\n const isTrackedArray = key in trackedArrayFields;\n if (!isTrackedField && !isTrackedArray) return acc;\n }\n\n if (Array.isArray(value)) {\n const fieldsToTrack =\n trackedArrayFields[key] ?? trackedArrayFields[rootKey];\n if (fieldsToTrack) {\n value.forEach((item, index) => {\n fieldsToTrack.forEach(field => {\n acc[`${fullKey}.${index}.${field}`] = String(item[field] ?? '');\n });\n });\n } else {\n acc[fullKey] = String(value);\n }\n } else if (value !== null && typeof value === 'object') {\n if (trackedArrayFields[rootKey]) {\n return acc;\n }\n\n Object.assign(\n acc,\n flattenObject(value, trackedFields, trackedArrayFields, fullKey)\n );\n } else {\n // Only include leaf value if fullKey exactly matches a tracked field,\n // or if the tracked field is a prefix of fullKey (deeper nesting),\n // or if no dotted tracked fields target this root (plain field)\n const isDottedTarget = trackedFields.some(f => f.includes('.'));\n const isExactOrDeeper = trackedFields.some(\n f => fullKey === f || fullKey.startsWith(`${f}.`)\n );\n\n if (!isDottedTarget || isExactOrDeeper) {\n acc[fullKey] = String(value ?? '');\n }\n }\n\n return acc;\n },\n {} as Record<string, string>\n );\n}\n\n/**\n * BEFORE MAKING ANY CHANGES:\n * PLEASE READ THIS COMMENT AND THE TESTS IN `test-getChangedFields.ts` TO UNDERSTAND HOW THIS FUNCTION WORKS.\n *\n * Compares `initialValues` vs `currentValues` and returns which tracked fields changed.\n *\n * The function works in two steps:\n * 1) `flattenObject(...)` flattens the input objects into a `{ [path]: string }` map,\n * but **only for paths you explicitly track** via `trackedFields` / `trackedArrayFields`.\n * 2) `getChangedFields(...)` diffs the two flattened maps and returns:\n * - `changed_fields`: list of changed field paths\n * - optionally (`onlyChangedList: false`) `<path>_before` and `<path>_after` values\n *\n * @param initialValues - baseline object (e.g. values on load)\n * @param currentValues - current object (e.g. values after user edits)\n * @param trackedFields - list of field paths to track (supports dot paths)\n * - Simple field: `\"title\"`\n * - Nested field: `\"company.name\"` (tracks only that nested path)\n * @param trackedArrayFields - map of array field name -> list of item subfields to track\n * - Example: `{ links: [\"linkText\", \"itemType\"] }` tracks `links.<index>.linkText`, etc.\n * - Note: this is intended for arrays of objects at the root key (or within that root branch)\n * @param onlyChangedList - when true, return only `changed_fields`\n *\n * @returns An object containing:\n * - `changed_fields: string[]`\n * - and when `onlyChangedList` is false:\n * - `<path>_before: string`\n * - `<path>_after: string`\n *\n * @example\n * // 1) Simple key/value pairs\n * const res = getChangedFields({\n * initialValues: { title: \"A\", company: \"X\", ignored: 123 },\n * currentValues: { title: \"B\", company: \"X\", ignored: 999 },\n * trackedFields: [\"title\", \"company\"],\n * onlyChangedList: false,\n * });\n *\n * // res.changed_fields -> [\"title\"]\n * // res.title_before -> \"A\"\n * // res.title_after -> \"B\"\n *\n * @example\n * // 2) Nested object fields (dot paths)\n * // Track specific nested properties with `trackedFields`:\n * const res = getChangedFields({\n * initialValues: {\n * videoSource: { label: \"OBS Virtual Camera\", value: \"abc\" },\n * },\n * currentValues: {\n * videoSource: { label: \"FaceTime HD Camera\", value: \"def\" },\n * },\n * trackedFields: [\"videoSource.label\"],\n * onlyChangedList: true,\n * });\n *\n * // res.changed_fields -> [\"videoSource.label\"]\n *\n * @example\n * // 3) Array of objects\n * // Track specific subfields on each array item using `trackedArrayFields`.\n * const res = getChangedFields({\n * initialValues,\n * currentValues: data,\n * trackedFields: [\"title\", \"company\"],\n * trackedArrayFields: {\n * links: [\"linkText\", \"itemType\", \"fileThumbnail\", \"newWindow\"],\n * },\n * onlyChangedList: false,\n * });\n *\n * // If `links` changes, paths look like:\n * // \"links.0.linkText\", \"links.2.newWindow\", ...\n * // and you get before/after fields for each changed path.\n */\nexport function getChangedFields({\n initialValues,\n currentValues,\n trackedFields = [],\n trackedArrayFields = {},\n onlyChangedList = false,\n}: GetChangedFieldsOptions) {\n const flatInitial = flattenObject(\n initialValues,\n trackedFields,\n trackedArrayFields\n );\n const flatCurrent = flattenObject(\n currentValues,\n trackedFields,\n trackedArrayFields\n );\n\n const changedFields: string[] = [];\n const result: Record<string, string | string[]> = {};\n\n for (const key in flatCurrent) {\n if (flatInitial[key] !== flatCurrent[key]) {\n changedFields.push(key);\n\n if (!onlyChangedList) {\n result[`${key}_before`] = flatInitial[key] ?? '';\n result[`${key}_after`] = flatCurrent[key];\n }\n }\n }\n\n return {\n changed_fields: changedFields,\n ...result,\n };\n}\n","import { GTMVideoMessageInteraction, GTMVideoMessageProperties } from './types';\nimport { pushToDataLayer } from '../../pushToDataLayer';\nimport {\n GTMEvent,\n GTMEventAttributes,\n GTMEventName,\n GTMVideoAttributes,\n} from '../../types';\nimport { mapToGTMVideoAttributes } from '../../utils';\nimport { mapToGtmVideoMessageProperties } from './utils';\n\nexport function videoMessageInteractionEvent({\n action,\n videoMessageProperties,\n video,\n vehicleData,\n}: GTMVideoMessageInteraction): void {\n const base: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.VIDEO_MESSAGE_INTERACTION,\n };\n\n const gtmVideoMessageProperties: GTMVideoMessageProperties =\n mapToGtmVideoMessageProperties(videoMessageProperties);\n const gtmVideo: GTMVideoAttributes = mapToGTMVideoAttributes(video);\n\n pushToDataLayer({\n ...base,\n action: action,\n ...gtmVideo,\n ...gtmVideoMessageProperties,\n ...vehicleData,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport {\n GTMEvent,\n GTMEventAttributes,\n GTMEventName,\n GTMVideoAttributes,\n} from '../../types';\nimport { mapToGTMVideoAttributes } from '../../utils';\nimport { VideoAttributeInteractionInteractionEventArgs } from './types';\n\n// THIS NEEDS TO BE IMPLEMENTED SIMILARLY TO THE OTHER EVENTS THAT REQUIRE VEHICLE DATA\nexport function videoAttributeInteractionInteractionEvent({\n videoAttributes,\n vehicleData,\n}: VideoAttributeInteractionInteractionEventArgs) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.VIDEO_ATTRIBUTE_INTERACTION,\n };\n\n const gtmVideoAttributes: GTMVideoAttributes =\n mapToGTMVideoAttributes(videoAttributes);\n\n pushToDataLayer({\n ...eventAttributes,\n ...gtmVideoAttributes,\n ...vehicleData,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport {\n GTMEvent,\n GTMEventAttributes,\n GTMEventName,\n GTMVideoAttributes,\n} from '../../types';\nimport { mapToGTMVideoAttributes } from '../../utils';\nimport { GTMSaveNewVideoInteractionEventArguments } from './types';\n\nexport function saveNewVideoInteractionEvent({\n videoAttributes,\n type,\n vehicleData,\n mergedIds,\n changedFieldKeys,\n changes,\n}: GTMSaveNewVideoInteractionEventArguments) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.SAVED_NEW_VIDEO,\n };\n\n const gtmVideoAttributes: GTMVideoAttributes =\n mapToGTMVideoAttributes(videoAttributes);\n\n pushToDataLayer({\n ...eventAttributes,\n type,\n ...(mergedIds ? { merge_ids: mergedIds } : {}),\n ...gtmVideoAttributes,\n ...vehicleData,\n changed_fields:\n changedFieldKeys && changedFieldKeys.length > 0\n ? changedFieldKeys\n : undefined,\n ...changes,\n });\n}\n","import { CovideoGTMVideoAttributes, GTMVehicleAttributes } from '../../types';\n\nexport enum GTMVideoInteractionActions {\n VIEW = 'View',\n SEND_AND_SHARE = 'Send & Share (Insert)',\n COPY_VIDEO_URL = 'Copy Video URL',\n MERGE = 'Merge',\n VOICE_OVER = 'Voice Over',\n}\n\nexport enum GTMSaveNewVideoInteractionTypes {\n RECORD = 'Record',\n UPLOAD = 'Upload',\n MERGE = 'Merge',\n VOICE_RECORD = 'Voice Record',\n}\n\nexport enum GTMVideoMessageInteractionActions {\n INSERT = 'Insert',\n COPY = 'Copy',\n}\ntype GTMVideoInteractionBase = {\n action: GTMVideoInteractionActions;\n};\n\ntype GTMVideoInteractionWithIds = GTMVideoInteractionBase & {\n // When we have IDs, we can send the event with just this.\n videoIds: number[];\n\n // No details in this variant\n videoAttributes?: never;\n vehicleData?: never;\n};\n\ntype GTMVideoInteractionWithDetails = GTMVideoInteractionBase & {\n // No IDs → we key off details instead\n videoIds?: undefined;\n\n // Both required in this branch\n videoAttributes?: CovideoGTMVideoAttributes;\n vehicleData?: GTMVehicleAttributes;\n};\n\nexport type GTMVideoInteractonEventArguments =\n | GTMVideoInteractionWithIds\n | GTMVideoInteractionWithDetails;\n\nexport interface GTMSaveNewVideoInteractionEventArguments {\n videoAttributes: CovideoGTMVideoAttributes;\n type: GTMSaveNewVideoInteractionTypes;\n vehicleData?: GTMVehicleAttributes;\n mergedIds?: number[];\n changedFieldKeys?: string[];\n changes?: Record<string, any>;\n}\n\nexport type VideoAttributeInteractionInteractionEventArgs = {\n videoAttributes: CovideoGTMVideoAttributes;\n vehicleData?: GTMVehicleAttributes;\n};\n\nexport type GTMVideoMessageInteraction = {\n action: GTMVideoMessageInteractionActions;\n videoMessageProperties: CovideoGTMVideoMessageProperties;\n shareOption?: never;\n video: CovideoGTMVideoAttributes;\n vehicleData?: GTMVehicleAttributes;\n};\n\n/**\n * Describes the normalized data sent to GTM for \"Video Message Interaction\"\n * events that occur when a user shares or interacts with a video message.\n * Each field corresponds to a user-selected option within the share flow.\n */\n\nexport interface GTMVideoMessageProperties {\n customer_id?: string;\n sms?: boolean;\n email?: boolean;\n /**\n * Indicates whether the user opted to notify the recipient after sharing\n * the video message (e.g., \"Notify viewer when video is viewed\").\n *\n * @example true // user enabled notifications for video views\n */\n notification_viewed?: boolean;\n\n /**\n * The name or ID of the selected landing page template used for the\n * shared video. Typically derived from `templateId` or the template label.\n *\n * @example \"Automotive Default Template\"\n */\n landing_page?: string;\n\n /**\n * The name or ID of the selected Call-to-Action (CTA) link set\n * attached to the shared video. Usually maps to a `linksetId` or title.\n *\n * @example \"Book a Test Drive\"\n */\n call_to_action?: string;\n\n /**\n * The name or ID of the selected video thumbnail style or icon used\n * in the share configuration. Usually maps to `iconId` or template title.\n *\n * @example \"Dark Overlay Thumbnail\"\n */\n thumbnails?: string;\n}\n\nexport interface CovideoGTMVideoMessageProperties {\n customerId?: string;\n sms?: boolean;\n email?: boolean;\n /**\n * Indicates whether the user opted to notify the recipient after sharing\n * the video message (e.g., \"Notify viewer when video is viewed\").\n *\n * @example true // user enabled notifications for video views\n */\n notificationViewed?: boolean;\n\n /**\n * The name or ID of the selected landing page template used for the\n * shared video. Typically derived from `templateId` or the template label.\n *\n * @example \"Automotive Default Template\"\n */\n landingPage?: string;\n\n /**\n * The name or ID of the selected Call-to-Action (CTA) link set\n * attached to the shared video. Usually maps to a `linksetId` or title.\n *\n * @example \"Book a Test Drive\"\n */\n callToAction?: string;\n\n /**\n * The name or ID of the selected video thumbnail style or icon used\n * in the share configuration. Usually maps to `iconId` or template title.\n *\n * @example \"Dark Overlay Thumbnail\"\n */\n thumbnails?: string;\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\nimport { SelectRecordingType } from './types';\n\nexport function selectRecordingTypeEvent({\n type,\n}: {\n type: SelectRecordingType;\n}) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.SELECT_RECORDING_TYPE,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n type,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\nimport { RecordingToolAction } from './types';\n\nexport function recordingToolIntearctionEvent({\n action,\n}: {\n action: RecordingToolAction;\n}) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.RECORDING_TOOL_INTERACTION,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n type: 'Telepromter',\n action,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\n\nexport function discardVideoEvent() {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.DISCARD_VIDEO,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\n\nexport function startRecordingEvent() {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.START_RECORDING,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\n\nexport function stopRecordingEvent() {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.STOP_RECORDING,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\n\nexport function addVideoAttributeEvent() {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.ADD_VIDEO_ATTRIBUTES,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n });\n}\n","import { pushToDataLayer } from '../../pushToDataLayer';\nimport { GTMEvent, GTMEventAttributes, GTMEventName } from '../../types';\nimport { VideoPlayerInteraction } from './types';\n\nexport function videoPlayerInteractionsEvent({\n action,\n}: {\n action: VideoPlayerInteraction;\n}) {\n const eventAttributes: GTMEventAttributes = {\n event: GTMEvent.COVIDEO_EVENT,\n event_name: GTMEventName.VIDEO_PLAYER_INTERACTION,\n };\n\n pushToDataLayer({\n ...eventAttributes,\n\n action,\n });\n}\n","import { CovideoGTMVehicleItem, GTMVehicleAttributes } from './types';\nimport { mapToGtmVehicleAttributes } from './utils';\n\nimport {\n saveNewVideoInteractionEvent,\n videoAttributeInteractionInteractionEvent,\n videoInteractonEvent,\n videoMessageInteractionEvent,\n} from './actions/video';\nimport { useCallback, useRef, useState } from 'react';\nimport {\n GTMSaveNewVideoInteractionEventArguments,\n GTMVideoInteractonEventArguments,\n GTMVideoMessageInteraction,\n VideoAttributeInteractionInteractionEventArgs,\n} from './actions/video/types';\nimport { getInventoryItems } from 'lib/api';\nimport {\n selectRecordingTypeEvent,\n recordingToolIntearctionEvent,\n stopRecordingEvent,\n startRecordingEvent,\n addVideoAttributeEvent,\n discardVideoEvent,\n} from './actions/recording';\nimport { useTheme } from 'styled-components';\nimport { videoPlayerInteractionsEvent } from './actions/videoPlayer';\n\ntype TrackVideoInteractionArgs = {\n vehicle?: CovideoGTMVehicleItem;\n} & Omit<GTMVideoInteractonEventArguments, 'vehicleData'>;\n\ntype TrackSaveNewVideoArgs = {\n vehicle?: CovideoGTMVehicleItem;\n} & Omit<GTMSaveNewVideoInteractionEventArguments, 'vehicleData'>;\n\ntype TrackVideoAttributeInteractionArgs =\n VideoAttributeInteractionInteractionEventArgs & {\n vehicle?: CovideoGTMVehicleItem;\n };\n\ntype TrackGTMVideoMessageInteractionEvent = GTMVideoMessageInteraction & {\n vehicle?: CovideoGTMVehicleItem;\n};\n\nexport function useGTMAnalytics() {\n const { isCdkEnviroment: isCdkUser } = useTheme();\n\n const trackVideoInteractionEvent = useCallback(\n async ({ vehicle, ...rest }: TrackVideoInteractionArgs) => {\n const vehicleData = mapToGtmVehicleAttributes(vehicle);\n\n // WithIds variant: send just IDs\n if (Array.isArray(rest.videoIds) && rest.videoIds.length > 0) {\n return videoInteractonEvent({\n action: rest.action,\n videoIds: rest.videoIds,\n });\n }\n\n // Details variant: requires videoAttributes + vehicleData\n return videoInteractonEvent({\n action: rest.action,\n videoAttributes: rest.videoAttributes,\n vehicleData,\n });\n },\n []\n );\n\n const trackVideoAttributeInteraction = useCallback(\n async ({\n vehicle,\n videoAttributes,\n }: TrackVideoAttributeInteractionArgs) => {\n const vehicleData = mapToGtmVehicleAttributes(vehicle);\n\n return videoAttributeInteractionInteractionEvent({\n vehicleData,\n videoAttributes,\n });\n },\n []\n );\n\n const trackSaveNewVideo = useCallback(\n async ({ vehicle, ...rest }: TrackSaveNewVideoArgs) => {\n const vehicleData = mapToGtmVehicleAttributes(vehicle);\n\n return saveNewVideoInteractionEvent({\n vehicleData,\n ...rest,\n });\n },\n []\n );\n\n const trackVideoMessageInteractionEvent = useCallback(\n async ({ vehicle, ...rest }: TrackGTMVideoMessageInteractionEvent) => {\n const vehicleData = mapToGtmVehicleAttributes(vehicle);\n\n return videoMessageInteractionEvent({\n ...rest,\n vehicleData,\n });\n },\n []\n );\n\n return {\n trackGTMVideoInteractionEvent: isCdkUser\n ? trackVideoInteractionEvent\n : undefined,\n trackGTMVideoMessageInteractionEvent: isCdkUser\n ? trackVideoMessageInteractionEvent\n : undefined,\n trackGTMSaveNewVideoInteractionEvent: isCdkUser\n ? trackSaveNewVideo\n : undefined,\n\n // needs to be implemented -> using fields from form\n trackGTMVideoAttributeInteractionInteractionEvent: isCdkUser\n ? trackVideoAttributeInteraction\n : undefined,\n\n // recording\n trackGTMRecordingToolIntearctionEvent: isCdkUser\n ? recordingToolIntearctionEvent\n : undefined,\n trackGTMSelectRecordingTypeEvent: isCdkUser\n ? selectRecordingTypeEvent\n : undefined,\n\n trackGTMStopRecordingEvent: isCdkUser ? stopRecordingEvent : undefined,\n trackGTMStartRecordingEvent: isCdkUser ? startRecordingEvent : undefined,\n trackGTMAddVideoAttributeEvent: isCdkUser\n ? addVideoAttributeEvent\n : undefined,\n trackGTMDiscardVideoEvent: isCdkUser ? discardVideoEvent : undefined,\n // video player settings\n trackVideoPlayerInteractionsEvent: isCdkUser\n ? videoPlayerInteractionsEvent\n : undefined,\n };\n}\n","import * as React from 'react';\nimport styled, { css, useTheme } from 'styled-components';\nimport { hex } from 'color-convert';\nimport { FullScreen, useFullScreenHandle } from 'react-full-screen';\n\nimport { VideoControls } from './components';\nimport { theme } from 'lib/style';\nimport { LoadingIndicator } from 'lib/components';\nimport { useAuthorizationContext } from 'lib/context';\nimport { checkIfAutomotive } from 'lib/utils/automotiveRolePermissionChecks';\nimport { isSafari } from 'lib/utils/functions';\nimport { useTranslation } from 'react-i18next';\nimport { VideoPlayerInteraction } from 'lib/hooks/GTM/actions/videoPlayer/types';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\n\ntype Props = {\n playerBackgroundColor?: string;\n playerIconsColor?: string;\n playButtonPosition?: string;\n thumbnail?: string;\n videoSource: string;\n videoId?: string;\n videoRef?: any;\n small?: boolean;\n autoplay?: boolean;\n playlist?: any[];\n preventWideSize?: boolean;\n selectedAnnotationId?: string | undefined;\n previewAnnotation?: any;\n hideContext?: boolean;\n startWithControls?: boolean;\n height?: string;\n width?: string;\n margin?: string;\n id?: string;\n disableControls?: boolean;\n borderBottomRadius?: string;\n FullscreenVideoWrapperBackgroundColor?: string;\n setVideoIsProcessing?: React.Dispatch<React.SetStateAction<boolean>>;\n videoDuration?: number;\n setVideoDuration?: (arg1: number) => void;\n\n setIsVideoLoading?: (arg: boolean) => void;\n};\n\ntype PlayerLayoutProps = {\n height?: string;\n width?: string;\n small?: boolean;\n margin?: string;\n disablePointerEvents?: boolean;\n};\ntype ControlProps = {\n r: number;\n g: number;\n b: number;\n hex: string;\n small?: boolean;\n isVisible: boolean;\n isFullScreen?: boolean;\n};\ntype FigureProps = {\n small?: boolean;\n borderBottomRadius?: string;\n preventWideSize?: boolean;\n};\n\nconst PlayerLayout = styled.div<PlayerLayoutProps>`\n box-sizing: border-box;\n overflow: overlay;\n display: flex;\n justify-content: center;\n padding-right: 0px;\n height: ${props => (props.height ? props.height : '100%')};\n width: ${props => (props.width ? props.width : '')};\n margin: ${props => (props.margin ? props.margin : '')};\n ${({ disablePointerEvents }) =>\n disablePointerEvents &&\n css`\n pointer-events: none;\n `}\n`;\n\nconst Figure = styled.figure<FigureProps>`\n border-radius: 4px;\n ${props =>\n props.borderBottomRadius\n ? `\n border-bottom-left-radius: ${props.borderBottomRadius};\n border-bottom-right-radius: ${props.borderBottomRadius};\n `\n : ``}\n margin: 0;\n position: relative;\n height: 100%;\n /* TODO - check if this is ok */\n max-width: 800px;\n overflow: hidden;\n\n ${props => {\n if (props.preventWideSize) {\n return `width: auto;`;\n }\n return `\n width: 100%;\n ${theme.mediaQueryMinWidth.lg} {\n width: 720px;\n }\n `;\n }}\n`;\n\ntype FullscreenWrapperProps = {\n backgroundColor?: string;\n};\n\nconst FullscreenWrapper = styled(FullScreen)<FullscreenWrapperProps>`\n width: 100%;\n position: relative;\n box-sizing: border-box;\n background-color: ${props =>\n props.backgroundColor ? props.backgroundColor : ''};\n`;\n\nconst Video = styled.video<any>`\n border-radius: ${props => props.borderBottomRadius || '4px'};\n position: relative;\n width: 100%;\n height: ${props => (props.isFullScreen ? '100%' : props.height)};\n object-fit: contain; /*object-fit: contain to fix the issue of vertical video SUS-687*/\n max-height: ${props => (props.isFullScreen ? '100%' : 'unset')};\n`;\n\nconst Overlay = styled.div`\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: ${theme.palette.whiteRgb85};\n z-index: 4;\n`;\n\nconst Controls = styled.div<ControlProps>`\n transition: all 0.15s;\n position: absolute;\n opacity: ${props => (props.isVisible ? 1 : 0)};\n left: 0;\n right: 0;\n bottom: ${props => (props.isFullScreen ? '0px' : '7px')};\n background-color: ${props => props.hex};\n padding: ${props => `${props.small ? '0px 2px 1px' : '8px'}`};\n`;\n\nconst RETRY_DELAY = 1000; //ms\n\nexport const VideoPlayer = (props: Props) => {\n const {\n videoSource,\n thumbnail,\n small,\n videoRef,\n autoplay,\n playlist,\n preventWideSize,\n hideContext = false,\n startWithControls = true,\n height,\n width,\n margin,\n disableControls = false,\n borderBottomRadius,\n FullscreenVideoWrapperBackgroundColor,\n setIsVideoLoading,\n setVideoDuration,\n setVideoIsProcessing,\n } = props;\n const { trackVideoPlayerInteractionsEvent } = useGTMAnalytics();\n const { colors } = useTheme();\n const { t } = useTranslation();\n const playerBgColor = colors.primary[80];\n const playerIcColor = colors.white[100];\n\n const [isVideoPaused, setIsVideoPaused] = React.useState(true);\n const [showPlaybackSpeed, setShowPlaybackSpeed] = React.useState(false);\n\n const [isVideoMuted, setIsVideoMuted] = React.useState(false);\n const [volumeRange, setVolumeRange] = React.useState(1);\n const [duration, setDuration] = React.useState(0);\n const [currentTime, setCurrentTime] = React.useState(0);\n const [hasControls, setHasControls] = React.useState(startWithControls);\n const [isError, setIsError] = React.useState(false);\n const [retryTimeout, setRetryTimeout] = React.useState(0);\n const { userData } = useAuthorizationContext();\n const isAutomotive = checkIfAutomotive(userData);\n const hasControlsRef = React.useRef(hasControls);\n\n let playlistIndex = React.useRef(0);\n\n const [retryCount, setRetryCount] = React.useState(0);\n const controlsRef = React.createRef<HTMLDivElement>();\n\n const togglePlay = () => {\n const currentVideo = videoRef.current;\n if (currentVideo) {\n isVideoPaused ? currentVideo.play() : currentVideo.pause();\n trackVideoPlayerInteractionsEvent?.({\n action: isVideoPaused\n ? VideoPlayerInteraction.PLAY\n : VideoPlayerInteraction.PAUSE,\n });\n }\n };\n\n const contextMenu = (e: any) => {\n if (hideContext) e.preventDefault();\n };\n\n const fullScreenHandle = useFullScreenHandle();\n const toggleFullScreen = () => {\n if (fullScreenHandle.active) {\n return fullScreenHandle.exit();\n }\n return fullScreenHandle.enter();\n };\n\n React.useEffect(() => {\n if (currentTime === duration && currentTime !== 0 && duration !== 0) {\n trackVideoPlayerInteractionsEvent?.({\n action: VideoPlayerInteraction.COMPLETE,\n });\n }\n }, [currentTime, duration]);\n\n React.useEffect(() => {\n if (autoplay) {\n trackVideoPlayerInteractionsEvent?.({\n action: VideoPlayerInteraction.PLAY,\n });\n }\n }, [autoplay]);\n\n React.useEffect(() => {\n setTimeout(() => window.dispatchEvent(new Event('resize')), 200);\n }, [fullScreenHandle.active]);\n\n React.useEffect(() => {\n const video = videoRef.current;\n if (video.textTracks.length && video.textTracks[0]) {\n const line = hasControls ? -4 : -1;\n\n let cues = video.textTracks[0].cues; // array of current cues\n for (var i = 0; i < cues.length; i++) {\n cues[i].line = line;\n }\n if (video.textTracks[0].activeCues[0]) {\n video.textTracks[0].activeCues[0].line = line;\n }\n }\n }, [hasControls]);\n\n const handleMute = () => {\n const currentVideo = videoRef.current;\n if (currentVideo) {\n if (isVideoMuted) {\n setVolumeRange(1);\n setIsVideoMuted(false);\n currentVideo.volume = 1;\n } else {\n setVolumeRange(0);\n setIsVideoMuted(true);\n currentVideo.volume = 0;\n }\n }\n };\n\n const handleVolumeControl = (\n e: any,\n volumeRef: React.RefObject<HTMLInputElement>\n ) => {\n const volumeRefWidth = volumeRef.current && volumeRef.current.offsetWidth;\n let eventOffset = e.target.value; // e.nativeEvent.offsetX;\n\n // make sure that offset is never over 100 or under 0;\n if (eventOffset > 100) eventOffset = 100;\n if (eventOffset < 0) eventOffset = 0;\n\n if (videoRef.current && volumeRefWidth) {\n let volume = Number((eventOffset / volumeRefWidth).toFixed(2));\n\n if (Math.floor(videoRef.current.volume * 100) == e.target.valueAsNumber) {\n return;\n }\n\n setVolumeRange(volume);\n\n if (volume < 0) {\n volume = 0;\n setVolumeRange(0);\n }\n if (volume > 1) {\n setVolumeRange(1);\n volume = 1;\n }\n\n if (volume === 0) setIsVideoMuted(true);\n if (volume !== 1) setIsVideoMuted(false);\n\n videoRef.current.volume = volume;\n }\n };\n\n const scrub = (e: any, progressRef: React.RefObject<HTMLProgressElement>) => {\n const progressElWidth = progressRef.current\n ? progressRef.current.offsetWidth\n : 640;\n if (videoRef.current) {\n const scrubTime =\n (e.nativeEvent.offsetX / progressElWidth) * videoRef.current.duration;\n videoRef.current.currentTime = scrubTime;\n }\n };\n\n const handleDurationChange = () => {\n if (videoRef.current && isFinite(videoRef.current.duration)) {\n setDuration(videoRef.current.duration);\n if (setVideoDuration) setVideoDuration(videoRef.current.duration);\n }\n };\n\n const handleError = () => {\n if (\n videoRef.current &&\n videoRef.current.networkState == HTMLMediaElement.NETWORK_NO_SOURCE &&\n !isError\n ) {\n console.log('error loading mp4');\n setIsError(true);\n setVideoIsProcessing?.(true);\n }\n };\n\n const handleLoadedMetadata = () => {\n setIsError(false);\n setVideoIsProcessing?.(false);\n clearTimeout(retryTimeout);\n // fixed issue when recording and screen video play on preview page we can skip and forward the video (SUS-466)\n if (videoRef.current && videoRef.current.duration === Infinity) {\n videoRef.current.currentTime = 1e101;\n videoRef.current.ontimeupdate = function () {\n this.ontimeupdate = () => {\n return;\n };\n if (videoRef.current) videoRef.current.currentTime = 0;\n };\n }\n };\n\n React.useEffect(() => {\n setIsVideoLoading && setIsVideoLoading(isError);\n if (isError) {\n setRetryCount(retryCount + 1);\n }\n }, [isError]);\n\n React.useEffect(() => {\n if (retryCount > 0 && isError) {\n clearTimeout(retryTimeout);\n const timeout = setTimeout(\n setRetryCount,\n RETRY_DELAY * retryCount,\n retryCount + 1\n );\n // @ts-ignore\n setRetryTimeout(timeout);\n videoRef.current?.load();\n }\n }, [retryCount]);\n\n React.useEffect(() => {\n if (videoRef.current) {\n videoRef.current.addEventListener(\n 'durationchange',\n handleDurationChange,\n true\n );\n videoRef.current.addEventListener(\n 'loadedmetadata',\n handleLoadedMetadata,\n true\n );\n videoRef.current.addEventListener('error', handleError, true);\n videoRef.current.addEventListener(\n 'pause',\n () => setIsVideoPaused(true),\n true\n );\n videoRef.current.addEventListener(\n 'play',\n () => setIsVideoPaused(false),\n true\n );\n }\n\n return () => {\n if (videoRef.current) {\n videoRef.current.removeEventListener(\n 'durationchange',\n handleDurationChange,\n true\n );\n videoRef.current.removeEventListener(\n 'loadedmetadata',\n handleLoadedMetadata,\n true\n );\n videoRef.current.removeEventListener('error', handleError, true);\n }\n };\n }, [videoRef, controlsRef]);\n\n React.useEffect(() => {\n const video = videoRef.current;\n const controls = controlsRef?.current;\n\n if (!video || !controls || showPlaybackSpeed) return;\n\n video.addEventListener('mouseenter', showControls);\n video.addEventListener('mouseleave', hideControls);\n controls.addEventListener('mouseenter', showControls);\n controls.addEventListener('mouseleave', hideControls);\n\n return () => {\n video.removeEventListener('mouseenter', showControls);\n video.removeEventListener('mouseleave', hideControls);\n controls.removeEventListener('mouseenter', showControls);\n controls.removeEventListener('mouseleave', hideControls);\n };\n }, [videoRef, controlsRef, showPlaybackSpeed]);\n\n const hideControls = () => {\n if (!videoRef.current) {\n return;\n }\n\n setHasControls(false);\n hasControlsRef.current = false;\n };\n\n const showControls = () => {\n if (disableControls) {\n return;\n }\n setHasControls(true);\n hasControlsRef.current = true;\n };\n\n React.useEffect(() => {\n if (playlist && playlist.length > 0) {\n playlistIndex.current = 0;\n setCurrentTime(0);\n setIsVideoPaused(true);\n }\n }, [playlist]);\n\n React.useEffect(() => {\n const handleTimeUpdate = () => {\n if (videoRef.current) {\n setCurrentTime(videoRef.current.currentTime);\n if (playlistIndex && playlist && playlist[playlistIndex.current]) {\n if (\n videoRef.current.currentTime >=\n playlist[playlistIndex.current].endTime\n ) {\n const videoEndEvent = new Event('ended');\n videoRef.current.dispatchEvent(videoEndEvent);\n }\n }\n }\n };\n const handleVideoEnded = () => {\n if (videoRef.current && playlist) {\n playlistIndex.current++;\n if (\n playlistIndex.current < playlist.length &&\n playlist[playlistIndex.current].videoSource\n ) {\n videoRef.current.poster =\n playlist[playlistIndex.current].autogeneratedThumbnail;\n let time = '';\n const start = playlist[playlistIndex.current].startTime;\n const end = playlist[playlistIndex.current].endTime;\n if (start || end) {\n time = `#t=${start ? start : 0}${end ? ',' + end : ''}`;\n }\n let newSrc =\n ('' + playlist[playlistIndex.current].videoSource).split('#t=')[0] +\n time;\n videoRef.current.src = newSrc;\n videoRef.current.play();\n }\n }\n };\n\n if (videoRef.current) {\n videoRef.current.addEventListener('timeupdate', handleTimeUpdate, true);\n }\n if (videoRef.current) {\n videoRef.current.addEventListener('ended', handleVideoEnded, true);\n }\n if (videoRef.current && autoplay) {\n videoRef.current.play();\n setIsVideoPaused(false);\n }\n\n return () => {\n if (videoRef.current) {\n videoRef.current.removeEventListener(\n 'timeupdate',\n handleTimeUpdate,\n true\n );\n videoRef.current.removeEventListener('ended', handleVideoEnded, true);\n }\n };\n }, [videoRef]);\n\n React.useEffect(() => {\n const videoElement = videoRef.current;\n\n if (!videoElement || !videoSource) return;\n\n const playVideo = async () => {\n try {\n videoElement.src = videoSource;\n videoElement.muted = true; // Ensure muted for autoplay\n\n // Wait for the video to be ready to play\n videoElement.oncanplay = async () => {\n try {\n autoplay && (await videoElement.play());\n videoElement.muted = false;\n } catch (playError) {\n console.error('Autoplay failed:', playError);\n }\n };\n\n videoElement.load(); // Explicitly load the video\n } catch (error) {\n console.error('Error in playVideo:', error);\n }\n };\n\n playVideo();\n\n return () => {\n if (videoElement) {\n videoElement.pause();\n videoElement.src = '';\n }\n };\n }, [videoSource]);\n\n const setPlayBack = (rate: number) => {\n videoRef.current.playbackRate = rate;\n };\n\n const newColor = hex.rgb(playerBgColor) || [];\n\n return (\n <PlayerLayout\n small={small}\n height={height}\n width={width}\n margin={margin}\n disablePointerEvents={disableControls}\n >\n <Figure\n small={small}\n preventWideSize={preventWideSize}\n borderBottomRadius={borderBottomRadius}\n >\n <FullscreenWrapper\n handle={fullScreenHandle}\n backgroundColor={FullscreenVideoWrapperBackgroundColor}\n >\n <Video\n onContextMenu={contextMenu}\n key={videoSource}\n poster={isError ? '' : thumbnail}\n preload={isSafari ? 'auto' : 'metadata'}\n ref={videoRef}\n onClick={togglePlay}\n isFullScreen={fullScreenHandle.active}\n height={height || 'auto'}\n borderBottomRadius={borderBottomRadius}\n playsInline={true}\n controls={false}\n >\n <source\n key={retryCount + playlistIndex.current + videoSource}\n src={videoSource}\n type='video/mp4'\n />\n </Video>\n\n {isError && (\n <Overlay>\n <LoadingIndicator\n height={'100%'}\n isLoading={isError}\n text={t('processing...')}\n />\n </Overlay>\n )}\n {/*Customizable video controls */}\n {!disableControls && (\n <Controls\n ref={controlsRef}\n r={newColor[0]}\n g={newColor[1]}\n b={newColor[2]}\n hex={playerBgColor}\n small={small}\n isVisible={hasControls}\n isFullScreen={fullScreenHandle.active}\n >\n <VideoControls\n isVideoPaused={isVideoPaused}\n togglePlay={togglePlay}\n isVideoMuted={isVideoMuted}\n handleMute={handleMute}\n handleFullScreen={toggleFullScreen}\n setPlayBack={setPlayBack}\n setTranslate={() => {}} // add if necessary\n duration={duration}\n currentTime={currentTime}\n handleVolumeControl={handleVolumeControl}\n volumeRange={volumeRange}\n playerIconsColor={playerIcColor}\n small={small}\n scrub={scrub}\n playerBackgroundColor={playerBgColor}\n captionsEnabled={false}\n captions={''}\n isVisible={hasControls}\n videoRef={videoRef}\n isAutomotive={isAutomotive}\n hideControls={hideControls}\n setShowPlaybackSpeed={setShowPlaybackSpeed}\n showPlaybackSpeed={showPlaybackSpeed}\n />\n </Controls>\n )}\n </FullscreenWrapper>\n </Figure>\n </PlayerLayout>\n );\n};\n","import React from 'react';\nimport { Modal } from './Modal';\nimport { VideoListItem } from 'lib/api';\nimport { VideoPlayer } from '../../../app/pages/video/components/videoPlayer';\nimport styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { screenSizes } from 'lib/style/theme';\nimport { useTranslation } from 'react-i18next';\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\nconst CloseButtonWrap = styled.div`\n background-color: ${theme.palette.themeDark};\n display: flex;\n justify-content: center;\n align-items: center;\n color: ${theme.palette.white};\n height: 24px;\n width: 24px;\n position: absolute;\n z-index: 10;\n right: 4px;\n top: 4px;\n border: 1px solid #fff;\n border-radius: 4px;\n &:hover {\n opacity: 0.7;\n cursor: pointer;\n }\n`;\n\nconst ModalItem = styled.div`\n display: block;\n position: relative;\n background-color: black;\n\n min-width: 660px;\n max-width: 800px;\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n width: calc(100vw - 30px);\n min-width: unset;\n max-width: unset;\n `}\n`;\n\ntype PreviewProps = {\n handleModalClose: () => void;\n video: VideoListItem;\n};\n\nexport const ModalVideoPreview = ({\n handleModalClose,\n video,\n}: PreviewProps) => {\n const { t } = useTranslation();\n const videoRef = React.createRef<HTMLVideoElement>();\n return (\n <Modal maxHeight='fit-content' onOutsideClick={handleModalClose}>\n <ModalItem>\n <CloseButtonWrap\n title={t('Close video preview')}\n onClick={handleModalClose}\n >\n <CloseIcon />\n </CloseButtonWrap>\n <Content>\n <VideoPlayer\n videoSource={video.videoSource}\n videoId={video.id}\n thumbnail={video.autogeneratedThumbnail}\n videoRef={videoRef}\n autoplay={true}\n height='405px'\n width={'100%'}\n />\n </Content>\n </ModalItem>\n </Modal>\n );\n};\n","import {\n copyCompanyVideoToPrimary,\n downloadVideo,\n VideoListItem,\n} from 'lib/api';\nimport { CheckboxInput, Spinner, useToastNotifications } from 'lib/components';\nimport { apiKey, token } from 'lib/config';\nimport { ModalQuickShareMarkAsSent } from 'lib/components/modal/ModalQuickShareMarkAsSent';\nimport { DEFAULT_FOLDER_NAMES } from 'lib/const/Folder';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { theme } from 'lib/style';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n getMarkAsSentValue,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { serverTimeToUserTime } from 'lib/utils/functions';\nimport { useState } from 'react';\nimport { CovideoMagicButton } from 'react-covideo-ai-assist';\nimport { IoIosMic, IoIosShareAlt, IoMdAdd, IoMdCalendar } from 'react-icons/io';\nimport { MdCreateNewFolder, MdDownload } from 'react-icons/md';\nimport { useHistory } from 'react-router';\nimport styled from 'styled-components';\nimport { PROMPT_TYPE } from './const';\nimport { VIDE0_ACTIVITY_TYPE } from 'lib/const/VideoActivity';\nimport { Button } from 'react-covideo-common';\nimport { useQuickShare } from 'lib/hooks/useQuickShare';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport { VideoItemThumbnail } from './VideoItemThumbnail';\nimport { ModalVideoPreview } from 'lib/components/modals/ModalVideoPreview';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { GTMVideoInteractionActions } from 'lib/hooks/GTM/actions/video';\nimport {\n CovideoGTMVehicleItem,\n CovideoGTMVideoAttributes,\n} from 'lib/hooks/GTM/types';\n\nconst Card = styled.div<{ opacity?: string }>`\n background: ${({ theme }) => theme.colors.white[100]};\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 6px;\n overflow: hidden;\n opacity: ${({ opacity }) => opacity ?? '1'};\n &:hover {\n .small-insert-video-button {\n display: none;\n }\n .large-insert-video-button {\n display: flex;\n }\n }\n`;\n\nconst Head = styled.div<{ backgroundColor?: string }>`\n position: relative;\n aspect-ratio: 16 / 9;\n min-height: 100px;\n background-color: ${({ backgroundColor }) =>\n backgroundColor || 'transparent'};\n`;\n\nconst Content = styled.div`\n background-color: ${({ theme }) => theme.colors.white[100]};\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n`;\n\nconst Title = styled.div<{ backgroundColor?: string; width?: string }>`\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n min-height: 40px;\n color: ${theme.palette.gray100};\n background-color: ${({ backgroundColor }) =>\n backgroundColor || 'transparent'};\n width: ${({ width }) => width || 'auto'};\n border-radius: 6px;\n word-break: break-word;\n`;\n\nconst Date = styled.div<{ backgroundColor?: string; width?: string }>`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n display: flex;\n align-items: center;\n background-color: ${({ backgroundColor }) =>\n backgroundColor || 'transparent'};\n width: ${({ width }) => width || 'auto'};\n border-radius: 6px;\n`;\n\nconst Duration = styled.div`\n position: absolute;\n left: 12px;\n bottom: 12px;\n background-color: ${theme.palette.black40};\n border-radius: 24px;\n color: ${({ theme }) => theme.colors.white[100]};\n font-weight: 500;\n font-size: 12px;\n line-height: 16px;\n padding: 4px 8px;\n min-width: 50px;\n`;\n\nconst ButtonsWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n position: absolute;\n z-index: 1;\n padding: 8px;\n top: 0;\n width: 100%;\n`;\nconst LeftButtonsWrapper = styled.div`\n display: flex;\n flex-direction: row;\n gap: 10px;\n`;\nconst CheckboxWrapper = styled.div`\n position: absolute;\n top: 10px;\n left: 10px;\n`;\n\ntype Props = {\n video?: VideoListItem;\n isMerge?: boolean;\n selectedVideosData?: any;\n setSelectedVideosData?: any;\n};\n\nexport const VideoItem = ({\n video,\n isMerge,\n selectedVideosData,\n setSelectedVideosData,\n}: Props) => {\n const { t, i18n } = useTranslation();\n const isCompanyVideo = video?.folder === DEFAULT_FOLDER_NAMES.COMPANY;\n const {\n showQuickshareFeature,\n showVoiceoverFeature,\n showInsertFeature,\n showAiAssistFeature,\n env,\n onVideoInsert,\n } = useConfigurationContext();\n const { userData } = useAuthorizationContext();\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSalesRole = checkIfAutomotiveSalesRole(userData);\n const markAsSent = getMarkAsSentValue(userData);\n const isIMSEnabled = !!userData?.customer.isIMSEnabled;\n\n const { trackGTMVideoInteractionEvent } = useGTMAnalytics();\n\n const isAutomotive = checkIfAutomotive(userData);\n const history = useHistory();\n const [isCopyLoading, setIsCopyLoading] = useState(false);\n const [isDownloadLoading, setIsDownloadLoading] = useState(false);\n const [showPreviewModal, setShowPreviewModal] = useState(false);\n const [showModalMarkAsSent, setShowModalQuickShareMarkAsSent] =\n useState<boolean>(false);\n\n const { toast } = useToastNotifications();\n\n const {\n onQuickShareMutationHandler,\n isQuickshareLoading,\n onQuickShareButtonClick,\n } = useQuickShare({\n video,\n videoRequest: video?.videoRequest as any,\n setShowModalQuickShareMarkAsSent,\n });\n\n const clientTime = !video\n ? ''\n : serverTimeToUserTime(video.recordDate, userData, 'MM/DD/YYYY hh:mm:ss A');\n\n const handleChange = (e: React.SyntheticEvent) => {\n let { checked } = e.target as HTMLInputElement;\n if (checked) {\n setSelectedVideosData([...selectedVideosData, video]);\n } else {\n setSelectedVideosData(\n selectedVideosData.filter(\n // @ts-ignore\n (e: any) => e.id != video.id\n )\n );\n }\n };\n\n const handleDownload = async () => {\n if (!video) {\n return;\n }\n setIsDownloadLoading(true);\n try {\n await downloadVideo(video.id, `${video.title}.mp4`);\n } catch (error) {\n toast({\n message: t('Download failed, please try again later.'),\n });\n }\n setIsDownloadLoading(false);\n };\n\n const createGTMVideoInteractionEvent = ({\n action,\n }: {\n action: GTMVideoInteractionActions;\n }) => {\n if (!video) return;\n const gtmVideoAttributes: CovideoGTMVideoAttributes = {\n videoId: Number(video.id),\n videoType: video?.videoRequest?.videoType,\n videoCustomerName: !!video?.videoRequest?.customerName,\n videoLength: video?.videoLength,\n videoTitle: video?.title,\n };\n trackGTMVideoInteractionEvent?.({\n videoAttributes: gtmVideoAttributes,\n action: action,\n vehicle: video?.videoRequest?.inventoryItem as CovideoGTMVehicleItem,\n });\n };\n\n const handleCopy = async () => {\n if (!video) {\n return;\n }\n setIsCopyLoading(true);\n try {\n await copyCompanyVideoToPrimary(video.id);\n toast({\n message: t('Video copied successfully.'),\n });\n } catch (error) {\n toast({\n message: t(`Copy failed, please try again later.`),\n });\n }\n setIsCopyLoading(false);\n };\n\n if (!video) {\n return (\n <Card opacity='.3'>\n <Head backgroundColor={theme.palette.gray20}>\n <Duration> </Duration>\n </Head>\n <Content>\n <Title backgroundColor={theme.palette.gray20} width='100%'>\n \n </Title>\n <Date backgroundColor={theme.palette.gray20} width='70%'>\n \n </Date>\n </Content>\n </Card>\n );\n }\n\n return (\n <Card>\n <Head backgroundColor={theme.palette.black}>\n <VideoItemThumbnail\n videoId={video.id}\n thumbnail={video.thumbnail}\n duration={video.videoLength || 0}\n processing={video.processing}\n onClick={() => {\n createGTMVideoInteractionEvent({\n action: GTMVideoInteractionActions.VIEW,\n });\n setShowPreviewModal(true);\n }}\n />\n {!isMerge && (\n <ButtonsWrapper>\n <LeftButtonsWrapper>\n {!isCompanyVideo && (\n <>\n {showInsertFeature && (\n <Button\n onClick={() => {\n createGTMVideoInteractionEvent({\n action: GTMVideoInteractionActions.SEND_AND_SHARE,\n });\n\n history.push(`/insert-video/${video?.id}`);\n }}\n icon={<IoMdAdd size={18} />}\n variant='white'\n iconPosition='middle'\n size='small'\n title={t('Insert')}\n />\n )}\n {showQuickshareFeature && (\n <Button\n onClick={() => {\n createGTMVideoInteractionEvent({\n action: GTMVideoInteractionActions.COPY_VIDEO_URL,\n });\n onQuickShareButtonClick({\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n toastType: 'quickshare',\n });\n }}\n icon={\n isQuickshareLoading ? (\n <Spinner size={12} />\n ) : (\n <IoIosShareAlt size={18} />\n )\n }\n disabled={isQuickshareLoading}\n variant='white'\n title={t('Copy Video')}\n size='small'\n />\n )}\n {showAiAssistFeature && (\n <CovideoMagicButton\n defaultPromptType={PROMPT_TYPE.CRM_MESSAGE}\n handleSubmitGeneratedContent={(\n content,\n url,\n thumbnail,\n markAsSentConfirmed\n ) => {\n const payload = {\n url: url || '',\n thumbnail: thumbnail || '',\n image: video.thumbnail || '',\n html: content,\n token,\n };\n onVideoInsert?.(payload);\n setTimeout(() => {\n markAsSentConfirmed ||\n (markAsSent === MarkAsSentOptions.ALWAYS.value &&\n toast({ message: t('Video marked as Sent') }));\n }, 100);\n toast({ message: t('Inserting video...') });\n }}\n handleOnCopySuccess={(\n content,\n url,\n thumbnail,\n markAsSentConfirmed\n ) => {\n setTimeout(() => {\n markAsSentConfirmed ||\n (markAsSent === MarkAsSentOptions.ALWAYS.value &&\n toast({ message: t('Video marked as Sent') }));\n }, 100);\n toast({ message: t('Link copied to clipboard!') });\n }}\n margin={'0'}\n iconColor='gradient'\n videoId={video ? video.id : ''}\n defaultVin={video?.videoRequest?.vin || ''}\n token={token}\n userData={{\n customer: {\n business: userData.customer.business,\n hasCovideoMagic:\n userData?.customer?.hasCovideoMagic?.toString() ===\n '1',\n markVideosAsSent: getMarkAsSentValue(userData),\n },\n firstName: userData.firstName,\n isAutomotiveSalesRole: isAutomotiveSalesRole,\n isAutomotiveServiceRole: isAutomotiveServiceRole,\n isIMSEnabled: isIMSEnabled,\n isCompanyAdmin: userData.isCompanyAdmin,\n isAutomotive: isAutomotive,\n preferredLanguage: i18n.language,\n }}\n aiAssistTheme={'branding'}\n env={env}\n apiKey={apiKey}\n variant={'white'}\n size={'small'}\n />\n )}\n </>\n )}\n {isCompanyVideo && (\n <>\n <Button\n onClick={handleCopy}\n icon={\n isCopyLoading ? (\n <Spinner size={12} />\n ) : (\n <MdCreateNewFolder size={18} />\n )\n }\n disabled={isCopyLoading}\n variant='white'\n title={t('Copy to Primary')}\n size='small'\n />\n\n <Button\n onClick={handleDownload}\n title={t('Download')}\n icon={\n isDownloadLoading ? (\n <Spinner size={12} />\n ) : (\n <MdDownload size={18} />\n )\n }\n disabled={isDownloadLoading}\n variant='white'\n size='small'\n />\n </>\n )}\n </LeftButtonsWrapper>\n {showVoiceoverFeature && !isCompanyVideo && (\n <Button\n title={t('Voiceover')}\n onClick={() => {\n createGTMVideoInteractionEvent({\n action: GTMVideoInteractionActions.VOICE_OVER,\n });\n history.push(`/voiceover/${video.id}`);\n }}\n icon={<IoIosMic size={18} />}\n variant='white'\n size='small'\n />\n )}\n </ButtonsWrapper>\n )}\n {isMerge && (\n <CheckboxWrapper>\n <CheckboxInput\n width='24px'\n checked={selectedVideosData.find((v: any) => v.id === video.id)}\n onChange={(e: React.SyntheticEvent) => handleChange(e)}\n />\n </CheckboxWrapper>\n )}\n </Head>\n <Content>\n <Title>{video.title}</Title>\n <Date>\n <IoMdCalendar\n size={16}\n color={theme.palette.gray40}\n style={{ marginRight: 6 }}\n />\n {clientTime}\n </Date>\n </Content>\n {showModalMarkAsSent && (\n <ModalQuickShareMarkAsSent\n markAsSentPayload={{ toastType: 'quickshare' }}\n isQuickShareLoading={isQuickshareLoading}\n quickShareMarkAsSentHandler={onQuickShareMutationHandler}\n handleModalClose={async () => {\n setShowModalQuickShareMarkAsSent(false);\n }}\n />\n )}\n {showPreviewModal && (\n <ModalVideoPreview\n video={video}\n handleModalClose={() => setShowPreviewModal(false)}\n />\n )}\n </Card>\n );\n};\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { IoMdSearch } from 'react-icons/io';\nimport { useState } from 'react';\nimport { Input } from 'lib/components';\nimport { MdClear } from 'react-icons/md';\nimport { screenSizes } from 'lib/style/theme';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useTranslation } from 'react-i18next';\n\nconst SearchWrapper = styled.div`\n position: relative;\n width: 190px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.cmd &&\n css`\n width: 100%;\n `}\n`;\n\nconst SearchIconWrapper = styled.div`\n position: absolute;\n left: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\nconst ClearIconWrapper = styled.div`\n position: absolute;\n right: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\ntype Props = {\n prevSearch: string;\n handleSearch: (searchTerm: string) => void;\n};\nexport const Search = ({ prevSearch, handleSearch }: Props) => {\n const { t } = useTranslation();\n const { containerWidth } = useConfigurationContext();\n const [searchTerm, setSearchTerm] = useState(prevSearch || '');\n\n const handleSearchKeyUp = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSearch(searchTerm);\n }\n };\n\n const handleClear = () => {\n setSearchTerm('');\n handleSearch('');\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.currentTarget.value);\n };\n\n const placeholder =\n containerWidth >= theme.screenSizes.mb\n ? t('Search Videos...')\n : t('Search...');\n\n return (\n <SearchWrapper>\n <SearchIconWrapper>\n <IoMdSearch onClick={() => handleSearch(searchTerm)} size={17} />\n </SearchIconWrapper>\n <Input\n width='100%'\n type='text'\n padding='8px 8px 8px 40px'\n value={searchTerm}\n placeholder={placeholder || undefined}\n onKeyUp={handleSearchKeyUp}\n onChange={handleChange}\n />\n {searchTerm !== '' && (\n <ClearIconWrapper>\n <MdClear onClick={() => handleClear()} size={17} />\n </ClearIconWrapper>\n )}\n </SearchWrapper>\n );\n};\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { VideoItem } from '.';\nimport { screenSizes } from 'lib/style/theme';\n\ntype Props = {\n size: number;\n message: string;\n};\n\nconst VideosGrid = styled.div`\n position: relative;\n display: grid;\n gap: 24px;\n margin: 24px 0;\n grid-template-columns: repeat(3, 1fr);\n z-index: 0;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n grid-template-columns: 1fr;\n `}\n`;\n\nconst Text = styled.div`\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1;\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray60};\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n top: 32px;\n width: 100%;\n text-align: center;\n `}\n`;\n\nexport const NoVideos = ({ size, message }: Props) => {\n return (\n <VideosGrid>\n <Text>{message}</Text>\n {[...Array(size)].map((n: number, i: number) => (\n <VideoItem key={i} />\n ))}\n </VideosGrid>\n );\n};\n","export const locationKeys = {\n all: (userId: number) => ['LOCATION', userId],\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\nimport { locationKeys } from './locationKeys';\n\nexport interface ILocation {\n locationId: number;\n customerId: number;\n name: string;\n streetAddress?: string;\n state?: string;\n}\n\nconst getUserLocations = async (\n userId: number | string\n): Promise<ILocation[]> => {\n const response = await EXPRESS_API.get(`/locations/user/${userId}`);\n return response.data as ILocation[];\n};\n\nexport const useGetLocationsQuery = (userId: number, enabled: boolean) => {\n const { data, isLoading, refetch } = useQuery(\n locationKeys.all(userId),\n () => getUserLocations(userId),\n {\n enabled: !!userId && enabled,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n }\n );\n\n return { data: data || [], isLoading, refetch };\n};\n","import { AxiosError } from 'axios';\nimport { EXPRESS_API, updateToken } from 'lib/config';\nimport { useMutation } from 'react-query';\ninterface ILoggedUser {\n accessToken: string;\n refreshToken: string;\n}\ninterface ISignIntoParams {\n locationId: number;\n}\n\nconst signIntoLocation = async ({\n locationId,\n}: ISignIntoParams): Promise<ILoggedUser> => {\n const response = await EXPRESS_API.post(`/locations/sign-in`, {\n locationId,\n });\n return response.data as ILoggedUser;\n};\n\nexport const useSignIntoLocation = (hasExternalJwt: boolean) => {\n return useMutation(signIntoLocation, {\n onSuccess: data => {\n // for external jwt add token to URL and reload the page\n if (hasExternalJwt) {\n const url = new URL(window.location.href);\n url.searchParams.set('token', data.accessToken);\n window.location.href = url.toString();\n return;\n }\n updateToken(data.accessToken);\n },\n onError: (err: AxiosError) => {\n console.log(err);\n },\n });\n};\n","import * as React from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport CreatableSelect from 'react-select/creatable';\nimport Select, {\n ControlProps,\n CSSObjectWithLabel,\n DropdownIndicatorProps as BaseDropdownIndicatorProps,\n FormatOptionLabelMeta,\n GroupBase,\n MenuPlacement,\n MenuPosition,\n OptionProps,\n SelectComponentsConfig,\n} from 'react-select';\nimport { theme } from 'lib/style';\nimport { MdArrowDropDown } from 'react-icons/md';\n\nexport const Chip = styled.div<{\n bgColor: string;\n fontColor: string;\n radius?: string;\n padding?: string;\n fontSize?: string;\n lineHeight?: string;\n width?: string;\n height?: string;\n}>`\n font-style: normal;\n font-weight: 600;\n font-size: ${props => props.fontSize ?? '12px'};\n line-height: ${props => props.lineHeight ?? '16px'};\n height: ${props => props.height ?? 'auto'};\n width: ${props => props.width ?? 'auto'};\n background: ${props => props.bgColor};\n color: ${props => props.fontColor};\n border-radius: 6px;\n padding: ${props => props.padding ?? '2px 8px'};\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n`;\n\nexport type Option = {\n value: string | number;\n label: string | number;\n isFolderShared?: boolean;\n access?: boolean | string;\n};\n\ntype Icon = 'checkmark' | 'folder' | '';\n\ntype Props = {\n icon?: Icon;\n value: any;\n defaultValue?: any;\n options: Array<Option> | any;\n placeholder?: string;\n isLoading?: boolean;\n name?: string;\n className?: string;\n dropdownHeight?: string | number;\n height?: number;\n width?: number;\n disabled?: boolean;\n zIndexProp?: number;\n menuZIndexProp?: number;\n creatable?: boolean;\n error?: boolean;\n inputId?: any;\n menuPortalTarget?: HTMLElement | null;\n menuPosition?: MenuPosition;\n menuPlacement?: MenuPlacement;\n ariaLabel?: string;\n onMenuScrollToBottom?: () => void;\n onMenuClose?: () => void;\n onChange: (value: any, actionMeta?: any) => void;\n onInputChange?: (inputValue: any, actionMeta?: any) => void;\n getOptionLabel?: (option: any) => string;\n getOptionValue?: (option: any) => string;\n extendStyles?: {\n container?: React.CSSProperties;\n menu?: React.CSSProperties;\n control?: React.CSSProperties;\n menuList?: React.CSSProperties;\n valueContainer?: React.CSSProperties;\n input?: React.CSSProperties;\n singleValue?: React.CSSProperties;\n option?: React.CSSProperties;\n };\n showIndicator?: boolean;\n chipValueSelected?: boolean;\n isClearable?: boolean;\n isMulti?: any /* used as any because creatable select not considering it as boolean */;\n onCreateOption?: (e?: any) => void;\n isShareVideoModal?: boolean;\n isSearchable?: boolean;\n formatCreateLabel?: (inputValue: string) => React.ReactNode;\n menuShouldBlockScroll?: boolean;\n minMenuHeight?: number;\n closeMenuOnScroll?: boolean | ((event: Event) => boolean) | undefined;\n filterOption?:\n | ((option: Option, rawInput: string) => boolean)\n | null\n | undefined;\n formatOptionLabel?:\n | ((\n option: any,\n labelMeta: FormatOptionLabelMeta<any>\n ) => React.ReactNode)\n | undefined;\n customComponents?: Partial<SelectComponentsConfig<any, any, GroupBase<any>>> | undefined;\n onMenuOpen?: (() => void) | undefined;\n maxMenuHeight?: number;\n controlShouldRenderValue?: boolean;\n createOptionPosition?: 'first' | 'last' | undefined;\n autoFocus?: boolean;\n};\n\ntype DropdownArrowProps = {\n menuIsOpen?: boolean;\n};\n\nexport type DropdownIndicatorProps = React.PropsWithChildren<\n BaseDropdownIndicatorProps<Option, false>\n>;\n\nexport const DropdownArrowIcon = styled.span<DropdownArrowProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n padding-right: 12px;\n position: relative;\n svg {\n ${props => props.menuIsOpen && 'transform: rotate(180deg);'}\n }\n`;\n\nexport const OptionWrapper = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n`;\n\nexport const OptionIconWrapper = styled.div`\n text-align: center;\n`;\n\nexport const getControlStyles = (props: ControlProps<Option, false>) => {\n const { isDisabled, menuIsOpen, selectProps } = props;\n\n if (isDisabled) {\n return { borderColor: theme.palette.transparent };\n }\n if ((selectProps as any).error) {\n return { borderColor: theme.palette.error };\n }\n\n return { borderColor: theme.palette.covideoGray40 };\n};\n\nexport const getOptionStyles = (\n props: OptionProps<Option, false>,\n themes: any,\n isShareVideoModal?: boolean /* SUS-1302 changes */\n) => {\n const { isFocused, isSelected, isDisabled } = props;\n if (isDisabled) {\n return {\n color: theme.palette.gray40,\n backgroundColor: theme.palette.gray10,\n cursor: 'not-allowed',\n };\n }\n if (isFocused || isSelected) {\n /* SUS-1302 changes */\n if (isShareVideoModal) {\n return {\n color: theme.palette.black_1_100,\n backgroundColor: 'rgb(222, 235, 255)',\n };\n }\n /*****/\n return {\n color: themes.colors.primary[100],\n backgroundColor: themes.colors.secondary[5],\n };\n }\n\n return {\n color: theme.palette.covideoGray100,\n backgroundColor: theme.palette.white,\n };\n};\n\nexport const Dropdown = (props: Props) => {\n const {\n ariaLabel = 'Aria label is missing',\n name,\n options,\n value,\n defaultValue = undefined,\n placeholder = 'No Folders',\n onChange,\n getOptionLabel,\n getOptionValue,\n menuPosition = 'absolute',\n menuPlacement = 'auto',\n menuPortalTarget,\n inputId,\n className,\n dropdownHeight = 'auto',\n height = 48,\n width,\n disabled = false,\n creatable = true,\n error = false,\n onMenuScrollToBottom,\n onMenuClose,\n extendStyles,\n icon,\n showIndicator = true,\n chipValueSelected = false,\n isClearable = false,\n onInputChange /* SUS-1302 changes */,\n onCreateOption /* SUS-1302 changes */,\n isMulti = false /* SUS-1302 changes */,\n isShareVideoModal = false /* SUS-1302 changes */,\n zIndexProp = 9999,\n menuZIndexProp = 2,\n isSearchable,\n formatCreateLabel,\n closeMenuOnScroll = undefined,\n menuShouldBlockScroll = false,\n isLoading = false,\n filterOption,\n formatOptionLabel,\n customComponents,\n onMenuOpen,\n maxMenuHeight,\n controlShouldRenderValue,\n createOptionPosition,\n autoFocus,\n } = props;\n const themes = useTheme();\n\n //common props\n const commonProps = {\n icon,\n error,\n options,\n className,\n name,\n placeholder,\n value,\n defaultValue,\n getOptionLabel,\n getOptionValue,\n onChange,\n menuPlacement,\n menuPosition,\n isDisabled: disabled,\n menuPortalTarget,\n 'aria-label': ariaLabel,\n onMenuScrollToBottom,\n onMenuClose,\n isClearable,\n onInputChange,\n onCreateOption /* SUS-1302 changes */,\n isMulti /* SUS-1302 changes */,\n isSearchable,\n filterOption,\n };\n\n const DropdownIndicator = (props: DropdownIndicatorProps) => {\n return showIndicator ? (\n <DropdownArrowIcon menuIsOpen={props.selectProps.menuIsOpen}>\n <MdArrowDropDown size={18} opacity={0.5} />\n </DropdownArrowIcon>\n ) : (\n <></>\n );\n };\n\n //dropdown styles\n const styles = {\n container: (base: CSSObjectWithLabel) => {\n return {\n ...base,\n ...(extendStyles?.container || {}),\n };\n },\n\n control: (\n base: CSSObjectWithLabel,\n props: ControlProps<Option, false>\n ) => {\n return {\n ...base,\n width: width,\n boxShadow: 'none',\n borderRadius: 6,\n minHeight: '40px',\n cursor: 'pointer',\n ...getControlStyles(props),\n ...(extendStyles?.control || {}),\n //@ts-ignore\n '&:hover': {\n borderColor: isShareVideoModal\n ? 'rgb(128, 189, 255)'\n : themes.colors.primary[100] /* SUS-1302 changes */,\n },\n '&:focus-within': {\n borderColor: isShareVideoModal\n ? 'rgb(128, 189, 255)'\n : themes.colors.primary[100] /* SUS-1302 changes */,\n },\n };\n },\n singleValue: (base: CSSObjectWithLabel) => ({\n ...base,\n width: '95%',\n ...(extendStyles?.singleValue || {}),\n }),\n valueContainer: (base: CSSObjectWithLabel) => ({\n ...base,\n ...(extendStyles?.valueContainer || {}),\n }),\n input: (base: CSSObjectWithLabel) => ({\n ...base,\n ...(extendStyles?.input || {}),\n }),\n menuPortal: (base: CSSObjectWithLabel) => ({\n ...base,\n zIndex: zIndexProp || 9999,\n }),\n menuList: (base: CSSObjectWithLabel) => ({\n ...base,\n ...(extendStyles?.menuList || {}),\n height: dropdownHeight,\n }),\n menu: (base: CSSObjectWithLabel) => ({\n ...base,\n ...(extendStyles?.menu || {}),\n marginTop: 2,\n zIndex: menuZIndexProp || 2,\n color: theme.palette.primaryDarkBlue,\n }),\n option: (\n base: CSSObjectWithLabel,\n props: OptionProps<Option, false>\n ) => {\n return {\n ...base,\n height: isShareVideoModal ? 35 : height /* SUS-1302 changes */,\n display: 'flex',\n alignItems: 'center',\n padding: '0 16px',\n cursor: 'pointer',\n transition: 'all 0.3s',\n fontWeight: isShareVideoModal ? 'normal' : 600 /* SUS-1302 changes */,\n fontSize: 15,\n ...getOptionStyles(\n props,\n themes,\n isShareVideoModal\n ) /* SUS-1302 changes */,\n ...(extendStyles?.option || {}),\n };\n },\n };\n\n if (creatable) {\n return (\n <CreatableSelect\n {...commonProps}\n isLoading={false}\n components={{\n DropdownIndicator: DropdownIndicator,\n IndicatorSeparator: () => null,\n ...customComponents,\n }}\n styles={styles}\n isSearchable={isSearchable}\n formatCreateLabel={formatCreateLabel}\n formatOptionLabel={formatOptionLabel}\n createOptionPosition={createOptionPosition}\n />\n );\n }\n\n return (\n <Select\n {...commonProps}\n inputId={inputId}\n maxMenuHeight={maxMenuHeight || 220}\n menuShouldScrollIntoView={false}\n menuPortalTarget={menuPortalTarget}\n isLoading={isLoading}\n components={{\n DropdownIndicator: DropdownIndicator,\n IndicatorSeparator: () => null,\n ...customComponents,\n }}\n styles={styles}\n isSearchable={isSearchable}\n closeMenuOnScroll={closeMenuOnScroll}\n menuShouldBlockScroll={menuShouldBlockScroll}\n filterOption={filterOption}\n formatOptionLabel={formatOptionLabel}\n onMenuOpen={onMenuOpen}\n controlShouldRenderValue={controlShouldRenderValue}\n autoFocus={autoFocus}\n />\n );\n};\n","import styled, { useTheme } from 'styled-components';\nimport { ButtonDropdown } from 'lib/components';\nimport { theme } from 'lib/style';\nimport { IoMdPerson, IoMdArrowDropdown, IoMdArrowDropup } from 'react-icons/io';\nimport { memo, useState } from 'react';\nimport { useOnClickOutside } from 'lib/utils/UseOnClickOutside';\nimport { MdLogout } from 'react-icons/md';\nimport { useHistory } from 'react-router-dom';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { clearCookies } from 'lib/utils/functions';\nimport { useAuthorizationContext } from 'lib/context';\nimport {\n ILocation,\n useGetLocationsQuery,\n} from 'lib/api/multilocation/getUserLocations';\nimport { useSignIntoLocation } from 'lib/api/multilocation/signIntoLocation';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\nimport { useQueryClient } from 'react-query';\n\nconst Wrapper = styled.div`\n position: relative;\n display: flex;\n`;\n\nconst Menu = styled.div`\n position: absolute;\n cursor: pointer;\n top: 40px;\n min-height: 20px;\n background: pink;\n min-width: 100%;\n box-shadow:\n 0px 0px 4px rgba(66, 79, 104, 0.08),\n 0px 6px 12px rgba(66, 79, 104, 0.06);\n border-radius: 8px;\n background: ${theme.palette.white};\n`;\n\ntype Props = {\n handleUpdateToken: Function;\n};\nconst SpainFlag = (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 640 480'\n width='20'\n height='15'\n >\n <g fillRule='evenodd'>\n <path fill='#aa151b' d='M0 0h640v480H0z' />\n <path fill='#f1bf00' d='M0 120h640v240H0z' />\n </g>\n </svg>\n);\n\nconst UKFlag = (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 60 30'\n width='20'\n height='15'\n >\n <clipPath id='t'>\n <path d='M0,0 v30 h60 v-30 z' />\n </clipPath>\n <clipPath id='s'>\n <path d='M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z' />\n </clipPath>\n <g clipPath='url(#t)'>\n <path d='M0,0 v30 h60 v-30 z' fill='#012169' />\n <path d='M0,0 L60,30 M60,0 L0,30' stroke='#fff' strokeWidth='6' />\n <path\n d='M0,0 L60,30 M60,0 L0,30'\n stroke='#C8102E'\n strokeWidth='4'\n clipPath='url(#s)'\n />\n <path d='M30,0 v30 M0,15 h60' stroke='#fff' strokeWidth='10' />\n <path d='M30,0 v30 M0,15 h60' stroke='#C8102E' strokeWidth='6' />\n </g>\n </svg>\n);\n\nconst FranceFlag = (\n <svg\n xmlns='http://www.w3.org/2000/svg'\n viewBox='0 0 3 2'\n width='20'\n height='15'\n >\n <rect width='1' height='2' x='0' y='0' fill='#0055a4' />\n <rect width='1' height='2' x='1' y='0' fill='#fff' />\n <rect width='1' height='2' x='2' y='0' fill='#ef4135' />\n </svg>\n);\n\nexport const UserDropdown = memo(({ handleUpdateToken }: Props) => {\n const { i18n, t } = useTranslation();\n const { colors, isCdkEnviroment } = useTheme();\n const queryClient = useQueryClient();\n const {\n hasExternalJwt,\n reRender,\n showMultiLocationFeature,\n showLanguageDropdownFeature,\n } = useConfigurationContext();\n const { mutateAsync: signIn, isLoading: isChangingLocation } =\n useSignIntoLocation(hasExternalJwt);\n const { userData } = useAuthorizationContext();\n const hasLocationsEnabled =\n userData?.customer?.hasMultiLocation?.toString() === '1';\n const { data: locations } = useGetLocationsQuery(\n parseInt(userData?.userId, 10),\n showMultiLocationFeature && hasLocationsEnabled\n );\n const hasAccessToLocation = !!(\n locations &&\n locations.length &&\n locations.find(\n (location: ILocation) =>\n location.locationId.toString() ===\n userData?.customer?.locationId?.toString()\n )\n );\n const showMultiLocationPicker =\n showMultiLocationFeature && hasLocationsEnabled && hasAccessToLocation;\n const [open, setOpen] = useState(false);\n const { ref } = useOnClickOutside(() => setOpen(false));\n const history = useHistory();\n\n const handleDropdownClick = () => {\n setOpen(prev => !prev);\n };\n\n const logout = () => {\n handleUpdateToken('');\n clearCookies();\n queryClient.clear();\n history.go(0);\n };\n\n let name = userData.firstName || userData.lastName || t('Welcome');\n\n const currentLocation = (locations || []).find(\n location =>\n userData?.customer?.locationId &&\n location.locationId.toString() === userData.customer.locationId.toString()\n );\n\n const locationOptions = locations.filter(\n location => location.locationId !== currentLocation?.locationId\n );\n\n const changeLocation = async (locationId: number) => {\n await signIn({ locationId });\n reRender();\n };\n\n const languageOptions = [\n { value: 'es', label: <>{SpainFlag} ES</> },\n { value: 'en', label: <>{UKFlag} EN</> },\n { value: 'fr', label: <>{FranceFlag} FR</> },\n ];\n\n const menuItems = [\n ...(showMultiLocationPicker\n ? (locationOptions || []).map(loc => ({\n key: `loc-${loc.locationId}`,\n label: (\n <ButtonDropdown\n key={loc.locationId}\n text={loc.name}\n textColor={'black'}\n backgroundColor='transparent'\n borderColor='transparent'\n onClick={() => changeLocation(loc.locationId)}\n disabled={isChangingLocation}\n />\n ),\n }))\n : []),\n ...(!hasExternalJwt\n ? [\n {\n key: 'logout',\n label: (\n <ButtonDropdown\n text={t('Log Out')}\n textColor={\n isCdkEnviroment ? colors.primary[100] : colors.danger[80]\n }\n backgroundColor='transparent'\n borderColor='transparent'\n icon={\n <MdLogout\n size={18}\n color={\n isCdkEnviroment ? colors.primary[100] : colors.danger[40]\n }\n />\n }\n onClick={() => logout()}\n disabled={isChangingLocation}\n />\n ),\n },\n ]\n : []),\n ];\n\n const doesMenuItemsExist = menuItems.length > 0;\n\n return (\n <Wrapper ref={ref}>\n <ButtonDropdown\n text={name}\n subtext={showMultiLocationPicker ? currentLocation?.name : ''}\n backgroundColor={open ? theme.palette.black25 : 'transparent'}\n borderColor='transparent'\n textColor={'white'}\n icon={<IoMdPerson size={18} color={'white'} />}\n iconOther={\n !doesMenuItemsExist ? (\n <></>\n ) : open ? (\n <IoMdArrowDropup />\n ) : (\n <IoMdArrowDropdown />\n )\n }\n onClick={() =>\n !doesMenuItemsExist ? () => null : handleDropdownClick()\n }\n />\n {open && (\n <Menu>\n {menuItems.map(item => (\n <div key={item.key}>{item.label}</div>\n ))}\n </Menu>\n )}\n {showLanguageDropdownFeature && (\n <Dropdown\n isSearchable={false}\n isClearable={false}\n width={90}\n options={languageOptions}\n onChange={value => {\n i18n.changeLanguage(value.value);\n }}\n formatOptionLabel={option => (\n <div\n style={{\n display: 'flex',\n gap: 4,\n alignItems: 'center',\n }}\n >\n {option.label}\n </div>\n )}\n value={languageOptions.find(opt => opt.value === i18n.language)}\n />\n )}\n </Wrapper>\n );\n});\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\n\nconst Wrapper = styled.div`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n`;\n\ntype Props = {\n page: number;\n size: number;\n count: number;\n};\n\nexport const PageInfo = ({ page, size, count }: Props) => {\n const from = page * size + 1;\n let to = page * size + size;\n if (to > count) {\n to = count;\n }\n return (\n <Wrapper>\n {from}-{to} of {count}\n </Wrapper>\n );\n};\n","//TODO_CHECK HOW TO TRANSLATE THESE\nexport enum VideoTypeSales {\n NoType = '',\n Marketing = 'Marketing',\n Prospecting = 'Prospecting',\n RespondToInquiry = 'Respond to Inquiry',\n ThanksForYourBusiness = 'Thanks For Your Business',\n}\n//TODO_CHECK HOW TO TRANSLATE THESE\nexport enum VideoType {\n NoType = '',\n AdditionalRepair = 'Additional Repair',\n RepairInquiry = 'Repair inquiry',\n RegularService = 'Regular service',\n ServiceReminder = 'Service reminder',\n QuoteRequest = 'Quote request',\n}\n\nexport const EXTERNAL_VIDEO_PREFIX = '~~~external-video~~~';\n","export enum PackageName {\n LEGACY = 0,\n FREE = 1,\n PRO = 2,\n TEAMS = 3,\n ENTERPRISE = 4,\n}\n","import { useReducer } from 'react';\n\ntype ActionType =\n | {\n type: 'REQUEST';\n }\n | {\n type: 'SUCCESS';\n data: {};\n }\n | {\n type: 'FAILURE';\n error: boolean;\n }\n | {\n type: 'PROGRESS';\n };\n\ntype QueryState = {\n // TODO: we should export generic type\n data: any | null;\n error: boolean | null;\n loading: boolean;\n progress: number;\n};\n\nconst initialState = { data: null, error: null, loading: true, progress: 0 };\n\nconst getRandomInt = (max: number) => {\n return Math.floor(Math.random() * Math.floor(max));\n};\n\nconst queryReducer = (state: QueryState, action: ActionType) => {\n switch (action.type) {\n case 'REQUEST':\n return {\n ...state,\n loading: true,\n error: null,\n };\n\n case 'PROGRESS':\n return {\n ...state,\n progress: Math.min(state.progress + getRandomInt(25), 100),\n };\n\n case 'SUCCESS':\n return {\n ...state,\n data: action.data,\n loading: false,\n error: null,\n progress: 100,\n };\n\n case 'FAILURE':\n return {\n ...state,\n data: null,\n loading: false,\n error: action.error,\n progress: 100,\n };\n\n default:\n return state;\n }\n};\n\nexport const useQueryState = (init?: any) => {\n const [state, dispatch] = useReducer(\n queryReducer,\n init ? init : initialState\n );\n\n return { state, dispatch };\n};\n","import axios, { AxiosRequestConfig, AxiosResponse, Method } from 'axios';\nimport { apiExpress, options } from 'lib/config';\nimport { useQueryState } from './useQueryState';\nimport { useToastNotifications } from 'lib/components';\n\ninterface ExpandedAxiosResponse extends AxiosResponse<any> {\n success?: boolean;\n}\n\ntype UseQueryProps = {\n method?: Method;\n params?: {};\n pathname?: string;\n autoFetch?: boolean;\n showToastMessage?: boolean;\n};\n\nexport const useQueryFetch = ({\n method,\n pathname,\n params,\n autoFetch = false,\n showToastMessage = true,\n}: UseQueryProps) => {\n const { state, dispatch } = useQueryState({\n data: null,\n error: '',\n loading: false,\n });\n\n const { data, error, loading, progress } = state;\n const { toast } = useToastNotifications();\n\n const fetchData = async (requestConfig?: AxiosRequestConfig, id?: any) => {\n dispatch({ type: 'REQUEST' });\n const progressInterval = setInterval(() => {\n dispatch({ type: 'PROGRESS' });\n }, 200);\n\n let baseUrl = requestConfig?.baseURL;\n\n if (!baseUrl) {\n baseUrl = apiExpress;\n }\n\n // @ts-ignore\n let config: AxiosRequestConfig = {\n url: pathname,\n baseURL: baseUrl,\n method: typeof method !== 'undefined' ? method : 'get',\n params: params,\n };\n axios({ ...config, ...{ headers: options.headers }, ...requestConfig })\n .then((response: ExpandedAxiosResponse) => {\n let { data, success } = response;\n if (data && data.message && showToastMessage) {\n toast({ title: data.message });\n }\n if (data.id) {\n data.video_id = data.id;\n }\n if (method === 'patch') {\n if (Array.isArray(data)) {\n data = data.length > 0 ? 'SUCCESS' : success;\n }\n data = data === true ? 'SUCCESS' : 'ERROR';\n }\n if (id >= 0) {\n data.id = id;\n if (data.data) {\n data.data.id = id;\n }\n }\n dispatch({ type: 'SUCCESS', data });\n clearInterval(progressInterval);\n })\n .catch(error => {\n dispatch({ type: 'FAILURE', error: error.message });\n if (showToastMessage) toast({ title: error.message });\n clearInterval(progressInterval);\n });\n };\n if (autoFetch && data == null && loading === false && !error) {\n fetchData();\n }\n return {\n data,\n loading,\n error,\n fetchData,\n progress,\n };\n};\n","import { apiExpress } from 'lib/config';\nimport { useQueryFetch } from './useQueryFetch';\n\ninterface VideoData {\n title: string;\n filename: string;\n id?: number | string;\n}\n\ninterface CreateVideoResponse {\n success: boolean;\n url: string;\n html: string;\n id: string;\n video_id: string;\n data?: any;\n}\n\nexport const useCreateVideo = () => {\n const { data, error, loading, fetchData, progress } = useQueryFetch({\n pathname: '',\n });\n const fetch = (data: VideoData) => {\n fetchData(\n {\n method: 'post',\n url: '/videos',\n baseURL: apiExpress,\n data: {\n filename: data.filename,\n title: data.title,\n },\n },\n data.hasOwnProperty('id') ? data.id : undefined\n );\n };\n const videoData: CreateVideoResponse = data || null;\n\n return { videoData, loading, error, fetch, progress };\n};\n","import { apiExpress } from 'lib/config';\nimport { useQueryFetch } from './useQueryFetch';\n\ninterface EncodeData {\n videoId: string;\n customerId: string;\n}\n\ninterface EncodeVideoResponse {\n success: boolean;\n job_id: number;\n}\n\nexport const useEncodeVideo = () => {\n const { data, error, loading, fetchData, progress } = useQueryFetch({\n pathname: '',\n });\n\n const fetch = (data: EncodeData) => {\n const { videoId } = data;\n return fetchData({\n method: 'post',\n url: `videos/${videoId}/encode`,\n baseURL: apiExpress,\n });\n };\n\n const encodeData: EncodeVideoResponse =\n (data && (data.data || data.jobId)) || null;\n\n return { encodeData, loading, error, fetch, progress };\n};\n","import { useQueryFetch } from './useQueryFetch';\nimport { apiExpress } from 'lib/config';\n\ninterface PresignedUrl {\n url: string;\n id?: number;\n}\n\ninterface PresignedUrlParams {\n fileName: string;\n type: string;\n id?: number;\n}\nexport const usePresignedUrl = () => {\n const { data, error, loading, fetchData } = useQueryFetch({});\n\n // const presignedUrlArr = [];\n const fetch = (data: PresignedUrlParams) => {\n fetchData(\n {\n method: 'get',\n url: `aws/signedurl?filename=${data.fileName}&filetype=${data.type}`,\n baseURL: apiExpress,\n },\n data.hasOwnProperty('id') ? data.id : undefined\n );\n };\n\n const presignedUrl: PresignedUrl = data;\n // presignedUrlArr.push(presignedUrl);\n return { presignedUrl, loading, error, fetch };\n // return { presignedUrlArr, loading, error, fetch };\n};\n","import { createContext, useContext, useState } from 'react';\n\nexport const ActionDispatchContext = createContext({} as any);\n\nexport const ActionDispatchProvider = ({ children }: any) => {\n const [action, setAction] = useState({});\n\n const value = {\n action,\n setAction,\n };\n\n return (\n <ActionDispatchContext.Provider value={value}>\n {children}\n </ActionDispatchContext.Provider>\n );\n};\n\nexport const useActionDispatchContextState = () =>\n useContext(ActionDispatchContext);\n","// This action follow the Flux Standard Action (FSA) convention.\n\ninterface ActionTypeRequest {\n type: string;\n meta?: any;\n}\n\ninterface ActionTypeSuccess {\n type: string;\n payload?: any;\n meta?: any;\n}\n\ninterface ActionTypeFailure {\n type: string;\n payload?: any;\n meta?: any;\n error?: boolean | null;\n}\n\nexport interface ActionType {\n type: string;\n payload?: any;\n meta?: any;\n error?: boolean | null;\n}\n\nexport const requestActionCreator = ({ type, meta }: ActionTypeRequest) => {\n return {\n type,\n meta,\n };\n};\n\nexport const successActionCreator = ({\n type,\n payload,\n meta,\n}: ActionTypeSuccess) => {\n return {\n type,\n payload,\n meta,\n };\n};\n\nexport const failureActionCreator = ({\n type,\n payload,\n meta,\n error = true,\n}: ActionTypeFailure) => {\n return {\n type,\n payload,\n meta,\n error,\n };\n};\n","import { useCallback, useReducer, useContext, useEffect } from 'react';\nimport axios from 'axios';\nimport { ActionDispatchContext } from 'lib/context/ActionDispatchContext';\n\nimport {\n ActionType,\n requestActionCreator,\n successActionCreator,\n failureActionCreator,\n} from '../context/actionCreators';\nimport { useToastNotifications } from 'lib/components';\n\ninterface UploadData {\n url: string;\n file: File;\n contentType?: string;\n onUploadProgress: (event: ProgressEvent, id?: number | string) => void;\n id?: number;\n}\n\ninterface UseS3Upload {\n data: any;\n loading: boolean;\n error: string | null;\n uploadVideo(video: UploadData): void;\n}\n\ninterface MutationState {\n error: string | null;\n loading: boolean;\n data: any;\n}\n\nfunction reducer(state: MutationState, action: ActionType) {\n switch (action.type) {\n case 'FETCH_REQUEST':\n return {\n ...state,\n loading: true,\n error: null,\n };\n\n case 'FETCH_SUCCESS':\n return {\n ...state,\n data: action.payload,\n loading: false,\n error: null,\n };\n\n case 'FETCH_FAILURE':\n return {\n ...state,\n loading: false,\n error: action.payload,\n };\n\n default:\n return state;\n }\n}\n\nconst useActionListener = (dispatch: Function) => {\n const { action } = useContext(ActionDispatchContext);\n\n useEffect(() => {\n dispatch(action);\n }, [action, dispatch]);\n};\n\nconst initialState = {\n data: undefined,\n loading: false,\n error: null,\n};\n\nexport const useS3Upload = (): UseS3Upload => {\n const [state, dispatch] = useReducer(reducer, initialState);\n const { error, loading, data } = state;\n const { toast } = useToastNotifications();\n\n const checkIfFirefox = () => {\n return navigator?.userAgent?.indexOf('Firefox') !== -1;\n };\n\n useActionListener(dispatch);\n\n const uploadVideo = useCallback(async (uploadData: UploadData) => {\n dispatch(\n requestActionCreator({\n type: 'FETCH_REQUEST',\n })\n );\n const onUploadProgress = (progressEvent: any) => {\n uploadData.onUploadProgress(\n progressEvent,\n uploadData.hasOwnProperty('id') ? uploadData.id : undefined\n );\n };\n try {\n const isFirefox = checkIfFirefox();\n await axios.put(uploadData.url, uploadData.file, {\n headers: {\n 'content-type':\n !isFirefox && uploadData.contentType\n ? uploadData.contentType\n : uploadData.file.type,\n },\n onUploadProgress: onUploadProgress,\n });\n\n dispatch(\n successActionCreator({\n type: 'FETCH_SUCCESS',\n payload: {\n success: true,\n id: uploadData.hasOwnProperty('id') ? uploadData.id : undefined,\n },\n })\n );\n //const response: UploadVideoResponse = data;\n //toast({ message: response });\n\n return;\n } catch (err) {\n if (err instanceof Error) {\n toast({ message: err?.message });\n // Axios automatically throws an error in case of HTTP or Network errors\n // so we can eventually put error parsing here and return whatever value we want based on that.\n dispatch(\n failureActionCreator({\n type: 'FETCH_FAILURE',\n payload: 'Something wen wrong',\n })\n );\n\n throw new Error(err.message);\n }\n }\n }, []);\n\n return {\n data,\n loading,\n error,\n uploadVideo,\n };\n};\n","import { useReducer } from 'react';\nimport { useActionDispatchContextState } from 'lib/context/ActionDispatchContext';\n\nimport {\n ActionType,\n requestActionCreator,\n successActionCreator,\n failureActionCreator,\n} from '../context/actionCreators';\nimport { VideoTranscriptionResponse, startTranscription } from 'lib/api';\nimport { useToastNotifications } from 'lib/components';\nimport { useTranslation } from 'react-i18next';\n\ninterface VideoTranscription {\n data: VideoTranscriptionResponse;\n loading: boolean;\n error: string | null;\n start: (videoId: string) => void;\n}\n\ninterface VideoTranscriptionStoreState {\n data: VideoTranscriptionResponse | undefined;\n error: string | null;\n loading: boolean;\n isValid: boolean;\n}\n\nfunction reducer(state: VideoTranscriptionStoreState, action: ActionType) {\n switch (action.type) {\n case 'FETCH_REQUEST':\n return {\n ...state,\n loading: true,\n error: null,\n };\n\n case 'FETCH_SUCCESS':\n return {\n ...state,\n data: action.payload,\n loading: false,\n error: null,\n };\n\n case 'FETCH_FAILURE':\n return {\n ...state,\n data: undefined,\n loading: false,\n error: action.payload,\n };\n\n default:\n return state;\n }\n}\n\nexport const useVideoTranscriptionStart = (): VideoTranscription => {\n const { setAction } = useActionDispatchContextState();\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n\n const initialState = {\n data: undefined,\n loading: false,\n error: null,\n isValid: false,\n };\n\n const [state, dispatch] = useReducer(reducer, initialState);\n\n const start = async (videoId: string) => {\n dispatch(\n requestActionCreator({\n type: 'FETCH_REQUEST',\n })\n );\n\n try {\n const response: VideoTranscriptionResponse =\n await startTranscription(videoId);\n\n dispatch(\n successActionCreator({\n type: 'FETCH_SUCCESS',\n payload: response,\n })\n );\n\n toast({ title: t('Transcription Started.') });\n\n return {\n data,\n loading: false,\n error: null,\n };\n } catch (err) {\n // Axios automatically throws an error in case of HTTP or Network errors\n // so we can eventually put error parsing here and return whatever value we want based on that.\n toast({ message: err });\n\n dispatch(\n failureActionCreator({\n type: 'FETCH_FAILURE',\n payload: 'Something went wrong',\n })\n );\n\n setAction({ type: 'START_VIDEO_TRANSCRIPTION' });\n\n return Promise.reject({\n loading: false,\n error: 'Something went wrong',\n });\n }\n };\n\n const { data, error, loading } = state;\n\n return {\n start,\n data,\n loading,\n error,\n };\n};\n","import * as React from \"react\";\nconst SvgAdd = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#272A32\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"bqn2hmlmqa\", d: \"M18 13h-5v5c0 .55-.45 1-1 1s-1-.45-1-1v-5H6c-.55 0-1-.45-1-1s.45-1 1-1h5V6c0-.55.45-1 1-1s1 .45 1 1v5h5c.55 0 1 .45 1 1s-.45 1-1 1z\" })));\nexport default SvgAdd;\n","import styled from 'styled-components';\nimport AddSvg from './add.svg?react';\n\nconst AddIcon = styled(AddSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || '1'};\n }\n`;\n\nexport default AddIcon;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport AddIcon from 'lib/images/AddIcon';\nimport { Button } from 'react-covideo-common';\nimport { useTranslation } from 'react-i18next';\n\ntype Event = any;\n\ntype ContainerProps = {\n width: number;\n height: number;\n marginTop: number;\n backgroundColor?: string;\n};\n\nconst DragAndDropContainer = styled.div<ContainerProps>`\n margin-top: ${props => props.marginTop}px;\n text-align: center;\n width: ${props => props.width}px;\n max-width: 100%;\n margin-left: auto;\n margin-right: auto;\n height: ${props => props.height}px;\n background-color: ${props => props.backgroundColor || theme.palette.white};\n\n .file-exists {\n text-align: left;\n color: red;\n }\n\n .drag-drop-zone {\n display: block;\n width: ${props => props.width - 2}px;\n max-width: 100%;\n height: ${props => props.height}px;\n border: 1px dashed ${theme.palette.lightgray};\n border-radius: 5px;\n color: ${theme.palette.primaryDarkBlue};\n font-size: 16px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.5;\n box-sizing: border-box;\n\n input {\n background: none !important;\n border: none;\n padding: 0 !important;\n &:hover {\n cursor: pointer;\n text-decoration: underline;\n color: ${theme.palette.secondaryBlue};\n }\n }\n }\n\n .drag-drop-zone.inside-drag-area {\n svg {\n opacity: 0.7;\n }\n }\n\n .drag-drop-zone.outside-drag-area {\n svg {\n opacity: 0.3;\n }\n }\n\n .dropped-files li {\n color: #07f;\n padding: 3px;\n text-align: left;\n font-weight: bold;\n }\n\n .file {\n display: none;\n }\n`;\n\ntype TextProps = {\n isActive: boolean;\n backgroundColor?: string;\n};\n\nconst TextComponent = styled.div<TextProps>`\n height: 100%;\n width: 100%;\n float: left;\n line-height: 0.2;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n z-index: -1;\n background-color: ${props =>\n props.backgroundColor\n ? props.backgroundColor\n : props.isActive\n ? '#f6f7f9'\n : '#fff'};\n`;\n\nconst ButtonContainer = styled.div`\n svg {\n opacity: 1 !important;\n }\n`;\n\nconst Text = styled.p`\n width: 317px;\n margin: 0 0 21px;\n font-size: 16px;\n line-height: 1.5;\n text-align: center;\n color: ${theme.palette.black_1_100};\n`;\n\ninterface Props {\n accept?: string;\n cssInputClass?: string;\n fileEncoding?: string;\n inputStyle?: object;\n onDrop: (e: any) => void;\n height?: number;\n width?: number;\n marginTop?: number;\n disabled?: boolean;\n textStyle?: React.CSSProperties;\n backgroundColor?: string;\n buttonTextColor?: string;\n showAddIcon?: boolean;\n buttonBorder?: string;\n}\n\nconst DragAndDrop = ({\n accept = '.csv, text/csv',\n inputStyle = {},\n onDrop,\n width = 528,\n height = 100,\n marginTop = 0,\n disabled = false,\n textStyle,\n backgroundColor,\n}: Props) => {\n const { t } = useTranslation();\n const reducer = (state: any, action: any) => {\n switch (action.type) {\n case 'SET_DROP_DEPTH':\n return { ...state, dropDepth: action.dropDepth };\n case 'SET_IN_DROP_ZONE':\n return { ...state, inDropZone: action.inDropZone };\n case 'ADD_FILE_TO_LIST':\n let validFile = true;\n for (let file of action.files) {\n validFile = accept.includes(file.name.substr(-4));\n }\n\n if (validFile)\n return { ...state, fileList: state.fileList.concat(action.files) };\n else return state;\n default:\n return state;\n }\n };\n\n const [data, dispatch] = React.useReducer(reducer, {\n dropDepth: 0,\n inDropZone: false,\n fileList: [],\n });\n\n const handleDragEnter = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n dispatch({ type: 'SET_DROP_DEPTH', dropDepth: data.dropDepth + 1 });\n };\n\n const handleDragLeave = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.target && e.target.id.includes('text-')) {\n return;\n }\n\n dispatch({ type: 'SET_DROP_DEPTH', dropDepth: data.dropDepth - 1 });\n dispatch({ type: 'SET_IN_DROP_ZONE', inDropZone: false });\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n e.dataTransfer.dropEffect = 'copy';\n dispatch({ type: 'SET_IN_DROP_ZONE', inDropZone: true });\n };\n\n const browseFiles = () => {\n const fileInput = document.getElementById('file');\n if (!fileInput || !fileInput.click) {\n return;\n }\n fileInput.click();\n };\n\n return (\n <DragAndDropContainer\n width={width}\n height={height}\n marginTop={marginTop}\n backgroundColor={backgroundColor}\n >\n <div\n className={\n data.inDropZone\n ? 'drag-drop-zone inside-drag-area'\n : 'drag-drop-zone outside-drag-area'\n }\n onDrop={(e: React.DragEvent) => onDrop(e)}\n onDragOver={(e: React.DragEvent) => handleDragOver(e)}\n onDragEnter={(e: Event) => handleDragEnter(e)}\n onDragLeave={(e: Event) => handleDragLeave(e)}\n >\n <TextComponent\n id='text-browse'\n isActive={data.inDropZone}\n backgroundColor={backgroundColor}\n >\n {!data.inDropZone && data.fileList.length === 0 && (\n <>\n <Text style={textStyle}>\n {t('Drag and drop your files here or')}\n </Text>\n {!data.inDropZone ? (\n <ButtonContainer>\n <Button\n text={t('Browse files...')}\n icon={<AddIcon color='#fff' />}\n disabled={disabled}\n onClick={browseFiles}\n />\n </ButtonContainer>\n ) : (\n <input\n type='button'\n value='browse your files...'\n onClick={browseFiles}\n />\n )}\n </>\n )}\n {data.inDropZone && (\n <>\n <br />\n <p id='text-drop'>Drop file here</p>\n </>\n )}\n {data.fileList[0] && (\n <>\n <br />\n <p>{data.fileList[0][0].name} is ready</p>\n </>\n )}\n <input\n className='file'\n id='file'\n type='file'\n style={inputStyle}\n accept={accept}\n onChange={(e: Event) => onDrop(e)}\n disabled={disabled}\n />\n </TextComponent>\n </div>\n </DragAndDropContainer>\n );\n};\n\nexport default DragAndDrop;\n","import { theme } from 'lib/style';\nimport { screenSizes } from 'lib/style/theme';\nimport styled, { css } from 'styled-components';\n\nexport const Content = styled.div`\n min-height: 400px;\n position: relative;\n`;\n\nexport const ContentBody = styled.div`\n font-size: 15px;\n color: ${theme.palette.blackRgb75};\n background-color: ${theme.palette.gray10};\n\n display: flex;\n flex-direction: column;\n\n margin-top: 18px;\n padding: 20px 30px;\n\n min-height: 340px;\n max-height: 340px;\n overflow-y: auto;\n overflow-x: hidden !important;\n width: 500px;\n max-width: 100%;\n`;\n\nexport const ContentFooter = styled.div`\n display: flex;\n justify-content: right;\n align-items: center;\n padding: 10px 20px;\n gap: 12px;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n justify-content: space-between;\n `}\n`;\n\nexport const UploadFieldContainer = styled.div`\n margin-bottom: 24px;\n`;\n\nexport const FlexContainer = styled.div`\n display: flex;\n`;\n\nexport const Skill = styled.div`\n width: 0%;\n color: white;\n background-color: transparent;\n height: 4px;\n text-align: right;\n font-size: 1px;\n border-radius: 15px;\n`;\n\nexport const ProgressData = styled.div`\n width: 50%;\n color: black;\n padding: 1%;\n text-align: left;\n font-size: 16px;\n border-radius: 0px;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n font-size: 15px;\n `}\n`;\n\nexport const ProgressContainer = styled.div`\n display: flex;\n background: ${theme.palette.gray10};\n`;\n\nexport const UploadData = styled.div`\n flex-grow: 1;\n color: black;\n padding: 1%;\n text-align: right;\n font-size: 16px;\n border-radius: 0px;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n font-size: 15px;\n `}\n`;\n\nexport const UploadingHeader = styled.div`\n position: absolute;\n top: -47px;\n left: 0;\n padding: 0 32px;\n height: 30px;\n font-size: 18px;\n color: ${theme.palette.gray100};\n background-color: white;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n font-size: 16px;\n `}\n`;\n\nexport const CancelContainer = styled.div`\n display: flex;\n height: 249px;\n padding: 32px;\n align-items: center;\n`;\n","import React from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport { toMB } from 'lib/utils/functions';\nimport { Input } from '../Input';\nimport { IUploadingData } from './VideoUpload';\nimport {\n FlexContainer,\n UploadFieldContainer,\n UploadData,\n ProgressData,\n ProgressContainer,\n Skill,\n UploadingHeader,\n} from './styles';\nimport { useTranslation } from 'react-i18next';\n\nconst ErrorMessage = styled.div`\n font-size: 14px;\n color: ${({ theme }) => theme.colors.danger[100]};\n height: 20px;\n margin-top: 15px;\n`;\n\ninterface ITitleArrayValues {\n elementId: number;\n isTitleNotEmpty: boolean;\n}\n\ntype MultipleUploadProps = {\n progress: number;\n uploadingData: IUploadingData;\n setUploadingData: (arg: IUploadingData) => void;\n};\n\nexport const MultipleUploadList = ({\n progress,\n uploadingData,\n setUploadingData,\n}: MultipleUploadProps) => {\n const uplVideo: any = [];\n let uploadingArr: any = [];\n let uploadingTotal: any = [];\n let uploadActiveVideo: any = [];\n const { colors } = useTheme();\n const { t } = useTranslation();\n const [titleValidationArray, setTitleValidationArray] = React.useState<\n ITitleArrayValues[]\n >([{ elementId: 0, isTitleNotEmpty: true }]);\n\n for (let x in uploadingData) {\n uplVideo.push(uploadingData[x]);\n uploadActiveVideo = uplVideo.filter((ele: any) => {\n return ele.showActiveVideo === 1;\n });\n uploadingArr = uploadActiveVideo.filter((ele: any) => {\n return ele.status === 1;\n });\n uploadingTotal = uploadActiveVideo.reduce(\n (total: any, obj: any) => obj.progressEvent.total + total,\n 0\n );\n }\n\n const editTitle = (i: number, title: string) => {\n let filteredArray = titleValidationArray.filter(el => el.elementId === i);\n filteredArray.forEach(i => {\n const index = titleValidationArray.indexOf(i);\n if (index >= 0) {\n setTitleValidationArray(titleValidationArray.splice(index, 1));\n }\n });\n setTitleValidationArray([\n ...titleValidationArray,\n { elementId: i, isTitleNotEmpty: !!title.trimStart() },\n ]);\n\n setUploadingData((ud: any) => ({ ...ud, [i]: { ...ud[i], title } }));\n };\n\n const isUploadInProgress = (ele: any) => ele.status >= 1;\n\n const progressState = (status: number) => {\n if (status === 0) {\n return t(`Waiting...`);\n }\n if (status === 1) {\n return t(`Uploading...`);\n }\n return t(`Encoding...`);\n };\n\n return (\n <div>\n {!!progress && (\n <UploadingHeader>\n <span>\n <b>\n {uploadingArr.length} of {uploadActiveVideo.length}\n </b>\n </span>\n {t('videos uploading')} ({toMB(uploadingTotal)} MB)\n </UploadingHeader>\n )}\n {uplVideo.map((ele: any) => (\n <UploadFieldContainer key={`Video-list-${ele.id}`}>\n {' '}\n {ele.showActiveVideo ? (\n <>\n <FlexContainer\n style={{\n ...(isUploadInProgress(ele) && {\n flexDirection: 'column',\n }),\n }}\n >\n <Input\n maxLength={100}\n type='text'\n value={ele.title}\n readOnly={!!progress}\n width={'100%'}\n onChange={e => editTitle(ele.id, e.target.value)}\n />\n {isUploadInProgress(ele) && (\n <div\n style={{\n width: '100%',\n marginTop: '18px',\n backgroundColor: 'white',\n }}\n >\n <Skill\n style={{\n width: ele.progressEvent.percentage + '%',\n backgroundColor: colors.primary[100],\n }}\n />\n <ProgressContainer>\n <ProgressData>{progressState(ele.status)}</ProgressData>\n <UploadData>\n {toMB(ele.progressEvent.loaded) +\n ' MB/' +\n toMB(ele.progressEvent.total) +\n ' MB'}\n </UploadData>\n </ProgressContainer>\n </div>\n )}\n </FlexContainer>\n {titleValidationArray.map((element: any) => {\n if (element.elementId === ele.id && !element.isTitleNotEmpty) {\n return (\n <ErrorMessage key={`error-${element.elementId}`}>\n {t('Video title is required!')}\n </ErrorMessage>\n );\n }\n return <div key={`el-${element.elementId}`}></div>;\n })}\n </>\n ) : (\n ''\n )}\n </UploadFieldContainer>\n ))}\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useCreateVideo } from 'lib/hooks/useCreateVideo';\nimport { useEncodeVideo } from 'lib/hooks/useEncodeVideo';\nimport { usePresignedUrl } from 'lib/hooks/usePresignedUrl';\nimport { useS3Upload } from 'lib/hooks/useS3Upload';\nimport { useVideoTranscriptionStart } from 'lib/hooks/useVideoTranscriptionStart';\nimport DragAndDrop from '../DragAndDrop';\nimport { CancelContainer, Content, ContentBody, ContentFooter } from './styles';\nimport { useToastNotifications } from '../toast-notifications';\nimport { generateFileName } from 'lib/utils/functions';\nimport { MultipleUploadList } from './MultipleUploadList';\nimport { Button } from 'react-covideo-common';\nimport { useTheme } from 'styled-components';\nimport { t } from 'i18next';\n\nenum View {\n FORM = 0,\n UPLOADING = 1,\n CREATE = 2,\n ENCODE = 3,\n}\n\nconst parseOptions = {\n accept: 'video/*,.mkv',\n header: false,\n dynamicTyping: true,\n skipEmptyLines: true,\n};\n\nexport interface IUploadingData {\n [key: string]: any;\n}\n\ntype UploadProps = {\n handleModalClose: () => void;\n onSuccess: (data: number[]) => void;\n};\n\ntype SubmitButtonProps = {\n disabled?: boolean;\n title?: string;\n onClick?: () => void;\n};\n\nconst VideoUpload = ({ handleModalClose, onSuccess }: UploadProps) => {\n const { toast } = useToastNotifications();\n const { userData } = useAuthorizationContext();\n const { start: startTranscription } = useVideoTranscriptionStart();\n const { isCdkEnviroment } = useTheme();\n\n const [currentView, setCurrentView] = useState(View.FORM);\n\n const [uploadingData, setUploadingData] = useState<IUploadingData>({});\n\n const [disableUpload, setDisableUpload] = useState(false);\n const [isSubmitClicked, setIsSubmitClicked] = useState(false);\n const [canceling, setCanceling] = useState(false);\n const [progress, setProgress] = useState(View.FORM);\n\n const [uploadedVideoArray, setUploadedVideoArray] = useState<number[]>([]);\n const [_, setUploadProgress] = useState({\n loaded: 0,\n total: 0,\n percentage: 0,\n });\n\n const {\n presignedUrl,\n fetch: getPresignedUrl,\n loading: isLoadingUrl,\n error: urlError,\n } = usePresignedUrl();\n const {\n uploadVideo,\n loading: isUploading,\n data: uploadData,\n error: uploadError,\n } = useS3Upload();\n const {\n fetch: createVideo,\n loading: isCreating,\n videoData,\n error: createError,\n } = useCreateVideo();\n const {\n fetch: encodeVideo,\n loading: isEncoding,\n encodeData,\n } = useEncodeVideo();\n\n useEffect(() => {\n if (!isLoadingUrl && !urlError && Object.keys(uploadingData).length) {\n setCurrentView(View.UPLOADING);\n setProgress(View.UPLOADING);\n const { id } = presignedUrl || { id: -1 };\n if (id === undefined) {\n return;\n }\n if (Object.keys(uploadingData).length) {\n uploadingData[id].status = 1;\n setUploadingData(uploadingData);\n }\n uploadVideo({\n url: presignedUrl.url,\n file: uploadingData[id].file,\n onUploadProgress: onUploadProgress,\n id: presignedUrl.id,\n });\n }\n }, [presignedUrl]);\n\n useEffect(() => {\n if (\n !isUploading &&\n !uploadError &&\n uploadData &&\n Object.keys(uploadingData).length\n ) {\n const { id } = uploadData || { id: -1 };\n if (id === undefined) {\n return;\n }\n\n if (Object.keys(uploadingData).length) {\n uploadingData[id].status = 2;\n setUploadingData(uploadingData);\n }\n const data = uploadingData[id];\n setProgress(View.CREATE);\n createVideo({\n filename: data.file.name,\n title: data.title,\n id: uploadData.id,\n });\n }\n }, [isUploading, uploadData]);\n\n useEffect(() => {\n if (\n currentView !== View.FORM &&\n (!uploadingData || !Object.keys(uploadingData).length)\n ) {\n setCurrentView(View.FORM);\n }\n const fileTitles: any = [];\n const fileTitlesLength: any = [];\n Object.keys(uploadingData).forEach(id => {\n fileTitles.push(\n !!(uploadingData[id].title && uploadingData[id].title.trimStart())\n );\n fileTitlesLength.push(\n uploadingData[id].title.length > 100 ? true : false\n ); // SUS-797-changes\n });\n if (fileTitles.includes(false)) {\n setDisableUpload(true);\n } else if (fileTitlesLength.includes(true)) {\n toast({\n title: t('Video title can not be more than 100 characters!'),\n });\n setDisableUpload(true);\n } else {\n setDisableUpload(false);\n }\n }, [uploadingData]);\n\n useEffect(() => {\n if (\n !isCreating &&\n !createError &&\n videoData &&\n Object.keys(uploadingData).length\n ) {\n setProgress(View.ENCODE);\n const { id } = videoData || { id: -1 };\n if (id === undefined) {\n return;\n }\n if (Object.keys(uploadingData).length) {\n uploadingData[id].status = 3;\n setUploadingData(uploadingData);\n }\n setUploadedVideoArray([Number(videoData.video_id)]);\n encodeVideo({\n videoId: videoData.video_id,\n customerId: userData.customerId,\n });\n }\n }, [isCreating, videoData]);\n\n useEffect(() => {\n if (\n !isEncoding &&\n encodeData &&\n uploadedVideoArray.length === Object.keys(uploadingData).length &&\n !Object.values(uploadingData).some(f => f.status < 3)\n ) {\n transcribeVideo();\n onSuccess(uploadedVideoArray);\n handleModalClose();\n }\n }, [isCreating, encodeData, uploadedVideoArray]);\n\n const appendFilesToQueue = async (files: any) => {\n for (let i = 0; i < files.length; i++) {\n const isValidType =\n /.*\\.(avchd|swf|flv|mov|qt|wmv|mkv|m4v|m4p|mpv|mp2|mpe|mpg|ogg|mp4|avi|webm|mpeg)/i.test(\n files[i].name\n );\n if (!isValidType) {\n toast({\n title: t(\"{{name}} is of invalid type and won't be uploaded.\", {\n name: files[i].name,\n }),\n });\n continue;\n }\n\n const filename = files[i].name.split('.');\n const file_type =\n filename[1] === 'mkv' ? 'video/x-matroska' : files[i].type;\n\n const file = new File(\n [files[i]],\n generateFileName(userData, filename[filename.length - 1]),\n {\n type: file_type,\n lastModified: files[i].lastModified,\n }\n );\n\n setUploadingData((ud: IUploadingData) => {\n const u = { ...ud };\n\n let id = 0;\n if (Object.keys(ud).length) {\n const keys = Object.keys(ud);\n id = parseInt(keys[keys.length - 1], 10) + 1;\n }\n\n u[id] = {\n id,\n file: file,\n title: filename[0],\n progressEvent: {\n loaded: 0,\n total: 0,\n percentage: 0,\n },\n status: 0,\n showActiveVideo: 1,\n };\n\n return u;\n });\n }\n };\n\n const handleSelectedFile = async (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n const target = e.dataTransfer || e.target;\n if (target && target.files && target.files.length) {\n await appendFilesToQueue(target.files);\n } else {\n toast({\n title: t('Oops! Something went wrong, try again in a few moments.'),\n });\n }\n };\n\n const handleCloseWithCancel = () => {\n if (progress === View.FORM) {\n return handleModalClose();\n }\n setCanceling(true);\n };\n\n const handleSubmit = () => {\n setIsSubmitClicked(true);\n Object.keys(uploadingData).forEach(id => {\n const file = uploadingData[id].file;\n getPresignedUrl({\n fileName: file.name,\n type: file.type,\n id: parseInt(id, 10),\n });\n });\n };\n\n const onUploadProgress = (e: ProgressEvent, id?: number | string) => {\n const percentCompleted = Math.round((e.loaded * 100) / e.total);\n if (id === undefined || !uploadingData[id]) {\n return;\n }\n\n const ud = { ...uploadingData };\n ud[id].progressEvent = {\n loaded: Math.floor(e.loaded / 1024),\n total: Math.floor(e.total / 1024),\n percentage: percentCompleted,\n };\n\n setUploadingData(ud);\n setUploadProgress({\n loaded: Math.floor(e.loaded / 1024),\n total: Math.floor(e.total / 1024),\n percentage: percentCompleted,\n });\n };\n\n const transcribeVideo = () => {\n if (userData.autoTranscribe && videoData && videoData.id) {\n try {\n setTimeout(() => {\n startTranscription(videoData.id);\n }, 5000);\n } catch (e) {\n console.log(e);\n }\n }\n };\n\n const isUploadingData = !!Object.keys(uploadingData).length;\n\n const SubmitButton = ({\n disabled = false,\n onClick = handleSubmit,\n title,\n }: SubmitButtonProps) => {\n const btnTitle = title ? title : t('Upload');\n return <Button text={btnTitle} onClick={onClick} disabled={disabled} />;\n };\n\n const uploadFormView = (\n <Content>\n <ContentBody\n style={{\n ...(!isUploadingData && {\n backgroundColor: 'transparent',\n marginTop: 0,\n maxHeight: '400px',\n }),\n }}\n >\n {!isUploadingData ? (\n <DragAndDrop\n onDrop={handleSelectedFile}\n marginTop={0}\n height={350}\n width={440}\n accept={parseOptions.accept}\n />\n ) : (\n <MultipleUploadList\n uploadingData={uploadingData}\n setUploadingData={setUploadingData}\n progress={progress}\n />\n )}\n </ContentBody>\n {isUploadingData && (\n <ContentFooter>\n <Button\n text={t('Cancel')}\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n onClick={handleCloseWithCancel}\n />\n <SubmitButton disabled={disableUpload || isSubmitClicked} />\n </ContentFooter>\n )}\n </Content>\n );\n\n const uploadingContent = (\n <>\n <ContentBody>\n <MultipleUploadList\n uploadingData={uploadingData}\n setUploadingData={setUploadingData}\n progress={progress}\n />\n </ContentBody>\n <ContentFooter\n style={{\n justifyContent: 'right',\n }}\n >\n <Button\n text={t('Cancel')}\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n onClick={handleCloseWithCancel}\n />\n <SubmitButton disabled />\n </ContentFooter>\n </>\n );\n\n const cancelingContent = (\n <>\n <ContentBody>\n <CancelContainer>\n {t(\n 'You will have to restart your video upload from the beginning if you cancel now. Are you sure you want to cancel this upload?'\n )}\n </CancelContainer>\n </ContentBody>\n <ContentFooter>\n <Button\n text={t('Cancel')}\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n onClick={handleModalClose}\n />\n <SubmitButton\n title={t('Continue Upload')}\n onClick={() => setCanceling(false)}\n />\n </ContentFooter>\n </>\n );\n\n const uploadProgressView = (\n <Content>{canceling ? cancelingContent : uploadingContent}</Content>\n );\n\n const views = [uploadFormView, uploadProgressView];\n return views[currentView];\n};\n\nexport default VideoUpload;\n","import { Modal } from './Modal';\nimport styled from 'styled-components';\nimport { CloseButton } from '../CloseButton';\nimport VideoUpload from '../videoUpload/VideoUpload';\nimport { useTranslation } from 'react-i18next';\n\nconst Header = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 25px 30px 5px 30px;\n`;\n\nconst Title = styled.div`\n font-weight: bold;\n font-size: 18px;\n`;\n\ntype UploadProps = {\n handleModalClose: () => void;\n disabled?: boolean;\n onSuccess: (data: number[]) => void;\n};\nexport const ModalUpload = ({\n handleModalClose,\n disabled,\n onSuccess,\n}: UploadProps) => {\n const { t } = useTranslation();\n return (\n <Modal disableFullScreen>\n <Header>\n <Title>{t('Upload new video')}</Title>\n <CloseButton\n style={{\n position: 'static',\n padding: 0,\n height: 'fit-content',\n width: 'fit-content',\n }}\n disabled={disabled}\n onClick={handleModalClose}\n />\n </Header>\n <VideoUpload handleModalClose={handleModalClose} onSuccess={onSuccess} />\n </Modal>\n );\n};\n","import { useQuery } from 'react-query';\nimport { getInventoryItems } from '../inventoryApi';\n\nexport const useGtmVinInventoryQuery = ({ vin = '' }: { vin: string }) => {\n return useQuery(\n ['GTM_VIN', vin],\n async () =>\n getInventoryItems({\n search: vin,\n soldFilter: '2',\n }),\n {\n refetchOnWindowFocus: false,\n staleTime: 0, // 1 hour\n enabled: !!vin,\n }\n );\n};\n","import { pushToDataLayer } from 'lib/hooks/GTM/pushToDataLayer';\nimport { useCallback } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport {\n CovideoGTMVideoAttributes,\n GTMCDKUserAttributes,\n GTMEvent,\n GTMPageApplication,\n GTMPageviewAttributes,\n GTMVehicleAttributes,\n GTMVideoAttributes,\n} from './types';\nimport { mapToGtmVehicleAttributes, mapToGTMVideoAttributes } from './utils';\n\nimport { useAuthorizationContext } from 'lib/context';\nimport { useGtmVinInventoryQuery } from 'lib/api/inventory/useGtmVinInventoryQuery';\nimport { useTheme } from 'styled-components';\n\nexport function useGTMTrackPageView({ vin }: { vin: string }) {\n const { isCdkEnviroment: isCdkUser } = useTheme();\n const { data, isSuccess: vehiceReady } = useGtmVinInventoryQuery({\n vin: isCdkUser ? vin : '',\n });\n\n const { userData } = useAuthorizationContext();\n const location = useLocation();\n\n // if vin is empty, skip vehicle data do not use cached data\n const item = vin ? data?.items?.[0] : undefined;\n\n const cdkUserAttributes: GTMCDKUserAttributes = {\n user_id: userData?.eleadDMSEmployeeID || undefined,\n enterprise_id: userData?.customer?.cdkEnterpriseId || undefined,\n store_id: userData?.customer?.cdkStoreId || undefined,\n store_name: userData?.customer?.business || undefined,\n is_internal_user: userData?.email?.includes('cdk'),\n };\n const vehicleData: GTMVehicleAttributes = mapToGtmVehicleAttributes(item);\n\n // actions\n const trackVideoSpecificPagesManually = useCallback(\n ({\n pageLocation,\n pageSection,\n videoAttributes,\n excludeVehicleData = false,\n vehicle,\n mergeIds,\n pageUrl,\n }: {\n pageLocation?: string;\n pageSection?: string;\n videoAttributes?: CovideoGTMVideoAttributes;\n excludeVehicleData?: boolean;\n vehicle?: GTMVehicleAttributes;\n mergeIds?: number[];\n pageUrl: string;\n }) => {\n const gtmVideoAttributes: GTMVideoAttributes =\n mapToGTMVideoAttributes(videoAttributes);\n\n const pageViewAttributes: GTMPageviewAttributes = {\n event: GTMEvent.COVIDEO_PAGEVIEW,\n application: GTMPageApplication.CRM_VIDEO_EMBED,\n page_url: pageUrl,\n page_location: pageLocation || undefined,\n page_section: pageSection || undefined,\n };\n\n const payload = {\n ...pageViewAttributes,\n ...cdkUserAttributes,\n ...gtmVideoAttributes,\n ...(excludeVehicleData ? {} : vehicleData),\n ...vehicle,\n ...(mergeIds ? { merge_ids: mergeIds } : {}),\n };\n\n pushToDataLayer(payload);\n },\n [location.pathname, userData, vehicleData.vin]\n );\n\n return {\n trackVideoSpecificPagesManually: isCdkUser\n ? trackVideoSpecificPagesManually\n : undefined,\n vehiceReady: vehiceReady,\n };\n}\n","import { ALL_FOLDERS } from 'lib/api';\n\nexport const LAST_SELECTED_FOLDER_LOCAL_STORAGE_KEY_EMBED =\n 'lastSelectedFolderEmbed';\n\ninterface LastSelectedFolder {\n folderId: string | number;\n userId: string;\n}\n\nexport const getLastSelectedFolderFromLocalStorage =\n (): LastSelectedFolder | null => {\n const item = localStorage.getItem(\n LAST_SELECTED_FOLDER_LOCAL_STORAGE_KEY_EMBED\n );\n return item ? JSON.parse(item) : null;\n };\n\nexport const setLastSelectedFolderToLocalStorage = (\n value: LastSelectedFolder\n): void => {\n localStorage.setItem(\n LAST_SELECTED_FOLDER_LOCAL_STORAGE_KEY_EMBED,\n JSON.stringify(value)\n );\n};\n\nexport const getValidInitialFolder = (userId: number): number | string => {\n const DEFAULT_FOLDER_ID = -2;\n const lastSelected = getLastSelectedFolderFromLocalStorage();\n\n const isCompatibleUser =\n lastSelected && Number(lastSelected.userId) === userId;\n\n if (!isCompatibleUser || lastSelected.folderId === undefined) {\n return DEFAULT_FOLDER_ID;\n }\n\n if (lastSelected?.folderId === ALL_FOLDERS.value) {\n return ALL_FOLDERS.value;\n }\n\n return Number(lastSelected.folderId);\n};\n","import { UserData } from 'lib/context';\n\n// Vin Reels\nexport const checkIfVinReelsAvailable = (userData: UserData) => {\n return !!Number(userData?.customer?.isUsingVinReels);\n};\n// AI Spotlight\nexport const checkIfAISpotlightAvailable = (userData: UserData) => {\n return (\n !!Number(userData?.customer?.spotlightEnabled) &&\n !!Number(userData?.spotlightEnabled)\n );\n};\nexport const checkIfAISpotlightAvailableForCustomer = (userData: UserData) => {\n return !!Number(userData?.customer?.spotlightEnabled);\n};\n// Quick Videos\nexport const checkIfQuickVideosAvailable = (userData: UserData) => {\n return !!Number(userData?.customer?.quickVideosEnabled);\n};\n// Suggested Content\nexport const checkIfSuggestedContentAvailable = (userData: UserData) => {\n return !!Number(userData?.customer?.suggestedContentEnabled);\n};\n// AI Assistant\nexport const checkIfAIAssistantAvailable = (userData: UserData) => {\n return (\n !!Number(userData?.customer?.quickVideoAvatarEnabled) &&\n !!Number(userData?.quickVideoAvatarEnabled)\n );\n};\nexport const checkIfAIAssistantAvailableForCustomer = (userData: UserData) => {\n return !!Number(userData?.customer?.quickVideoAvatarEnabled);\n};\n// AI Music\nexport const checkIfAIMusicAvailable = (userData: UserData) => {\n return !!Number(userData?.customer?.aiMusicEnabled);\n};\n// AI Scripts\nexport const checkIfAIScriptsAvailable = (userData: UserData) => {\n return !!Number(userData?.customer?.hasCovideoMagic);\n};\n","import { useMemo } from 'react';\nimport {\n checkIfAIAssistantAvailable,\n checkIfAIAssistantAvailableForCustomer,\n checkIfAIMusicAvailable,\n checkIfAIScriptsAvailable,\n checkIfAISpotlightAvailable,\n checkIfAISpotlightAvailableForCustomer,\n checkIfQuickVideosAvailable,\n checkIfSuggestedContentAvailable,\n checkIfVinReelsAvailable,\n} from './utils';\nimport { useAuthorizationContext } from 'lib/context';\n\nexport const useAIFeatureFlags = () => {\n const { userData } = useAuthorizationContext();\n return useMemo(() => {\n return {\n isAIScriptsEnabled: checkIfAIScriptsAvailable(userData),\n isAIAssistantEnabled: checkIfAIAssistantAvailable(userData),\n isAIAssistantEnabledForCustomer:\n checkIfAIAssistantAvailableForCustomer(userData),\n isVinReelsEnabled: checkIfVinReelsAvailable(userData),\n isAISpotlightEnabled: checkIfAISpotlightAvailable(userData),\n isAISpotlightEnabledForCustomer:\n checkIfAISpotlightAvailableForCustomer(userData),\n isQuickVideosEnabled: checkIfQuickVideosAvailable(userData),\n isSuggestedContentEnabled: checkIfSuggestedContentAvailable(userData),\n isAIMusicEnabled: checkIfAIMusicAvailable(userData),\n };\n }, [userData]);\n};\n","import { useMemo } from 'react';\nimport { useAIFeatureFlags } from './useAIFeatureFlags';\n\nexport const useAIFeatureAvailability = () => {\n const {\n isVinReelsEnabled,\n isQuickVideosEnabled,\n isAISpotlightEnabled,\n isAIAssistantEnabled,\n } = useAIFeatureFlags();\n\n return useMemo(() => {\n // Pronunciation\n const isPronunciationAvailable =\n isAIAssistantEnabled || isVinReelsEnabled || isAISpotlightEnabled;\n\n // Dealership Highlights\n const isDealershipHighlightsAvailable =\n isVinReelsEnabled || isQuickVideosEnabled;\n\n // Personalization\n const isPersonalizationAvailable =\n isPronunciationAvailable || isDealershipHighlightsAvailable;\n\n // AI Assistants\n const isAIAssistantsAvailable =\n isAISpotlightEnabled || isAIAssistantEnabled;\n\n // Quick Videos\n const isQuickVideosAvailable = isQuickVideosEnabled;\n\n // Vin Reels\n const isVinReelsAvailable = isVinReelsEnabled;\n\n // Configuration\n const isAIConfigurationAvailable =\n isPersonalizationAvailable ||\n isAIAssistantsAvailable ||\n isQuickVideosAvailable;\n\n return {\n isPronunciationAvailable,\n isDealershipHighlightsAvailable,\n isPersonalizationAvailable,\n isAIAssistantsAvailable,\n isQuickVideosAvailable,\n isVinReelsAvailable,\n isAIConfigurationAvailable,\n };\n }, [\n isVinReelsEnabled,\n isQuickVideosEnabled,\n isAISpotlightEnabled,\n isAIAssistantEnabled,\n ]);\n};\n","import { screenSizes } from 'lib/style/theme';\nimport * as React from 'react';\nimport styled, { css } from 'styled-components';\nimport { useTheme } from 'styled-components';\n\nconst DropdownContainer = styled.div`\n position: absolute;\n top: calc(100% + 6px); // space below the trigger\n right: 0;\n background: ${({ theme }) => theme.colors.white[100]};\n border: 1px solid ${({ theme }) => theme.colors.secondary[20]};\n border-radius: 8px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n padding: 20px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n z-index: 999;\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n right: -32px;\n `}\n`;\n\nconst DropdownItem = styled.button<{\n color: string;\n bgColor: string;\n onHoverBgColor: string;\n}>`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n padding: 8px 12px;\n background: ${props => props.bgColor};\n border: none;\n width: 175px;\n border-radius: 5px;\n font-weight: 600;\n color: ${props => props.color};\n cursor: pointer;\n\n &:hover {\n background: ${props => props.onHoverBgColor};\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\ntype DropdownItemProps = {\n icon: React.ReactNode;\n label: React.JSX.Element | string;\n onClick: () => void;\n productFeatureId?: number;\n nextPlan?: string;\n showItem?: boolean;\n};\n\ntype Props = {\n dropdownItems: DropdownItemProps[];\n};\n\nexport const AddonDropdown = (props: Props) => {\n const { dropdownItems } = props;\n const themes = useTheme();\n return (\n <DropdownContainer>\n {dropdownItems.map((item, index) => {\n const itemContent = (\n <DropdownItem\n bgColor={themes.colors.secondary[5]}\n onHoverBgColor={themes.colors.secondary[5]}\n color={themes.colors.secondary[100]}\n key={index}\n onClick={item.onClick}\n >\n {item.icon}\n {item.label}\n </DropdownItem>\n );\n if (!item.showItem) return null;\n\n return itemContent;\n })}\n </DropdownContainer>\n );\n};\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { LabelHTMLAttributes } from 'react';\n\ninterface ICommonTypography {\n m?: string;\n textAlign?: string;\n ellipsis?: boolean;\n width?: string;\n maxWidth?: string;\n}\n\nexport const CommonTypography = styled.h1<ICommonTypography>`\n margin: ${({ m }) => m || 0};\n\n color: ${({ color }) => color || theme.palette.gray100};\n\n text-align: ${({ textAlign }) => textAlign || 'left'};\n\n width: ${({ width }) => width || 'auto'};\n\n ${({ maxWidth }) => maxWidth && css({ maxWidth })}\n\n ${({ ellipsis }) =>\n ellipsis &&\n css`\n overflow: hidden;\n text-overflow: ellipsis;\n `}\n`;\n\n// add missing typography\nexport const CHeading = css`\n font-weight: 800;\n font-size: 24px;\n line-height: 40px;\n line-break: anywhere; /*** SUS-797 changes ***/\n`;\n\nexport const Heading = styled(CommonTypography).attrs({ as: 'h1' })`\n ${CHeading}\n`;\n\nexport const SubHeading = styled(CommonTypography).attrs({ as: 'h2' })`\n font-size: 18px;\n line-height: 24px;\n font-weight: 700;\n`;\n\nexport const ParagraphNormal = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 16px;\n line-height: 24px;\n font-weight: 400;\n`;\n\nexport const ParagraphNormalBold = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 16px;\n line-height: 24px;\n font-weight: 700;\n`;\nexport const ParagraphNormalBold600 = styled(CommonTypography).attrs({\n as: 'p',\n})`\n font-size: 16px;\n line-height: 24px;\n font-weight: 600;\n`;\nexport const ParagraphNormalBold500 = styled(CommonTypography).attrs({\n as: 'p',\n})`\n font-size: 16px;\n line-height: 24px;\n font-weight: 500;\n`;\nexport const ParagraphExtraSmall = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 12px;\n line-height: 16px;\n font-weight: 400;\n`;\n\nexport const ParagraphSmall = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 14px;\n line-height: 20px;\n font-weight: 400;\n`;\n\nexport const ParagraphSmallBold = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 14px;\n line-height: 20px;\n font-weight: 600;\n`;\n\nexport const ParagraphExtraSmallBold = styled(CommonTypography).attrs({\n as: 'p',\n})`\n font-size: 12px;\n line-height: 16px;\n font-weight: 500;\n`;\n\nexport const CheckboxLabel = styled(CommonTypography).attrs({ as: 'label' })<\n LabelHTMLAttributes<HTMLLabelElement>\n>`\n font-size: 15px;\n font-weight: 500;\n line-height: 24px;\n`;\n","import { useAuthorizationContext } from 'lib/context';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useAIFeatureAvailability } from 'lib/hooks/ai/features/useAiFeatureAvailability';\nimport { checkIfAutomotiveServiceRole } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useState } from 'react';\nimport { Button, Tooltip } from 'react-covideo-common';\nimport { useTranslation } from 'react-i18next';\nimport { IoMdCar } from 'react-icons/io';\nimport { useHistory } from 'react-router-dom';\nimport { BiChevronDown } from 'react-icons/bi';\n\nimport { IoCarSport } from 'react-icons/io5';\nimport { useOnClickOutside } from 'lib/utils/UseOnClickOutside';\nimport styled, { useTheme } from 'styled-components';\nimport { AddonDropdown } from '../AddonDropdown';\nimport { ParagraphNormal, ParagraphSmall } from '../styles/typography';\n\nconst DropdownTrigger = styled.div`\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n background: ${({ theme }) => theme.colors.white[100]};\n border: 1px solid ${({ theme }) => theme.colors.neutral[20]};\n border-radius: 5px;\n cursor: pointer;\n border-width: 1px;\n padding: 7px;\n gap: 12px;\n`;\n\nconst LesaSvg = (\n <svg\n width='25'\n height='24'\n viewBox='0 0 25 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M16.8318 10.0099V10.9675C16.7829 10.9675 16.7387 10.9675 16.6946 10.9675C15.5974 10.9675 14.5003 10.9663 13.4025 10.9693C13.2903 10.9693 13.1746 10.9824 13.0666 11.0122C12.9079 11.0564 12.8303 11.181 12.8321 11.3475C12.8345 11.5217 12.9073 11.6196 13.0809 11.6667C13.1537 11.6864 13.2295 11.7013 13.3046 11.7043C14.0289 11.7299 14.7538 11.7502 15.4781 11.7771C15.7018 11.7854 15.9267 11.7962 16.1469 11.8302C16.5908 11.8982 16.8551 12.1655 16.947 12.6022C17.0215 12.9584 17.0251 13.3163 16.947 13.6719C16.8402 14.1569 16.4983 14.4451 15.9828 14.4898C15.8206 14.5036 15.6571 14.5113 15.4942 14.5119C14.2562 14.5137 13.0189 14.5131 11.7809 14.5131C11.7356 14.5131 11.6902 14.5131 11.6341 14.5131V13.5484C11.6807 13.5484 11.7248 13.5484 11.769 13.5484C12.8661 13.5484 13.9633 13.5496 15.0611 13.5466C15.181 13.5466 15.3039 13.5329 15.4196 13.5031C15.5765 13.4625 15.6535 13.3563 15.6613 13.2107C15.6714 13.0335 15.607 12.9005 15.4501 12.8474C15.3194 12.8032 15.178 12.7764 15.0396 12.7704C14.3344 12.74 13.6286 12.7227 12.9234 12.6923C12.7045 12.6827 12.4825 12.6666 12.2689 12.6207C11.8215 12.5246 11.587 12.2466 11.5214 11.7371C11.4808 11.4209 11.488 11.1017 11.5661 10.7897C11.6944 10.2748 12.0124 10.0117 12.5678 10.0081C13.9764 9.99857 15.385 10.0051 16.7936 10.0051C16.8008 10.0051 16.8085 10.0075 16.8306 10.0117L16.8318 10.0099Z'\n fill='#214099'\n />\n <path\n d='M6.16772 10.0088H11.0426V11.035H7.54053C7.54053 11.2873 7.53933 11.5248 7.54291 11.7622C7.54291 11.7801 7.57692 11.807 7.59959 11.8135C7.63121 11.8225 7.66701 11.8171 7.70161 11.8171C8.69258 11.8171 9.68355 11.8171 10.6751 11.8171C10.7809 11.8171 10.834 11.8714 10.8344 11.98C10.8344 12.1805 10.8296 12.3815 10.8362 12.582C10.8398 12.6864 10.8058 12.7168 10.7002 12.7168C9.70145 12.7132 8.70272 12.7144 7.704 12.7144C7.65507 12.7144 7.60615 12.7144 7.53993 12.7144C7.53993 12.9554 7.53874 13.1887 7.54232 13.422C7.54232 13.4405 7.57513 13.4679 7.5972 13.4745C7.62882 13.484 7.66462 13.4781 7.69922 13.4781C8.76238 13.4781 9.82554 13.4781 10.8893 13.4781H11.0426V14.5048H6.16832V10.0088H6.16772Z'\n fill='#214099'\n />\n <path\n d='M16.8557 14.5122C16.981 14.2801 17.0973 14.0641 17.2143 13.8488C17.8878 12.6084 18.5626 11.3693 19.232 10.1271C19.2851 10.0287 19.3424 9.99884 19.451 10C19.9635 10.006 20.4759 10.0036 20.9884 10.0018C21.0523 10.0018 21.0905 10.0173 21.1227 10.0776C21.9024 11.5309 22.684 12.9837 23.4656 14.4364C23.4757 14.4555 23.4841 14.4764 23.5002 14.5128C23.4184 14.5128 23.3486 14.5128 23.2788 14.5128C22.8803 14.5128 22.4817 14.511 22.0832 14.5146C22.0062 14.5152 21.9615 14.4967 21.9251 14.4227C21.8249 14.2193 21.7127 14.0218 21.6083 13.8201C21.5785 13.7629 21.5421 13.7396 21.4759 13.7396C20.6144 13.742 19.7523 13.742 18.8907 13.7396C18.8233 13.7396 18.7881 13.7646 18.7589 13.8207C18.6497 14.0283 18.5399 14.236 18.4236 14.4394C18.4045 14.4734 18.352 14.5092 18.315 14.5098C17.8371 14.5146 17.3587 14.5128 16.8569 14.5128L16.8557 14.5122ZM21.0541 12.7749C20.7611 12.2236 20.4771 11.689 20.18 11.1306C19.8835 11.689 19.5989 12.2248 19.306 12.7749H21.0535H21.0541Z'\n fill='#214099'\n />\n <path\n d='M5.88986 14.509H1.5V10.0088H2.87041V10.1412C2.87041 11.1787 2.87041 12.2168 2.87041 13.2543C2.87041 13.456 2.84834 13.4321 3.04343 13.4327C3.94312 13.4333 4.84341 13.4327 5.74309 13.4327C5.78844 13.4327 5.83378 13.4327 5.88867 13.4327V14.5084L5.88986 14.509Z'\n fill='#214099'\n />\n </svg>\n);\n\nconst WheelsTVIconSvg = (\n <svg\n width='25'\n height='24'\n viewBox='0 0 25 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n d='M8.01135 7.31074L8.13763 16.7994C8.15144 17.8372 9.27808 18.4745 10.1758 17.9536L18.1748 13.3109C19.0686 12.792 19.0765 11.5016 18.1886 10.9728L10.0634 6.12688C9.1518 5.58428 7.99754 6.24922 8.01135 7.31074Z'\n fill='#E91524'\n />\n <path\n d='M12.5 23C18.5751 23 23.5 18.0751 23.5 12C23.5 5.92487 18.5751 1 12.5 1C6.42487 1 1.5 5.92487 1.5 12C1.5 18.0751 6.42487 23 12.5 23Z'\n stroke='#231F20'\n stroke-width='1.18386'\n stroke-miterlimit='10'\n />\n </svg>\n);\n\nconst VinReelsIconSvg = (\n <svg\n width='25'\n height='24'\n viewBox='0 0 25 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n >\n <path\n fill-rule='evenodd'\n clip-rule='evenodd'\n d='M2.5 4C2.5 3.44772 2.94772 3 3.5 3H21.5C22.0523 3 22.5 3.44772 22.5 4V14C22.5 14.5523 22.0523 15 21.5 15H3.5C2.94772 15 2.5 14.5523 2.5 14V4ZM14.3216 8.576C14.6349 8.77183 14.6349 9.22817 14.3216 9.424L11.765 11.0219C11.432 11.23 11 10.9906 11 10.5979V7.40212C11 7.00941 11.432 6.76998 11.765 6.97812L14.3216 8.576Z'\n fill='#272A32'\n />\n <path\n d='M3.5 17C2.94772 17 2.5 17.4477 2.5 18V20C2.5 20.5523 2.94772 21 3.5 21H21.5C22.0523 21 22.5 20.5523 22.5 20V18C22.5 17.4477 22.0523 17 21.5 17H3.5Z'\n fill='#272A32'\n />\n </svg>\n);\nexport const MediaTools = () => {\n const { colors } = useTheme();\n const [showActionDropdown, setShowActionDropdown] = useState(false);\n const { showWheelsTVFeature, showLesaTVFeature, showVinReelsFeature } =\n useConfigurationContext();\n\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n const history = useHistory();\n const { isVinReelsAvailable } = useAIFeatureAvailability();\n\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n\n const closeDropdown = () => {\n setShowActionDropdown(false);\n };\n const { ref } = useOnClickOutside(closeDropdown);\n\n const isWheelsTVEnabled =\n !isAutomotiveServiceRole && !!Number(userData.customer.wheelsTV);\n const isLesaEnabled = !!Number(userData.customer.lesaAccess);\n\n const enabledFeatures: string[] = [\n isWheelsTVEnabled ? t('Wheels TV') : '',\n isLesaEnabled ? t('Lesa') : '',\n isVinReelsAvailable ? t('VINReels') : '',\n ].filter(Boolean);\n\n const formatList = (items: string[]): string => {\n const last = items.pop();\n return `${items.join(', ')} & ${last}`;\n };\n\n const tooltipText = formatList([...enabledFeatures]);\n const enabledCount = enabledFeatures.length;\n const isDropdownEnabled = enabledCount >= 2;\n\n // TO DO REFACTOR THIS CODE TO BE MORE SCALABLE IF MORE MEDIA TOOLS ARE ADDED IN THE FUTURE\n const dropdownItems = [\n {\n label: <ParagraphNormal>{t('Wheels TV')}</ParagraphNormal>,\n icon: WheelsTVIconSvg,\n onClick: () => {\n setShowActionDropdown(false);\n history.push('/wheels-tv');\n },\n showItem: isWheelsTVEnabled && showWheelsTVFeature,\n },\n {\n label: <ParagraphNormal>{t('Lesa')}</ParagraphNormal>,\n icon: LesaSvg,\n onClick: () => {\n setShowActionDropdown(false);\n history.push('/lesa-tv');\n },\n showItem: isLesaEnabled && showLesaTVFeature,\n },\n {\n label: <ParagraphNormal>{t('VINReels')}</ParagraphNormal>,\n icon: VinReelsIconSvg,\n onClick: () => {\n setShowActionDropdown(false);\n history.push('/vinreels');\n },\n showItem: isVinReelsAvailable && showVinReelsFeature,\n },\n ];\n\n if (!showLesaTVFeature && !showWheelsTVFeature && !showVinReelsFeature) {\n return <></>;\n }\n\n return (\n <>\n {isDropdownEnabled && (\n <div\n ref={ref}\n style={{ position: 'relative', display: 'inline-block' }}\n >\n <Tooltip\n extendStyles={{\n element: {\n width: '100%',\n maxWidth: '200px',\n },\n popup: {\n padding: '10px',\n },\n }}\n popup={<ParagraphSmall>{tooltipText}</ParagraphSmall>}\n >\n <DropdownTrigger\n onClick={() => setShowActionDropdown(prev => !prev)}\n >\n <IoCarSport\n size={24}\n color={colors.secondary?.text?.color || colors.secondary[100]}\n />\n <BiChevronDown\n size={20}\n color={colors.secondary?.text?.color || colors.secondary[100]}\n />\n </DropdownTrigger>\n </Tooltip>\n {!!showActionDropdown && (\n <AddonDropdown dropdownItems={dropdownItems} />\n )}\n </div>\n )}\n {showWheelsTVFeature\n ? !isDropdownEnabled &&\n isWheelsTVEnabled && (\n <Button\n onClick={() => history.push('/wheels-tv')}\n icon={<IoMdCar size={18} />}\n text='WheelsTV'\n variant='white'\n />\n )\n : null}\n {showLesaTVFeature\n ? !isDropdownEnabled &&\n isLesaEnabled && (\n <Button\n onClick={() => history.push('/lesa-tv')}\n icon={<IoMdCar size={18} />}\n text='LesaTV'\n variant='white'\n />\n )\n : null}\n {showVinReelsFeature\n ? !isDropdownEnabled &&\n isVinReelsAvailable && (\n <Button\n onClick={() => history.push('/vinreels')}\n icon={<IoMdCar size={18} />}\n text='VinReels'\n variant='white'\n />\n )\n : null}\n </>\n );\n};\n","import styled, { css, useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useHistory } from 'react-router-dom';\nimport { Folder, useAuthorizationContext } from 'lib/context';\nimport { useQuery } from 'react-query';\nimport { AutomotiveRole } from 'lib/const/AutomotiveRole';\nimport { ALL_FOLDERS, VideoListItem, getFolders, getVideos } from 'lib/api';\nimport { keyBy } from 'lodash';\nimport { Container, Logo, TopBar, useToastNotifications } from 'lib/components';\nimport {\n NoVideos,\n PageInfo,\n Search,\n UserDropdown,\n VideoItem,\n} from './components';\nimport { useEffect, useState } from 'react';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport {\n MdChevronLeft,\n MdChevronRight,\n MdUpload,\n MdVideocam,\n} from 'react-icons/md';\nimport { PackageName } from 'lib/const';\nimport {\n COMPANY_FOLDER_ID,\n DEFAULT_FOLDER_NAMES,\n SHARED_FOLDER_PREFIX,\n} from 'lib/const/Folder';\nimport { ModalUpload } from 'lib/components/modals/ModalUpload';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { screenSizes } from 'lib/style/theme';\nimport { COOKIE_NAMES, token } from 'lib/config';\nimport { Button, Tooltip } from 'react-covideo-common';\nimport { Dropdown } from 'lib/components/NewDropdown';\n\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { GTMVideoInteractionActions } from 'lib/hooks/GTM/actions/video';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\nimport {\n getValidInitialFolder,\n setLastSelectedFolderToLocalStorage,\n} from 'lib/utils/folders/folderSelection';\nimport { MediaTools } from 'lib/components/mediaTools';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nconst ActionBar = styled.div`\n display: flex;\n justify-content: space-between;\n gap: 16px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.cmd &&\n css`\n flex-direction: column;\n `}\n`;\n\nconst ActionBarSide = styled.div`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n button {\n flex-shrink: 0;\n }\n flex-wrap: wrap;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.cmd &&\n css`\n justify-content: flex-end;\n `}\n`;\n\nconst Navigation = styled.div`\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst FolderSelectWrapper = styled.div`\n width: 190px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.cmd &&\n css`\n width: 100%;\n `}\n`;\n\nconst VideosGrid = styled.div`\n display: grid;\n gap: 24px;\n margin: 24px 0;\n grid-template-columns: repeat(3, 1fr);\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n grid-template-columns: 1fr 1fr;\n `}\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n grid-template-columns: 1fr;\n `}\n`;\n\ntype VideoListFilter = {\n folderId: string | number;\n searchQuery: string;\n page: number;\n size: number;\n};\n\nconst DEFAULT_FOLDER = {\n folderId: -2,\n name: 'Primary',\n isDeletable: false,\n};\nconst DEFAULT_PAGE = 0;\nconst DEFAULT_SIZE = 6;\n\ntype Props = {\n handleUpdateToken: Function;\n};\n\nconst CDS_FOLDERS = 'cds-folders';\n\nexport const Library = ({ handleUpdateToken }: Props) => {\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n const { trackGTMVideoInteractionEvent } = useGTMAnalytics();\n const { colors, isCdkEnviroment } = useTheme();\n const { userData } = useAuthorizationContext();\n const { toast } = useToastNotifications();\n const {\n showMergeFeature,\n showWheelsTVFeature,\n showLesaTVFeature,\n showRecordFeature,\n showUploadFeature,\n showFolderFeature,\n containerWidth,\n onUploadButtonClick,\n onRecordButtonClick,\n } = useConfigurationContext();\n const [isMerge, setIsMerge] = useState(false);\n const [selectedVideosData, setSelectedVideosData] = useState<VideoListItem[]>(\n []\n );\n const [openUploadModal, setOpenUploadModal] = useState(false);\n const isAutomotive = checkIfAutomotive(userData);\n const isAutomotiveSales = checkIfAutomotiveSalesRole(userData);\n const [uploadedVideoId, setUploadedVideoId] = useState(0);\n const { t } = useTranslation();\n\n const history = useHistory();\n\n const [filter, setFilter] = useState<VideoListFilter>({\n page: DEFAULT_PAGE,\n size: DEFAULT_SIZE,\n folderId: DEFAULT_FOLDER.folderId,\n searchQuery: '',\n });\n\n const { data: folders, isLoading: isLoadingFolders } = useQuery(\n CDS_FOLDERS,\n getFolders,\n {\n refetchOnWindowFocus: false,\n staleTime: 500_000_000,\n select: folders => {\n let filteredFolders = [...folders];\n // For technician user vault and private folders are surplus\n if (userData.automotiveRole === AutomotiveRole.TECHNICIAN) {\n filteredFolders = folders.filter(folder => {\n return (\n folder.name !== DEFAULT_FOLDER_NAMES.VAULT &&\n folder.name !== DEFAULT_FOLDER_NAMES.PRIVATE\n );\n });\n }\n return filteredFolders;\n },\n }\n );\n\n const foldersDictionary = folders ? keyBy(folders, 'folderId') : {};\n const currentFolder = foldersDictionary[filter.folderId] || DEFAULT_FOLDER;\n const isSharedFolder = !!currentFolder?.access;\n let folderName = foldersDictionary[filter.folderId]\n ? foldersDictionary[filter.folderId].name\n : DEFAULT_FOLDER.name;\n if (isSharedFolder) {\n folderName = `${SHARED_FOLDER_PREFIX}${filter.folderId}`;\n }\n\n folderName =\n folderName === ALL_FOLDERS.label ? ALL_FOLDERS.value : folderName;\n\n const { data, isLoading: isLoadingVideos } = useQuery(\n ['cds-videos', filter],\n async () =>\n getVideos({\n folder: folderName,\n search: filter.searchQuery,\n size: filter.size,\n page: filter.page,\n }),\n {\n refetchOnWindowFocus: false,\n enabled: !!folders?.length,\n }\n );\n const { count: videoCount, videos } = data || {\n count: 0,\n videos: [],\n };\n\n const DEFAULT_FOLDER_VALUES = Object.values(DEFAULT_FOLDER_NAMES);\n\n const options =\n folders\n ?.filter(Boolean)\n .filter((f: Folder) => f.folderId !== ALL_FOLDERS.value)\n .map((f: Folder) => ({\n value: f.folderId,\n label: DEFAULT_FOLDER_VALUES.includes(f.name) ? t(`${f.name}`) : f.name,\n }))\n .concat([\n {\n value: ALL_FOLDERS.value,\n label: t('All folders'), // \"All folders\"\n },\n ]) || [];\n\n const onSearch = (query: string) => {\n const searchQuery = query.toLowerCase();\n setFilter(prev => ({\n ...prev,\n page: DEFAULT_PAGE,\n searchQuery,\n }));\n };\n\n const onCancelMerge = () => {\n setIsMerge(false);\n localStorage.removeItem(COOKIE_NAMES.merge);\n setSelectedVideosData([]);\n };\n\n const onFolderChange = (folderId: string | number) => {\n if (folderId.toString() === COMPANY_FOLDER_ID.toString()) {\n onCancelMerge();\n }\n setLastSelectedFolderToLocalStorage({ folderId, userId: userData.userId });\n setFilter(prev => ({ ...prev, page: DEFAULT_PAGE, folderId }));\n };\n\n const onPageChange = (direction: 'left' | 'right') => {\n if (direction === 'left') {\n setFilter(prev => ({ ...prev, page: prev.page - 1 }));\n }\n if (direction === 'right') {\n setFilter(prev => ({ ...prev, page: prev.page + 1 }));\n }\n };\n\n const handleMergeSelectedVideos = () => {\n // save to ls\n localStorage.setItem(\n COOKIE_NAMES.merge,\n JSON.stringify(selectedVideosData)\n );\n const videoIds = selectedVideosData\n .map(video => video.id)\n .filter(Boolean)\n .join(',');\n trackGTMVideoInteractionEvent?.({\n action: GTMVideoInteractionActions.MERGE,\n videoIds: selectedVideosData.map(v => Number(v.id)),\n });\n history.push(`/merge/?videos=${videoIds}`);\n };\n\n const onUploadSuccess = async (uploadedVideoIds: number[]) => {\n if (!uploadedVideoIds.length) return;\n\n setUploadedVideoId(uploadedVideoIds[0]); // only singular upload for now\n };\n\n // Prevent freemium and pro users to use elead integration\n useEffect(() => {\n const userPackageId = userData.customer?.packageId;\n if (\n Number(userPackageId) === PackageName.FREE ||\n Number(userPackageId) === PackageName.PRO\n ) {\n toast({\n message: t('Please upgrade you account to use eLead integration.'),\n });\n handleUpdateToken('');\n history.go(0);\n }\n }, []);\n\n useEffect(() => {\n const cache = localStorage.getItem(COOKIE_NAMES.merge);\n if (!cache) {\n return;\n }\n try {\n const selectedVideos = JSON.parse(cache) || [];\n setSelectedVideosData(selectedVideos);\n setIsMerge(!!selectedVideos.length);\n } catch (error) {\n localStorage.removeItem(COOKIE_NAMES.merge);\n }\n }, []);\n\n useEffect(() => {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_OVERVIEW,\n });\n }, []);\n\n useEffect(() => {\n if (!userData.userId) return;\n const folderId = getValidInitialFolder(Number(userData.userId));\n setFilter(prev => ({\n ...prev,\n folderId,\n }));\n }, [userData.userId]);\n\n useEffect(() => {\n if (!!uploadedVideoId) {\n // go to upload-preview\n history.push(`/preview-upload/${uploadedVideoId}`);\n }\n }, [uploadedVideoId]);\n\n const showLoading = isLoadingVideos || isLoadingFolders;\n\n const mergeDisabled = currentFolder?.name === DEFAULT_FOLDER_NAMES.COMPANY;\n return (\n <Wrapper>\n <TopBar\n left={<UserDropdown handleUpdateToken={handleUpdateToken} />}\n center={<Logo />}\n right={\n <>\n {showUploadFeature && (\n <Button\n onClick={\n !!onUploadButtonClick\n ? () => onUploadButtonClick(token)\n : () => setOpenUploadModal(true)\n }\n variant={isCdkEnviroment ? 'white' : 'secondary'}\n text={containerWidth > screenSizes.sm ? t('Upload') : ''}\n icon={<MdUpload size={22} />}\n />\n )}\n\n {showRecordFeature && (\n <Button\n onClick={\n !!onRecordButtonClick\n ? () => onRecordButtonClick(token)\n : () => history.push('/record/home')\n }\n text={containerWidth > screenSizes.sm ? t('Record') : ''}\n icon={<MdVideocam size={22} />}\n variant={isCdkEnviroment ? 'white' : 'red'}\n />\n )}\n </>\n }\n />\n\n <Container>\n <ActionBar>\n <ActionBarSide>\n <Search handleSearch={onSearch} prevSearch={filter.searchQuery} />\n {showFolderFeature && (\n <FolderSelectWrapper>\n <Dropdown\n options={options}\n value={\n options.find(option => option.value === filter?.folderId) ||\n DEFAULT_FOLDER\n }\n placeholder={t('All folders')}\n onChange={option =>\n onFolderChange(option?.value ?? DEFAULT_FOLDER.folderId)\n }\n isLoading={isLoadingFolders}\n isSearchable={false}\n creatable={false}\n disabled={isLoadingFolders}\n />\n </FolderSelectWrapper>\n )}\n </ActionBarSide>\n\n {(showWheelsTVFeature || showMergeFeature || showLesaTVFeature) && (\n <>\n {!isMerge && (\n <ActionBarSide>\n <MediaTools />\n\n {showMergeFeature && (\n <Button\n onClick={() => (mergeDisabled ? {} : setIsMerge(true))}\n text={t('Merge Videos')}\n variant='white'\n disabled={mergeDisabled}\n />\n )}\n </ActionBarSide>\n )}\n {isMerge && (\n <ActionBarSide>\n <Button\n onClick={onCancelMerge}\n text={t('Cancel')}\n variant='white'\n />\n\n <Tooltip\n position='top'\n hoverable={\n !(\n selectedVideosData.length >= 2 &&\n selectedVideosData.length <= 9\n )\n }\n children={\n <Button\n onClick={handleMergeSelectedVideos}\n text={t('Merge Videos')}\n disabled={\n mergeDisabled ||\n selectedVideosData.length < 2 ||\n selectedVideosData.length > 9\n }\n />\n }\n popup={\n <>\n {selectedVideosData.length < 2 &&\n t('Select 2+ videos to merge')}\n {selectedVideosData.length > 9 &&\n t('Select maximum 9 videos')}\n </>\n }\n extendStyles={{\n popup: {\n left: 40,\n ...(isCdkEnviroment\n ? {\n color: colors.white[100],\n background: colors.black[100],\n }\n : {}),\n },\n }}\n />\n </ActionBarSide>\n )}\n </>\n )}\n </ActionBar>\n <>\n {!showLoading && !!videos.length && (\n <>\n <VideosGrid>\n {videos.map((video, i) => (\n <VideoItem\n video={video}\n key={video.id}\n isMerge={isMerge}\n selectedVideosData={selectedVideosData}\n setSelectedVideosData={setSelectedVideosData}\n />\n ))}\n </VideosGrid>\n <Navigation>\n <PageInfo\n page={filter.page}\n size={filter.size}\n count={videoCount}\n />\n <Button\n onClick={() => onPageChange('left')}\n icon={<MdChevronLeft size={22} />}\n disabled={filter.page === 0}\n variant='white'\n size='small'\n />\n <Button\n onClick={() => onPageChange('right')}\n icon={<MdChevronRight size={22} />}\n disabled={\n videos.length < filter.size ||\n (filter.page + 1) * filter.size >= videoCount\n }\n variant='white'\n size='small'\n />\n </Navigation>\n </>\n )}\n {showLoading && (\n <NoVideos message={t('Loading...')} size={filter.size} />\n )}\n {!showLoading && !videos.length && (\n <NoVideos\n message={t('No videos match your query')}\n size={filter.size}\n />\n )}\n </>\n </Container>\n {openUploadModal && (\n <ModalUpload\n handleModalClose={() => setOpenUploadModal(false)}\n onSuccess={onUploadSuccess}\n />\n )}\n </Wrapper>\n );\n};\n","import styled, { keyframes } from 'styled-components';\nimport { theme } from 'lib/style';\n\nexport const fadeUp = keyframes`\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n`;\n\nexport const spin = keyframes`\n to { transform: rotate(360deg); }\n`;\n\nexport const LoginWrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n padding: 50px 0;\n`;\n\nexport const LoginCard = styled.div`\n width: 420px;\n max-width: calc(100% - 32px);\n background: ${theme.palette.white};\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 16px;\n padding: 36px 32px 32px;\n animation: ${fadeUp} 0.3s ease both;\n`;\n\nexport const Heading = styled.h1`\n font-size: 22px;\n font-weight: 700;\n color: ${({ theme }) => theme.colors.neutral[100]};\n margin: 0 0 6px;\n line-height: 1.3;\n`;\n\nexport const HeadingSubtitle = styled.p`\n font-size: 14px;\n color: ${({ theme }) => theme.colors.neutral[60]};\n margin: 0 0 24px;\n`;\n\nexport const CardSubtitle = styled.div`\n text-align: center;\n color: ${({ theme }) => theme.colors.primary[100]};\n font-size: 12px;\n margin-top: 12px;\n`;\n\nexport const FormGroup = styled.div`\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 20px;\n animation: ${fadeUp} 0.25s ease both;\n`;\n\nexport const LabelRow = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nexport const FieldLabel = styled.label`\n font-size: 14px;\n font-weight: 500;\n color: ${({ theme }) => theme.colors.neutral[80]};\n`;\n\nexport const Anchor = styled.a`\n font-size: 13px;\n font-weight: 500;\n color: ${({ theme }) => theme.colors.primary[100]};\n text-decoration: none;\n cursor: pointer;\n &:hover {\n text-decoration: underline;\n }\n`;\n\nexport const InputRow = styled.div`\n display: flex;\n align-items: stretch;\n gap: 8px;\n`;\n\nexport const Spinner = styled.div`\n width: 16px;\n height: 16px;\n border: 2px solid rgba(255, 255, 255, 0.35);\n border-top-color: #fff;\n border-radius: 50%;\n animation: ${spin} 0.65s linear infinite;\n`;\n\nexport const VerifyingText = styled.p`\n text-align: center;\n font-size: 14px;\n color: ${({ theme }) => theme.colors.neutral[60]};\n margin: 12px 0 0;\n animation: ${fadeUp} 0.2s ease both;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n`;\n\nexport const PasswordWrapper = styled.div`\n position: relative;\n`;\n\nexport const PasswordToggleIconWrapper = styled.div`\n position: absolute;\n right: 12px;\n top: calc(50% - 8px);\n transform: translateY(-50%);\n color: ${theme.palette.gray60};\n cursor: pointer;\n display: flex;\n align-items: center;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n","import { FieldMetaProps } from 'formik';\nimport { ParagraphExtraSmall } from 'lib/components/styles/typography';\nimport { CSSProperties } from 'react';\nimport { useCovideoTheme } from 'react-covideo-common';\ninterface IProps {\n errorWrapper?: CSSProperties | undefined;\n}\n\nexport const FormikErrorMessage = ({\n meta,\n extendStyles,\n}: {\n meta: FieldMetaProps<any>;\n extendStyles?: IProps;\n}) => {\n const themes = useCovideoTheme();\n return (\n <div style={{ height: 16, ...extendStyles?.errorWrapper }}>\n {meta.error && meta.touched ? (\n <ParagraphExtraSmall color={themes.colors.danger[80]}>\n {meta.error}\n </ParagraphExtraSmall>\n ) : null}\n </div>\n );\n};\n","import React from 'react';\nimport { Tooltip } from 'react-covideo-common';\nimport { MdInfo } from 'react-icons/md';\nimport styled, { css, CSSProperties, useTheme } from 'styled-components';\n\nconst CommonStyles = css`\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n margin: 0;\n display: flex;\n gap: 2px;\n`;\n\nconst StyledLabel = styled.label<{ disabled?: boolean }>`\n ${CommonStyles}\n color: ${({ theme }) => theme.colors.neutral[60]};\n opacity: ${({ disabled }) => (disabled ? 0.5 : 1)};\n`;\n\nconst StyledParagraph = styled.p<{ disabled?: boolean }>`\n ${CommonStyles}\n color: ${({ theme }) => theme.colors.neutral[60]};\n opacity: ${({ disabled }) => (disabled ? 0.5 : 1)};\n`;\n\nconst TooltipContainer = styled.div`\n position: relative;\n display: inline-block;\n cursor: pointer;\n`;\n\ninterface IFormikLabelProps {\n name?: string;\n label: string;\n isRequired?: boolean;\n disabled?: boolean;\n info?: string | React.ReactNode;\n labelStyles?: CSSProperties | undefined;\n}\n\nconst IconTooltip = ({ info }: { info: string | React.ReactNode }) => {\n const { colors } = useTheme();\n\n return (\n <TooltipContainer>\n <Tooltip\n popup={info}\n position='bottom'\n extendStyles={{\n popup: {\n width: '310px',\n fontSize: '14px',\n lineHeight: '24px',\n color: colors.neutral[80],\n padding: '8px 12px',\n zIndex: 9999,\n },\n element: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: 'pointer',\n },\n }}\n >\n <MdInfo size={18} style={{ display: 'inline' }} />\n </Tooltip>\n </TooltipContainer>\n );\n};\n\nexport const FormikLabel: React.FC<IFormikLabelProps> = ({\n name,\n label,\n isRequired,\n disabled,\n info,\n labelStyles,\n}) => {\n const themes = useTheme();\n\n if (name) {\n return (\n <StyledLabel htmlFor={name} disabled={disabled} style={labelStyles}>\n {label}{' '}\n {isRequired && (\n <span style={{ color: themes.colors.primary[100] }}>*</span>\n )}{' '}\n {info && <IconTooltip info={info} />}\n </StyledLabel>\n );\n }\n return (\n <StyledParagraph disabled={disabled} style={labelStyles}>\n {label}{' '}\n {isRequired && (\n <span style={{ color: themes.colors.primary[100] }}>*</span>\n )}{' '}\n {info && <IconTooltip info={info} />}\n </StyledParagraph>\n );\n};\n","import styled, { css } from 'styled-components';\n\ninterface IGap {\n gap?: string;\n center?: boolean;\n m?: string;\n flexWrap?: string;\n flexDirection?: string;\n alignItems?: string;\n justifyContent?: string;\n width?: string;\n height?: string;\n}\n\ninterface IEnhancedGap {\n maxWidth: string;\n overflow: string;\n textOverflow: string;\n whiteSpace: string;\n}\n\nexport const Gap = styled.div<IGap>`\n display: flex;\n flex-wrap: ${({ flexWrap }) => (flexWrap ? flexWrap : 'wrap')};\n margin: ${({ m }) => m || '0px'};\n width: ${({ width }) => width || 'auto'};\n height: ${({ height }) => height || 'auto'};\n gap: ${({ gap }) => gap || '16px'};\n flex-direction: ${({ flexDirection }) => flexDirection || 'row'};\n align-items: ${({ alignItems }) => alignItems || 'center'};\n justify-content: ${({ justifyContent }) => justifyContent || 'flex-start'};\n ${({ center }) =>\n center &&\n css`\n align-items: center;\n justify-content: center;\n `}\n`;\n\nexport const EnhancedGap = styled(Gap)<IEnhancedGap>`\n max-width: ${({ maxWidth }) => maxWidth};\n overflow: ${({ overflow }) => overflow};\n text-overflow: ${({ textOverflow }) => textOverflow};\n white-space: ${({ whiteSpace }) => whiteSpace};\n`;\n\n//Header\nexport const HeaderWrapper = styled.div`\n display: flex;\n justify-content: space-between;\n margin-bottom: 26px;\n flex-wrap: wrap;\n gap: 32px;\n`;\n\ninterface IStack {\n gap?: string;\n m?: string;\n p?: string;\n flexWrap?: string;\n alignItems?: string;\n justifyContent?: string;\n width?: string;\n maxWidth?: string;\n height?: string;\n}\n\nexport const Stack = styled.div<IStack>`\n display: flex;\n box-sizing: border-box;\n flex-wrap: ${({ flexWrap }) => (flexWrap ? flexWrap : 'wrap')};\n margin: ${({ m }) => m || '0px'};\n padding: ${({ p }) => p || '0px'};\n width: ${({ width }) => width || 'auto'};\n max-width: ${({ maxWidth }) => maxWidth || 'auto'};\n height: ${({ height }) => height || 'auto'};\n gap: ${({ gap }) => gap || '16px'};\n flex-direction: column;\n align-items: ${({ alignItems }) => alignItems || 'center'};\n justify-content: ${({ justifyContent }) => justifyContent || 'flex-start'};\n`;\n\nexport const Flex = styled.div<FlexProps>`\n display: flex;\n ${({ flex, flexBasis, flexDirection, flexGrow, flexShrink, flexWrap }) => `\n flex: ${flex ?? '0 1 auto'};\n flex-basis: ${flexBasis ?? 'auto'};\n flex-direction: ${flexDirection ?? 'column'};\n flex-grow: ${flexGrow ?? 0};\n flex-shrink: ${flexShrink ?? 1};\n flex-wrap: ${flexWrap ?? 'nowrap'};\n `}\n ${({ gap, alignItems, justifyContent, cursor }) => `\n gap: ${gap ?? '0'};\n align-items: ${alignItems ?? 'stretch'};\n justify-content: ${justifyContent ?? 'flex-start'};\n cursor: ${cursor ?? 'auto'};\n `}\n ${({ width, minWidth, maxWidth, height, margin, padding }) => `\n width: ${width ?? '100%'};\n min-width: ${minWidth ?? 'none'};\n max-width: ${maxWidth ?? 'none'};\n height: ${height ?? 'auto'};\n margin: ${margin ?? '0'};\n padding: ${padding ?? '0'};\n `}\n ${({ border, borderLeft, borderBottom, borderRadius }) => `\n ${border ? `border: ${border};` : ''}\n ${borderLeft ? `border-left: ${borderLeft};` : ''}\n ${borderBottom ? `border-bottom: ${borderBottom};` : ''}\n ${borderRadius ? `border-radius: ${borderRadius};` : ''}\n `}\n ${({ backgroundColor, whiteSpace }) => `\n ${backgroundColor ? `background-color: ${backgroundColor};` : ''}\n ${whiteSpace ? `white-space: ${whiteSpace};` : ''}\n `}\n`;\n\n// Define reusable FlexProps\nexport interface FlexProps {\n flex?: string | number;\n flexBasis?: string;\n flexDirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse';\n flexGrow?: number;\n flexShrink?: number;\n flexWrap?: 'nowrap' | 'wrap' | 'wrap-reverse';\n gap?: string;\n alignItems?: 'stretch' | 'center' | 'flex-start' | 'flex-end' | 'baseline';\n justifyContent?:\n | 'flex-start'\n | 'flex-end'\n | 'center'\n | 'space-between'\n | 'space-around'\n | 'space-evenly';\n width?: string;\n minWidth?: string;\n maxWidth?: string;\n height?: string;\n margin?: string;\n padding?: string;\n border?: string;\n borderLeft?: string;\n borderBottom?: string;\n borderRadius?: string;\n whiteSpace?: 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | 'pre-line';\n hideOnMobile?: boolean;\n backgroundColor?: string;\n cursor?: string;\n}\n","import React, { CSSProperties } from 'react';\nimport { useField } from 'formik';\nimport styled from 'styled-components';\nimport { FormikErrorMessage } from './FormikErrorMessage';\nimport { FormikLabel } from './FormikLabel';\nimport { Flex, FlexProps } from '../styles/layout';\n\nexport const TextInput = styled.input`\n font-style: normal;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n color: #272a32;\n border-radius: 4px;\n height: 40px;\n width: 100%;\n box-sizing: border-box;\n border: solid 1px #e1e2e5;\n padding: 8px 12px;\n &:focus {\n outline: none;\n border: solid 1px ${({ theme }) => theme.colors.primary[100]};\n }\n &:disabled {\n cursor: not-allowed;\n }\n &::placeholder {\n color: ${({ theme }) => theme.colors.neutral[40]};\n font-size: 16px;\n }\n`;\n\ninterface CustomInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n name: string;\n label?: string;\n info?: string | React.ReactNode;\n isRequired: boolean;\n extendStyles?: {\n errorWrapper?: CSSProperties;\n labelStyles?: CSSProperties;\n inputWrapper?: FlexProps;\n mainWrapper?: FlexProps;\n };\n}\n\nexport const FormikInputField = React.forwardRef<\n HTMLInputElement,\n CustomInputProps\n>(({ label, isRequired, extendStyles, info, ...props }, ref) => {\n const [field, meta] = useField(props);\n return (\n <Flex {...extendStyles?.mainWrapper} gap='4px'>\n {label && (\n <FormikLabel\n label={label}\n name={props.name}\n isRequired={isRequired}\n disabled={!!props.disabled}\n info={info}\n labelStyles={extendStyles?.labelStyles}\n />\n )}\n <Flex {...extendStyles?.inputWrapper} gap='4px'>\n <TextInput {...field} {...props} id={props.name} ref={ref} />\n <FormikErrorMessage meta={meta} extendStyles={extendStyles} />\n </Flex>\n </Flex>\n );\n});\n\nFormikInputField.displayName = 'FormikInputField';\n","import * as Yup from 'yup';\n\nexport type Step = 'username' | 'sso' | 'password';\n\nexport const usernameSchema = Yup.object({\n username: Yup.string().trim().required('Username is required'),\n});\n\nexport const passwordSchema = Yup.object({\n username: Yup.string().required(),\n password: Yup.string().required('Password is required'),\n});\n","export const buildSSOUrl = (\n ssoLoginUrl: string,\n relayState?: string\n): string => {\n const query = relayState\n ? `?relayState=${encodeURIComponent(relayState)}`\n : '';\n return `${ssoLoginUrl}${query}`;\n};\n","import type { AxiosError } from 'axios';\nimport { EXPRESS_API } from 'lib/config';\nimport { useMutation } from 'react-query';\n\ninterface ICheckUsernameParams {\n username: string;\n}\n\ninterface ICheckUsernameResponse {\n userExist: boolean;\n ssoLoginUrl: string | undefined;\n}\n\nconst checkUsername = async (\n params: ICheckUsernameParams\n): Promise<ICheckUsernameResponse> => {\n const response = await EXPRESS_API.post(`/auth/username-check-sso`, params);\n return response.data as ICheckUsernameResponse;\n};\n\nexport const useCheckUsernameMutation = () => {\n return useMutation<ICheckUsernameResponse, AxiosError, ICheckUsernameParams>({\n mutationFn: checkUsername,\n onError: err => {\n console.error('Username check error', err);\n },\n });\n};\n","import { useTranslation } from 'react-i18next';\nimport { Formik, Form } from 'formik';\nimport { MdArrowForward } from 'react-icons/md';\nimport { Button } from 'react-covideo-common';\nimport { FormikInputField } from 'lib/components/formik/FormikInputField';\nimport { usernameSchema } from './types';\nimport {\n FormGroup,\n LabelRow,\n FieldLabel,\n Anchor,\n InputRow,\n Spinner,\n} from './styles';\nimport { buildSSOUrl } from './utils';\nimport { useCheckUsernameMutation } from 'lib/api/auth/useCheckUsernameMutation';\nimport { url } from 'inspector';\n\ntype Props = {\n onVerified: (username: string) => void;\n onSso: (username: string) => void;\n};\n\nexport const UsernameForm = ({ onVerified, onSso }: Props) => {\n const { t } = useTranslation();\n const { mutateAsync: checkUsername } = useCheckUsernameMutation();\n\n return (\n <Formik\n initialValues={{ username: '' }}\n validationSchema={usernameSchema}\n onSubmit={async (values, { setFieldError }) => {\n const trimmed = values.username.trim();\n try {\n const { userExist, ssoLoginUrl } = await checkUsername({\n username: trimmed,\n });\n\n if (!userExist) {\n setFieldError(\n 'username',\n t('Username not found. Please try again.')\n );\n return;\n }\n\n if (ssoLoginUrl) {\n if (window.location.origin.includes('localhost:6006')) {\n console.log('[SSO MOCK] Redirect to:', ssoLoginUrl);\n return;\n }\n\n const relayState = window.location.href;\n const fullSSOUrl = buildSSOUrl(ssoLoginUrl, relayState);\n onSso(trimmed);\n setTimeout(() => {\n window.location.assign(fullSSOUrl);\n }, 1500);\n } else {\n onVerified(trimmed);\n }\n } catch {\n setFieldError(\n 'username',\n t('Could not verify username. Please try again.')\n );\n }\n }}\n >\n {({ values, isSubmitting }) => (\n <Form>\n <FormGroup>\n <LabelRow>\n <FieldLabel htmlFor='username'>{t('Username')}</FieldLabel>\n <Anchor\n href='https://www.covideo.com/forgot-username/'\n target='_blank'\n >\n {t('Forgot username?')}\n </Anchor>\n </LabelRow>\n <InputRow>\n <FormikInputField\n name='username'\n isRequired\n placeholder={t('Username')}\n autoFocus\n type='text'\n extendStyles={{ mainWrapper: { flex: 1 } }}\n />\n <Button\n type='submit'\n disabled={!values.username.trim() || isSubmitting}\n aria-label='Next'\n icon={isSubmitting ? <Spinner /> : <MdArrowForward size={18} />}\n />\n </InputRow>\n </FormGroup>\n </Form>\n )}\n </Formik>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button } from 'react-covideo-common';\nimport { TextInput } from 'lib/components/formik/FormikInputField';\nimport {\n FormGroup,\n LabelRow,\n FieldLabel,\n Anchor,\n InputRow,\n Spinner as SpinnerStyle,\n VerifyingText,\n} from './styles';\n\nimport styled, { keyframes } from 'styled-components';\n\nconst spin = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\nexport const Spinner = styled.svg`\n animation: ${spin} 2s linear infinite;\n will-change: transform;\n`;\n\ntype Props = {\n username: string;\n};\n\nconst SSOVerifyingLoader = () => {\n return (\n <Spinner\n width='20'\n height='20'\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n className='spinner'\n >\n <path\n fill-rule='evenodd'\n clip-rule='evenodd'\n d='M5.83317 10.0003C5.83317 9.54033 5.45984 9.16699 4.99984 9.16699H2.49984C2.03984 9.16699 1.6665 9.54033 1.6665 10.0003C1.6665 10.4603 2.03984 10.8337 2.49984 10.8337H4.99984C5.45984 10.8337 5.83317 10.4603 5.83317 10.0003V10.0003ZM17.4998 9.16699H14.9998C14.5398 9.16699 14.1665 9.54033 14.1665 10.0003C14.1665 10.4603 14.5398 10.8337 14.9998 10.8337H17.4998C17.9598 10.8337 18.3332 10.4603 18.3332 10.0003C18.3332 9.54033 17.9598 9.16699 17.4998 9.16699V9.16699ZM9.99984 14.167C9.53984 14.167 9.1665 14.5403 9.1665 15.0003V17.5003C9.1665 17.9612 9.53984 18.3337 9.99984 18.3337C10.4598 18.3337 10.8332 17.9612 10.8332 17.5003V15.0003C10.8332 14.5403 10.4598 14.167 9.99984 14.167V14.167ZM9.99984 1.66699C9.53984 1.66699 9.1665 2.04033 9.1665 2.50033V5.00033C9.1665 5.46033 9.53984 5.83366 9.99984 5.83366C10.4598 5.83366 10.8332 5.46033 10.8332 5.00033V2.50033C10.8332 2.04033 10.4598 1.66699 9.99984 1.66699V1.66699ZM6.9715 3.08866C6.7415 2.69033 6.23234 2.55283 5.83317 2.78366C5.434 3.01366 5.29817 3.52366 5.52817 3.92199L6.77817 6.08699C7.00817 6.48533 7.51734 6.62199 7.9165 6.39199C8.31567 6.16199 8.4515 5.65199 8.2215 5.25366L6.9715 3.08866ZM13.2215 13.9137C12.9915 13.5153 12.4823 13.3787 12.0832 13.6087C11.684 13.8387 11.5482 14.3487 11.7782 14.747L13.0282 16.912C13.2582 17.3103 13.7673 17.4478 14.1665 17.217C14.5657 16.987 14.7015 16.477 14.4715 16.0787L13.2215 13.9137ZM6.3915 12.0837C6.1615 11.6845 5.6515 11.5487 5.25317 11.7787L3.08817 13.0287C2.68984 13.2587 2.55234 13.7678 2.78317 14.167C3.01317 14.5662 3.52317 14.702 3.9215 14.472L6.0865 13.222C6.48484 12.992 6.6215 12.4828 6.3915 12.0837V12.0837ZM13.6082 7.91699C13.8382 8.31616 14.3482 8.45199 14.7465 8.22199L16.9115 6.97199C17.3098 6.74199 17.4473 6.23283 17.2165 5.83366C16.9865 5.43449 16.4765 5.29866 16.0782 5.52866L13.9132 6.77866C13.5148 7.00866 13.3782 7.51783 13.6082 7.91699V7.91699ZM3.08817 6.97199L5.25317 8.22199C5.6515 8.45199 6.1615 8.31616 6.3915 7.91699C6.6215 7.51783 6.48484 7.00866 6.0865 6.77866L3.9215 5.52866C3.52317 5.29866 3.01317 5.43449 2.78317 5.83366C2.55234 6.23283 2.68984 6.74199 3.08817 6.97199V6.97199ZM16.9115 13.0287L14.7465 11.7787C14.3482 11.5487 13.8382 11.6845 13.6082 12.0837C13.3782 12.4828 13.5148 12.992 13.9132 13.222L16.0782 14.472C16.4765 14.702 16.9865 14.5662 17.2165 14.167C17.4473 13.7678 17.3098 13.2587 16.9115 13.0287V13.0287ZM7.9165 13.6087C7.51734 13.3787 7.00817 13.5153 6.77817 13.9137L5.52817 16.0787C5.29817 16.477 5.434 16.987 5.83317 17.217C6.23234 17.4478 6.7415 17.3103 6.9715 16.912L8.2215 14.747C8.4515 14.3487 8.31567 13.8387 7.9165 13.6087V13.6087ZM12.0832 6.39199C12.4823 6.62199 12.9915 6.48533 13.2215 6.08699L14.4715 3.92199C14.7015 3.52366 14.5657 3.01366 14.1665 2.78366C13.7673 2.55283 13.2582 2.69033 13.0282 3.08866L11.7782 5.25366C11.5482 5.65199 11.684 6.16199 12.0832 6.39199V6.39199Z'\n fill='#9297A2'\n />\n </Spinner>\n );\n};\n\nexport const SSOVerifying = ({ username }: Props) => {\n const { t } = useTranslation();\n\n return (\n <>\n <FormGroup>\n <LabelRow>\n <FieldLabel>{t('Username')}</FieldLabel>\n <Anchor\n href='https://www.covideo.com/forgot-username/'\n target='_blank'\n >\n {t('Forgot username?')}\n </Anchor>\n </LabelRow>\n <InputRow>\n <TextInput value={username} disabled type='text' readOnly />\n <Button\n type='button'\n disabled\n aria-label='Verifying'\n icon={<SpinnerStyle />}\n />\n </InputRow>\n </FormGroup>\n <VerifyingText>\n <SSOVerifyingLoader />\n {t('Verifying SSO...')}\n </VerifyingText>\n </>\n );\n};\n","import { AxiosError } from 'axios';\nimport { EXPRESS_API } from 'lib/config';\nimport { useMutation } from 'react-query';\n\ninterface ILoginParams {\n username: string;\n password: string;\n}\n\ninterface ILoginResponse {\n accessToken: string;\n refreshToken: string;\n}\n\nconst loginUser = async (params: ILoginParams): Promise<ILoginResponse> => {\n const response = await EXPRESS_API.post(`/auth`, params);\n return response.data as ILoginResponse;\n};\n\nexport const useLoginMutation = () => {\n return useMutation(loginUser, {\n onError: (err: AxiosError) => {\n console.log(err);\n },\n });\n};\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useHistory } from 'react-router-dom';\nimport { Formik, Form } from 'formik';\nimport { IoMdEye, IoMdEyeOff } from 'react-icons/io';\nimport { MdArrowBack, MdArrowForward } from 'react-icons/md';\nimport { Button } from 'react-covideo-common';\nimport { FormikInputField } from 'lib/components/formik/FormikInputField';\nimport { passwordSchema } from './types';\nimport {\n FormGroup,\n LabelRow,\n FieldLabel,\n Anchor,\n PasswordWrapper,\n PasswordToggleIconWrapper,\n} from './styles';\nimport { useLoginMutation } from 'lib/api/auth/useLoginMutation';\nimport { useTheme } from 'styled-components';\n\ntype Props = {\n username: string;\n handleUpdateToken: Function;\n onPreviousStepHandler: () => void;\n};\n\nexport const PasswordForm = ({\n username,\n handleUpdateToken,\n onPreviousStepHandler,\n}: Props) => {\n const { colors } = useTheme();\n const { t } = useTranslation();\n const history = useHistory();\n const [showPassword, setShowPassword] = useState(false);\n const { mutateAsync: loginUser } = useLoginMutation();\n\n return (\n <>\n <Formik\n initialValues={{ username, password: '' }}\n validationSchema={passwordSchema}\n onSubmit={async (values, { setFieldError }) => {\n try {\n const { accessToken } = await loginUser({\n username: values.username,\n password: values.password,\n });\n await handleUpdateToken(accessToken);\n history.go(0);\n } catch {\n setFieldError('password', t('Incorrect login. Please try again.'));\n }\n }}\n >\n {({ values, isSubmitting }) => (\n <Form>\n {/* Pre-filled, disabled username */}\n <FormikInputField\n name='username'\n isRequired\n placeholder={t('Username')}\n type='text'\n disabled\n extendStyles={{ mainWrapper: { flex: 1 } }}\n />\n\n {/* Password */}\n <FormGroup>\n <LabelRow>\n <FieldLabel htmlFor='password'>{t('Password')}</FieldLabel>\n <Anchor\n href='https://www.covideo.com/reset-password/'\n target='_blank'\n >\n {t('Forgot Password?')}\n </Anchor>\n </LabelRow>\n <PasswordWrapper>\n <FormikInputField\n name='password'\n isRequired\n placeholder={t('Password')}\n autoFocus\n type={showPassword ? 'text' : 'password'}\n style={{ paddingRight: 40 }}\n />\n <PasswordToggleIconWrapper\n onClick={() => setShowPassword(p => !p)}\n >\n {showPassword ? (\n <IoMdEyeOff size={20} />\n ) : (\n <IoMdEye size={20} />\n )}\n </PasswordToggleIconWrapper>\n </PasswordWrapper>\n </FormGroup>\n\n <Button\n style={{ width: '100%' }}\n type='submit'\n disabled={!values.password || isSubmitting}\n icon={<MdArrowForward size={16} />}\n text={t('Log In')}\n iconPosition='right'\n />\n </Form>\n )}\n </Formik>\n\n <Button\n text={t('Back to username')}\n variant='text'\n onClick={onPreviousStepHandler}\n icon={<MdArrowBack size={16} />}\n style={{\n textDecoration: 'underline',\n color: colors.primary[100],\n marginTop: 16,\n }}\n />\n </>\n );\n};\n","import { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TopBar, Logo } from 'lib/components/';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport {\n LoginWrapper,\n LoginCard,\n Heading,\n HeadingSubtitle,\n CardSubtitle,\n} from './styles';\nimport { UsernameForm } from './UsernameForm';\nimport { SSOVerifying } from './SSOVerifying';\nimport { PasswordForm } from './PasswordForm';\n\ntype Props = {\n handleUpdateToken: Function;\n};\n\nenum StepEnum {\n USERNAME = 'username',\n SSO = 'sso',\n PASSWORD = 'password',\n}\n\nexport const Login = ({ handleUpdateToken }: Props) => {\n const { t } = useTranslation();\n const { hasExternalJwt } = useConfigurationContext();\n\n const [step, setStep] = useState<StepEnum>(StepEnum.USERNAME);\n const [verifiedUsername, setVerifiedUsername] = useState('');\n\n if (hasExternalJwt) {\n return (\n <>\n <TopBar center={<Logo />} />\n <LoginWrapper>\n <LoginCard>\n <Heading>{t('Login failed')}</Heading>\n <CardSubtitle>{t('External token invalid.')}</CardSubtitle>\n </LoginCard>\n </LoginWrapper>\n </>\n );\n }\n\n return (\n <>\n <TopBar center={<Logo />} />\n <LoginWrapper>\n <LoginCard>\n <Heading>{t('Welcome back')} 👋</Heading>\n\n {(step === StepEnum.USERNAME || step === StepEnum.SSO) && (\n <HeadingSubtitle>{t('Enter username to continue')}</HeadingSubtitle>\n )}\n\n {step === StepEnum.USERNAME && (\n <UsernameForm\n onVerified={username => {\n setVerifiedUsername(username);\n setStep(StepEnum.PASSWORD);\n }}\n onSso={username => {\n setVerifiedUsername(username);\n setStep(StepEnum.SSO);\n }}\n />\n )}\n\n {step === StepEnum.SSO && (\n <SSOVerifying username={verifiedUsername} />\n )}\n\n {step === StepEnum.PASSWORD && (\n <PasswordForm\n username={verifiedUsername}\n handleUpdateToken={handleUpdateToken}\n onPreviousStepHandler={() => setStep(StepEnum.USERNAME)}\n />\n )}\n </LoginCard>\n </LoginWrapper>\n </>\n );\n};\n","import { GetLandingPagesResponse } from 'lib/api';\nimport { UserData } from 'lib/context';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { uniqBy } from 'lodash';\n\nexport const LINKSET_NONE_OPTION_VALUE = '-1';\n// custom landing pages created by customers have this typeId\nexport const builderLandingPageTypeId = 19;\nexport const LANDING_PAGE_DESIGN_TYPE_ID = 21;\nexport const QUOTIBLE_LANDING_PAGE_TYPE_ID = 20;\n\nexport const SALES_PAGE_ID = -2;\nexport const WEBSITE_OVERLAY_LANDING_PAGE_ID = -1;\n\nexport enum LandingPageType {\n VIDMAILS = 'vidmails',\n AUTOMOTIVE = 'automotive',\n}\n\nexport const defaultLPOption: LandingPageOption = {\n value: 0,\n label: '',\n landingPageType: LandingPageType.VIDMAILS,\n id: 0,\n};\n\nexport type LandingPageOption = {\n value: string | number;\n label: string;\n typeId?: number;\n landingPageType: LandingPageType;\n id?: number;\n};\n\nexport const getSalesServiceOption = (userData: UserData) => {\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n return {\n //has to be -2 so php doesn't add default if no LP selected\n value: SALES_PAGE_ID,\n label: `${isAutomotiveServiceRole ? 'Service' : 'Sales'} page`,\n landingPageType: LandingPageType.AUTOMOTIVE,\n typeId: builderLandingPageTypeId,\n };\n};\nexport const prepareTemplateLandingPageOptions = ({\n userData,\n templatesResponse,\n sendVehicle,\n sendQuote,\n}: {\n userData: UserData;\n templatesResponse: GetLandingPagesResponse;\n sendVehicle: boolean;\n sendQuote: boolean;\n}): { options: LandingPageOption[]; autoSelectedOption: LandingPageOption } => {\n const { customer } = userData;\n\n const isAutomotive = checkIfAutomotive(userData);\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSalesRole = checkIfAutomotiveSalesRole(userData);\n\n if (customer.isUsingLandingPageDesign.toString() === '1') {\n return {\n autoSelectedOption: {\n ...templatesResponse.default,\n value: templatesResponse.default.id,\n label: templatesResponse.default.title,\n landingPageType: LandingPageType.AUTOMOTIVE,\n },\n options: templatesResponse.templates.map(lpDesign => ({\n ...lpDesign,\n value: lpDesign.id,\n label: lpDesign.title,\n landingPageType: LandingPageType.AUTOMOTIVE,\n })),\n };\n }\n\n // flag to disable cds landing page, to use vidmails only\n const disableCDSLandingPage = !isAutomotive;\n const salesServicePageOption = getSalesServiceOption(userData);\n // flag to show only custom landing pages (built by our builder)\n const disableStaticLandingPages =\n (isAutomotiveServiceRole && sendQuote) ||\n (isAutomotiveSalesRole && sendVehicle);\n\n let autoSelectedOption = disableCDSLandingPage\n ? defaultLPOption\n : salesServicePageOption;\n const defaultLandingPage = templatesResponse?.default;\n // filter our static lp options from response if static pages disabled, create options\n let options = (templatesResponse?.templates || [])\n .filter(\n (template: any) =>\n !disableStaticLandingPages ||\n template.typeId === builderLandingPageTypeId ||\n template.typeId === QUOTIBLE_LANDING_PAGE_TYPE_ID\n )\n .map((template: any) => ({\n label: template.title,\n value: template.id,\n typeId: template.typeId,\n landingPageType:\n template.typeId !== builderLandingPageTypeId\n ? LandingPageType.VIDMAILS\n : LandingPageType.AUTOMOTIVE,\n }));\n // add automotive LP as option\n if (!disableCDSLandingPage) {\n options = [...options, salesServicePageOption];\n }\n // add default LP as option if static not disabled or default not static\n if (\n defaultLandingPage?.id &&\n (!disableStaticLandingPages ||\n defaultLandingPage?.typeId === builderLandingPageTypeId ||\n defaultLandingPage?.typeId === QUOTIBLE_LANDING_PAGE_TYPE_ID)\n ) {\n const defaultLandingPageOption = {\n label: templatesResponse?.default?.title,\n value: templatesResponse?.default?.id,\n landingPageType:\n defaultLandingPage?.typeId === builderLandingPageTypeId\n ? LandingPageType.AUTOMOTIVE\n : LandingPageType.VIDMAILS,\n typeId: defaultLandingPage?.typeId,\n };\n autoSelectedOption = defaultLandingPageOption;\n options = [...options, defaultLandingPageOption];\n }\n options = uniqBy(options, 'value');\n\n return { options, autoSelectedOption };\n};\n","import React, { Dispatch, SetStateAction, useMemo, useState } from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { CheckboxInput } from 'lib/components';\nimport { VideoShareSetData } from '../InsertVideo';\nimport { debounce } from 'lodash';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\nimport {\n LandingPageOption,\n LINKSET_NONE_OPTION_VALUE,\n QUOTIBLE_LANDING_PAGE_TYPE_ID,\n WEBSITE_OVERLAY_LANDING_PAGE_ID,\n} from '../utils';\nimport { CTASet } from 'lib/api/exitlinksets/useExitLinksetsQuery';\nimport { WebsiteOverlay } from 'lib/api/overlays/useWebsiteOverlayQuery';\n\ntype RowProps = {\n marginBottom?: string;\n};\n\nconst Row = styled.div<RowProps>`\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: ${props => (props.marginBottom ? props.marginBottom : '0')};\n`;\n\nconst CheckboxInputWrapper = styled.div`\n display: flex;\n align-items: center;\n margin-bottom: 16px;\n`;\n\ntype FormGroupProps = {\n marginBottom?: string;\n width?: string;\n};\n\nconst FormGroup = styled.div<FormGroupProps>`\n margin-bottom: ${props => (props.marginBottom ? props.marginBottom : '16px')};\n width: ${props => (props.width ? props.width : 'auto')};\n`;\n\nconst Label = styled.p`\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray60};\n margin: 0 0 8px 0;\n`;\n\nconst CheckboxLabel = styled.label`\n margin-left: 12px;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n color: ${theme.palette.gray100};\n`;\n\nconst AddWebsiteButton = styled.a`\n max-height: 24px;\n font-size: 15px;\n font-weight: 500;\n line-height: 1.6;\n text-align: right;\n color: ${({ theme }) => theme.colors.primary[100]};\n text-decoration: underline;\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst NewWebsiteInput = styled.input`\n width: 100%;\n border-radius: 4px;\n font-size: 15px;\n font-weight: 500;\n line-height: 1.6;\n border: solid 1px ${theme.palette.gray10};\n outline: none;\n padding: 8px 12px;\n`;\n\ntype Props = {\n templatesOptions: LandingPageOption[];\n linksetsData: Array<CTASet>;\n overlaysData: Array<WebsiteOverlay>;\n insertVideoData: VideoShareSetData;\n setInsertVideoData: Dispatch<SetStateAction<VideoShareSetData>>;\n reactionsCustomerEnabled?: boolean;\n};\n\nexport const InsertVideoSettings = ({\n linksetsData,\n templatesOptions,\n overlaysData,\n insertVideoData,\n setInsertVideoData,\n reactionsCustomerEnabled,\n}: Props) => {\n const { t } = useTranslation();\n const {\n showCTAFeature,\n showLandingPageFeature,\n showWebsiteOverlayFeature,\n showReactionsFeature: showReactionsAndCommentsFeature,\n } = useConfigurationContext();\n const [newWebsiteSelected, setNewWebsiteSelected] = useState(false);\n\n const isWebsiteOverlaySelected =\n insertVideoData.templateId === WEBSITE_OVERLAY_LANDING_PAGE_ID;\n\n const websitesOptions = useMemo(() => {\n const data = overlaysData || [];\n\n return data.map(({ id, title }) => ({\n value: id.toString(),\n label: title,\n }));\n }, [overlaysData, showWebsiteOverlayFeature]);\n\n const linksetOptions = useMemo(() => {\n const hasNone = (linksetsData || []).some(\n item => item.id.toString() === LINKSET_NONE_OPTION_VALUE\n );\n\n const options = (linksetsData || []).map(({ id, title }) => ({\n value: id.toString(),\n label: title,\n }));\n\n return hasNone\n ? options\n : [{ value: LINKSET_NONE_OPTION_VALUE, label: 'None' }, ...options];\n }, [linksetsData]);\n\n const setWebsite = debounce(value => {\n isWebsiteOverlaySelected\n ? setInsertVideoData({\n ...insertVideoData,\n overlayId: value,\n })\n : setInsertVideoData({\n ...insertVideoData,\n linksetId: value,\n });\n }, 1000);\n\n const currentTemplate = templatesOptions.find(\n o => o.value === insertVideoData.templateId\n );\n\n const isQuotibleSelected =\n currentTemplate?.typeId === QUOTIBLE_LANDING_PAGE_TYPE_ID;\n\n const showWebsiteOverlayDropdown =\n !newWebsiteSelected && isWebsiteOverlaySelected;\n const showCTADropdown = !newWebsiteSelected && !isWebsiteOverlaySelected;\n\n const websiteOverlayDropdownValue = websitesOptions.find(\n o => o.value === insertVideoData.overlayId?.toString()\n );\n\n const ctaDropdownValue = linksetOptions.find(\n o => o.value === insertVideoData.linksetId?.toString()\n );\n\n return (\n <>\n {showLandingPageFeature && (\n <Row>\n <FormGroup width={'100%'}>\n <Label>{t('Landing Page')}</Label>\n <Dropdown\n value={currentTemplate}\n options={templatesOptions}\n onChange={option => {\n setInsertVideoData({\n ...insertVideoData,\n templateId: parseInt(option.value),\n });\n if (option.value !== WEBSITE_OVERLAY_LANDING_PAGE_ID) {\n setNewWebsiteSelected(false);\n }\n }}\n placeholder={t('Select Landing Page')}\n isSearchable\n creatable={false}\n />\n </FormGroup>\n </Row>\n )}\n {isQuotibleSelected\n ? null\n : (showCTAFeature || isWebsiteOverlaySelected) && (\n <Row>\n <FormGroup width={'100%'} marginBottom={'35px'}>\n <Row>\n <Label>\n {isWebsiteOverlaySelected ? t('Websites') : t('CTAs')}\n </Label>\n {isWebsiteOverlaySelected && (\n <AddWebsiteButton\n onClick={() => setNewWebsiteSelected(prev => !prev)}\n >\n {newWebsiteSelected ? t('Use Existing') : t('Add New')}\n </AddWebsiteButton>\n )}\n </Row>\n {showWebsiteOverlayDropdown && (\n <Dropdown\n aria-label='Website Overlay'\n className='dropdown'\n value={websiteOverlayDropdownValue}\n isClearable\n placeholder={t('No Websites')}\n options={websitesOptions}\n onChange={(selectedItem: any) => {\n setInsertVideoData(prev => ({\n ...prev,\n overlayId: selectedItem?.value || '',\n }));\n }}\n isSearchable\n creatable={false}\n />\n )}\n {showCTADropdown && (\n <Dropdown\n aria-label='CTA'\n className='dropdown'\n value={ctaDropdownValue}\n placeholder={t('No CTAs')}\n options={linksetOptions}\n onChange={(selectedItem: any) => {\n setInsertVideoData(prev => ({\n ...prev,\n linksetId: selectedItem?.value || '',\n }));\n }}\n isSearchable\n creatable={false}\n />\n )}\n\n {isQuotibleSelected\n ? null\n : newWebsiteSelected && (\n <NewWebsiteInput\n type='text'\n placeholder={t('Enter website')}\n onChange={(e: any) => {\n setWebsite(e.target.value);\n }}\n />\n )}\n </FormGroup>\n </Row>\n )}\n {isQuotibleSelected ? null : (\n <FormGroup width={'100%'} marginBottom={'15px'}>\n <Row>\n {showReactionsAndCommentsFeature\n ? reactionsCustomerEnabled && (\n <CheckboxInputWrapper>\n <CheckboxInput\n name='allowReactions'\n width='24px'\n checked={insertVideoData.allowReactions}\n onChange={(e: React.SyntheticEvent) => {\n const { checked } = e.target as HTMLInputElement;\n setInsertVideoData(prev => ({\n ...prev,\n allowReactions: checked,\n }));\n }}\n />\n <CheckboxLabel>\n {t('Enable video reactions & comments')}\n </CheckboxLabel>\n </CheckboxInputWrapper>\n )\n : null}\n </Row>\n </FormGroup>\n )}\n </>\n );\n};\n","import { useQuery } from 'react-query';\nimport { getInventoryItems } from 'lib/api';\nimport { useAuthorizationContext } from 'lib/context';\n\ntype Props = {\n size?: number;\n page?: number;\n sort?: string;\n searchQuery?: string;\n soldFilter?: string;\n videosRecordedFilter?: string;\n countRecorded?: boolean;\n enabled?: boolean;\n};\n\nexport const useGetInventoryItems = ({\n size = 10,\n page = 0,\n sort = '',\n searchQuery = '',\n soldFilter = '',\n videosRecordedFilter = '',\n countRecorded = false,\n enabled = true,\n}: Props) => {\n const { userData } = useAuthorizationContext();\n return useQuery(\n [\n 'inventoryItems',\n userData?.id,\n size,\n page,\n sort,\n searchQuery,\n soldFilter,\n videosRecordedFilter,\n enabled,\n countRecorded,\n ],\n async () =>\n getInventoryItems({\n limit: size,\n start: page * size,\n sort,\n search: searchQuery || '',\n soldFilter,\n videosRecordedFilter,\n countRecorded,\n }),\n {\n refetchOnWindowFocus: false,\n staleTime: !countRecorded ? 3600000 : 0, // 1 hour if video counter not necessary\n enabled,\n refetchOnMount: false,\n refetchOnReconnect: false,\n }\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { theme } from 'lib/style';\nimport styled, { useTheme } from 'styled-components';\nimport Select, { components } from 'react-select';\nimport { IoMdCar } from 'react-icons/io';\nimport { InventoryItem, useAuthorizationContext } from 'lib/context';\nimport { useGetInventoryItems } from 'lib/hooks/query/inventoryItem';\nimport { Button } from 'react-covideo-common';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { debounce } from 'lodash';\nimport { useTranslation } from 'react-i18next';\n\nconst OptionWrapper = styled.div`\n display: flex;\n align-items: center;\n padding-left: 12px;\n`;\nconst OptionLabel = styled.div`\n margin-left: 0px;\n width: 100%;\n`;\nconst CustomOptionLabel = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n`;\nconst Title = styled.div`\n max-width: 100%;\n font-weight: 500;\n font-size: 14px;\n line-height: 24px;\n width: 256px;\n margin-right: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: ${theme.palette.gray100};\n`;\nconst Vin = styled.div`\n font-weight: 400;\n font-size: 14px;\n line-height: 24px;\n color: ${theme.palette.gray60};\n text-align: right;\n`;\nconst SingleValueWrapper = styled.div`\n padding-left: 6px;\n`;\nconst AddVehicleWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: 6px;\n height: 72px;\n border: 1px dashed ${({ theme }) => theme.colors.primary[100]};\n border-radius: 6px;\n &:hover {\n cursor: pointer;\n }\n`;\nconst SelectedVehicleWrapper = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n padding: 16px;\n gap: 8px;\n height: 108px;\n background: ${theme.palette.white};\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 6px;\n`;\nconst SelectedVehicleContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n height: 36px;\n margin-bottom: 5px;\n padding: 0 8px;\n`;\nconst SelectedCarNameContainer = styled.div`\n display: flex;\n align-items: center;\n gap: 8px;\n width: 50%;\n`;\nconst SelectedVehicleButtonContainer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n gap: 4px;\n`;\nconst VehicleSearchWrapper = styled.div`\n background-color: ${theme.palette.white};\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 6px;\n`;\nconst CarInfoText = styled.div<{ color?: string; fontWeight?: string }>`\n font-style: normal;\n font-weight: ${props => props.fontWeight || '500'};\n font-size: 14px;\n line-height: 20px;\n color: ${props => props.color || props.theme.colors.primary[100]};\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n`;\n\nconst DropdownIndicator = (props: any) => {\n return <></>;\n};\n\nconst filterOptions = (\n candidate: { label: string; value: string; data: any },\n input: string\n) => {\n const label = candidate.label.toLowerCase();\n const vin = candidate.data.vin ? candidate.data.vin.toLowerCase() : '';\n const stockNumber = candidate.data.stockNumber\n ? candidate.data.stockNumber.toLowerCase()\n : '';\n const haystack = `${label} ${vin} ${stockNumber}`;\n return haystack.includes(input.toLowerCase());\n};\nconst Option = (props: any) => {\n return (\n <OptionWrapper>\n <OptionLabel>\n <components.Option {...props} />\n </OptionLabel>\n </OptionWrapper>\n );\n};\n\ntype OptionLabelProps = {\n value: string;\n label: string;\n vin: string;\n};\nconst formatOptionLabel = ({ label, vin }: OptionLabelProps) => (\n <CustomOptionLabel>\n <Title>{label}</Title>\n <Vin> {vin}</Vin>\n </CustomOptionLabel>\n);\n\nconst SingleValue = ({ children, ...props }: any) => {\n return <SingleValueWrapper>{props.data.label}</SingleValueWrapper>;\n};\n\nconst NoOptionsMessage = (props: any) => {\n const { t } = useTranslation();\n return (\n <components.NoOptionsMessage {...props}>\n {t(' No vehicles found, try entering a different name or VIN.')}\n </components.NoOptionsMessage>\n );\n};\n\ntype Props = {\n onChangeVehicle: (item: InventoryItem) => void;\n handleChangeVehicleButtonPress?: () => void;\n handleRemoveVehicleButtonPress?: () => void;\n setAddingVehicle?: Function;\n selectedVin?: string;\n placeholder?: string;\n fetchSold?: boolean;\n addingVehicle?: boolean;\n};\n\nexport const VehicleSearch = ({\n onChangeVehicle,\n handleChangeVehicleButtonPress,\n handleRemoveVehicleButtonPress,\n setAddingVehicle,\n selectedVin = '',\n placeholder,\n fetchSold = true,\n addingVehicle = true,\n}: Props) => {\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n const { colors, isCdkEnviroment } = useTheme();\n const hasIMS = !!userData?.customer.isIMSEnabled;\n const [vehicleTitle, setVehicleTitle] = useState('');\n const [searchInventoryQuery, setSearchInventoryQuery] = useState(selectedVin);\n const { showUpgradeMessageFeature } = useConfigurationContext();\n\n const selectStyle = {\n control: (styles: any, state: any) => ({\n ...styles,\n height: '40px',\n boxShadow: 'none',\n borderColor: state.isFocused ? colors.primary[100] : theme.palette.gray40,\n ':hover': {\n borderColor: colors.primary[100],\n },\n ':focus': {\n borderColor: colors.primary[100],\n },\n ':active': {\n borderColor: colors.primary[100],\n },\n }),\n option: (base: any) => ({\n ...base,\n backgroundColor: 'transparent',\n color: theme.palette.gray100,\n padding: '8px',\n cursor: 'pointer',\n ':hover': {\n backgroundColor: 'transparent',\n opacity: '.8',\n },\n ':focus': {\n backgroundColor: 'transparent',\n opacity: '.8',\n },\n }),\n indicatorSeparator: () => ({ display: 'none' }),\n valueContainer: (base: any) => ({\n ...base,\n padding: 4,\n overflow: 'show',\n }),\n };\n\n const { data } = useGetInventoryItems({\n searchQuery: searchInventoryQuery,\n countRecorded: false,\n enabled: hasIMS,\n soldFilter: fetchSold ? '2' : '0',\n });\n const items = data ? data.items : [];\n\n useEffect(() => {\n setSearchInventoryQuery(selectedVin);\n }, [selectedVin]);\n\n useEffect(() => {\n if (!data || selectedVin === '') {\n return;\n }\n\n if (items) {\n const selectedVehicleList = items.filter(\n (item: any) => item.vin === selectedVin\n );\n if (!selectedVehicleList.length) {\n handleRemoveVehicleButtonPress?.();\n setVehicleTitle('');\n return;\n }\n setVehicleTitle(selectedVehicleList[0].title);\n }\n }, [items, selectedVin]);\n\n const debouncedSearch = useRef(\n debounce((input: string) => setSearchInventoryQuery(input), 500)\n ).current;\n\n const onInputChange = (input: string) => {\n if (input.length < 2) return;\n debouncedSearch(input);\n };\n\n const options = items.map(v => {\n return {\n ...v,\n value: v.vin,\n label: v.title,\n };\n });\n\n if (!hasIMS) {\n if (!showUpgradeMessageFeature) {\n return null;\n }\n return (\n <>\n {t(\n 'To enable the integration with your Inventory Management System, please call us at'\n )}{' '}\n <br />\n <a href='tel:8003061445'>800-306-1445</a>\n </>\n );\n }\n\n return addingVehicle ? (\n <VehicleSearchWrapper>\n <Select\n components={{\n Option,\n DropdownIndicator,\n SingleValue,\n NoOptionsMessage,\n }}\n styles={selectStyle}\n options={options}\n value={options.find((o: any) => {\n return o.value === selectedVin;\n })}\n onChange={(option: any) => {\n onChangeVehicle(option || undefined);\n setVehicleTitle(option?.title || '');\n }}\n autoFocus={true}\n isSearchable={true}\n isClearable={true}\n placeholder={placeholder}\n filterOption={filterOptions}\n formatOptionLabel={formatOptionLabel}\n onInputChange={onInputChange}\n />\n </VehicleSearchWrapper>\n ) : selectedVin ? (\n <SelectedVehicleWrapper>\n <SelectedVehicleContainer>\n <SelectedCarNameContainer>\n <IoMdCar size={20} color={colors.primary[40]} />\n <CarInfoText>{vehicleTitle}</CarInfoText>\n </SelectedCarNameContainer>\n <CarInfoText color={colors.primary[40]} fontWeight={'400'}>\n {selectedVin}\n </CarInfoText>\n </SelectedVehicleContainer>\n <SelectedVehicleButtonContainer>\n <Button\n onClick={() => {\n handleChangeVehicleButtonPress?.();\n setVehicleTitle('');\n }}\n text={t('Change')}\n variant='primary'\n size='small'\n />\n <Button\n onClick={() => {\n handleRemoveVehicleButtonPress?.();\n setVehicleTitle('');\n }}\n text={t('Remove')}\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n size='small'\n />\n </SelectedVehicleButtonContainer>\n </SelectedVehicleWrapper>\n ) : (\n <AddVehicleWrapper onClick={() => setAddingVehicle?.(true)}>\n <IoMdCar size={20} color={colors.primary[100]} />\n {t('Add Vehicle')}\n </AddVehicleWrapper>\n );\n};\n","import { UserData } from 'lib/context';\n\nexport const checkIfCustomerReactionsEnabled = (userData: UserData) => {\n return !!(\n userData.customer?.reactionsPreference &&\n userData.customer.reactionsPreference.toString() !== '0'\n );\n};\n\nexport const checkIfReactionsEnabledByDefault = (userData: UserData) => {\n return !!(\n (userData.reactionsPreference &&\n userData.reactionsPreference.toString() === '1') ||\n (userData.reactionsPreference === null &&\n userData.customer?.reactionsPreference &&\n userData.customer.reactionsPreference.toString() === '1')\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\ntype PreviewVideoProps = {\n width: string;\n numberOfStills: number;\n};\nconst PreviewVideo = styled.video<PreviewVideoProps>`\n height: auto;\n width: ${props => props.width};\n object-fit: cover;\n object-position: center;\n &:nth-child(1) {\n border-radius: 6px 0 0 6px;\n }\n &:nth-child(${({ numberOfStills }) => numberOfStills}) {\n border-radius: 0 6px 6px 0;\n }\n`;\nconst PreviewVideoWrapper = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n height: 48px;\n overflow: hidden;\n display: flex;\n flex-wrap: nowrap;\n`;\ntype VideoPreviewTrackProps = {\n videoSource: string;\n videoDuration: number;\n numberOfStills: number;\n};\nexport const VideoPreviewTrack = ({\n videoSource,\n videoDuration,\n numberOfStills,\n}: VideoPreviewTrackProps) => {\n let refArray = [] as any;\n const videoWidthPercent = 100 / numberOfStills;\n\n for (let i = 0; i < numberOfStills; i++) {\n refArray.push(React.createRef<HTMLVideoElement>());\n }\n\n useEffect(() => {\n refArray.forEach((ref: any, index: number) => {\n if (ref.current) {\n ref.current.currentTime = videoDuration * (index / numberOfStills);\n }\n });\n }, [refArray]);\n\n return (\n <PreviewVideoWrapper>\n {refArray.map((ref: any, index: number) => (\n <PreviewVideo\n key={`previewvideoRef-${index}`}\n ref={ref}\n src={videoSource}\n width={`${videoWidthPercent}%`}\n numberOfStills={numberOfStills}\n playsInline={true}\n controls={false}\n />\n ))}\n </PreviewVideoWrapper>\n );\n};\n","import React, { Fragment } from 'react';\nimport { GetRailProps } from 'react-compound-slider';\nimport styled from 'styled-components';\nconst RailOuter = styled.div`\n position: absolute;\n width: 100%;\n height: 48px;\n cursor: pointer;\n`;\nconst RailInner = styled.div`\n position: absolute;\n width: 100%;\n height: 48px;\n pointer-events: none;\n background-color: rgba(0, 27, 83, 0.15);\n border-radius: 6px;\n`;\ninterface SliderRailProps {\n getRailProps: GetRailProps;\n}\nexport const SliderRail: React.FC<SliderRailProps> = ({ getRailProps }) => (\n <Fragment>\n <RailOuter {...getRailProps()} />\n <RailInner />\n </Fragment>\n);\n","import React, { Fragment } from 'react';\nimport { toMMSS } from 'lib/utils/functions';\nimport { SliderItem, GetHandleProps } from 'react-compound-slider';\nimport { theme } from 'lib/style';\nimport styled, { useTheme } from 'styled-components';\ntype MainHandleProps = {\n percent: string;\n transform: string;\n};\nconst MainHandle = styled.div<MainHandleProps>`\n left: ${props => props.percent};\n position: absolute;\n transform: ${props => props.transform};\n z-index: 400;\n width: 24px;\n height: 48px;\n cursor: pointer;\n`;\ntype SliderProps = {\n percent: string;\n isDisabled?: boolean;\n transform: string;\n borderRadius: string;\n};\nconst Slider = styled.div<SliderProps>`\n left: ${props => props.percent};\n background-color: ${props =>\n props.isDisabled ? '#666' : props.theme.colors.primary[100]};\n position: absolute;\n transform: ${props => props.transform};\n z-index: 2;\n width: 24px;\n height: 48px;\n border-radius: ${props => props.borderRadius};\n &:before {\n content: '';\n position: absolute;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n width: 4px;\n height: 12px;\n background: ${theme.palette.white};\n border-radius: 4px;\n }\n`;\ninterface HandleProps {\n isActive: boolean;\n domain: number[];\n handle: SliderItem;\n getHandleProps: GetHandleProps;\n disabled?: boolean;\n videoSource: string;\n videoRef: any;\n nChild: number;\n changeVideoPosition?: boolean;\n showFloatingPreview?: boolean;\n}\nexport const Handle = (props: HandleProps) => {\n const { colors } = useTheme();\n const {\n domain: [min, max],\n handle: { id, value, percent },\n showFloatingPreview = true,\n isActive,\n disabled,\n getHandleProps,\n videoRef,\n changeVideoPosition = true,\n nChild,\n } = props;\n const [mouseOver, setMouseOver] = React.useState(false);\n\n const previewvideoRef = React.createRef<HTMLVideoElement>();\n\n const onMouseEnter = () => {\n setMouseOver(true);\n };\n\n const onMouseLeave = () => {\n setMouseOver(false);\n };\n\n React.useEffect(() => {\n if (isActive) {\n if (showFloatingPreview) {\n previewvideoRef!.current!.currentTime = value ? value : 0;\n }\n if (changeVideoPosition) {\n videoRef!.current!.currentTime = value ? value : 0;\n }\n }\n }, [value, previewvideoRef, changeVideoPosition, videoRef]);\n\n const seconds = toMMSS(value).split('.')[0];\n const miliseconds = toMMSS(value).split('.')[1];\n\n return (\n <Fragment>\n {showFloatingPreview && (\n <>\n {(mouseOver || isActive) && !disabled ? (\n <div\n style={{\n left: `${percent}%`,\n position: 'absolute',\n marginLeft: '-15px',\n marginTop: '52px',\n zIndex: 1,\n }}\n >\n <div\n style={{\n width: 0,\n height: 0,\n marginLeft: 21,\n borderLeft: '6px solid transparent',\n borderRight: '6px solid transparent',\n borderBottom: `6px solid `,\n }}\n />\n <div\n style={{\n width: 'auto',\n padding: 4,\n fontSize: 12,\n fontWeight: 500,\n letterSpacing: 0.34,\n backgroundColor: colors.primary[100],\n color: '#fff',\n textAlign: 'center',\n zIndex: 99999,\n }}\n >\n {seconds}\n <span\n style={{\n fontSize: 9,\n fontWeight: 400,\n letterSpacing: 0.34,\n color: '#fff',\n opacity: 0.7,\n }}\n >\n {'.' + miliseconds}\n </span>\n </div>\n </div>\n ) : null}\n <div\n style={{\n left: `${percent}%`,\n position: 'absolute',\n marginLeft: '-38px',\n marginTop: '-92px',\n zIndex: 3,\n visibility:\n (mouseOver || isActive) && !disabled ? 'visible' : 'hidden',\n }}\n >\n <div\n style={{\n width: 141,\n height: 80,\n border: `solid 2px ${colors.primary[100]}`,\n backgroundColor: theme.palette.themeDark75Percent,\n display: 'flex',\n justifyContent: 'center',\n }}\n >\n <video\n key='previewvideoRef'\n ref={previewvideoRef}\n height={'100%'}\n src={props.videoSource}\n playsInline={true}\n controls={false}\n />\n </div>\n </div>\n </>\n )}\n <MainHandle\n percent={`${percent}%`}\n {...getHandleProps(id)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n transform={nChild === 0 ? 'translate(0px,0%)' : 'translate(-15px,0%)'}\n />\n <Slider\n role='slider'\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n percent={`${percent}%`}\n borderRadius={nChild === 0 ? '5px 0px 0px 5px;' : '0px 5px 5px 0px'}\n isDisabled={disabled}\n transform={nChild === 0 ? 'translate(0px,0%)' : 'translate(-15px,0%)'}\n />\n </Fragment>\n );\n};\n","import React from 'react';\nimport { SliderItem, GetTrackProps } from 'react-compound-slider';\n\ninterface TrackProps {\n source: SliderItem;\n target: SliderItem;\n getTrackProps: GetTrackProps;\n disabled?: boolean;\n}\n\nexport const Track: React.FC<TrackProps> = ({\n source,\n target,\n getTrackProps,\n disabled,\n}) => {\n return (\n <>\n <div\n style={{\n position: 'absolute',\n height: 48,\n zIndex: 1,\n backgroundColor: disabled ? '#999' : 'rgba(0,0,0,.7)',\n cursor: 'pointer',\n left: `0`,\n width: `${source.percent + 1}%`,\n borderRadius: '6px 0 0 6px',\n }}\n {...getTrackProps()}\n />\n <div\n style={{\n position: 'absolute',\n height: 48,\n zIndex: 1,\n backgroundColor: disabled ? '#999' : 'transparent',\n cursor: 'pointer',\n left: `${source.percent}%`,\n width: `${target.percent - source.percent}%`,\n borderRadius: 6,\n }}\n {...getTrackProps()}\n />\n <div\n style={{\n position: 'absolute',\n height: 48,\n zIndex: 1,\n backgroundColor: disabled ? '#999' : 'rgba(0,0,0,.7)',\n cursor: 'pointer',\n left: `${target.percent}%`,\n width: `${100 - target.percent}%`,\n borderRadius: '0 6px 6px 0',\n }}\n {...getTrackProps()}\n />\n </>\n );\n};\n","import React from 'react';\nimport { toMMSS } from 'lib/utils/functions';\n\nimport { SliderItem } from 'react-compound-slider';\nimport { theme } from 'lib/style';\n\ninterface TickProps {\n tick: SliderItem;\n count: number;\n format?: (val: number) => string;\n}\n\nexport const Tick: React.FC<TickProps> = ({ tick, count }) => {\n return (\n <div>\n <div\n style={{\n position: 'absolute',\n width: 2,\n height: 48,\n opacity: 0.4,\n backgroundColor: theme.palette.blackRgb60,\n left: `${tick.percent}%`,\n zIndex: 1,\n }}\n />\n <div\n style={{\n position: 'absolute',\n marginTop: 52,\n fontSize: 10,\n textAlign: 'center',\n marginLeft: `${-(100 / count) / 2}%`,\n width: `${100 / count}%`,\n left: `${tick.percent}%`,\n }}\n >\n {toMMSS(tick.value).split('.')[0]}\n </div>\n </div>\n );\n};\n","import * as React from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport {\n Slider,\n Rail,\n Handles,\n Tracks,\n Ticks,\n TracksObject,\n TicksObject,\n SliderItem,\n TrackItem,\n HandlesObject,\n RailObject,\n} from 'react-compound-slider';\nimport { VideoPreviewTrack } from './VideoPreviewTrack';\nimport { SliderRail } from './SliderRail';\nimport { Handle } from './Handle';\nimport { Track } from './Track';\nimport { Tick } from './Tick';\n\ntype WrapProps = {\n width: string;\n};\nconst Wrap = styled.div<WrapProps>`\n position: relative;\n width: ${props => props.width};\n height: 48px;\n`;\n\ntype Props = {\n videoDuration: number;\n videoRef: any;\n videoSource: string;\n setTrimDuration?: any;\n setStart?: any;\n value: any;\n setValue: any;\n addHistory?: any;\n onSlideEnd?: any;\n valueRef: React.MutableRefObject<Array<number>>;\n showTickTime?: boolean;\n changeVideoPosition?: boolean;\n showFloatingPreview?: boolean;\n width: string;\n showPreviewTrack?: boolean;\n};\n\nconst VideoPreviewMemo = React.memo(VideoPreviewTrack);\n\nexport const TimelineRange = (props: Props) => {\n const { colors } = useTheme();\n const {\n videoDuration,\n videoSource,\n setTrimDuration = () => {},\n setStart = () => {},\n value,\n setValue,\n addHistory = () => {},\n onSlideEnd = () => {},\n valueRef,\n videoRef,\n showTickTime = true,\n changeVideoPosition = true,\n showFloatingPreview = true,\n width,\n\n showPreviewTrack = true,\n } = props;\n\n const domain = [0, videoDuration];\n\n React.useEffect(() => {\n const duration = videoDuration ? videoDuration : 0;\n const initialValues = [0, duration];\n // update value if endTime in undefined\n if (!value[1]) {\n setValue(initialValues);\n }\n }, [videoDuration]);\n\n React.useEffect(() => {\n if (videoRef && videoRef.current) {\n videoRef.current.addEventListener('play', (e: any) => onPlay(e));\n videoRef.current.addEventListener('timeupdate', (e: any) =>\n onTimeupdate(e)\n );\n }\n return () => {\n if (videoRef && videoRef.current) {\n videoRef.current.removeEventListener('play', (e: any) => onPlay(e));\n videoRef.current.removeEventListener('timeupdate', (e: any) =>\n onTimeupdate(e)\n );\n }\n };\n }, [videoRef]);\n\n const onTimeupdate = (event: Event) => {\n const video = event.target as HTMLVideoElement;\n if (video.currentTime > valueRef.current[1] && valueRef.current[1] != 0) {\n video.pause();\n }\n };\n\n const onPlay = (event: Event) => {\n const video = event.target as HTMLVideoElement;\n if (video.currentTime >= valueRef.current[1]) {\n //on trim end set start time\n video.currentTime = valueRef.current[0];\n } else if (video.currentTime < valueRef.current[0]) {\n // go to trim start if currentTime less\n video.currentTime = valueRef.current[0];\n }\n };\n\n const onChange = (values: ReadonlyArray<number>) => {\n if (!isNaN(values[0]) && !isNaN(values[1])) {\n const newValue = values.slice();\n addHistory(newValue);\n setValue(newValue);\n valueRef.current = newValue;\n }\n };\n\n const onUpdate = (update: ReadonlyArray<number>) => {\n setTrimDuration(update[1] - update[0]);\n setStart(update[0]);\n };\n\n const onSlideEndHandle = (args: any) => {\n onSlideEnd(args);\n };\n\n const numberOfStills = 14;\n const tickCount = 10;\n\n const duration = React.useMemo(() => {\n return videoDuration;\n }, [videoDuration]);\n\n const sliderStyle = {\n position: 'relative' as 'relative',\n width: '100%',\n backgroundColor: colors.primary[40],\n };\n\n return (\n <Wrap width={width}>\n <Slider\n rootStyle={sliderStyle}\n mode={1}\n step={0.0000001}\n domain={domain}\n reversed={false}\n onChange={onChange}\n onUpdate={onUpdate}\n values={value}\n onSlideEnd={onSlideEndHandle}\n >\n {showPreviewTrack && (\n <VideoPreviewMemo\n numberOfStills={numberOfStills}\n videoSource={videoSource}\n videoDuration={duration}\n />\n )}\n <Rail>{(railProps: RailObject) => <SliderRail {...railProps} />}</Rail>\n <Handles>\n {({ handles, activeHandleID, getHandleProps }: HandlesObject) => (\n <div className='slider-handles'>\n {handles.map((handle: SliderItem, index: number) => (\n <Handle\n showFloatingPreview={showFloatingPreview}\n nChild={index}\n key={handle.id}\n handle={handle}\n domain={domain}\n isActive={handle.id === activeHandleID}\n getHandleProps={getHandleProps}\n videoSource={videoSource}\n videoRef={videoRef}\n changeVideoPosition={changeVideoPosition}\n />\n ))}\n </div>\n )}\n </Handles>\n <Tracks left={false} right={false}>\n {({ tracks, getTrackProps }: TracksObject) => (\n <div className='slider-tracks'>\n {tracks.map(({ id, source, target }: TrackItem) => {\n return (\n <Track\n key={id}\n source={source}\n target={target}\n getTrackProps={getTrackProps}\n />\n );\n })}\n </div>\n )}\n </Tracks>\n {showTickTime && (\n <Ticks count={tickCount}>\n {({ ticks }: TicksObject) => (\n <div className='slider-ticks'>\n {ticks.map((tick: SliderItem) => (\n <Tick key={tick.id} tick={tick} count={ticks.length} />\n ))}\n </div>\n )}\n </Ticks>\n )}\n </Slider>\n </Wrap>\n );\n};\n","import React from 'react';\nimport { TimelineRange } from './TimelineRange';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useTranslation } from 'react-i18next';\n\ntype TrimProps = {\n videoDuration: number;\n videoRef: any;\n videoSource: string;\n value: number[];\n setValue: (arg1: number[]) => void;\n valueRef: React.MutableRefObject<Array<number>>;\n isVideoTrimmed: boolean;\n isVideoLoading?: boolean;\n};\n\nconst TrimmedContainer = styled.div`\n margin-top: 8px;\n font-weight: 400;\n color: ${theme.palette.covideoGray100};\n\n span {\n text-decoration: underline;\n cursor: pointer;\n }\n`;\n\nconst DisabledTimelineRange = styled(TimelineRange)`\n height: 48px;\n width: 100%;\n background-color: ${theme.palette.gray10};\n`;\n\nconst Trim = ({\n videoRef,\n videoDuration,\n videoSource,\n setValue,\n value,\n isVideoTrimmed,\n valueRef,\n isVideoLoading = true,\n}: TrimProps) => {\n const { t } = useTranslation();\n return (\n <>\n {!isVideoLoading ? (\n <TimelineRange\n width={'100%'}\n videoRef={videoRef}\n videoDuration={videoDuration}\n videoSource={videoSource}\n setValue={setValue}\n value={value}\n valueRef={valueRef}\n showTickTime={false}\n showFloatingPreview={false}\n />\n ) : (\n <DisabledTimelineRange\n width='100%'\n videoRef={null}\n videoDuration={0}\n videoSource={''}\n setValue={setValue}\n value={[0, 0]}\n valueRef={valueRef}\n showTickTime={false}\n showFloatingPreview={false}\n />\n )}\n\n {isVideoTrimmed && (\n <TrimmedContainer>\n {t('Trimmed.')}\n <span\n style={{ marginLeft: 8 }}\n onClick={() => {\n setValue([0, videoDuration]);\n if (valueRef.current) valueRef.current = [0, videoDuration];\n if (videoRef.current) videoRef.current.currentTime = 0;\n }}\n >\n {t('Revert to Original')}\n </span>\n </TrimmedContainer>\n )}\n </>\n );\n};\n\nexport default Trim;\n","import { VideoListItem } from 'lib/api';\nimport { Spinner } from 'lib/components';\nimport { ModalQuickShareMarkAsSent } from 'lib/components/modal/ModalQuickShareMarkAsSent';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport { VIDE0_ACTIVITY_TYPE } from 'lib/const/VideoActivity';\nimport { useAuthorizationContext, VideoListAutomotiveItem } from 'lib/context';\nimport { useQuickShare } from 'lib/hooks/useQuickShare';\nimport { getMarkAsSentValue } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useState } from 'react';\nimport { IoMdAdd } from 'react-icons/io';\nimport { VideoShareSetData } from '../InsertVideo';\nimport { Button } from 'react-covideo-common';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n video?: VideoListAutomotiveItem | VideoListItem;\n disable: boolean;\n getMarkAsSentPayload: () => {\n videoShareSetData: VideoShareSetData;\n useAutomotive: boolean;\n };\n onCRMClick?: () => void;\n};\n\nexport const InsertButton = ({\n video,\n getMarkAsSentPayload,\n disable,\n onCRMClick,\n}: Props) => {\n const { t } = useTranslation();\n const { isCdkEnviroment } = useTheme();\n const { userData } = useAuthorizationContext();\n const markAsSent = getMarkAsSentValue(userData);\n const [insertingVideo, setInsertingVideo] = useState(false);\n const [showModalQuickShareMarkAsSent, setShowModalQuickShareMarkAsSent] =\n useState(false);\n const handleOnMarkAsSentSuccessCallback = () => {\n setInsertingVideo(false);\n };\n const {\n onQuickShareMutationHandler,\n isQuickshareLoading,\n onQuickShareButtonClick,\n } = useQuickShare({\n video,\n videoRequest: video?.videoRequest as any,\n setShowModalQuickShareMarkAsSent,\n handleOnMarkAsSentSuccessCallback,\n });\n\n const onClick = () => {\n onCRMClick?.();\n // open modal if ask every time\n if (markAsSent === MarkAsSentOptions.ASK_VERY_TIME.value) {\n onQuickShareButtonClick({\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n toastType: 'insert',\n });\n return;\n }\n setInsertingVideo(true);\n const payload = getMarkAsSentPayload();\n onQuickShareButtonClick({\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n toastType: 'insert',\n ...payload.videoShareSetData,\n useAutomotive: payload.useAutomotive,\n });\n };\n\n const modalGetMarkAsSentPayload = async () => {\n setInsertingVideo(true);\n const payload = getMarkAsSentPayload();\n return payload;\n };\n\n return (\n <>\n <Button\n onClick={onClick}\n text={t('Insert')}\n variant={isCdkEnviroment ? 'white' : 'primary'}\n disabled={disable || insertingVideo}\n icon={insertingVideo ? <Spinner size={12} /> : <IoMdAdd size={18} />}\n />\n\n {showModalQuickShareMarkAsSent && (\n <ModalQuickShareMarkAsSent\n markAsSentPayload={{ toastType: 'insert' }}\n isQuickShareLoading={isQuickshareLoading}\n quickShareMarkAsSentHandler={onQuickShareMutationHandler}\n handleModalClose={async () => {\n setShowModalQuickShareMarkAsSent(false);\n }}\n getMarkAsSentPayload={modalGetMarkAsSentPayload}\n />\n )}\n </>\n );\n};\n","import { VideoListItem } from 'lib/api';\nimport { Spinner } from 'lib/components';\nimport { ModalQuickShareMarkAsSent } from 'lib/components/modal/ModalQuickShareMarkAsSent';\nimport { MarkAsSentOptions } from 'lib/const/MarkAsSentOptions';\nimport { VIDE0_ACTIVITY_TYPE } from 'lib/const/VideoActivity';\nimport { useAuthorizationContext, VideoListAutomotiveItem } from 'lib/context';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useQuickShare } from 'lib/hooks/useQuickShare';\nimport { screenSizes } from 'lib/style/theme';\nimport { getMarkAsSentValue } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useState } from 'react';\nimport { IoIosShareAlt } from 'react-icons/io';\nimport { VideoShareSetData } from '../InsertVideo';\nimport { Button } from 'react-covideo-common';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\ntype Props = {\n video?: VideoListAutomotiveItem | VideoListItem;\n disable: boolean;\n getMarkAsSentPayload: () => {\n videoShareSetData: VideoShareSetData;\n useAutomotive: boolean;\n };\n onCRMClick?: () => void;\n};\n\nexport const CopyVideoButton = ({\n video,\n getMarkAsSentPayload,\n disable,\n onCRMClick,\n}: Props) => {\n const { t } = useTranslation();\n const { isCdkEnviroment } = useTheme();\n const { containerWidth } = useConfigurationContext();\n const { userData } = useAuthorizationContext();\n const markAsSent = getMarkAsSentValue(userData);\n const [copyingVideo, setCopyingVideo] = useState(false);\n const [showModalQuickShareMarkAsSent, setShowModalQuickShareMarkAsSent] =\n useState(false);\n const handleOnMarkAsSentSuccessCallback = () => {\n setCopyingVideo(false);\n };\n const {\n onQuickShareMutationHandler,\n isQuickshareLoading,\n onQuickShareButtonClick,\n } = useQuickShare({\n video,\n videoRequest: video?.videoRequest as any,\n setShowModalQuickShareMarkAsSent,\n handleOnMarkAsSentSuccessCallback,\n });\n const onClick = async () => {\n onCRMClick?.();\n // open modal if ask every time\n if (markAsSent === MarkAsSentOptions.ASK_VERY_TIME.value) {\n onQuickShareButtonClick({\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n toastType: 'quickshare',\n });\n return;\n }\n setCopyingVideo(true);\n const payload = getMarkAsSentPayload();\n onQuickShareButtonClick({\n videoActivityType: VIDE0_ACTIVITY_TYPE.QUICKSHARE,\n toastType: 'quickshare',\n ...payload.videoShareSetData,\n useAutomotive: payload.useAutomotive,\n });\n };\n\n const modalGetMarkAsSentPayload = async () => {\n setCopyingVideo(true);\n const payload = getMarkAsSentPayload();\n return payload;\n };\n\n return (\n <>\n <Button\n variant={isCdkEnviroment ? 'white' : 'secondary'}\n onClick={onClick}\n text={containerWidth > screenSizes.sm ? t('Copy Video') : t('Copy')}\n disabled={disable || copyingVideo}\n icon={\n copyingVideo ? <Spinner size={12} /> : <IoIosShareAlt size={18} />\n }\n />\n\n {showModalQuickShareMarkAsSent && (\n <ModalQuickShareMarkAsSent\n markAsSentPayload={{ toastType: 'quickshare' }}\n isQuickShareLoading={isQuickshareLoading}\n quickShareMarkAsSentHandler={onQuickShareMutationHandler}\n handleModalClose={async () => {\n setShowModalQuickShareMarkAsSent(false);\n }}\n getMarkAsSentPayload={modalGetMarkAsSentPayload}\n />\n )}\n </>\n );\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useQuery } from 'react-query';\n\nexport type GetLandingPagesParams = {\n search?: string;\n start?: number;\n limit?: number;\n showUserCustomLandingPages?: boolean;\n};\nexport type LandingPage = {\n id: number;\n title: string;\n thumbnailURL: string;\n typeId?: number;\n landingPage?: {\n [key: string]: any;\n };\n};\n\nexport type GetLandingPagesResponse = {\n templates: LandingPage[];\n default: LandingPage;\n count: number;\n};\n\nconst getLandingPages = async (\n params?: GetLandingPagesParams\n): Promise<GetLandingPagesResponse> => {\n const response = await EXPRESS_API.get('/templates', {\n params,\n });\n return response.data;\n};\n\nexport const useGetTemplatesQuery = (\n params?: GetLandingPagesParams,\n enabled?: boolean\n) => {\n const { userData } = useAuthorizationContext();\n return useQuery(\n ['TEMPLATES', params, userData?.id],\n () => getLandingPages(params),\n {\n enabled: enabled || true,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n }\n );\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\nimport { InventoryItem } from 'react-covideo-ai-assist/dist/ai-assist/types';\n\nexport interface IVideoItemResponse {\n id: number;\n flvName: string;\n title: string;\n autogeneratedThumbnail: string;\n videoSource: string;\n videoLength: number;\n sendReply: number;\n processing: number;\n wtvId: number;\n protected: number;\n autogeneratedGif: string;\n recordDate: string;\n reactionsPreference: null;\n userId: number;\n chapters: null;\n videoReplyEnabled: number;\n folder: string;\n isGuide: number;\n pinnedVideo: PinnedVideo;\n playButtonPosition: string;\n playerBackgroundColor: string;\n playerIconsAndTextColor: string;\n personalThumbnail: string;\n videoRequest: VideoRequest;\n}\n\nexport interface PinnedVideo {}\n\nexport interface VideoRequest {\n videoRequestId: number;\n userId: number;\n advisorId: number;\n customerId: number;\n videoId: number;\n videoType: string;\n repairOrderNumber: string;\n vin: null;\n automotiveDepartment: number;\n sharedWithCompany: boolean;\n note: null;\n deniedNote: null;\n customerName: string;\n status: string;\n emailStatus: string;\n createdAt: Date;\n deletedAt: null;\n inventoryItem: InventoryItem;\n}\n\nexport const getVideo = async (\n videoId: string\n): Promise<IVideoItemResponse> => {\n const response = await EXPRESS_API.get(`/videos/${videoId}`);\n return response.data;\n};\n\nexport const useVideoQuery = (videoId: string) => {\n return useQuery(['VIDEO', videoId], () => getVideo(videoId), {\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n });\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\n\nexport type ValidTinyInt = 0 | 1;\nexport type CustomerAndUserIds = {\n customerId: number;\n userId: number;\n};\nexport type CTA = CustomerAndUserIds & {\n id: number;\n ctaSetId: number;\n type: string;\n linkText: string;\n linkValue: string;\n autoOpen: boolean;\n linkPosition: number;\n newWindow: ValidTinyInt;\n fileTitle: string;\n fileThumbnail: string;\n itemType: string;\n};\n\nexport type CTASet = CustomerAndUserIds & {\n id: number;\n company: ValidTinyInt;\n title: string;\n defaultLinks: ValidTinyInt;\n links: CTA[];\n};\n\nexport type GetCtaSetParams = {\n search?: string;\n start?: number;\n limit?: number;\n};\n\nexport type GetCtaSetResponse = {\n linksets: CTASet[];\n default: CTASet;\n};\n\nexport const getCTASets = async (\n params: GetCtaSetParams\n): Promise<GetCtaSetResponse> => {\n const { search = '', start = 0, limit = 0 } = params;\n const response = await EXPRESS_API.get('/exitlinksets', {\n params: {\n search,\n start,\n limit,\n },\n });\n return response.data;\n};\n\nexport const useExitLinksetsQuery = (params: GetCtaSetParams) => {\n return useQuery(['EXIT_LINKSETS'], () => getCTASets(params), {\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n });\n};\n","// Website Overlay Urls\n\nimport { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\n\nexport type GetLandingPagesParams = {\n search?: string;\n start?: number;\n limit?: number;\n showUserCustomLandingPages?: boolean;\n};\n\nexport type WebsiteOverlay = {\n id: number;\n url: string;\n title: string;\n defaultflag: 0 | 1;\n fileThumbnail: string;\n fileTitle: string;\n type: string;\n itemType: string;\n};\n\nexport type GetWebsiteOverlaysParams = GetLandingPagesParams;\n\nexport type GetWebsiteOverlaysResponse = {\n websiteUrls: WebsiteOverlay[];\n default: WebsiteOverlay;\n count: number;\n};\n\nexport const getWebsiteOverlays = async (\n params: GetWebsiteOverlaysParams\n): Promise<GetWebsiteOverlaysResponse> => {\n const response = await EXPRESS_API.get('/overlays', { params });\n return response.data;\n};\n\nexport const useWebsiteOverlayQuery = (params: GetWebsiteOverlaysParams) => {\n return useQuery(['WEBSITE_OVERLAY'], () => getWebsiteOverlays(params), {\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n });\n};\n","import { useEffect, useRef } from 'react';\nimport { TopBar } from 'lib/components/TopBar';\nimport styled, { css, useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useAuthorizationContext, InventoryItem } from 'lib/context';\nimport { trimVideo } from 'lib/api';\nimport {\n Container,\n LoadingIndicator,\n Spinner,\n useToastNotifications,\n} from 'lib/components';\nimport { useState } from 'react';\nimport {\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { MdArrowBack, MdContentCut } from 'react-icons/md';\nimport { useHistory, useParams } from 'react-router';\nimport { InsertVideoSettings, VehicleSearch } from './components';\nimport { VideoPlayer } from '../video/components/videoPlayer';\nimport { IoMdCalendar } from 'react-icons/io';\nimport { Button } from 'react-covideo-common';\nimport {\n checkIfCustomerReactionsEnabled,\n checkIfReactionsEnabledByDefault,\n} from 'lib/utils/reactions';\nimport Trim from '../video/components/videoPlayer/components/trim/Trim';\nimport { checkIfVideoIsTrimmed } from 'lib/utils/functions';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { screenSizes } from 'lib/style/theme';\nimport { InsertButton } from './components/InsertButton';\nimport { CopyVideoButton } from './components/CopyVideoButton';\nimport { useTranslation } from 'react-i18next';\nimport {\n builderLandingPageTypeId,\n defaultLPOption,\n LandingPageOption,\n LandingPageType,\n prepareTemplateLandingPageOptions,\n SALES_PAGE_ID,\n WEBSITE_OVERLAY_LANDING_PAGE_ID,\n} from './utils';\nimport { useGetTemplatesQuery } from 'lib/api/useGetTemplatesQuery';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport {\n CovideoGTMVehicleItem,\n CovideoGTMVideoAttributes,\n} from 'lib/hooks/GTM/types';\nimport {\n CovideoGTMVideoMessageProperties,\n GTMVideoMessageInteractionActions,\n} from 'lib/hooks/GTM/actions/video';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\nimport { useVideoQuery } from 'lib/api/videos/useVideoQuery';\nimport { useExitLinksetsQuery } from 'lib/api/exitlinksets/useExitLinksetsQuery';\nimport { useWebsiteOverlayQuery } from 'lib/api/overlays/useWebsiteOverlayQuery';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nconst ContentWrapper = styled.div`\n display: flex;\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 16px;\n`;\n\nconst Main = styled.div`\n box-sizing: border-box;\n width: 100%;\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.sm &&\n css`\n width: calc(50% - 8px);\n `}\n`;\n\nconst Side = styled.div`\n box-sizing: border-box;\n width: 100%;\n margin-top: 16px;\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.sm &&\n css`\n margin-top: 0;\n width: calc(50% - 8px);\n `}\n`;\n\nconst VideoWrapper = styled.div`\n margin-bottom: 24px;\n background: ${theme.palette.white};\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 6px;\n .fullscreen {\n height: auto;\n }\n`;\n\nconst Content = styled.div`\n background-color: ${theme.palette.white};\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n border-radius: 6px;\n`;\n\nconst Title = styled.div<{ backgroundColor?: string; width?: string }>`\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray100};\n background-color: ${({ backgroundColor }) =>\n backgroundColor || 'transparent'};\n width: ${({ width }) => width || 'auto'};\n border-radius: 6px;\n word-break: break-word;\n`;\n\nconst Date = styled.div<{ backgroundColor?: string; width?: string }>`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n display: flex;\n align-items: center;\n background-color: ${({ backgroundColor }) =>\n backgroundColor || 'transparent'};\n width: ${({ width }) => width || 'auto'};\n border-radius: 6px;\n`;\n\nexport type Option = {\n value: string;\n label: string;\n};\n\nexport type VideoShareSetData = {\n videoId: number;\n templateId: number;\n linksetId?: string | number;\n overlayId?: string | number;\n vin: string;\n allowReactions?: boolean;\n};\n\nconst VinPendingStatus = 'pending';\n\nconst toMaybeString = (v: unknown) => {\n return !!v ? String(v) : undefined;\n};\n\nexport const InsertVideo = () => {\n const {\n showInsertFeature,\n showQuickshareFeature,\n containerWidth,\n showTrimFeature,\n showCTAFeature,\n showLandingPageFeature,\n showReactionsFeature: showReactionsAndCommentsFeature,\n showWebsiteOverlayFeature,\n } = useConfigurationContext();\n const { t } = useTranslation();\n const { colors, isCdkEnviroment } = useTheme();\n const { videoId } = useParams() as { videoId: string };\n const { toast } = useToastNotifications();\n const { userData } = useAuthorizationContext();\n\n const { isLoading: isLoadingTemplates, data: templates } =\n useGetTemplatesQuery({\n start: 0,\n limit: 2000,\n search: '',\n });\n const { data: videoData, isLoading: videoLoading } = useVideoQuery(videoId);\n const { data: overlays, isLoading: overlaysLoading } = useWebsiteOverlayQuery(\n {\n start: 0,\n limit: 100,\n search: '',\n }\n );\n const { data: linksets, isLoading: linksetsLoading } = useExitLinksetsQuery({\n start: 0,\n limit: 100,\n search: '',\n });\n\n const videoRef = useRef<HTMLVideoElement | null>(null);\n\n const isAutomotiveService = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSales = checkIfAutomotiveSalesRole(userData);\n const reactionsCustomerEnabled = checkIfCustomerReactionsEnabled(userData);\n\n const reactionsEnabledByDefault = checkIfReactionsEnabledByDefault(userData);\n\n const { trackGTMVideoMessageInteractionEvent } = useGTMAnalytics();\n\n const history = useHistory();\n const [isVideoProcessing, setIsVideoProcessing] = useState(false);\n\n const [addingVehicle, setAddingVehicle] = useState(false);\n const [insertVideoData, setInsertVideoData] = useState<VideoShareSetData>({\n videoId: Number(videoId),\n templateId: defaultLPOption.id as number,\n linksetId: '',\n overlayId: '',\n vin: VinPendingStatus,\n allowReactions: reactionsEnabledByDefault,\n });\n\n const { trackVideoSpecificPagesManually, vehiceReady } = useGTMTrackPageView({\n vin: insertVideoData.vin !== VinPendingStatus ? insertVideoData.vin : '',\n });\n\n const [templatesOptions, setTemplatesOptions] = useState<LandingPageOption[]>(\n []\n );\n\n // trim\n const [isVideoTrimmed, setIsVideoTrimmed] = useState(false);\n const [isVideoTrimmingLoading, setIsVideoTrimmingLoading] = useState(false);\n const [trimValue, setTrimValue] = useState<Array<number>>([0, 0]);\n const [videoDuration, setVideoDuration] = useState(0);\n const trimDurationRef = useRef<Array<number>>([0, 0]);\n\n const linksetsList = linksets?.linksets ?? [];\n const overlaysData = overlays?.websiteUrls ?? [];\n\n const goToLibrary = () => history.push(`/`);\n\n useEffect(() => {\n setTrimValue([0, videoDuration]);\n }, [videoDuration]);\n\n const isLoading =\n videoLoading ||\n isLoadingTemplates ||\n isLoadingTemplates ||\n linksetsLoading ||\n overlaysLoading;\n\n const calculateTemplateAndVin = (vin: string) => {\n if (isLoadingTemplates || !templates) return;\n\n const { autoSelectedOption, options } = prepareTemplateLandingPageOptions({\n userData,\n templatesResponse: templates,\n sendVehicle: !!vin,\n sendQuote: false,\n });\n\n const filteredOptions = options.filter(option => {\n if (!showWebsiteOverlayFeature) {\n return option.id !== WEBSITE_OVERLAY_LANDING_PAGE_ID;\n }\n return true;\n });\n\n const currentTemplateOption = filteredOptions.find(\n o => Number(o.value) === insertVideoData.templateId\n )?.value;\n\n // check if service pages are present in options\n const hasServicePages = options.some(\n o => o.value === SALES_PAGE_ID && o.typeId === builderLandingPageTypeId\n );\n\n setTemplatesOptions(filteredOptions);\n setInsertVideoData(old => ({\n ...old,\n templateId: hasServicePages\n ? Number(autoSelectedOption.value) || templates.default.id\n : Number(currentTemplateOption) || templates.default.id,\n vin,\n }));\n };\n\n // calculate template and vin on load and when templates change\n useEffect(() => {\n if (!videoData && !templates) return;\n calculateTemplateAndVin(videoData?.videoRequest?.vin || '');\n }, [templates, isLoadingTemplates, videoData]);\n\n // set default overlay if not set\n useEffect(() => {\n if (overlaysLoading || !overlaysData.length) return;\n if (overlaysData.length > 0) {\n setInsertVideoData(old => ({\n ...old,\n overlayId: overlaysData[0].id,\n }));\n }\n }, [overlays, overlaysLoading]);\n\n // set default linkset if not set\n useEffect(() => {\n if (linksetsLoading || !linksetsList.length) return;\n const defaultLinkset =\n linksetsList.find(ls => ls.defaultLinks) ?? linksetsList[0];\n\n if (defaultLinkset) {\n setInsertVideoData(prev => ({\n ...prev,\n linksetId: defaultLinkset.id,\n }));\n }\n }, [linksets, linksetsLoading]);\n\n // set vin from video data when loaded\n useEffect(() => {\n if (!videoLoading && !videoData) return;\n setInsertVideoData(old => ({\n ...old,\n vin: videoData?.videoRequest?.vin || '',\n }));\n }, [videoData, videoLoading]);\n\n useEffect(() => {\n const checkTrim = checkIfVideoIsTrimmed({\n trimStart: trimValue[0],\n trimEnd: trimValue[1],\n videoDuration,\n });\n setIsVideoTrimmed(checkTrim);\n return () => {\n setIsVideoTrimmed(false);\n };\n }, [trimValue, videoDuration]);\n\n useEffect(() => {\n if (vehiceReady && insertVideoData.vin !== VinPendingStatus) {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.SEND_SHARE,\n });\n }\n }, [vehiceReady]);\n\n const handleTrimVideo = async () => {\n try {\n const res = await trimVideo(videoId, {\n duration: trimValue[1],\n start: trimValue[0],\n title: videoData?.title,\n });\n return res;\n } catch (error) {\n toast({\n message: t(\n 'Something went wrong while trimming the video, try again later!'\n ),\n });\n }\n };\n\n const getMarkAsSentPayload = () => {\n const currentTemplate = templatesOptions.find(\n o => o.value === insertVideoData.templateId\n );\n const useAutomotive =\n isAutomotiveService ||\n currentTemplate?.landingPageType === LandingPageType.AUTOMOTIVE ||\n false;\n\n const videoShareSetData: VideoShareSetData = {\n videoId: Number(videoId),\n vin: insertVideoData.vin !== VinPendingStatus ? insertVideoData.vin : '',\n templateId: Number(insertVideoData.templateId) || 0,\n overlayId: insertVideoData.overlayId || 0,\n linksetId: insertVideoData.linksetId || 0,\n allowReactions: insertVideoData.allowReactions,\n };\n\n return { videoShareSetData, useAutomotive };\n };\n\n const handleTrimeVideoHandler = async () => {\n if (isVideoTrimmed) {\n setIsVideoTrimmingLoading(true);\n const trimmedVideoData = await handleTrimVideo();\n setIsVideoTrimmingLoading(false);\n setIsVideoTrimmed(false);\n history.replace(`/insert-video/${trimmedVideoData.id}`);\n }\n };\n\n const gtmVideoAttributes: CovideoGTMVideoAttributes = {\n videoId: Number(videoData?.id),\n videoTitle: videoData?.title,\n videoLength: videoData?.videoLength,\n videoCustomerName: !!videoData?.videoRequest?.customerName,\n videoType: videoData?.videoRequest?.videoType || undefined,\n };\n\n const createGTMVideoMessageInteractionEvent = ({\n action,\n }: {\n action: GTMVideoMessageInteractionActions;\n }) => {\n const payload = getMarkAsSentPayload();\n const gtmVideoMessageProperties: CovideoGTMVideoMessageProperties = {\n notificationViewed: undefined,\n landingPage: templatesOptions.find(\n o => o.value === payload.videoShareSetData.templateId\n )?.label,\n callToAction:\n linksetsList.find(o => o.id === payload.videoShareSetData.linksetId)\n ?.title ?? undefined,\n thumbnails: undefined,\n customerId: toMaybeString(userData.customerId),\n sms: undefined,\n email: undefined,\n };\n\n trackGTMVideoMessageInteractionEvent?.({\n action,\n video: gtmVideoAttributes,\n videoMessageProperties: gtmVideoMessageProperties,\n vehicle: videoData?.videoRequest?.inventoryItem as CovideoGTMVehicleItem,\n });\n };\n\n const disableInsert =\n isLoadingTemplates ||\n linksetsLoading ||\n overlaysLoading ||\n (insertVideoData.templateId === -1 && !insertVideoData.overlayId) ||\n isVideoProcessing;\n\n if (isLoading || !videoData) {\n return <LoadingIndicator isLoading={videoLoading} />;\n }\n\n return (\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n icon={<MdArrowBack size='18' />}\n onClick={() => goToLibrary()}\n variant='transparent'\n style={{\n color: 'white',\n }}\n />\n }\n center={<></>}\n right={\n <>\n {isVideoTrimmed && (\n <Button\n variant={isCdkEnviroment ? 'white' : 'secondary'}\n onClick={handleTrimeVideoHandler}\n text={\n containerWidth > screenSizes.sm ? t('Trim Video') : t('Trim')\n }\n disabled={isVideoTrimmingLoading}\n icon={\n isVideoTrimmingLoading ? (\n <Spinner size={12} />\n ) : (\n <MdContentCut size={18} />\n )\n }\n />\n )}\n {showQuickshareFeature && !isVideoTrimmed && (\n <CopyVideoButton\n video={videoData as any}\n disable={disableInsert}\n getMarkAsSentPayload={getMarkAsSentPayload}\n onCRMClick={() => {\n createGTMVideoMessageInteractionEvent({\n action: GTMVideoMessageInteractionActions.COPY,\n });\n }}\n />\n )}\n {showInsertFeature && !isVideoTrimmed && (\n <InsertButton\n video={videoData as any}\n disable={disableInsert}\n getMarkAsSentPayload={getMarkAsSentPayload}\n onCRMClick={async () => {\n createGTMVideoMessageInteractionEvent({\n action: GTMVideoMessageInteractionActions.INSERT,\n });\n }}\n />\n )}\n </>\n }\n />\n <Container>\n <ContentWrapper>\n <Main>\n <VideoWrapper>\n <VideoPlayer\n videoId={videoId}\n videoRef={videoRef}\n autoplay={false}\n height={'247px'}\n FullscreenVideoWrapperBackgroundColor={colors.black[100]}\n borderBottomRadius={'0px'}\n videoSource={videoData?.videoSource || ''}\n playerBackgroundColor={videoData?.playerBackgroundColor || ''}\n setVideoDuration={setVideoDuration}\n setVideoIsProcessing={setIsVideoProcessing}\n />\n <Content>\n <Title>{videoData?.title}</Title>\n <Date>\n <IoMdCalendar\n size={16}\n color={colors.neutral[40]}\n style={{ marginRight: 6 }}\n />\n {videoData?.recordDate}\n </Date>\n </Content>\n </VideoWrapper>\n {showTrimFeature && (\n <Trim\n isVideoTrimmed={isVideoTrimmed}\n setValue={setTrimValue}\n value={trimValue}\n videoDuration={videoDuration}\n videoRef={videoRef}\n isVideoLoading={videoLoading}\n videoSource={videoData?.videoSource || ''}\n valueRef={trimDurationRef}\n />\n )}\n </Main>\n {(showLandingPageFeature ||\n showCTAFeature ||\n showReactionsAndCommentsFeature) && (\n <Side>\n <InsertVideoSettings\n insertVideoData={insertVideoData}\n setInsertVideoData={setInsertVideoData}\n overlaysData={overlaysData}\n templatesOptions={templatesOptions}\n linksetsData={linksetsList}\n reactionsCustomerEnabled={reactionsCustomerEnabled}\n />\n {/* TO_DO -> move vehicle search to settings to keep form in one place */}\n {isAutomotiveSales && (\n <VehicleSearch\n onChangeVehicle={(item: InventoryItem) => {\n calculateTemplateAndVin(item?.vin);\n\n setAddingVehicle(false);\n }}\n placeholder={t(\n 'Search vehicle by name, VIN or stock number...'\n )}\n selectedVin={insertVideoData.vin}\n fetchSold={false}\n addingVehicle={addingVehicle}\n handleChangeVehicleButtonPress={() => {\n calculateTemplateAndVin('');\n setAddingVehicle(true);\n }}\n handleRemoveVehicleButtonPress={() =>\n calculateTemplateAndVin('')\n }\n setAddingVehicle={setAddingVehicle}\n />\n )}\n </Side>\n )}\n </ContentWrapper>\n </Container>\n </Wrapper>\n );\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { VideoData } from 'lib/hooks';\nimport { VideoPlayer } from '../../video/components/videoPlayer';\nimport { isSafari } from 'lib/utils/functions';\n\nconst Wrapper = styled.div<{ margin: string }>`\n display: flex;\n justify-content: center;\n align-items: flex-start;\n gap: 32px;\n margin: ${({ margin }) => margin};\n`;\n\ntype VideoPlayerWrapperProps = {\n width: number;\n};\n\nconst VideoPlayerWrapper = styled.div<VideoPlayerWrapperProps>`\n width: ${({ width }) => `${width}px`};\n > video {\n display: block;\n width: 100%;\n border-radius: 4px;\n height: ${({ width }) => `${width * 0.5625}px`};\n object-fit: contain;\n background: ${({ theme }) => theme.colors.primary[100]};\n }\n`;\n\ntype Props = {\n video: VideoData;\n videoRef: React.RefObject<HTMLVideoElement>;\n useCovideoPlayer?: boolean;\n width?: number;\n margin?: string;\n};\n\nexport const VideoPreview = ({\n video,\n videoRef,\n width = 696,\n margin = '0',\n useCovideoPlayer = false,\n}: Props) => {\n return (\n <Wrapper margin={margin}>\n {!useCovideoPlayer && (\n <VideoPlayerWrapper width={width}>\n <video\n ref={videoRef}\n {...(!isSafari && { preload: 'metadata' })}\n width={width}\n playsInline={true}\n controls={false}\n >\n <source src={video.videoSource} type='video/mp4' />\n </video>\n </VideoPlayerWrapper>\n )}\n {useCovideoPlayer && (\n <VideoPlayer\n width={`${width}px`}\n playerBackgroundColor={video.playerBackgroundColor || ''}\n videoSource={video.videoSource}\n videoId={video.id}\n playButtonPosition={video.playButtonPosition || ''}\n playerIconsColor={video.playerIconsAndTextColor || ''}\n videoRef={videoRef}\n autoplay={false}\n disableControls={true}\n startWithControls={false}\n />\n )}\n </Wrapper>\n );\n};\n","import { isSafari } from 'lib/utils/functions';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nexport const MIME_TYPE = isSafari ? 'video/mp4' : 'video/webm;codecs=vp8,opus';\nexport const CONTENT_TYPE = 'video/webm';\nexport const FILE_EXTENSION = 'webm';\n\ntype ReactMediaRecorderRenderProps = {\n error: string;\n muteAudio: () => void;\n unMuteAudio: () => void;\n startRecording: () => void;\n startRecordingForCanvas: (canvasStream: any) => void;\n pauseRecording: () => void;\n resumeRecording: () => void;\n stopRecording: () => void;\n mediaBlobUrl: null | string;\n status: StatusMessages;\n isAudioMuted: boolean;\n previewStream: MediaStream | null;\n previewAudioStream: MediaStream | null;\n clearBlobUrl: () => void;\n};\n\ntype ReactMediaRecorderHookProps = {\n audio?: boolean | MediaTrackConstraints;\n video?: boolean | MediaTrackConstraints;\n screen?: boolean;\n onStop?: (blobUrl: string, blob: Blob) => void;\n blobPropertyBag?: BlobPropertyBag;\n mediaRecorderOptions?: any | null;\n mimeType?: string;\n quality?: string;\n};\n\nconst stopStream = (s: any) => {\n try {\n s.getTracks().forEach((t: any) => t.stop());\n } catch (e) {}\n};\n\ntype StatusMessages =\n | 'media_aborted'\n | 'permission_denied'\n | 'no_specified_media_found'\n | 'media_in_use'\n | 'invalid_media_constraints'\n | 'no_constraints'\n | 'recorder_error'\n | 'idle'\n | 'acquiring_media'\n | 'delayed_start'\n | 'recording'\n | 'stopping'\n | 'stopped';\n\nenum RecorderErrors {\n AbortError = 'media_aborted',\n NotAllowedError = 'permission_denied',\n NotFoundError = 'no_specified_media_found',\n NotReadableError = 'media_in_use',\n OverconstrainedError = 'invalid_media_constraints',\n TypeError = 'no_constraints',\n NONE = '',\n NO_RECORDER = 'recorder_error',\n}\n\nconst BITRATES: { [key: string]: number } = {\n low: 1000000,\n standard: 2500000,\n high: 5000000,\n ultra: 8000000,\n};\n\nexport function useMediaRecorder({\n audio = true,\n video = false,\n onStop = () => null,\n blobPropertyBag,\n screen = false,\n mediaRecorderOptions = null,\n mimeType = '',\n quality = 'low',\n}: ReactMediaRecorderHookProps): ReactMediaRecorderRenderProps {\n const mediaRecorder = useRef<any | null>(null);\n const mediaChunks = useRef<Blob[]>([]);\n const mediaStream = useRef<MediaStream | null>(null);\n const [status, setStatus] = useState<StatusMessages>('idle');\n const [isAudioMuted, setIsAudioMuted] = useState<boolean>(false);\n const [mediaBlobUrl, setMediaBlobUrl] = useState<string | null>(null);\n const [error, setError] = useState<keyof typeof RecorderErrors>('NONE');\n const mountedRef = useRef<boolean>(false);\n const videoBitsPerSecond = BITRATES[quality] || BITRATES.low;\n //@ts-ignore\n if (!window.streams) {\n //@ts-ignore\n window.streams = [];\n }\n //@ts-ignore\n window.streams = window.streams.filter(Boolean);\n\n const getMediaStream = useCallback(async () => {\n setStatus('acquiring_media');\n const requiredMedia: MediaStreamConstraints = {\n audio: typeof audio === 'boolean' ? !!audio : audio,\n video: typeof video === 'boolean' ? !!video : video,\n };\n let stream: any;\n let audioStream: any;\n try {\n if (screen) {\n //@ts-ignore\n stream = (await window.navigator.mediaDevices.getDisplayMedia({\n video: video || true,\n })) as MediaStream;\n //@ts-ignore\n window.streams.push(stream);\n if (stream && audio) {\n audioStream = await window.navigator.mediaDevices.getUserMedia({\n // changes for SUS-785 audio recording fixed while screen recording\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n },\n });\n\n //@ts-ignore\n window.streams.push(audioStream);\n\n audioStream\n .getAudioTracks()\n .forEach((audioTrack: any) => stream.addTrack(audioTrack));\n }\n mediaStream.current = stream;\n } else {\n stream =\n await window.navigator.mediaDevices.getUserMedia(requiredMedia);\n //@ts-ignore\n window.streams.push(stream);\n mediaStream.current = stream;\n }\n if (!mountedRef.current) {\n stopStream(stream);\n return;\n }\n if (stream) {\n setStatus('idle');\n }\n } catch (error: any) {\n stopStream(stream);\n stopStream(audioStream);\n setError(error.name);\n setStatus('idle');\n }\n }, [audio, video, screen]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n //@ts-ignore\n if (!window.MediaRecorder) {\n throw new Error('Unsupported Browser');\n }\n\n if (screen) {\n //@ts-ignore\n if (!window.navigator.mediaDevices.getDisplayMedia) {\n throw new Error(\"This browser doesn't support screen capturing\");\n }\n }\n\n const checkConstraints = (mediaType: MediaTrackConstraints) => {\n const supportedMediaConstraints =\n navigator.mediaDevices.getSupportedConstraints();\n const unSupportedConstraints = Object.keys(mediaType).filter(\n constraint =>\n !(supportedMediaConstraints as { [key: string]: any })[constraint]\n );\n\n if (unSupportedConstraints.length > 0) {\n console.error(\n `The constraints ${unSupportedConstraints.join(\n ','\n )} doesn't support on this browser. Please check your ReactMediaRecorder component.`\n );\n }\n };\n\n if (typeof audio === 'object') {\n checkConstraints(audio);\n }\n if (typeof video === 'object') {\n checkConstraints(video);\n }\n\n if (mediaRecorderOptions && mediaRecorderOptions.mimeType) {\n //@ts-ignore\n if (!MediaRecorder.isTypeSupported(mediaRecorderOptions.mimeType)) {\n console.error(\n `The specified MIME type you supplied for MediaRecorder doesn't support this browser`\n );\n }\n }\n\n if (!mediaStream.current) {\n getMediaStream();\n }\n }, [audio, screen, video, getMediaStream, mediaRecorderOptions]);\n\n // Media Recorder Handlers\n\n const startRecording = async () => {\n setError('NONE');\n if (!mediaStream.current) {\n await getMediaStream();\n }\n if (mediaStream.current) {\n const isStreamEnded = mediaStream.current\n .getTracks()\n .some(track => track.readyState === 'ended');\n if (isStreamEnded) {\n await getMediaStream();\n }\n //@ts-ignore\n mediaRecorder.current = new MediaRecorder(mediaStream.current, {\n mimeType,\n videoBitsPerSecond,\n });\n mediaRecorder.current.ondataavailable = onRecordingActive;\n mediaRecorder.current.onstop = onRecordingStop;\n mediaRecorder.current.onerror = () => {\n setError('NO_RECORDER');\n setStatus('idle');\n };\n mediaRecorder.current.start();\n setStatus('recording');\n }\n };\n\n const startRecordingForCanvas = async (canvasStream: any) => {\n if (!canvasStream) {\n setError('NO_RECORDER');\n return;\n }\n\n if (audio) {\n let audioStream = await window.navigator.mediaDevices.getUserMedia({\n audio,\n });\n\n //@ts-ignore\n window.streams.push(audioStream);\n\n audioStream\n .getAudioTracks()\n .forEach((audioTrack: any) => canvasStream.addTrack(audioTrack));\n }\n\n //@ts-ignore\n mediaRecorder.current = new MediaRecorder(canvasStream, {\n mimeType,\n videoBitsPerSecond,\n });\n mediaRecorder.current.ondataavailable = onRecordingActive;\n mediaRecorder.current.onstop = onRecordingStop;\n mediaRecorder.current.onerror = () => {\n setError('NO_RECORDER');\n setStatus('idle');\n };\n mediaRecorder.current.start();\n setStatus('recording');\n };\n\n const onRecordingActive = ({ data }: any) => {\n mediaChunks.current.push(data);\n };\n\n const onRecordingStop = () => {\n const [chunk] = mediaChunks.current;\n const blobProperty: BlobPropertyBag = Object.assign(\n { type: chunk.type },\n blobPropertyBag || (video ? { type: 'video/mp4' } : { type: 'audio/wav' })\n );\n const blob = new Blob(mediaChunks.current, blobProperty);\n const url = URL.createObjectURL(blob);\n setStatus('stopped');\n setMediaBlobUrl(url);\n onStop(url, blob);\n };\n\n const muteAudio = (mute: boolean) => {\n setIsAudioMuted(mute);\n if (mediaStream.current) {\n mediaStream.current\n .getAudioTracks()\n .forEach(audioTrack => (audioTrack.enabled = !mute));\n }\n };\n\n const pauseRecording = () => {\n if (mediaRecorder.current && mediaRecorder.current.state === 'recording') {\n mediaRecorder.current.pause();\n }\n };\n const resumeRecording = () => {\n if (mediaRecorder.current && mediaRecorder.current.state === 'paused') {\n mediaRecorder.current.resume();\n }\n };\n\n const stopRecording = () => {\n if (mediaRecorder.current) {\n if (mediaRecorder.current.state !== 'inactive') {\n setStatus('stopping');\n mediaRecorder.current.stop();\n mediaStream.current &&\n mediaStream.current.getTracks().forEach(track => track.stop());\n mediaChunks.current = [];\n }\n }\n };\n\n const previewStream = mediaStream.current\n ? new MediaStream(mediaStream.current.getVideoTracks())\n : null;\n //@ts-ignore\n window.streams.push(previewStream);\n\n const previewAudioStream = mediaStream.current\n ? new MediaStream(mediaStream.current.getAudioTracks())\n : null;\n //@ts-ignore\n window.streams.push(previewAudioStream);\n\n return {\n error: RecorderErrors[error],\n muteAudio: () => muteAudio(true),\n unMuteAudio: () => muteAudio(false),\n startRecording,\n startRecordingForCanvas,\n pauseRecording,\n resumeRecording,\n stopRecording,\n mediaBlobUrl,\n status,\n isAudioMuted,\n previewStream,\n previewAudioStream,\n clearBlobUrl: () => setMediaBlobUrl(null),\n };\n}\n","import styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { Modal } from 'lib/components';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { Button } from 'react-covideo-common';\nimport React from 'react';\n\nconst ModalItem = styled.div`\n box-sizing: border-box;\n width: 400px;\n max-width: 100%;\n padding: 32px;\n min-height: 208px;\n background-color: ${theme.palette.white};\n`;\n\nconst Header = styled.div`\n display: flex;\n color: ${theme.palette.black_1_100};\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: 18px;\n line-height: 24px;\n`;\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst Content = styled.div`\n margin-top: 32px;\n`;\n\nconst ButtonsWrapper = styled.section`\n display: flex;\n flex-direction: row-reverse;\n margin-top: 48px;\n gap: 8px;\n gap: 12px;\n`;\n\ntype Props = {\n title: string;\n content: React.ReactNode;\n secondaryButtonText: string;\n primaryButtonText: string;\n handleSubmit: any;\n handleModalClose: () => void;\n primaryButtonType?: 'primary' | 'secondary' | 'text';\n};\n\nexport const ModalPrompt = ({\n title,\n content,\n primaryButtonText,\n secondaryButtonText,\n handleModalClose,\n handleSubmit,\n primaryButtonType = 'primary',\n}: Props) => {\n const { isCdkEnviroment } = useTheme();\n return (\n <Modal>\n <ModalItem>\n <Header>\n {title}\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n />\n </CloseButtonWrapper>\n </Header>\n <Content>\n {content}\n <ButtonsWrapper>\n <Button\n text={primaryButtonText}\n variant={primaryButtonType}\n onClick={handleSubmit}\n />\n <Button\n text={secondaryButtonText}\n variant={isCdkEnviroment ? 'text' : 'primary'}\n onClick={handleModalClose}\n />\n </ButtonsWrapper>\n </Content>\n </ModalItem>\n </Modal>\n );\n};\n","import { useToastNotifications } from 'lib/components';\nimport { VideoData } from 'lib/hooks';\nimport React, { createRef, useEffect, useState } from 'react';\nimport { theme } from 'lib/style';\nimport { MdMic, MdPause, MdPlayArrow } from 'react-icons/md';\nimport styled, { css, useTheme } from 'styled-components';\nimport { BsRecordCircle } from 'react-icons/bs';\nimport { MdRefresh } from 'react-icons/md';\nimport { useMediaRecorder } from 'lib/hooks/useMediaRecorder';\nimport { useHistory } from 'react-router';\nimport { toMMSS } from 'lib/utils/functions';\nimport { ModalPrompt } from 'lib/components/modals/ModalPrompt';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { screenSizes } from 'lib/style/theme';\nimport { COOKIE_NAMES } from 'lib/config';\nimport { Button } from 'react-covideo-common';\nimport { useTranslation } from 'react-i18next';\n\ntype WrapperProps = {\n margin: string;\n width: number;\n disabled: boolean;\n};\n\nconst Wrapper = styled.div<WrapperProps>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 11px;\n width: ${({ width }) => `${width}px`};\n max-width: 100%;\n margin: ${({ margin }) => margin};\n ${({ disabled }) =>\n disabled &&\n css`\n pointer-events: none;\n opacity: 0.4;\n `}\n`;\n\nconst ButtonsWrapper = styled.div`\n display: flex;\n justify-content: center;\n gap: 8px;\n flex-shrink: 0;\n`;\n\ntype RecordingProgressProps = {\n disabled: boolean;\n};\n\nconst RecordingProgress = styled.div<RecordingProgressProps>`\n position: relative;\n width: 100%;\n height: 40px;\n box-sizing: border-box;\n border-radius: 6px;\n display: flex;\n align-items: center;\n background: ${({ theme }) => theme.colors.primary[5]};\n border-radius: 6px;\n ${({ disabled }) =>\n disabled &&\n css`\n cursor: not-allowed;\n `}\n`;\n\nconst ProgressBar = styled.div`\n position: relative;\n height: 12px;\n width: 100%;\n margin-right: 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: #ffffff;\n border-radius: 8px;\n`;\n\ntype DoneProps = {\n position: number;\n background: string;\n};\n\nconst Done = styled.div<DoneProps>`\n position: absolute;\n top: 2px;\n bottom: 2px;\n left: 0;\n width: ${({ position }) => `${position}%`};\n background: ${({ background }) => background};\n border-radius: 8px;\n`;\n\nconst RecordingInfo = styled.div`\n box-sizing: border-box;\n width: 100px;\n flex-grow: 0;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 13px;\n`;\n\nconst MicIconWrapper = styled.div`\n flex-grow: 0;\n flex-shrink: 0;\n margin-right: 17px;\n padding-top: 4px;\n`;\n\nconst CurrentTime = styled.div`\n font-weight: 500;\n font-size: 14px;\n line-height: 24px;\n color: ${({ theme }) => theme.colors.neutral[100]};\n`;\n\nconst Duration = styled.div`\n font-weight: 500;\n font-size: 14px;\n line-height: 24px;\n width: 60px;\n padding-left: 12px;\n margin-right: 12px;\n color: ${({ theme }) => theme.colors.neutral[60]};\n`;\n\ntype SliderProps = {\n disabled: boolean;\n};\n\nconst Slider = styled.input<SliderProps>`\n -webkit-appearance: none;\n width: 100%;\n background: transparent;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n z-index: 3;\n cursor: pointer;\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 4px;\n height: 40px;\n margin-top: 6px;\n z-index: 3;\n }\n &::-moz-range-thumb {\n width: 4px;\n height: 40px;\n margin-top: 6px;\n z-index: 3;\n }\n &::-ms-thumb {\n width: 4px;\n height: 40px;\n z-index: 3;\n }\n ${({ disabled }) =>\n disabled &&\n css`\n pointer-events: none;\n &::-webkit-slider-thumb {\n display: none;\n }\n &::-moz-range-thumb {\n display: none;\n }\n &::-ms-thumb {\n display: none;\n }\n `};\n &:focus {\n outline: none;\n }\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n`;\n\nconst Audio = styled.audio`\n display: none;\n`;\n\nconst DEFAULT_SETTINGS = {\n audioSource: { value: 'default' },\n};\n\nenum RecordingStatus {\n NotRecording = 'NotRecording',\n Recording = 'Recording',\n RecordingPaused = 'RecordingPaused',\n Finished = 'Finished',\n}\n\nenum PreviewingStatus {\n NotPreviewing = 'NotPreviewing',\n Previewing = 'Previewing',\n PreviewingPaused = 'PreviewingPaused',\n}\n\ntype Props = {\n video: VideoData;\n videoRef: React.RefObject<HTMLVideoElement>;\n onChangeVoiceoverValid: (valid: boolean) => void;\n onRecordingUrlGeneration: (url: string) => void;\n handleShowCard?: (show: boolean) => void;\n margin?: string;\n width?: number;\n disabled?: boolean;\n};\n\nexport const AudioRecorder = ({\n video,\n videoRef,\n onChangeVoiceoverValid,\n onRecordingUrlGeneration,\n handleShowCard,\n margin = '0',\n width = 696,\n disabled = false,\n}: Props) => {\n const { t } = useTranslation();\n const { containerWidth } = useConfigurationContext();\n const { colors, isCdkEnviroment } = useTheme();\n const { toast } = useToastNotifications();\n const audioRef = createRef<HTMLAudioElement>();\n const [recordingStatus, setRecordingStatus] = useState(\n RecordingStatus.NotRecording\n );\n const [previewingStatus, setPreviewingStatus] = useState(\n PreviewingStatus.NotPreviewing\n );\n const [currentTime, setCurrentTime] = useState(0);\n const [audioPlayer, setAudioPlayer] = useState<HTMLAudioElement>();\n const [showRetakePrompt, setShowRetakePrompt] = useState(false);\n const history = useHistory();\n\n const settings = {\n audioSource: JSON.parse(\n localStorage.getItem(COOKIE_NAMES.recordSettings) ||\n JSON.stringify(DEFAULT_SETTINGS)\n ).audioSource as any,\n };\n\n let audio: any;\n try {\n audio = { deviceId: settings.audioSource.value };\n } catch (e) {}\n if (!settings || !settings.audioSource || !settings.audioSource.value) {\n audio = false;\n }\n\n const {\n error,\n startRecording,\n stopRecording,\n pauseRecording,\n resumeRecording,\n mediaBlobUrl,\n } = useMediaRecorder({\n audio,\n });\n\n // TODO: maybe should handle error without redirect and add record settings to voiceover, or add some voiceover support on record_home\n if (!audio || error) {\n toast({\n message: t(\n 'Please enable audio in your recording settings and try again!'\n ),\n });\n history.push('/record/home');\n }\n\n const startRecordingClick = async () => {\n if (!videoRef.current) {\n return;\n }\n handleShowCard?.(false);\n videoRef.current.volume = 0;\n videoRef.current.play();\n startRecording();\n setRecordingStatus(RecordingStatus.Recording);\n };\n\n const pauseRecordingClick = () => {\n if (!videoRef.current) {\n return;\n }\n pauseRecording();\n videoRef.current.pause();\n setRecordingStatus(RecordingStatus.RecordingPaused);\n };\n\n const resumeRecordingClick = () => {\n if (!videoRef.current) {\n return;\n }\n resumeRecording();\n videoRef.current?.play();\n setRecordingStatus(RecordingStatus.Recording);\n };\n\n const retakeButtonClick = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n audioPlayer.pause();\n videoRef.current.pause();\n if (previewingStatus !== PreviewingStatus.NotPreviewing) {\n setPreviewingStatus(PreviewingStatus.PreviewingPaused);\n }\n if (recordingStatus !== RecordingStatus.Finished) {\n setRecordingStatus(RecordingStatus.RecordingPaused);\n }\n setShowRetakePrompt(true);\n };\n\n const retakeRecording = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n setShowRetakePrompt(false);\n stopRecording();\n videoRef.current.pause();\n videoRef.current.currentTime = 0;\n audioPlayer.pause();\n audioPlayer.currentTime = 0;\n setRecordingStatus(RecordingStatus.NotRecording);\n setPreviewingStatus(PreviewingStatus.NotPreviewing);\n };\n\n const startPreview = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n setPreviewingStatus(PreviewingStatus.Previewing);\n videoRef.current.currentTime = 0;\n videoRef.current.play();\n audioPlayer.play();\n };\n\n const pausePreview = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n audioPlayer.pause();\n videoRef.current.pause();\n setPreviewingStatus(PreviewingStatus.PreviewingPaused);\n };\n\n const resumePreview = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n audioPlayer.play();\n videoRef.current.play();\n setPreviewingStatus(PreviewingStatus.Previewing);\n };\n\n const seekTo = (position: string) => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n videoRef.current.currentTime = parseFloat(position);\n audioPlayer.currentTime = parseFloat(position);\n audioPlayer.play();\n videoRef.current.play();\n setPreviewingStatus(PreviewingStatus.Previewing);\n };\n\n // close/reset everything\n const closeAndClear = () => {\n //@ts-ignore\n const streams = [...window.streams];\n //@ts-ignore\n streams.filter(Boolean).forEach(s => stopStream(s));\n //@ts-ignore\n window.streams = [];\n setRecordingStatus(RecordingStatus.NotRecording);\n setPreviewingStatus(PreviewingStatus.NotPreviewing);\n };\n\n const stopStream = (s: any) => {\n try {\n s.getTracks().forEach((t: any) => t.stop());\n } catch (e) {}\n };\n\n // clear all on component unmount\n useEffect(() => {\n return () => {\n closeAndClear();\n };\n }, []);\n\n // handle video events\n useEffect(() => {\n const handleTimeUpdate = () => {\n let currentTime = 0;\n if (videoRef.current) {\n currentTime = videoRef?.current?.currentTime || 0;\n if (videoRef.current.currentTime >= videoRef.current.duration) {\n currentTime = videoRef.current.duration;\n }\n }\n setCurrentTime(currentTime);\n };\n const handleVideoEnded = () => {\n stopRecording();\n setRecordingStatus(RecordingStatus.Finished);\n setPreviewingStatus(PreviewingStatus.NotPreviewing);\n };\n const handleVideoPlay = () => {\n setRecordingStatus(prev =>\n prev === RecordingStatus.Finished ? prev : RecordingStatus.Recording\n );\n setPreviewingStatus(prev =>\n prev === PreviewingStatus.PreviewingPaused\n ? PreviewingStatus.Previewing\n : prev\n );\n };\n const handleVideoPause = () => {\n setRecordingStatus(prev =>\n prev === RecordingStatus.Finished\n ? prev\n : RecordingStatus.RecordingPaused\n );\n setPreviewingStatus(prev =>\n prev === PreviewingStatus.Previewing\n ? PreviewingStatus.PreviewingPaused\n : prev\n );\n };\n const handleVideoSeeked = () => {\n if (!videoRef.current || !audioPlayer) {\n return;\n }\n audioPlayer.currentTime = videoRef.current.currentTime;\n };\n if (videoRef.current) {\n videoRef.current.addEventListener('timeupdate', handleTimeUpdate, true);\n videoRef.current.addEventListener('ended', handleVideoEnded, true);\n videoRef.current.addEventListener('pause', handleVideoPause, true);\n videoRef.current.addEventListener('play', handleVideoPlay, true);\n videoRef.current.addEventListener('seeked', handleVideoSeeked, true);\n }\n\n return () => {\n if (videoRef.current) {\n videoRef.current.removeEventListener(\n 'timeupdate',\n handleTimeUpdate,\n true\n );\n videoRef.current.removeEventListener('ended', handleVideoEnded, true);\n videoRef.current.removeEventListener('pause', handleVideoPause, true);\n videoRef.current.removeEventListener('play', handleVideoPlay, true);\n videoRef.current.removeEventListener('seeked', handleVideoSeeked, true);\n }\n };\n }, [videoRef]);\n\n // voiceover valid when recording finished\n useEffect(() => {\n onChangeVoiceoverValid(recordingStatus === RecordingStatus.Finished);\n }, [recordingStatus]);\n\n useEffect(() => {\n onRecordingUrlGeneration(mediaBlobUrl || '');\n if (!mediaBlobUrl || !audioRef.current) return;\n // add recording to audio player\n audioRef.current.load();\n }, [mediaBlobUrl]);\n\n useEffect(() => {\n if (!audioRef.current) {\n return;\n }\n setAudioPlayer(audioRef.current);\n }, [audioRef.current]);\n\n const isPreview = recordingStatus === RecordingStatus.Finished;\n const isRecording = recordingStatus === RecordingStatus.Recording;\n const duration =\n videoRef?.current?.duration ||\n (video?.videoLength ? video?.videoLength / 1000 : 0);\n const currentPosition = !duration\n ? 100\n : !currentTime\n ? 0\n : (parseFloat(currentTime.toString()) / parseFloat(duration.toString())) *\n 100;\n\n const updatePosition = (e: any) => {\n const newPosition = e.target.value.toString();\n const time = duration * (newPosition / 100);\n seekTo(time.toString());\n };\n\n // toMMSS util function was displaying 00:010\n const currentTimeMMSS = new Date(currentTime * 1000)\n .toISOString()\n .substring(14, 19);\n\n return (\n <Wrapper margin={margin} width={width} disabled={disabled}>\n <Audio ref={audioRef}>\n <source src={mediaBlobUrl || ''} />\n </Audio>\n <ButtonsWrapper>\n {recordingStatus === RecordingStatus.NotRecording && (\n <Button\n variant={isCdkEnviroment ? 'primary' : 'red'}\n icon={<BsRecordCircle size={12} />}\n text={t('Record')}\n onClick={() => startRecordingClick()}\n />\n )}\n {recordingStatus === RecordingStatus.Recording && (\n <>\n <Button\n icon={<MdPause />}\n text={t('Pause')}\n variant='secondary'\n onClick={() => pauseRecordingClick()}\n />\n </>\n )}\n {recordingStatus === RecordingStatus.RecordingPaused && (\n <Button\n icon={<MdPlayArrow />}\n text={t('Resume')}\n variant='primary'\n onClick={() => resumeRecordingClick()}\n />\n )}\n {recordingStatus === RecordingStatus.Finished &&\n previewingStatus === PreviewingStatus.NotPreviewing && (\n <Button icon={<MdPlayArrow />} onClick={() => startPreview()} />\n )}\n {previewingStatus === PreviewingStatus.Previewing && (\n <Button icon={<MdPause />} onClick={() => pausePreview()} />\n )}\n {previewingStatus === PreviewingStatus.PreviewingPaused && (\n <Button icon={<MdPlayArrow />} onClick={() => resumePreview()} />\n )}\n </ButtonsWrapper>\n <RecordingProgress\n disabled={!isPreview}\n title={!isPreview ? t('Controls disabled before preview.') : ''}\n >\n <RecordingInfo>\n <MicIconWrapper>\n <MdMic\n size={22}\n color={isRecording ? colors.primary[100] : colors.neutral[60]}\n />\n </MicIconWrapper>\n <CurrentTime>{currentTimeMMSS}</CurrentTime>\n </RecordingInfo>\n <ProgressBar>\n <Slider\n disabled={!isPreview}\n type='range'\n min='0'\n max='100'\n value={currentPosition}\n onChange={e => updatePosition(e)}\n step='1'\n />\n <Done\n background={isRecording ? colors.primary[100] : colors.primary[100]}\n position={currentPosition}\n />\n </ProgressBar>\n <Duration>{toMMSS(duration, 0)}</Duration>\n </RecordingProgress>\n {[RecordingStatus.RecordingPaused, RecordingStatus.Finished].includes(\n recordingStatus\n ) && (\n <ButtonsWrapper>\n <Button\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n icon={<MdRefresh />}\n text={containerWidth > screenSizes.mb ? t('Start Over') : ''}\n onClick={() => retakeButtonClick()}\n />\n </ButtonsWrapper>\n )}\n {showRetakePrompt && (\n <ModalPrompt\n title={t('Start Over?')}\n content={<>{t('Your voiceover recording will be erased.')}</>}\n secondaryButtonText={t('Back')}\n primaryButtonText={t('Start Over')}\n primaryButtonType={'primary'}\n handleSubmit={() => retakeRecording()}\n handleModalClose={() => setShowRetakePrompt(false)}\n />\n )}\n </Wrapper>\n );\n};\n","import styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { Modal } from 'lib/components';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { Input } from 'lib/components';\nimport { Button } from 'react-covideo-common';\nimport { useState } from 'react';\n\nconst ModalItem = styled.div`\n box-sizing: border-box;\n width: 400px;\n max-width: 100%;\n padding: 32px;\n min-height: 208px;\n background-color: ${theme.palette.white};\n`;\n\nconst Header = styled.div`\n display: flex;\n color: ${theme.palette.black_1_100};\n align-items: center;\n justify-content: space-between;\n font-weight: 700;\n font-size: 18px;\n line-height: 24px;\n`;\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst Content = styled.div`\n margin-top: 32px;\n`;\n\nconst Label = styled.div`\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n margin-bottom: 8px;\n`;\n\nconst ButtonsWrapper = styled.section`\n display: flex;\n flex-direction: row-reverse;\n margin-top: 48px;\n gap: 8px;\n`;\n\ntype Props = {\n title: string;\n label: string;\n defaultValue: string;\n secondaryButtonText: string;\n primaryButtonText: string;\n handleSubmit: (value: string) => void;\n handleModalClose: () => void;\n};\n\nexport const ModalInputText = ({\n title,\n label,\n defaultValue,\n primaryButtonText,\n secondaryButtonText,\n handleModalClose,\n handleSubmit,\n}: Props) => {\n const [inputValue, setInputValue] = useState(defaultValue);\n const { isCdkEnviroment } = useTheme();\n return (\n <Modal>\n <ModalItem>\n <Header>\n {title}\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n />\n </CloseButtonWrapper>\n </Header>\n <Content>\n <Label>{label}</Label>\n <Input\n autoFocus={true}\n value={inputValue}\n onChange={e => setInputValue(e.currentTarget.value)}\n width={'100%'}\n />\n <ButtonsWrapper>\n <Button\n text={secondaryButtonText}\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n onClick={handleModalClose}\n />\n <Button\n text={primaryButtonText}\n onClick={() => handleSubmit(inputValue)}\n disabled={inputValue === ''}\n />\n </ButtonsWrapper>\n </Content>\n </ModalItem>\n </Modal>\n );\n};\n","export const generateTempAudioName = (videoId: string, fileExt: string) => {\n return (\n videoId +\n '_' +\n (Math.random() + 1).toString(36).substring(2) +\n '.' +\n fileExt\n );\n};\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { IoMdSearch } from 'react-icons/io';\nimport { useState } from 'react';\nimport { Input } from 'lib/components';\nimport { MdClear } from 'react-icons/md';\nimport { screenSizes } from 'lib/style/theme';\nimport { useTranslation } from 'react-i18next';\n\nconst SearchWrapper = styled.div`\n position: relative;\n width: 216px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst SearchIconWrapper = styled.div`\n position: absolute;\n left: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\nconst ClearIconWrapper = styled.div`\n position: absolute;\n right: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\ntype Props = {\n prevSearch: string;\n handleSearch: (searchTerm: string) => void;\n};\nexport const Search = ({ prevSearch, handleSearch }: Props) => {\n const { t } = useTranslation();\n const [searchTerm, setSearchTerm] = useState(prevSearch || '');\n\n const handleSearchKeyUp = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSearch(searchTerm);\n }\n };\n\n const handleClear = () => {\n setSearchTerm('');\n handleSearch('');\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.currentTarget.value);\n };\n\n return (\n <SearchWrapper>\n <SearchIconWrapper>\n <IoMdSearch onClick={() => handleSearch(searchTerm)} size={17} />\n </SearchIconWrapper>\n <Input\n width='100%'\n type='text'\n padding='8px 40px 8px 40px'\n value={searchTerm}\n placeholder={t('Search...')}\n onKeyUp={handleSearchKeyUp}\n onChange={handleChange}\n />\n {searchTerm !== '' && (\n <ClearIconWrapper>\n <MdClear onClick={() => handleClear()} size={17} />\n </ClearIconWrapper>\n )}\n </SearchWrapper>\n );\n};\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\n\nconst Wrapper = styled.div`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n`;\n\ntype Props = {\n page: number;\n size: number;\n count: number;\n};\nexport const PageInfo = ({ page, size, count }: Props) => {\n const from = page * size + 1;\n let to = page * size + size;\n if (to > count) {\n to = count;\n }\n return (\n <Wrapper>\n {from}-{to} of {count}\n </Wrapper>\n );\n};\n","export const lesaKeys = {\n all: ({ page, search }: { page: number; search: string }) => [\n 'LESA_LIST',\n page,\n search,\n ],\n};\n","import { useQuery } from 'react-query';\nimport { lesaKeys } from './lesaKeys';\nimport { EXPRESS_API } from 'lib/config';\nimport { useToastNotifications } from 'lib/components';\n\nexport interface ILesaItem {\n postingId: number;\n stockNumber: string;\n year: number;\n make: string;\n model: string;\n vehicleCondition: VEHICLE_CONDITION;\n video: Video | null;\n thumbnailUrl?: string;\n lesaVehicleId: number;\n lesaDealerId: number;\n title: string;\n vin: string;\n updatedAt: string;\n createdAt: string;\n}\n\nenum VEHICLE_CONDITION {\n NEW = 'New',\n USED = 'Used',\n CERTIFIED = 'Certified',\n}\n\ninterface Video {\n url: string;\n filename: string;\n uuid: string | null;\n createdAt: string | null;\n captionsUrl: string;\n}\n\ntype LesaParams = {\n limit: number;\n page: number;\n search?: string;\n};\n\nconst getLesaVideos = async (\n props: LesaParams\n): Promise<{ videos: ILesaItem[]; count: number }> => {\n const start = ((props.page || 1) - 1) * (props.limit || 12);\n const params = {\n start,\n limit: props.limit,\n search: props.search,\n page: props.page,\n };\n\n return (\n await EXPRESS_API.get(`/lesa/videos`, {\n params,\n })\n ).data;\n};\n\nexport const useLesaTvVideosQuery = (params: LesaParams) => {\n const { toast } = useToastNotifications();\n return useQuery(\n lesaKeys.all({ page: params.page, search: params.search || '' }),\n () => getLesaVideos(params),\n {\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n enabled: params.search === '' || (params.search?.length || 0) > 2,\n onError: () => {\n toast({\n message:\n \"We're currently experiencing difficulties fetching Lesa videos.\",\n });\n },\n }\n );\n};\n","import { useMutation } from 'react-query';\nimport { EXPRESS_API } from 'lib/config';\nimport { useToastNotifications } from 'lib/components';\nimport { useTranslation } from 'react-i18next';\n\ntype LesaParams = {\n url: string;\n fileName: string;\n lesaVehicleId: number;\n};\n\nconst copyLesaVideo = async (params: LesaParams) => {\n return await EXPRESS_API.post(`/lesa/videos`, { ...params });\n};\n\nexport const useLesaVideosCopyMutation = ({\n onSuccesCallback,\n}: {\n onSuccesCallback: () => void;\n}) => {\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n return useMutation(copyLesaVideo, {\n onSuccess: () => {\n toast({ message: t('Video has been added!') });\n onSuccesCallback();\n },\n onError: () =>\n toast({ message: t('An error occured while trying to add the video!') }),\n });\n};\n","import { useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { Container, LoadingIndicator, TopBar } from 'lib/components';\nimport { MdArrowBack, MdChevronLeft, MdChevronRight } from 'react-icons/md';\nimport { useHistory } from 'react-router';\nimport { PageInfo, Search } from './components';\nimport { screenSizes } from 'lib/style/theme';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport {\n ILesaItem,\n useLesaTvVideosQuery,\n} from 'lib/api/lesa/useLesaTvVideosQuery';\nimport { useLesaVideosCopyMutation } from 'lib/api/lesa/useLesaVideosMutation';\nimport { Button } from 'react-covideo-common';\nimport { useTranslation } from 'react-i18next';\n\nconst getDisplayName = (input: string[]) => input.filter(Boolean).join(' ');\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nexport const TitleWrapper = styled.div`\n font-style: normal;\n font-weight: 600;\n font-size: 15px;\n line-height: 24px;\n text-align: center;\n color: white;\n`;\n\nconst SearchAndFilterWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-direction: flex-start;\n gap: 8px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n flex-direction: column;\n width: 100%;\n `}\n`;\n\nconst YearWrap = styled.div`\n width: 216px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nconst TableContentContainer = styled.div`\n background: ${theme.palette.white};\n`;\n\nconst VideosList = styled.div`\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n max-width: 925px;\n`;\n\nconst Video = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n height: 56px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nconst TableHeaderContainer = styled.div`\n width: 100%;\n display: flex;\n align-items: top;\n height: 32px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nconst TableColumnTitle = styled.div`\n width: 100%;\n display: flex;\n align-items: flex-start;\n font-weight: 500;\n color: ${theme.palette.gray60};\n margin-right: 5px;\n`;\n\nconst VehicleYear = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n max-width: 180px;\n min-width: 40px;\n`;\n\nconst VehicleMake = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n max-width: 180px;\n min-width: 75px;\n`;\n\nconst VehicleStockId = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n max-width: 180px;\n min-width: 75px;\n`;\n\nconst VehicleModel = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n width: inherit;\n`;\n\nconst VideoOptions = styled.div`\n height: 40px;\n width: inherit;\n text-align-last: end;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n max-width: 173px;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n`;\n\nconst LoadingWrapper = styled.div`\n margin-top: 100px;\n`;\n\nconst EmptySearch = styled.div`\n font-size: 14px;\n font-weight: bold;\n text-align: center;\n`;\n\nconst TablePaginationContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-end;\n margin-top: 16px;\n`;\n\nconst PaginationText = styled.span`\n color: ${theme.palette.gray80};\n height: 20px;\n font-size: 14px;\n font-weight: 400;\n font-stretch: normal;\n font-style: normal;\n line-height: 20px;\n letter-spacing: normal;\n color: #4e5461;\n`;\n\nconst PageInput = styled.input`\n height: 40px;\n width: 50px;\n margin-right: 16px;\n outline: 0;\n text-align: center;\n font-size: 15px;\n border: 1px solid ${({ theme }) => theme.colors.primary[20]};\n border-radius: 6px;\n`;\n\nconst Navigation = styled.div`\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 8;\nconst DEFAULT_COUNT = 1;\n\nexport const LesaTV = () => {\n const history = useHistory();\n const { containerWidth } = useConfigurationContext();\n const [searchTerm, setSearchTerm] = useState('');\n const [page, setPage] = useState(DEFAULT_PAGE);\n const goToLibrary = () => history.push(`/`);\n const { t } = useTranslation();\n\n //queries\n const {\n data,\n refetch,\n isLoading: isLoadingLesaTv,\n } = useLesaTvVideosQuery({\n limit: DEFAULT_LIMIT,\n page: page,\n search: searchTerm,\n });\n\n const onSuccesCallback = () => {\n goToLibrary();\n };\n // mutations\n const { mutateAsync: copyLesaVideosMutation, isLoading: isCopyingVideo } =\n useLesaVideosCopyMutation({\n onSuccesCallback,\n });\n\n const resetPage = () => {\n setPage(1);\n };\n\n const isLoading = isLoadingLesaTv || isCopyingVideo;\n const isNotSearchable = searchTerm.length > 0 && searchTerm.length < 3;\n\n useEffect(() => {\n if (isNotSearchable) {\n return;\n }\n refetch();\n }, [searchTerm]);\n\n const onSearchChangeHandler = async (search: string = '') => {\n setSearchTerm(search);\n resetPage();\n };\n\n const copyLesaMutationHandler = (video: ILesaItem) => {\n if (!video.video) {\n return;\n }\n const title = getDisplayName([\n video?.year.toString(),\n video.make,\n video.model,\n video.stockNumber,\n ]);\n copyLesaVideosMutation({\n url: video.video?.url,\n fileName: title,\n lesaVehicleId: video.lesaVehicleId,\n });\n };\n\n const onPageChange = (direction: 'left' | 'right') => {\n if (direction === 'left') {\n setPage(prevPage => prevPage - 1);\n }\n if (direction === 'right') {\n setPage(prevPage => prevPage + 1);\n }\n };\n const lastPage = Math.ceil((data?.count || 0) / DEFAULT_LIMIT);\n\n return (\n <>\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n icon={<MdArrowBack size='18' />}\n onClick={() => goToLibrary()}\n variant='transparent'\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{t('Lesa TV Import')}</TitleWrapper>}\n />\n <Container>\n <SearchAndFilterWrapper>\n <Search\n handleSearch={onSearchChangeHandler}\n prevSearch={searchTerm}\n />\n <YearWrap></YearWrap>\n </SearchAndFilterWrapper>\n </Container>\n </Wrapper>\n <TableContentContainer>\n <Container\n extendStyle={{\n wrapper: {\n padding:\n containerWidth >= screenSizes.xs ? '32px 16px' : '16px 0px',\n },\n }}\n >\n {isLoading ? (\n <LoadingWrapper>\n <LoadingIndicator isLoading={isLoading} />\n </LoadingWrapper>\n ) : isNotSearchable ? (\n <EmptySearch>\n <p>{t('Please enter at least three characters to search')}</p>\n </EmptySearch>\n ) : !data?.videos.length ? (\n <EmptySearch>\n <p>\n {t(\n 'Oops! It looks like there are no videos matching your search terms.'\n )}\n </p>\n <p>{t('Try using different search term')}</p>\n </EmptySearch>\n ) : (\n <>\n <TableHeaderContainer>\n <VehicleStockId>\n <TableColumnTitle>{t('Stock')} #</TableColumnTitle>\n </VehicleStockId>\n {containerWidth >= screenSizes.xs && (\n <VehicleYear>\n <TableColumnTitle>{t('Year')}</TableColumnTitle>\n </VehicleYear>\n )}\n <VehicleMake>\n <TableColumnTitle>{t('Make')}</TableColumnTitle>\n </VehicleMake>\n <VehicleModel>\n <TableColumnTitle>{t('Model')}</TableColumnTitle>\n </VehicleModel>\n </TableHeaderContainer>\n <VideosList>\n {data?.videos.map(video => (\n <Video key={video.stockNumber} onClick={() => {}}>\n <VehicleStockId>{video.stockNumber}</VehicleStockId>\n {containerWidth >= screenSizes.xs && (\n <VehicleYear>{video.year}</VehicleYear>\n )}\n <VehicleMake>{video.make}</VehicleMake>\n <VehicleModel>{video.model}</VehicleModel>\n <VideoOptions>\n <Button\n variant='secondary'\n onClick={() => copyLesaMutationHandler(video)}\n text={t('Add')}\n />\n </VideoOptions>\n </Video>\n ))}\n </VideosList>\n <TablePaginationContainer>\n <Navigation>\n <PaginationText>{t('Go to:')}</PaginationText>\n <PageInput\n type='number'\n min={DEFAULT_COUNT}\n value={page}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (!e.currentTarget || !e.currentTarget.value) {\n return;\n }\n\n const newPage = parseInt(e.currentTarget.value);\n if (newPage <= 0) {\n resetPage();\n return;\n }\n if (newPage > lastPage) {\n setPage(lastPage);\n return;\n }\n\n setPage(newPage);\n }}\n />\n <PageInfo\n page={page - 1}\n size={DEFAULT_LIMIT}\n count={data?.count || 0}\n />\n <Button\n onClick={() => onPageChange('left')}\n icon={<MdChevronLeft size={20} />}\n disabled={page === DEFAULT_PAGE}\n size='small'\n variant='secondary'\n />\n <Button\n onClick={() => onPageChange('right')}\n icon={<MdChevronRight size={20} />}\n disabled={page === lastPage}\n size='small'\n variant='secondary'\n />\n </Navigation>\n </TablePaginationContainer>\n </>\n )}\n </Container>\n </TableContentContainer>\n </>\n );\n};\n","import { useState, useEffect, createRef } from 'react';\nimport styled, { css, useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport {\n TopBar,\n Container,\n LoadingIndicator,\n useToastNotifications,\n} from 'lib/components';\nimport { MdArrowBack, MdInfo } from 'react-icons/md';\nimport { useHistory, useParams } from 'react-router';\nimport { VideoPreview } from './components/VideoPreview';\nimport { VideoData } from 'lib/hooks';\nimport { AudioRecorder } from './components/AudioRecorder';\nimport {\n addVoiceoverToVideo,\n GetSignedUrlsParams,\n GetSignedUrlsResponse,\n getVideo,\n getVoiceoverSignedURLs,\n uploadVoiceoverAudio,\n} from 'lib/api';\nimport { ModalInputText } from 'lib/components/modals/ModalInputText';\nimport { generateTempAudioName } from './components/util';\nimport { FILE_EXTENSION } from 'lib/hooks/useMediaRecorder';\nimport { screenSizes } from 'lib/style/theme';\nimport { Button } from 'react-covideo-common';\nimport { TitleWrapper } from '../lesaTV/LesaTV';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport {\n CovideoGTMVehicleItem,\n CovideoGTMVideoAttributes,\n} from 'lib/hooks/GTM/types';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { GTMSaveNewVideoInteractionTypes } from 'lib/hooks/GTM/actions/video';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.white};\n`;\n\nconst VoiceOverMessage = styled.div`\n width: 78%;\n margin-left: auto;\n margin-right: auto;\n height: 40%;\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n padding: 12px;\n gap: 12px;\n background: #f2f4f6;\n border: 1px solid rgba(39, 42, 50, 0.05);\n border-radius: 6px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\nconst IconWrapper = styled.div`\n width: 20px;\n flex-grow: 0;\n flex-shrink: 0;\n`;\nconst TextWrapper = styled.div`\n width: auto;\n`;\n\nconst Title = styled.div`\n font-weight: 600;\n font-size: 16px;\n line-height: 24px;\n color: ${({ theme }) => theme.colors.primary[100]};\n`;\n\nconst Text = styled.div`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.blackRgb60};\n margin-top: 2%;\n`;\n\nexport const VoiceOver = () => {\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n const { trackGTMSaveNewVideoInteractionEvent } = useGTMAnalytics();\n const { t } = useTranslation();\n const { toast } = useToastNotifications();\n const { colors, isCdkEnviroment } = useTheme();\n // @ts-ignore\n const { videoId } = useParams();\n const history = useHistory();\n const [video, setVideo] = useState<any>({});\n const [videoLoading, setVideoLoading] = useState(true);\n const [uploading, setUploading] = useState(false);\n const [voiceoverValid, setVoiceoverValid] = useState(false);\n const [showModalRename, setShowModalRename] = useState(false);\n const [recordingBlobUrl, setRecordingBlobUrl] = useState('');\n\n const videoRef = createRef<HTMLVideoElement>();\n\n const fetchVideo = async () => {\n setVideoLoading(true);\n const data = await getVideo(videoId);\n if (data) {\n setVideo(data);\n }\n setVideoLoading(false);\n };\n\n const handleSaveVideo = () => {\n setShowModalRename(true);\n };\n\n useEffect(() => {\n fetchVideo();\n }, []);\n\n useEffect(() => {\n if (videoLoading) return;\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_VOICE_RECORDER,\n videoAttributes: {\n videoId: Number(video.id),\n videoType: video.videoRequest?.videoType,\n videoCustomerName: !!video.videoRequest?.customerName || false,\n videoLength: video.videoLength || 0,\n videoTitle: video?.title,\n },\n });\n }, [videoLoading]);\n\n if (videoLoading) {\n return <LoadingIndicator isLoading={videoLoading} />;\n }\n\n const submitVideo = async (newVideoTitle: string) => {\n setShowModalRename(false);\n setUploading(true);\n const blob = await fetch(recordingBlobUrl || '').then(r => r.blob());\n const newAudioFileName = generateTempAudioName(video.id, FILE_EXTENSION);\n const file = new File([blob], newAudioFileName);\n\n const signedUrlData: GetSignedUrlsParams = {\n fileName: file.name,\n mimeType: 'audio/webm',\n folder: '',\n };\n\n const signedURL: GetSignedUrlsResponse =\n await getVoiceoverSignedURLs(signedUrlData);\n\n if (!signedURL || signedURL instanceof Error) {\n setUploading(false);\n toast({\n message: t('Server is currently unavailable, try again later!'),\n });\n return;\n }\n\n const data = {\n file: file as File,\n uploadURL: signedURL.uploadUrl,\n mimeType: signedUrlData.mimeType,\n };\n\n try {\n await uploadVoiceoverAudio({ data });\n await addVoiceoverToVideo({\n videoId: video.id,\n newVideoTitle,\n audioFileName: newAudioFileName,\n });\n const videoAttributes: CovideoGTMVideoAttributes = {\n videoId: Number(video.id),\n videoType: video?.videoRequest?.videoType,\n videoCustomerName: !!video?.videoRequest?.customerName,\n videoLength: video.videoLength,\n videoTitle: video.title,\n };\n\n trackGTMSaveNewVideoInteractionEvent?.({\n type: GTMSaveNewVideoInteractionTypes.VOICE_RECORD,\n vehicle: (video?.videoRequest?.inventoryItem ||\n video?.videoRequest?.vehicle) as CovideoGTMVehicleItem,\n videoAttributes: videoAttributes,\n });\n } catch (error) {\n setUploading(false);\n toast({\n message: t('Creating voiceover failed, try again later!'),\n });\n return;\n }\n toast({\n message: t('Voiceover successfully created!'),\n });\n setUploading(false);\n setVoiceoverValid(false);\n history.push('/');\n };\n\n return (\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n variant='transparent'\n icon={<MdArrowBack size='18' />}\n onClick={() => history.push('/')}\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{t('Voiceover')}</TitleWrapper>}\n right={\n <Button\n onClick={handleSaveVideo}\n text={t('Save Video')}\n variant={isCdkEnviroment ? 'white' : 'primary'}\n disabled={!voiceoverValid || uploading}\n />\n }\n />\n <Container>\n {!uploading && (\n <>\n <VoiceOverMessage>\n <IconWrapper>\n <MdInfo size={22} color={colors.primary[60]} />\n </IconWrapper>\n <TextWrapper>\n <Title>{t('Duplicated video ready for voiceover')}</Title>\n <Text>\n {t(\n 'The video won’t be available in the Library until you save it. A new voiceover will replace the original audio of duplicated video.'\n )}\n </Text>\n </TextWrapper>\n </VoiceOverMessage>\n <VideoPreview\n video={video as unknown as VideoData}\n videoRef={videoRef}\n margin='32px 0 0'\n />\n <AudioRecorder\n videoRef={videoRef}\n video={video as unknown as VideoData}\n onChangeVoiceoverValid={setVoiceoverValid}\n onRecordingUrlGeneration={(url: string) => {\n setRecordingBlobUrl(url);\n }}\n margin='32px auto 0'\n />\n </>\n )}\n </Container>\n {uploading && <LoadingIndicator isLoading={true} />}\n {showModalRename && (\n <ModalInputText\n title={t('Name new video')}\n label={t('Give your new video a name')}\n defaultValue={video.title}\n secondaryButtonText={t('Back')}\n primaryButtonText={t('Save Video')}\n handleSubmit={submitVideo}\n handleModalClose={() => setShowModalRename(false)}\n />\n )}\n </Wrapper>\n );\n};\n","import styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { IoMdSearch } from 'react-icons/io';\nimport { useState } from 'react';\nimport { Input } from 'lib/components';\nimport { MdClear } from 'react-icons/md';\nimport { screenSizes } from 'lib/style/theme';\nimport { useTranslation } from 'react-i18next';\n\nconst SearchWrapper = styled.div`\n position: relative;\n width: 216px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst SearchIconWrapper = styled.div`\n position: absolute;\n left: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\nconst ClearIconWrapper = styled.div`\n position: absolute;\n right: 12px;\n top: 12px;\n color: ${theme.palette.gray60};\n cursor: pointer;\n &:hover {\n color: ${theme.palette.gray100};\n }\n`;\n\ntype Props = {\n prevSearch: string;\n handleSearch: (searchTerm: string) => void;\n};\nexport const Search = ({ prevSearch, handleSearch }: Props) => {\n const { t } = useTranslation();\n const [searchTerm, setSearchTerm] = useState(prevSearch || '');\n\n const handleSearchKeyUp = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n handleSearch(searchTerm);\n }\n };\n\n const handleClear = () => {\n setSearchTerm('');\n handleSearch('');\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchTerm(e.currentTarget.value);\n };\n\n return (\n <SearchWrapper>\n <SearchIconWrapper>\n <IoMdSearch onClick={() => handleSearch(searchTerm)} size={17} />\n </SearchIconWrapper>\n <Input\n width='100%'\n type='text'\n padding='8px 40px 8px 40px'\n value={searchTerm}\n placeholder={t('Search Videos...')}\n onKeyUp={handleSearchKeyUp}\n onChange={handleChange}\n />\n {searchTerm !== '' && (\n <ClearIconWrapper>\n <MdClear onClick={() => handleClear()} size={17} />\n </ClearIconWrapper>\n )}\n </SearchWrapper>\n );\n};\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useTranslation } from 'react-i18next';\n\nconst Wrapper = styled.div`\n font-weight: 400;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.gray80};\n`;\n\ntype Props = {\n page: number;\n size: number;\n count: number;\n};\n\nexport const PageInfo = ({ page, size, count }: Props) => {\n const { t } = useTranslation();\n const from = page * size + 1;\n let to = page * size + size;\n if (to > count) {\n to = count;\n }\n return (\n <Wrapper>\n {from}-{to} {t('of')} {count}\n </Wrapper>\n );\n};\n","import { useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { theme } from 'lib/style';\nimport {\n Container,\n LoadingIndicator,\n useToastNotifications,\n TopBar,\n} from 'lib/components';\nimport { MdArrowBack, MdChevronLeft, MdChevronRight } from 'react-icons/md';\nimport { useHistory } from 'react-router';\nimport { copyWTVVideo, getWTVVideos, WTVListItem } from 'lib/api';\nimport { PageInfo, Search } from './components';\nimport { screenSizes } from 'lib/style/theme';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { Button } from 'react-covideo-common';\nimport { useAuthorizationContext } from 'lib/context';\nimport { TitleWrapper } from '../lesaTV/LesaTV';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nconst SearchAndFilterWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-direction: flex-start;\n gap: 8px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n flex-direction: column;\n width: 100%;\n `}\n`;\n\nconst YearWrap = styled.div`\n width: 216px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nconst TableContentContainer = styled.div`\n background: ${theme.palette.white};\n`;\n\nconst VideosList = styled.div`\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n max-width: 925px;\n`;\n\nconst Video = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n height: 56px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nconst TableHeaderContainer = styled.div`\n width: 100%;\n display: flex;\n align-items: top;\n height: 32px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nconst TableColumnTitle = styled.div`\n width: 100%;\n display: flex;\n align-items: flex-start;\n font-weight: 500;\n color: ${theme.palette.gray60};\n margin-right: 5px;\n`;\n\nconst VehicleYear = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n max-width: 180px;\n min-width: 40px;\n`;\n\nconst VehicleMake = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n max-width: 275px;\n min-width: 200px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n min-width: 100px;\n `}\n`;\n\nconst VehicleModel = styled.div`\n height: 20px;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n width: inherit;\n`;\n\nconst VideoOptions = styled.div`\n height: 40px;\n width: inherit;\n text-align-last: end;\n margin-left: 24px;\n font-size: 14px;\n line-height: 24px;\n text-align: left !important;\n color: ${theme.palette.gray100};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n max-width: 173px;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n`;\n\nconst LoadingWrapper = styled.div`\n margin-top: 100px;\n`;\n\nconst EmptySearch = styled.div`\n font-size: 14px;\n font-weight: bold;\n text-align: center;\n`;\n\nconst TablePaginationContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-end;\n margin-top: 16px;\n`;\n\nconst PaginationText = styled.span`\n color: ${theme.palette.gray80};\n height: 20px;\n font-size: 14px;\n font-weight: 400;\n font-stretch: normal;\n font-style: normal;\n line-height: 20px;\n letter-spacing: normal;\n color: #4e5461;\n`;\n\nconst PageInput = styled.input`\n height: 40px;\n width: 50px;\n margin-right: 16px;\n outline: 0;\n text-align: center;\n font-size: 15px;\n border: 1px solid ${({ theme }) => theme.colors.primary[20]};\n border-radius: 6px;\n`;\n\nconst Navigation = styled.div`\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 10;\nconst DEFAULT_COUNT = 1;\nconst DEFAULT_SEARCH_DELAY = 1;\nconst DEFAULT_YEAR = new Date().getFullYear();\n\nexport const WheelsTV = () => {\n const { t } = useTranslation();\n const history = useHistory();\n const { containerWidth } = useConfigurationContext();\n const [searchTerm, setSearchTerm] = useState('');\n const [currentPage, setCurrentPage] = useState(DEFAULT_PAGE);\n const [searchDelay, setSearchDelay] = useState(DEFAULT_SEARCH_DELAY);\n const [selectedYear, setSelectedYear] = useState(DEFAULT_YEAR);\n const [count, setCount] = useState(DEFAULT_COUNT);\n const [lastPage, setLastPage] = useState(DEFAULT_PAGE);\n const [videos, setVideos] = useState<WTVListItem[]>([]);\n const { toast } = useToastNotifications();\n const recordsLimit = DEFAULT_LIMIT;\n\n const [loading, setLoading] = useState(true);\n const goToLibrary = () => history.push(`/`);\n\n let rejectSearch = () => {};\n\n useEffect(() => {\n const fetchVideos = async () => {\n setLoading(true);\n try {\n const data = await getWTVVideos({\n limit: recordsLimit,\n page: currentPage,\n year: selectedYear,\n search: searchTerm,\n });\n setCount(data.count);\n setVideos(data.videos);\n let limit = data.count < recordsLimit ? data.count : recordsLimit;\n setLastPage(Math.ceil(data.count / limit));\n setLoading(false);\n } catch (error) {\n setLoading(false);\n }\n };\n\n fetchVideos();\n }, [recordsLimit, currentPage, selectedYear]);\n\n const handleSearch = async (\n search: string = '',\n page: number = 0,\n year: number = 0\n ) => {\n if (search.length < 2 && search !== '') return;\n\n if (search !== searchTerm) {\n setSearchTerm(search);\n page = DEFAULT_PAGE;\n setCurrentPage(DEFAULT_PAGE);\n }\n\n if (searchDelay > 0) clearTimeout(searchDelay);\n\n rejectSearch();\n\n new Promise((resolve, reject) => {\n rejectSearch = reject;\n let timeoutInterval = search !== searchTerm ? 500 : 0;\n // @ts-ignore\n setSearchDelay(setTimeout(resolve, timeoutInterval));\n }).then(async () => {\n setLoading(true);\n\n if (year === 0) year = selectedYear;\n\n try {\n const data = await getWTVVideos({\n limit: recordsLimit,\n search: search,\n page: page,\n year: year,\n });\n setCount(data.count);\n setVideos(data.videos);\n setLastPage(Math.ceil(data.count / recordsLimit));\n setLoading(false);\n } catch (error) {\n setLoading(false);\n }\n });\n };\n\n const copyVideoWTV = async (video: WTVListItem) => {\n setLoading(true);\n try {\n await copyWTVVideo({\n title: video.year + ' ' + video.make + ' ' + video.model,\n flvName: video.wtvVideoId,\n animatedGifPath: video.animatedGifPath,\n year: parseInt(video.year),\n make: video.make,\n model: video.model,\n wtvId: video.wtvId,\n });\n setLoading(false);\n toast({ message: t('Video has been added!') });\n goToLibrary();\n } catch (error) {\n setLoading(false);\n toast({ message: t('An error occured while trying to add the video!') });\n }\n };\n\n const onPageChange = (direction: 'left' | 'right') => {\n if (direction === 'left') {\n handleSearch(searchTerm, currentPage - 1, selectedYear);\n setCurrentPage(prevPage => prevPage - 1);\n }\n if (direction === 'right') {\n handleSearch(searchTerm, currentPage + 1, selectedYear);\n setCurrentPage(prevPage => prevPage + 1);\n }\n };\n\n let years: { label: string; value: string }[] = [];\n\n for (let i = DEFAULT_YEAR; i > 2007; i--) {\n years.push({ value: i.toString(), label: i.toString() });\n }\n return (\n <>\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n variant='transparent'\n icon={<MdArrowBack size='18' />}\n onClick={() => goToLibrary()}\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{t('Wheels TV Import')}</TitleWrapper>}\n />\n <Container>\n <SearchAndFilterWrapper>\n <Search handleSearch={handleSearch} prevSearch={searchTerm} />\n <YearWrap>\n <Dropdown\n value={{\n value: selectedYear.toString() || '',\n label: selectedYear.toString() || '',\n }}\n onChange={value => {\n setSelectedYear(value.value);\n setCurrentPage(DEFAULT_PAGE);\n handleSearch(searchTerm, DEFAULT_PAGE, value.value);\n }}\n options={years}\n isSearchable={false}\n creatable={false}\n />\n </YearWrap>\n </SearchAndFilterWrapper>\n </Container>\n </Wrapper>\n <TableContentContainer>\n <Container\n extendStyle={{\n wrapper: {\n padding:\n containerWidth >= screenSizes.xs ? '32px 16px' : '16px 0px',\n },\n }}\n >\n {loading ? (\n <LoadingWrapper>\n <LoadingIndicator isLoading={loading} />\n </LoadingWrapper>\n ) : !videos.length ? (\n <EmptySearch>\n <p>\n {t(\n 'Oops! It looks like there are no videos matching your search terms.'\n )}\n </p>\n <p>{t('Try using a different search terms')}</p>\n </EmptySearch>\n ) : (\n <>\n <TableHeaderContainer>\n {containerWidth >= screenSizes.xs && (\n <VehicleYear>\n <TableColumnTitle>{t('Year')}</TableColumnTitle>\n </VehicleYear>\n )}\n <VehicleMake>\n <TableColumnTitle>{t('Make')}</TableColumnTitle>\n </VehicleMake>\n <VehicleModel>\n <TableColumnTitle>{t('Model')}</TableColumnTitle>\n </VehicleModel>\n </TableHeaderContainer>\n <VideosList>\n {videos.map(video => (\n <Video key={video.wtvVideoId} onClick={() => {}}>\n {containerWidth >= screenSizes.xs && (\n <VehicleYear>{video.year}</VehicleYear>\n )}\n <VehicleMake>{video.make}</VehicleMake>\n <VehicleModel>{video.model}</VehicleModel>\n <VideoOptions>\n <Button\n onClick={async () => {\n copyVideoWTV(video);\n }}\n text={t('Add')}\n variant='secondary'\n />\n </VideoOptions>\n </Video>\n ))}\n </VideosList>\n <TablePaginationContainer>\n <Navigation>\n <PaginationText>{t('Go to:')}</PaginationText>\n <PageInput\n type='number'\n min={DEFAULT_COUNT}\n value={currentPage}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (!e.currentTarget || !e.currentTarget.value) {\n return;\n }\n\n const newPage = parseInt(e.currentTarget.value);\n if (newPage <= 0) {\n setCurrentPage(1);\n handleSearch(searchTerm, 1, selectedYear);\n return;\n }\n if (newPage > lastPage) {\n setCurrentPage(lastPage);\n handleSearch(searchTerm, lastPage, selectedYear);\n return;\n }\n\n setCurrentPage(newPage);\n handleSearch(searchTerm, newPage, selectedYear);\n }}\n />\n <PageInfo\n page={currentPage - 1}\n size={recordsLimit}\n count={count}\n />\n <Button\n onClick={() => onPageChange('left')}\n icon={<MdChevronLeft size={20} />}\n disabled={currentPage === DEFAULT_PAGE}\n variant='secondary'\n size='small'\n />\n <Button\n onClick={() => onPageChange('right')}\n icon={<MdChevronRight size={20} />}\n disabled={currentPage === lastPage}\n variant='secondary'\n size='small'\n />\n </Navigation>\n </TablePaginationContainer>\n </>\n )}\n </Container>\n </TableContentContainer>\n </>\n );\n};\n","import * as React from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport styled from 'styled-components';\nimport { TimelineRange } from '../../video/components/videoPlayer/components/trim/TimelineRange';\nimport { toHHMMSSFF } from 'lib/utils/functions';\n\nconst Row = styled.div`\n padding-left: 2px;\n padding-right: 2px;\n padding-top: 2px;\n display: flex;\n flex-direction: column;\n margin-left: 20px;\n height: 85px;\n`;\n\ntype RangeProps = {\n width: string;\n offset: string;\n};\n\nconst RangeWrapper = styled.div<RangeProps>`\n position: relative;\n left: ${props => props.offset};\n width: ${props => props.width};\n`;\n\nexport const VideoRow = ({\n index,\n totalDuration,\n offset,\n width,\n video = {},\n setVideos = () => {},\n hasProcessingVideos,\n showPreviewTrack = true,\n}: any) => {\n const valueRef = React.useRef<Array<number>>([0, 0]);\n const [value, setValue] = useState<ReadonlyArray<number>>([\n 0,\n video.duration,\n ]);\n\n useEffect(() => {\n setVideos((videos: any) => {\n const vtm = [...videos];\n const startSec = value[0];\n const endSec = value[1];\n const time = `#t=${startSec ? startSec : 0}${endSec ? ',' + endSec : ''}`;\n vtm[index] = {\n ...vtm[index],\n start: toHHMMSSFF(value[0]),\n end: toHHMMSSFF(value[1]),\n startSec,\n endSec,\n source: ('' + video.source).split('#t=')[0] + time,\n };\n return vtm;\n });\n }, [value]);\n\n const onUpdate = (args: any) => {\n const duration = args[1] - args[0];\n setVideos((videos: any) => {\n const vtm = [...videos];\n vtm[index] = {\n ...vtm[index],\n width: (duration * 100) / totalDuration,\n trimDuration: duration,\n };\n return vtm;\n });\n };\n\n useEffect(() => {\n if (!totalDuration) {\n return;\n }\n setVideos((videos: any) => {\n const vtm = [...videos];\n vtm[index] = {\n ...vtm[index],\n width: (video.trimDuration * 100) / totalDuration,\n };\n return vtm;\n });\n }, [totalDuration]);\n\n return useMemo(\n () => (\n <Row key={video.id}>\n <RangeWrapper offset={`${offset || 0}px`} width={`${width || 0}px`}>\n {!!video.duration && video.ref && !hasProcessingVideos && (\n <TimelineRange\n videoRef={video.ref}\n videoDuration={video.duration}\n videoSource={video.videoSource}\n setValue={setValue}\n showTickTime={false}\n value={value}\n valueRef={valueRef}\n width={'100%'}\n onSlideEnd={onUpdate}\n showPreviewTrack={showPreviewTrack}\n />\n )}\n </RangeWrapper>\n </Row>\n ),\n [video.width, video.ref, value, offset, width, video.processing]\n );\n};\n","import * as React from \"react\";\nconst SvgDragIcon = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M21 17C21.5523 17 22 16.5523 22 16C22 15.4477 21.5523 15 21 15H3C2.44772 15 2 15.4477 2 16C2 16.5523 2.44772 17 3 17H21ZM21 13C21.5523 13 22 12.5523 22 12C22 11.4477 21.5523 11 21 11H3C2.44772 11 2 11.4477 2 12C2 12.5523 2.44772 13 3 13H21ZM2 8C2 8.55228 2.44772 9 3 9H21C21.5523 9 22 8.55228 22 8C22 7.44772 21.5523 7 21 7H3C2.44772 7 2 7.44772 2 8Z\", fill: \"#001B53\", fillOpacity: 0.4 }));\nexport default SvgDragIcon;\n","import styled from 'styled-components';\nimport DragSvg from './drag-icon.svg?react';\n\nconst Drag = styled(DragSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n g {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default Drag;\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { theme } from 'lib/style';\nimport { VideoPlayer } from '../../video/components/videoPlayer';\nimport { useMemo } from 'react';\nimport Drag from 'lib/images/Drag';\nimport { VideoEncodingStatus } from 'lib/const/VideoStatus';\nimport { Spinner } from 'lib/components';\nimport { EXTERNAL_VIDEO_PREFIX } from 'lib/const/VideoType';\nimport useVideoLoadRetry from 'lib/hooks/useVideoLoadRetry';\nimport useImageLoadRetry from 'lib/hooks/useImageLoadRetry';\n\nconst VideoWrapper = styled.div`\n background-color: ${theme.palette.themeDark};\n max-height: 80px;\n align-self: center;\n border-radius: 6px;\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n border-radius: 6px;\n overflow: hidden;\n position: relative;\n aspect-ratio: 16 / 9;\n div {\n display: contents;\n opacity: 0;\n div {\n display: none;\n opacity: 0;\n }\n svg {\n display: none;\n opacity: 0;\n }\n path {\n display: none;\n opacity: 0;\n }\n figure {\n display: contents;\n opacity: 0;\n }\n video {\n display: contents;\n opacity: 0;\n }\n img {\n display: contents;\n opacity: 0;\n }\n }\n`;\n\nconst VideoImg = styled.img`\n background-color: ${theme.palette.themeDark};\n display: block;\n height: 100%;\n margin: auto;\n border-radius: 6px;\n width: 120px;\n object-fit: contain;\n`;\n\nconst Row = styled.div`\n padding-right: 32px;\n border-top-left-radius: 16px;\n border-bottom-left-radius: 16px;\n background-color: #fff;\n height: 80px;\n display: flex;\n flex-direction: row;\n margin-bottom: 8px;\n`;\n\ntype DragContainerProps = {\n disabled?: boolean;\n};\n\nconst DragContainer = styled.div<DragContainerProps>`\n display: flex;\n justify-content: center;\n height: 80px;\n width: 48px;\n align-items: center;\n opacity: 0.8;\n &:hover {\n cursor: ${props => (props.disabled ? 'not-allowed' : 'grab')};\n opacity: 1;\n }\n`;\n\nconst SpinnerWrapper = styled.div`\n background-color: ${theme.palette.themeDark};\n\n aspect-ratio: 16 / 9;\n width: 120px;\n max-height: 80px;\n margin: 6px 0;\n box-sizing: border-box;\n border-radius: 6px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const VideoThumbnail = ({\n video = {},\n setVideos = () => {},\n setVideoRef,\n index,\n isDragDisabled,\n setShouldFetch,\n}: any) => {\n const videoRef = React.createRef<HTMLVideoElement>();\n const [videoDuration, setVideoDuration] = useState<number>(0);\n\n const isExternalVideo =\n !!video?.id && video?.id.toString().includes(EXTERNAL_VIDEO_PREFIX);\n const { videoData, retryCount } = useVideoLoadRetry({\n videoId: video?.id || 0,\n enabled:\n !isExternalVideo && video?.processing === VideoEncodingStatus.PROCESSING,\n });\n\n const { imgRef } = useImageLoadRetry({\n src: videoData?.autogeneratedThumbnail || video?.autoGeneratedGifPath,\n });\n\n const onloadedmetadata = () => {\n if (videoRef.current) {\n const duration = videoRef.current.duration;\n setVideoDuration(duration);\n }\n };\n\n useEffect(() => {\n if (!videoDuration) {\n return;\n }\n setVideos((videos: any) => {\n const vtm = [...videos];\n vtm[index] = {\n ...vtm[index],\n duration: videoDuration,\n trimDuration: videoDuration,\n };\n return vtm;\n });\n }, [videoDuration]);\n\n useEffect(() => {\n if (videoRef && videoRef.current) {\n videoRef.current.onloadedmetadata = () => onloadedmetadata();\n setVideoRef(index, videoRef);\n }\n }, [videoRef]);\n\n useEffect(() => {\n if (videoData && retryCount !== 0) {\n // video done processing\n setShouldFetch(true);\n }\n }, [videoData, retryCount]);\n\n const isFinishedProcessing =\n video.processing === VideoEncodingStatus.FAILED ||\n video.processing === VideoEncodingStatus.READY;\n\n return useMemo(\n () => (\n <Row key={video.id}>\n <DragContainer disabled={isDragDisabled}>\n <Drag />\n </DragContainer>\n {!isFinishedProcessing ? (\n <SpinnerWrapper>\n <Spinner />\n </SpinnerWrapper>\n ) : (\n <VideoWrapper>\n {imgRef.current ? (\n <VideoImg ref={imgRef} />\n ) : (\n <VideoImg src={video.autogeneratedThumbnail} />\n )}\n <VideoPlayer\n videoSource={video.videoSource}\n videoId={video.id}\n thumbnail={video.autogeneratedThumbnail}\n videoRef={videoRef}\n autoplay={false}\n />\n </VideoWrapper>\n )}\n </Row>\n ),\n [video.videoSource, video.processing, videoData]\n );\n};\n","import * as React from \"react\";\nconst SvgZoomOut = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"path\", { id: \"p1bfbm3cda\", d: \"M15.5 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.79 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.26 4.25c.41.41 1.07.41 1.48 0l.01-.01c.41-.41.41-1.07 0-1.48L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zm-2-5h4c.28 0 .5.22.5.5s-.22.5-.5.5h-4c-.28 0-.5-.22-.5-.5s.22-.5.5-.5z\" })), /* @__PURE__ */ React.createElement(\"g\", { fill: \"none\", fillRule: \"evenodd\", opacity: 0.2 }, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"g\", { transform: \"translate(-1112 -640) translate(1104 632) translate(8 8)\" }, /* @__PURE__ */ React.createElement(\"mask\", { id: \"98kq0pmrgb\", fill: \"#fff\" }, /* @__PURE__ */ React.createElement(\"use\", { xlinkHref: \"#p1bfbm3cda\" })), /* @__PURE__ */ React.createElement(\"use\", { fill: \"#000\", fillRule: \"nonzero\", xlinkHref: \"#p1bfbm3cda\" }), /* @__PURE__ */ React.createElement(\"g\", { fill: \"#272A32\", mask: \"url(#98kq0pmrgb)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0 0H24V24H0z\" })))))));\nexport default SvgZoomOut;\n","import styled from 'styled-components';\nimport StatsSvg from './zoom-out.svg?react';\n\nconst ZoomOutIcon = styled(StatsSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n g {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default ZoomOutIcon;\n","import * as React from \"react\";\nconst SvgZoomIn = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"path\", { id: \"eekoyvk17a\", d: \"M15.499 14h-.79l-.28-.27c1.2-1.4 1.82-3.31 1.48-5.34-.47-2.78-2.79-5-5.59-5.34-4.23-.52-7.78 3.04-7.27 7.27.34 2.8 2.56 5.12 5.34 5.59 2.03.34 3.94-.28 5.34-1.48l.27.28v.79l4.26 4.25c.41.41 1.07.41 1.48 0l.01-.01c.41-.41.41-1.07 0-1.48L15.499 14zm-6 0c-2.49 0-4.5-2.01-4.5-4.5S7.009 5 9.499 5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-7c-.28 0-.5.22-.5.5V9h-1.5c-.28 0-.5.22-.5.5s.22.5.5.5h1.5v1.5c0 .28.22.5.5.5s.5-.22.5-.5V10h1.5c.28 0 .5-.22.5-.5s-.22-.5-.5-.5h-1.5V7.5c0-.28-.22-.5-.5-.5z\" })), /* @__PURE__ */ React.createElement(\"g\", { fill: \"none\", fillRule: \"evenodd\" }, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"g\", { transform: \"translate(-1376 -640) translate(1104 632) translate(264) translate(8 8)\" }, /* @__PURE__ */ React.createElement(\"mask\", { id: \"4qknrgzsbb\", fill: \"#fff\" }, /* @__PURE__ */ React.createElement(\"use\", { xlinkHref: \"#eekoyvk17a\" })), /* @__PURE__ */ React.createElement(\"g\", { fill: \"#272A32\", mask: \"url(#4qknrgzsbb)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M0 0H24V24H0z\" }))))))));\nexport default SvgZoomIn;\n","import styled from 'styled-components';\nimport StatsSvg from './zoom-in.svg?react';\n\nconst ZoomInIcon = styled(StatsSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n g {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default ZoomInIcon;\n","import * as React from 'react';\nimport styled, { css } from 'styled-components';\nimport { hex } from 'color-convert';\nimport { MdPlayArrow } from 'react-icons/md';\n\ntype OnScreenPlayButtonProps = {\n r: number;\n g: number;\n b: number;\n hex: string;\n playButtonPosition?: string;\n isVideoPaused?: boolean;\n small?: boolean;\n};\n\nconst OnScreenPlayButtonWrapper = styled.div<OnScreenPlayButtonProps>`\n display: ${props => (props.isVideoPaused ? 'flex' : 'none')};\n justify-content: center;\n align-items: center;\n background-color: ${props => props.hex};\n opacity: 0.5;\n font-size: ${props => (props.small ? '10px' : '40px')};\n cursor: pointer;\n width: ${props =>\n `${\n props.small ? '30px' : '54px'\n }`}; /*TODO: Check with Andrija, it's 120px on one screen and 100px on another*/\n height: ${props =>\n `${\n props.small ? '30px' : '54px'\n }`}; /*TODO: Check with Andrija, it's 120px on one screen and 100px on another*/\n position: absolute;\n\n z-index: 9;\n ${props =>\n props.playButtonPosition === 'center' &&\n css`\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n `}\n\n ${props =>\n props.playButtonPosition === 'top-left' &&\n css`\n top: 5%;\n left: 5%;\n `}\n\n ${props =>\n props.playButtonPosition === 'top-right' &&\n css`\n top: 5%;\n right: 5%;\n `}\n\n ${props =>\n props.playButtonPosition === 'bottom-left' &&\n css`\n bottom: 23%;\n left: 5%;\n `}\n\n ${props =>\n props.playButtonPosition === 'bottom-right' &&\n css`\n bottom: 23%;\n right: 5%;\n `}\n\n ${props =>\n props.playButtonPosition === 'none' &&\n css`\n display: none;\n `}\n`;\n\ntype Props = {\n playerBackgroundColor: string;\n playButtonPosition: string;\n isVideoPaused: boolean;\n togglePlay: () => void;\n playerIconsColor: string;\n small?: boolean;\n};\n\nexport const OnScreenPlayButton = (props: Props) => {\n const {\n playerBackgroundColor,\n playButtonPosition,\n isVideoPaused,\n togglePlay,\n playerIconsColor,\n small,\n } = props;\n\n const newColor = hex.rgb(playerBackgroundColor);\n\n return (\n <OnScreenPlayButtonWrapper\n isVideoPaused={isVideoPaused}\n onClick={togglePlay}\n r={newColor[0]}\n g={newColor[1]}\n b={newColor[2]}\n hex={playerBackgroundColor}\n playButtonPosition={playButtonPosition}\n small={small}\n >\n <MdPlayArrow color={playerIconsColor} />\n </OnScreenPlayButtonWrapper>\n );\n};\n","import React, { useState } from 'react';\nimport styled, { css, useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { OnScreenPlayButton } from '../../video/components/videoPlayer/components/onScreenPlayButton';\nimport { screenSizes } from 'lib/style/theme';\nimport { Spinner } from 'lib/components';\nimport { isSafari } from 'lib/utils/functions';\nimport { Slider } from './VideoMerge';\n\ntype PlayerProps = {\n displayVideos: any[];\n width?: number;\n height?: number;\n hasProcessingVideos?: boolean;\n};\n\ntype VideoProps = {\n width?: number;\n height?: number;\n};\n\nconst VideoContainer = styled.div<VideoProps>`\n position: relative;\n background-color: ${theme.palette.themeDark75Percent};\n border-radius: 6px;\n width: ${props => props.width || 600}px;\n height: ${props => props.height || 300}px;\n max-width: 100%;\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.mb &&\n css`\n border-radius: 0;\n `}\n`;\n\nconst ControlsContainer = styled.div`\n width: 100%;\n justify-content: center;\n display: flex;\n`;\n\nconst Input = styled.input``;\n\ntype SpinnerWrapperProps = {\n width?: number;\n height?: number;\n};\nconst SpinnerWrapper = styled.div<SpinnerWrapperProps>`\n background-color: ${theme.palette.themeDark};\n\n height: ${props => (props.height ? props.height + 'px' : '332px')};\n width: ${props => (props.width ? props.width + 'px' : '592px')};\n\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const Player = ({\n width,\n height,\n displayVideos,\n hasProcessingVideos,\n}: PlayerProps) => {\n const videoRef = React.useRef<HTMLVideoElement>(null);\n const { colors } = useTheme();\n const currentVideoIndex = React.useRef(0);\n const [_, setIsLoading] = React.useState(true);\n const [isPlaying, setIsPlaying] = React.useState(false);\n const [trimmedDuration, setTrimmedDuration] = React.useState(0);\n const [currentPlaylistTime, setCurrentPlaylistTime] = React.useState(0);\n const [rangeValue, setRangeValue] = useState(0);\n React.useEffect(() => {\n currentVideoIndex.current = 0;\n let playlistDuration = 0;\n for (let i = 0; i < displayVideos.length; i++) {\n let videoStartTime = displayVideos[i].startSec\n ? displayVideos[i].startSec\n : 0;\n let videoEndTime = displayVideos[i].endSec\n ? displayVideos[i].endSec\n : displayVideos[i].duration;\n let videoDuration = videoEndTime - videoStartTime;\n playlistDuration += videoDuration;\n }\n setTrimmedDuration(playlistDuration || 1);\n }, [displayVideos]);\n\n const loadedmetadata = () => {\n setIsLoading(false);\n };\n const updateProgress = () => {\n if (videoRef.current) {\n const currentVideo = currentVideoIndex.current;\n const video = videoRef.current;\n let currentTime = video.currentTime;\n let videoStartTime = displayVideos[currentVideo].startSec\n ? displayVideos[currentVideo].startSec\n : 0;\n currentTime = currentTime - videoStartTime;\n currentTime = currentTime < 0 ? 0 : currentTime;\n\n for (let i = 0; i < currentVideo; i++) {\n let videoStartTime = displayVideos[i].startSec\n ? displayVideos[i].startSec\n : 0;\n let videoEndTime = displayVideos[i].endSec\n ? displayVideos[i].endSec\n : displayVideos[i].duration;\n let videoDuration = videoEndTime - videoStartTime;\n currentTime += videoDuration;\n }\n\n if (displayVideos[currentVideo].endSec <= video.currentTime) {\n playNextVideo();\n }\n setCurrentPlaylistTime(currentTime);\n }\n };\n\n const playNextVideo = () => {\n if (videoRef.current) {\n const video = videoRef.current;\n setIsLoading(true);\n const currentPlaylistVideo = ++currentVideoIndex.current;\n if (displayVideos.length > currentPlaylistVideo) {\n video.src = displayVideos[currentPlaylistVideo].source;\n let videoStartTime = displayVideos[currentPlaylistVideo].startSec\n ? displayVideos[currentPlaylistVideo].startSec\n : 0;\n video.currentTime = videoStartTime;\n } else {\n currentVideoIndex.current = 0;\n video.src = displayVideos[0].source;\n video.pause();\n setIsPlaying(false);\n }\n }\n };\n\n const skip = (event: any) => {\n const skipTo = parseFloat(event.currentTarget.value);\n if (videoRef.current) {\n const video = videoRef.current;\n const currentVideo = currentVideoIndex.current;\n let videoStart = 0;\n let videoDurationStep = 0;\n for (let i = 0; i < displayVideos.length; i++) {\n let videoStartTime = displayVideos[i].startSec\n ? displayVideos[i].startSec\n : 0;\n let videoEndTime = displayVideos[i].endSec\n ? displayVideos[i].endSec\n : displayVideos[i].duration;\n let videoDuration = videoEndTime - videoStartTime;\n videoDurationStep += videoDuration;\n if (skipTo >= videoStart && skipTo < videoDurationStep) {\n if (currentVideo !== i) {\n setIsLoading(true);\n currentVideoIndex.current = i;\n video.src = displayVideos[i].source;\n }\n video.currentTime = skipTo - videoStart + videoStartTime;\n break;\n }\n videoStart = videoDurationStep;\n }\n }\n };\n const autoPlay = () => {\n if (videoRef.current && currentVideoIndex.current > 0 && isPlaying) {\n videoRef.current.play();\n }\n };\n\n const togglePlay = () => {\n const currentVideo = videoRef.current;\n if (currentVideo) {\n isPlaying ? currentVideo.pause() : currentVideo.play();\n setIsPlaying(!isPlaying);\n }\n };\n\n const videoSource = !!displayVideos[currentVideoIndex.current]\n ? displayVideos[currentVideoIndex.current].source\n : '';\n\n const videoReady = !!videoSource && !hasProcessingVideos;\n\n const percentage = (100 * (rangeValue - 0)) / (trimmedDuration - 0);\n const rangerStyle = {\n background: `linear-gradient(90deg, ${colors.primary[100]} 0%, ${colors.primary[100]} ${percentage}%, #d0d3d9 ${percentage}%, #d0d3d9 100%)`,\n };\n\n return (\n <VideoContainer width={width} height={height}>\n {!videoReady ? (\n <SpinnerWrapper>\n <Spinner size={30} />\n </SpinnerWrapper>\n ) : (\n <>\n <video\n {...(!isSafari && { preload: 'metadata' })}\n width={width}\n height={height}\n ref={videoRef}\n onTimeUpdate={updateProgress}\n onLoadedMetadata={loadedmetadata}\n onEnded={playNextVideo}\n onCanPlayThrough={autoPlay}\n src={`${displayVideos[currentVideoIndex.current].source}`}\n onClick={togglePlay}\n style={{ maxWidth: '100%' }}\n playsInline={true}\n controls={false}\n />\n <OnScreenPlayButton\n playerBackgroundColor='#fff'\n playButtonPosition='center'\n isVideoPaused={!isPlaying}\n togglePlay={togglePlay}\n playerIconsColor={theme.palette.themeDark75Percent}\n />\n <ControlsContainer>\n <Slider\n onChange={e => {\n setRangeValue(+e.target.value);\n skip(e);\n }}\n value={currentPlaylistTime}\n max={trimmedDuration}\n min='0'\n type='range'\n step='0.01'\n color='red'\n style={{\n width: '100%',\n marginTop: '-25px',\n zIndex: 2,\n height: '4px',\n ...rangerStyle,\n boxShadow:\n '0px 0px 4px rgba(66, 79, 104, 0.08),0px 6px 12px rgba(66, 79, 104, 0.06)',\n }}\n />\n </ControlsContainer>\n </>\n )}\n </VideoContainer>\n );\n};\n","import * as React from \"react\";\nconst SvgCloseCircle = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { className: \"bg\", fill: \"white\", d: \"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"icon\", fill: \"#E84C3D\", d: \"M16.3 16.3c-.39.39-1.02.39-1.41 0L12 13.41 9.11 16.3c-.39.39-1.02.39-1.41 0-.187-.187-.292-.44-.292-.705 0-.265.105-.518.292-.705L10.59 12 7.7 9.11c-.187-.187-.292-.44-.292-.705 0-.265.105-.518.292-.705.39-.39 1.02-.39 1.41 0L12 10.59l2.89-2.89c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41L13.41 12l2.89 2.89c.38.38.38 1.02 0 1.41z\" }));\nexport default SvgCloseCircle;\n","import styled from 'styled-components';\nimport CloseSvg from './close-circle.svg?react';\n\nconst CloseCircleIcon = styled(CloseSvg)`\n width: ${props => props.width || '16px'};\n height: ${props => props.height || '16px'};\n fill: ${props => props.color || 'currentColor'};\n path.icon {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n\n path.bg {\n fill: ${props => props.bgColor || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n \n`;\n\nexport default CloseCircleIcon;\n","import { theme } from 'lib/style';\nimport React from 'react';\nimport { AiFillInfoCircle } from 'react-icons/ai';\nimport styled from 'styled-components';\n\nconst Container = styled.div`\n display: flex;\n align-items: center;\n\n gap: 10px;\n\n background-color: ${({ theme }) => theme.colors.primary[5]};\n color: ${({ theme }) => theme.colors.primary[100]};\n border-radius: 6px;\n padding: 12px;\n`;\n\nconst IconContainer = styled.div`\n flex-shrink: 0;\n color: ${({ theme }) => theme.colors.primary[100]};\n`;\n\ntype InformationProps = {\n text: string;\n width?: string;\n};\n\nexport const InformationBox = ({ text, width }: InformationProps) => {\n return (\n <Container style={{ width }}>\n <IconContainer>\n <AiFillInfoCircle size={24} color={'inherit'} opacity={0.6} />\n </IconContainer>\n\n <div>{text}</div>\n </Container>\n );\n};\n","import { useEffect, useState } from 'react';\nimport styled, { css, useTheme } from 'styled-components';\n\nimport { theme } from 'lib/style';\nimport { VideoRow } from '../components/VideoRow';\nimport { Button } from 'react-covideo-common';\nimport { VideoThumbnail } from '../components/VideoThumbnail';\nimport { toMMSS } from 'lib/utils/functions';\nimport ZoomOutIcon from 'lib/images/ZoomOutIcon';\nimport ZoomInIcon from 'lib/images/ZoomInIcon';\nimport AddIcon from 'lib/images/AddIcon';\nimport { Player } from '../components/Player';\nimport { useHistory } from 'react-router-dom';\nimport { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';\nimport { reorder } from 'lib/utils/functions';\nimport CloseCircleIcon from 'lib/images/CloseCircleIcon';\nimport { VideoListItem } from 'lib/api';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { screenSizes } from 'lib/style/theme';\nimport { COOKIE_NAMES } from 'lib/config';\nimport { InformationBox } from 'lib/components/InformationBox';\nimport { useTranslation } from 'react-i18next';\n\nconst VideoMergeLayout = styled.div`\n background-color: ${theme.palette.gray10};\n height: 100%;\n width: 100%;\n`;\n\nconst ContentWrapper = styled.div`\n background-color: #f6f7f9;\n display: flex;\n flex-direction: column;\n margin-bottom: -36px;\n min-height: 400px;\n width: 100%;\n margin-top: 15px;\n`;\n\nconst Content = styled.div`\n background-color: #f6f7f9;\n display: flex;\n flex-direction: row;\n width: 100%;\n padding-bottom: 115px;\n padding-left: 8px;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n margin-top: 10px;\n`;\n\ntype ThumbnailProps = {\n marginTop?: number;\n};\n\nconst ThumbnailWrapper = styled.div<ThumbnailProps>`\n padding-top: 67px;\n margin-top: ${props => props.marginTop || 0}px;\n display: flex;\n flex-direction: column;\n border-top-left-radius: 16px;\n border-bottom-left-radius: 16px;\n margin-top: 8px;\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.mb &&\n css`\n padding-top: 0px;\n margin-top: 16px;\n `}\n`;\n\ntype RowProps = {\n width?: number;\n height?: number;\n marginTop?: number;\n};\n\nconst RowWrapper = styled.div<RowProps>`\n float: left;\n flex-direction: column;\n width: ${props => (props.width ? `${props.width}px` : '100%')};\n div {\n margin-top: 3.5px;\n }\n`;\n\nconst RangeContainer = styled.div<RowProps>`\n display: flex;\n flex-direction: column;\n width: ${props => (props.width ? `${props.width}px` : '100%')};\n margin-bottom: 8px;\n`;\n\nconst RowContainer = styled.div<RowProps>`\n height: ${props => (props.height ? `${props.height + 20}px` : '')};\n min-height: ${props => (props.height ? `${props.height + 20}px` : '')};\n overflow-x: auto;\n overflow-y: hidden;\n width: calc(100% - 250px);\n padding-top: 39px;\n padding-bottom: 26px;\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.mb &&\n css`\n padding-top: 0;\n margin-top: 16px;\n `}\n -ms-overflow-style: none; /* Internet Explorer 10+ */\n scrollbar-width: auto; /* Firefox */\n ::-webkit-scrollbar {\n display: block;\n }\n\n -ms-overflow-style: scrollbar;\n ::-webkit-scrollbar {\n -webkit-appearance: none;\n height: 8px; /* SUS-905 changes */\n }\n ::-webkit-scrollbar-track {\n background-color: ${theme.palette.gray10};\n }\n ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: ${({ theme }) => theme.colors.primary[20]};\n }\n ::-webkit-scrollbar-thumb:hover {\n background-color: ${({ theme }) => theme.colors.primary[40]};\n }\n`;\n\nconst BlankRowsContainer = styled.div<RowProps>`\n position: absolute;\n width: calc(100% - 210px);\n`;\n\nconst ContentHeader = styled.div`\n padding: 32px 12px;\n height: 10px; /* SUS-905 changes */\n width: calc(100%-24px);\n display: flex;\n justify-content: space-between;\n`;\n\nconst PreviewContainer = styled.div`\n display: flex;\n justify-content: center;\n margin-bottom: 32px;\n border-radius: 6px;\n margin-top: 30px;\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.mb &&\n css`\n margin-top: 0;\n border-radius: 0;\n margin-bottom: 0;\n `}\n`;\n\nconst RowTime = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 20px;\n`;\n\nconst RowTicker = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n height: 8px;\n`;\n\ntype TimeProps = {\n width?: number;\n rightBorder?: boolean;\n inside?: boolean;\n};\n\nconst Tick = styled.div<TimeProps>`\n width: ${props => props.width || 20}px;\n height: ${props => (props.inside ? 4 : 8)}px;\n border-left: 1px solid ${({ theme }) => theme.colors.primary[20]};\n border-right: ${props =>\n props.rightBorder && `1px solid ${props.theme.colors.primary[20]}`};\n`;\n\nconst Time = styled.div<TimeProps>`\n font-size: 12px;\n line-height: 1.43;\n color: ${({ theme }) => theme.colors.primary[100]};\n width: ${props => props.width || 220}px;\n height: 20px;\n display: flex;\n justify-content: space-between;\n`;\n\nconst Row = styled.div`\n background: #ffffff;\n border-top-right-radius: 16px;\n border-bottom-right-radius: 16px;\n padding-left: 2px;\n padding-right: 2px;\n display: flex;\n flex-direction: column;\n height: 80px;\n margin-bottom: 8px;\n position: relative;\n`;\n\ntype ButtonProps = {\n disabled?: boolean;\n};\n\nconst ZoomButton = styled.div<ButtonProps>`\n min-width: 20px;\n margin-left: 0;\n margin-right: 12px;\n text-decoration: none;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${props => (props.disabled ? 'default' : 'pointer')};\n opacity: ${props => (props.disabled ? '0.5' : '1')};\n height: 40px;\n width: 46px;\n border-radius: 4px;\n transition: width 0.2s ease;\n overflow: hidden;\n`;\n\nconst AddVideoContainer = styled.div`\n display: block;\n height: 40px;\n border-radius: 4px;\n color: white;\n button {\n border-radius: 4px;\n }\n`;\n\nconst ZoomContainer = styled.div`\n width: 200px;\n height: 40px;\n padding: 12px;\n box-sizing: border-box;\n display: flex;\n gap: 13px;\n align-items: center;\n background: #ffffff;\n border: 1px solid rgba(0, 27, 83, 0.1);\n border-radius: 6px;\n`;\n\nconst CloseContainer = styled.div`\n position: absolute;\n right: 15px;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n`;\nconst InfoBoxWrapper = styled.div`\n margin: 30px auto 0 auto;\n max-width: 578px;\n margin-bottom: 10px;\n box-sizing: border-box;\n`;\n\nexport const Slider = styled.input`\n -webkit-appearance: none;\n width: 100%;\n background: transparent;\n cursor: pointer;\n\n /* Thumb styles for WebKit browsers */\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 12px; /* Adjust width */\n height: 12px; /* Adjust height */\n background: ${({ theme }) =>\n theme.colors.primary[100]}; /* Add red color to thumb */\n border-radius: 50%; /* Optional: make it round */\n cursor: pointer;\n z-index: 3;\n }\n\n /* Thumb styles for Firefox */\n &::-moz-range-thumb {\n width: 12px;\n height: 12px;\n background: ${({ theme }) =>\n theme.colors.primary[100]}; /* Add red color to thumb */\n border-radius: 50%; /* Optional: make it round */\n cursor: pointer;\n z-index: 3;\n }\n\n /* Thumb styles for IE */\n &::-ms-thumb {\n width: 12px;\n height: 12px;\n background: ${({ theme }) =>\n theme.colors.primary[100]}; /* Add red color to thumb */\n border-radius: 50%; /* Optional: make it round */\n cursor: pointer;\n z-index: 3;\n }\n\n &:focus {\n outline: none;\n }\n\n /* Track styles for IE */\n &::-ms-track {\n width: 100%;\n cursor: pointer;\n background: transparent;\n border-color: transparent;\n color: transparent;\n }\n`;\n\nconst findNearestMultiple = (n: number, multiple: number) => {\n if (n > 0) return Math.ceil(n / multiple) * multiple;\n else return multiple;\n};\n\ntype VideoMergeProps = {\n videos?: any[];\n setVideos?: (arg: any) => void;\n hasProcessingVideos: boolean;\n setShouldFetch: (arg: boolean) => void;\n};\n\nexport const VideoMerge = ({\n videos = [],\n setVideos = () => {},\n hasProcessingVideos,\n setShouldFetch,\n}: VideoMergeProps) => {\n const { t } = useTranslation();\n const { colors, isCdkEnviroment } = useTheme();\n const { containerWidth } = useConfigurationContext();\n const history = useHistory();\n const [duration, setDuration] = useState(0);\n const [trimDuration, setTrimDuration] = useState(0);\n const [width, setWidth] = useState(0);\n const [height, setHeight] = useState(0);\n const [secWidth, setSecWidth] = useState(10);\n const [tickerCount, setTickerCount] = useState<any>(20);\n\n useEffect(() => {\n setDuration(\n videos.reduce((sum: number, v: any) => sum + v.duration, 0) || 0\n );\n setTrimDuration(\n videos.reduce((sum: number, v: any) => sum + v.trimDuration, 0) || 0\n );\n }, [videos]);\n\n useEffect(() => {\n setHeight(60 + videos.length * 100);\n }, [videos]);\n\n useEffect(() => {\n function handleResize() {\n const w = Math.max(\n findNearestMultiple(duration * secWidth, secWidth),\n containerWidth - 223\n );\n setWidth(w);\n setTickerCount(Math.round(w / secWidth));\n }\n\n handleResize();\n }, [duration, secWidth, containerWidth]);\n\n const removeVideo = (index: number) => {\n if (videos.length === 1) {\n history.push('/');\n return;\n }\n\n try {\n const cache = localStorage.getItem(COOKIE_NAMES.merge);\n const removedVideo = videos[index];\n const selectedVideos = JSON.parse(cache || '') || [];\n const filteredSelectedVideos = selectedVideos.filter(\n (video: VideoListItem) =>\n video.id.toString() !== removedVideo.id.toString()\n );\n localStorage.setItem(\n COOKIE_NAMES.merge,\n JSON.stringify(filteredSelectedVideos)\n );\n } catch (error) {\n console.log(error);\n }\n setVideos((vtm: any) => {\n const newVideos = [...vtm];\n newVideos.splice(index, 1);\n return newVideos;\n });\n };\n\n const setVideoRef = (index: number, videoRef: any) => {\n setVideos((prev: any) => {\n const vtm = [...prev];\n vtm[index].ref = videoRef;\n return vtm;\n });\n };\n\n const calculateVideoOffset = (i: number): number => {\n if (i === 0) {\n return 0;\n }\n const previousVideo = videos[i - 1];\n const video = videos[i];\n if (i === 1) {\n return previousVideo.endSec * secWidth - video.startSec * secWidth;\n }\n return (\n previousVideo.trimDuration * secWidth +\n previousVideo.startSec * secWidth -\n video.startSec * secWidth +\n calculateVideoOffset(i - 1)\n );\n };\n\n const onDragEnd = async (result: any) => {\n if (!result.destination) {\n return;\n }\n const updatedVideos = reorder(\n videos,\n result.source.index,\n result.destination.index\n );\n setVideos(updatedVideos);\n };\n\n return (\n <VideoMergeLayout>\n {hasProcessingVideos && (\n <InfoBoxWrapper>\n <InformationBox text='Some of the videos are still processing. Please wait until they are done, and then proceed with merging.' />\n </InfoBoxWrapper>\n )}\n\n <PreviewContainer>\n {videos && !!videos.length && (\n <Player\n width={592}\n height={332}\n displayVideos={videos}\n hasProcessingVideos={hasProcessingVideos}\n />\n )}\n </PreviewContainer>\n <ContentWrapper>\n <ContentHeader>\n <AddVideoContainer>\n <Button\n variant='white'\n icon={<AddIcon height={21} width={21} />}\n text={t('Add More Videos')}\n onClick={() => {\n history.push('/?add-more');\n }}\n />\n </AddVideoContainer>\n {containerWidth > screenSizes.mb && (\n <ZoomContainer>\n <ZoomButton\n onClick={() =>\n !hasProcessingVideos &&\n secWidth > 10 &&\n setSecWidth(secWidth - 5)\n }\n disabled={hasProcessingVideos || secWidth === 10}\n >\n <ZoomOutIcon\n width={24}\n height={24}\n color={colors.primary[100]}\n />\n </ZoomButton>\n <Slider\n type='range'\n // @ts-ignore\n onChange={e => setSecWidth(e.target.value as number)}\n min={10}\n max={200}\n value={secWidth}\n disabled={hasProcessingVideos}\n style={{\n width: '100px',\n height: '4px',\n backgroundColor: '#d0d3d9',\n boxShadow:\n '0px 0px 4px rgba(66, 79, 104, 0.08),0px 6px 12px rgba(66, 79, 104, 0.06)',\n }}\n />\n <ZoomButton\n onClick={() =>\n !hasProcessingVideos &&\n secWidth < 200 &&\n setSecWidth(secWidth + 5)\n }\n disabled={secWidth === 200 || hasProcessingVideos}\n >\n <ZoomInIcon\n width={24}\n height={24}\n color={colors.primary[100]}\n />\n </ZoomButton>\n </ZoomContainer>\n )}\n </ContentHeader>\n <Content>\n <ThumbnailWrapper>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId='videos'>\n {provided => (\n <div ref={provided.innerRef} {...provided.droppableProps}>\n {videos.map((v: any, i: number) => (\n <Draggable\n draggableId={v.id.toString()}\n index={i}\n key={v.id}\n isDragDisabled={hasProcessingVideos}\n >\n {provided => (\n <div\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n >\n <VideoThumbnail\n index={i}\n video={v}\n key={`${v.id}${i}thumb`}\n setVideos={setVideos}\n removeVideo={removeVideo}\n setVideoRef={setVideoRef}\n isDragDisabled={hasProcessingVideos}\n setShouldFetch={setShouldFetch}\n />\n </div>\n )}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n </ThumbnailWrapper>\n <RowContainer height={height} id='row-container'>\n {containerWidth > screenSizes.mb && (\n <RangeContainer width={width}>\n <RowTime>\n {[...Array(Math.round(tickerCount / 12)).keys()].map(\n (k: any) => (\n <Time width={12 * secWidth} key={k}>\n <span>{toMMSS(k * 12, 0)}</span>\n {k + 1 === Math.round(tickerCount / 12) && (\n <span>{toMMSS((k + 1) * 12, 0)}</span>\n )}\n </Time>\n )\n )}\n </RowTime>\n <RowTicker>\n {[...Array(tickerCount).keys()].map(k => (\n <Tick\n width={secWidth}\n key={k}\n rightBorder={k + 1 === tickerCount}\n inside={\n k >= videos[0].startSec &&\n k <= videos[0].startSec + trimDuration\n }\n />\n ))}\n </RowTicker>\n </RangeContainer>\n )}\n <BlankRowsContainer>\n {videos.map((v: any, i: number) => (\n <Row key={`${v.id}${i}`}>\n <CloseContainer>\n <CloseCircleIcon\n onClick={() => removeVideo(i)}\n height={20}\n width={20}\n color={\n isCdkEnviroment\n ? colors.primary[100]\n : colors.white[100]\n }\n bgColor={\n isCdkEnviroment ? colors.white[100] : colors.danger[40]\n }\n />\n </CloseContainer>\n </Row>\n ))}\n </BlankRowsContainer>\n {containerWidth > screenSizes.mb && (\n <RowWrapper>\n {videos.map((v: any, i: number) => (\n <VideoRow\n index={i}\n totalDuration={duration}\n offset={calculateVideoOffset(i)}\n width={v.duration * secWidth}\n video={v}\n key={`${v.id}${i}row`}\n setVideos={setVideos}\n hasProcessingVideos={hasProcessingVideos}\n /* hide preview track for merge since it is not optimized for multiple videos */\n showPreviewTrack={false}\n />\n ))}\n </RowWrapper>\n )}\n </RowContainer>\n </Content>\n </ContentWrapper>\n </VideoMergeLayout>\n );\n};\n","import * as React from \"react\";\nconst SvgSave = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"3 3 18 18\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fill: \"#001B53\", fillRule: \"evenodd\", d: \"M17 3H3v18h18V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z\" }));\nexport default SvgSave;\n","import styled from 'styled-components';\nimport SaveSvg from './save.svg?react';\n\nconst SaveIcon = styled(SaveSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default SaveIcon;\n","import * as React from \"react\";\nconst SvgDelete = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", xmlnsXlink: \"http://www.w3.org/1999/xlink\", width: 24, height: 24, viewBox: \"0 0 24 24\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { fill: \"#E84C3D\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v10zm3.17-7.83c.39-.39 1.02-.39 1.41 0L12 12.59l1.42-1.42c.39-.39 1.02-.39 1.41 0 .39.39.39 1.02 0 1.41L13.41 14l1.42 1.42c.39.39.39 1.02 0 1.41-.39.39-1.02.39-1.41 0L12 15.41l-1.42 1.42c-.39.39-1.02.39-1.41 0-.187-.187-.293-.44-.293-.705 0-.265.106-.518.293-.705L10.59 14l-1.42-1.42c-.39-.38-.39-1.02 0-1.41zM15.5 4l-.71-.71c-.18-.18-.44-.29-.7-.29H9.91c-.26 0-.52.11-.7.29L8.5 4H6c-.55 0-1 .45-1 1s.45 1 1 1h12c.55 0 1-.45 1-1s-.45-1-1-1h-2.5z\" })));\nexport default SvgDelete;\n","import styled from 'styled-components';\nimport DeleteSvg from './delete.svg?react';\n\nconst DeleteIcon = styled(DeleteSvg)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n g {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default DeleteIcon;\n","import styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport CloseIcon from '../../images/CloseIcon';\nimport SaveIcon from '../../images/SaveIcon';\nimport DeleteIcon from '../../images/DeleteIcon';\nimport { Button } from 'react-covideo-common';\nimport { Modal } from './Modal';\nimport { InformationBox } from '../InformationBox';\n\ntype Props = {\n open?: boolean;\n disableSave?: boolean;\n infoBoxText?: string;\n title?: string;\n discardButtonText?: string;\n confirmButtonText?: string;\n text?: string;\n showDiscardIcon?: boolean;\n showSaveIcon?: boolean;\n onClickDiscardButton: () => void;\n onClickConfirmButton: () => void;\n handleModalClose?: () => void;\n};\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst ModalItem = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n background-color: ${theme.palette.white};\n`;\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n padding: 32px;\n`;\n\nconst ContentHeader = styled.div`\n display: flex;\n flex-direction: row;\n font-size: 18px;\n font-weight: bold;\n color: ${theme.palette.black_1_100};\n justify-content: space-between;\n margin-bottom: 32px;\n p {\n margin: 0;\n }\n`;\n\nconst ContentBody = styled.p`\n font-size: 14px;\n line-height: 1.43;\n color: ${theme.palette.black_1_100};\n`;\n\nconst ButtonsWrapper = styled.section`\n display: flex;\n flex-direction: row;\n width: 528px;\n max-width: 100%;\n gap: 12px;\n justify-content: flex-end;\n align-items: right;\n padding: 0 32px 32px;\n`;\n\nexport const ModalLeave = ({\n open = false,\n disableSave = false,\n infoBoxText,\n title = '',\n text = '',\n discardButtonText = 'Keep video',\n confirmButtonText = 'Delete video',\n onClickDiscardButton,\n onClickConfirmButton,\n showDiscardIcon = true,\n showSaveIcon = true,\n handleModalClose = () => {},\n}: Props) => {\n const { isCdkEnviroment } = useTheme();\n if (!open) {\n return null;\n }\n return (\n <Modal disableFullScreen={true} style={{ position: 'fixed', zIndex: 999 }}>\n <ModalItem>\n <Content>\n <ContentHeader>\n <p>{title}</p>\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n />\n </CloseButtonWrapper>\n </ContentHeader>\n <ContentBody>{text}</ContentBody>\n {infoBoxText && <InformationBox text={infoBoxText} width='430px' />}\n </Content>\n <ButtonsWrapper>\n <Button\n {...(!!showDiscardIcon && {\n icon: <DeleteIcon height={24} width={24} />,\n })}\n text={discardButtonText}\n onClick={onClickDiscardButton}\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n />\n <Button\n {...(!!showSaveIcon && {\n icon: <SaveIcon height={16} width={16} />,\n })}\n text={confirmButtonText}\n onClick={onClickConfirmButton}\n disabled={disableSave}\n />\n </ButtonsWrapper>\n </ModalItem>\n </Modal>\n );\n};\n","import { Location } from 'history';\nimport { useEffect, useState } from 'react';\nimport { Prompt } from 'react-router-dom';\nimport { ModalLeave } from 'lib/components/modals/ModalLeave';\nimport { useTranslation } from 'react-i18next';\n\ninterface Props {\n when?: boolean | undefined;\n navigate?: (path: string) => void;\n shouldBlockNavigation: (location: Location) => boolean;\n onConfirm?: Function;\n onDiscard?: Function;\n onStay?: Function;\n stay?: Boolean;\n title?: string;\n text?: string;\n discardButtonText?: string;\n confirmButtonText?: string;\n showDiscardIcon?: boolean;\n showSaveIcon?: boolean;\n infoBoxText?: string;\n disableSave?: boolean;\n}\n\nconst RouteLeavingGuard = ({\n when,\n navigate = () => {},\n shouldBlockNavigation,\n onConfirm = () => {},\n onDiscard = () => {},\n onStay = () => {},\n stay = false,\n title,\n text,\n discardButtonText,\n confirmButtonText,\n showDiscardIcon = true,\n showSaveIcon = true,\n infoBoxText,\n disableSave,\n}: Props) => {\n const { t } = useTranslation();\n\n const translatedTitle = title ? title : t('Leave without saving changes?');\n const translatedText = text\n ? text\n : t('Your updates will not be saved. This action can’t be undone.');\n\n const translatedDiscardButtonText = discardButtonText\n ? discardButtonText\n : t('Discard Changes');\n const translatedConfirmButtonText = confirmButtonText\n ? confirmButtonText\n : t('Save Changes');\n\n const [modalVisible, setModalVisible] = useState(false);\n const [lastLocation, setLastLocation] = useState<Location | null>(null);\n const [confirmedNavigation, setConfirmedNavigation] = useState(false);\n const closeModal = () => {\n setModalVisible(false);\n };\n const handleBlockedNavigation = (nextLocation: Location): boolean => {\n if (!confirmedNavigation && shouldBlockNavigation(nextLocation)) {\n setModalVisible(true);\n setLastLocation(nextLocation);\n return false;\n }\n return true;\n };\n const handleConfirmNavigationClick = () => {\n onConfirm();\n setModalVisible(false);\n setConfirmedNavigation(true);\n };\n const handleDiscardNavigationClick = () => {\n onDiscard();\n setModalVisible(false);\n setConfirmedNavigation(true);\n };\n const handleStay = () => {\n closeModal();\n onStay();\n };\n useEffect(() => {\n if (confirmedNavigation && lastLocation) {\n navigate(lastLocation.pathname);\n }\n }, [confirmedNavigation, lastLocation]);\n return (\n <>\n <Prompt when={when} message={handleBlockedNavigation} />\n <ModalLeave\n open={modalVisible}\n title={translatedTitle}\n text={translatedText}\n discardButtonText={translatedDiscardButtonText}\n confirmButtonText={translatedConfirmButtonText}\n showDiscardIcon={showDiscardIcon}\n showSaveIcon={showSaveIcon}\n handleModalClose={closeModal}\n onClickDiscardButton={handleDiscardNavigationClick}\n onClickConfirmButton={stay ? handleStay : handleConfirmNavigationClick}\n infoBoxText={infoBoxText}\n disableSave={disableSave}\n />\n </>\n );\n};\n\nexport default RouteLeavingGuard;\n","export enum VideoSourceType {\n ORGANIZATION_VIDEO = 'ORGANIZATION_VIDEO',\n LESA_VEHICLE = 'LESA_VEHICLE',\n VIDEO = 'VIDEO',\n WHEELS_TV = 'WHEELS_TV',\n}\n\nexport interface ISourceType {\n sourceType: VideoSourceType;\n sourceId: number;\n}\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { LoadingIndicator } from 'lib/components';\nimport { useHistory, useLocation } from 'react-router-dom';\n\nimport { VideoMerge } from './components/VideoMerge';\nimport { mergeVideos, getVideo } from 'lib/api';\nimport { ModalInputText } from 'lib/components/modals/ModalInputText';\nimport styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { MdArrowBack } from 'react-icons/md';\nimport { TopBar } from 'lib/components';\nimport RouteLeavingGuard from 'lib/components/RouteLeavingGuard';\nimport { COOKIE_NAMES } from 'lib/config';\nimport { Button } from 'react-covideo-common';\nimport { VideoEncodingStatus } from 'lib/const/VideoStatus';\nimport { TitleWrapper } from '../lesaTV/LesaTV';\nimport { ISourceType, VideoSourceType } from './types';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { CovideoGTMVideoAttributes } from 'lib/hooks/GTM/types';\nimport { GTMSaveNewVideoInteractionTypes } from 'lib/hooks/GTM/actions/video';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\n\nconst MainContainer = styled.main`\n background: ${theme.palette.gray10};\n`;\n\nexport const Merge = () => {\n const { t } = useTranslation();\n\n const { trackGTMSaveNewVideoInteractionEvent } = useGTMAnalytics();\n\n const { isCdkEnviroment } = useTheme();\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n const location = useLocation();\n const urlParams = new URLSearchParams(location.search);\n const ids = (urlParams.get('videos') || '').split(',').filter(Boolean);\n const [videos, setVideos] = useState<any>({});\n const [videosToMerge, setVideosToMerge] = useState<any>(\n ids.map(id => ({ id }))\n );\n const history = useHistory();\n const [showSaveModal, setShowSaveModal] = React.useState(false);\n const [saved, setSaved] = React.useState(false);\n const [loading, setLoading] = React.useState(true);\n const [fetchFromLS, setFetchFromLS] = useState(true);\n\n const shouldBlockNavigation = (options: any) => {\n // if user wants to add more videos or video is just merged - do not block navigation\n if (\n options.pathname === '/' &&\n (options.search === '?add-more' || options.search === '?merged')\n ) {\n return false;\n } else {\n return !saved;\n }\n };\n\n useEffect(() => {\n if (loading) return;\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_MERGE,\n mergeIds: ids.map(id => Number(id)),\n });\n }, [loading]);\n\n useEffect(() => {\n if (fetchFromLS) {\n // pull data from local storage\n const cache: any = localStorage.getItem(COOKIE_NAMES.merge);\n const videosFromLs = JSON.parse(cache);\n let videosObject: any = {};\n videosFromLs?.forEach((video: any) => {\n videosObject[video.id] = video;\n });\n setVideos(videosObject);\n setFetchFromLS(false);\n }\n }, [fetchFromLS]);\n\n useEffect(() => {\n setLoading(true);\n Object.values(videos).forEach(async (video: any) => {\n const videoDetails = await getVideo(video.id);\n setVideosToMerge((videos: any) => {\n const vtm = [...videos];\n return vtm.map(v => {\n const sourceType: ISourceType = {\n sourceType: VideoSourceType.VIDEO,\n sourceId: Number(v.id),\n };\n if (v.id.toString() === video.id.toString()) {\n return {\n ...v,\n ...video,\n source: videoDetails.videoSource,\n flvName: videoDetails.flvName + '.mp4',\n start: '00:00:00:00',\n sourceType: sourceType,\n };\n }\n return { ...v, sourceType: sourceType };\n });\n });\n });\n setLoading(false);\n }, [videos]);\n\n const handleMergeVideos = async (videoName: string) => {\n // clear cache - loacal storage\n window.localStorage.removeItem(COOKIE_NAMES.merge);\n const duration =\n 1000 *\n videosToMerge.reduce((sum: number, v: any) => sum + v.trimDuration, 0);\n\n const sources: ISourceType[] = videosToMerge\n .filter((video: any) => video.sourceType !== undefined)\n .map((video: any) => video.sourceType);\n\n const video = await mergeVideos({\n videos: videosToMerge.map((v: any) => ({\n start: v.start,\n end: v.end,\n id: v.id,\n flvName: v.flvName,\n })),\n videoName,\n duration,\n ...(sources.length > 0 && { sources }),\n });\n\n const videoAttributes: CovideoGTMVideoAttributes = {\n videoId: Number(video.id),\n videoType: video?.videoRequest?.videoType || undefined,\n videoCustomerName: !!video?.videoRequest?.customerName,\n videoLength: video.videoLength,\n videoTitle: video.title,\n };\n\n trackGTMSaveNewVideoInteractionEvent?.({\n type: GTMSaveNewVideoInteractionTypes.MERGE,\n videoAttributes: videoAttributes,\n mergedIds: videosToMerge.map((v: { id: any }) => Number(v.id)),\n });\n setSaved(true);\n // add ?merged to recognize merge video path\n history.push('/?merged');\n };\n\n if (loading) {\n return <LoadingIndicator isLoading={loading} />;\n }\n\n const hasProcessingVideos = !!videosToMerge.find(\n (v: any) => v?.processing === VideoEncodingStatus.PROCESSING\n );\n\n return (\n <MainContainer>\n {videosToMerge.length >= 2 && (\n <RouteLeavingGuard\n when={true}\n navigate={path => {\n history.push(path);\n }}\n stay={true}\n onStay={() => setShowSaveModal(true)}\n onConfirm={() => {}}\n shouldBlockNavigation={options => shouldBlockNavigation(options)}\n disableSave={hasProcessingVideos}\n infoBoxText={\n hasProcessingVideos\n ? t(\n 'Some of the videos are still processing. Please wait until they are done, and then proceed with merging.'\n )\n : ''\n }\n />\n )}\n <TopBar\n left={\n <Button\n text={t('Back')}\n variant='transparent'\n icon={<MdArrowBack size='18' />}\n onClick={() => {\n window.localStorage.removeItem(COOKIE_NAMES.merge);\n history.push(`/`);\n }}\n extendStyles={{\n container: { color: 'white' },\n }}\n />\n }\n center={<TitleWrapper>{t('Merge Videos')}</TitleWrapper>}\n right={\n <Button\n variant={isCdkEnviroment ? 'white' : 'primary'}\n onClick={() => setShowSaveModal(true)}\n text={t('Save')}\n disabled={\n !videosToMerge || videosToMerge.length < 2 || hasProcessingVideos\n }\n />\n }\n />\n <VideoMerge\n videos={videosToMerge}\n setVideos={setVideosToMerge}\n hasProcessingVideos={hasProcessingVideos}\n setShouldFetch={setFetchFromLS}\n />\n\n {showSaveModal && (\n <ModalInputText\n title={t('Name new video')}\n label={t('Give your new video a name')}\n defaultValue={''}\n secondaryButtonText={t('Back')}\n primaryButtonText={t('Save Video')}\n handleSubmit={(title: any) => handleMergeVideos(title)}\n handleModalClose={() => setShowSaveModal(false)}\n />\n )}\n </MainContainer>\n );\n};\n","import { TopBar } from './TopBar';\nimport { Button } from 'react-covideo-common';\nimport { MdArrowBack } from 'react-icons/md';\nimport { useHistory } from 'react-router-dom';\nimport SaveIcon from 'lib/images/SaveIcon';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { Spinner } from './Spinner';\nimport { screenSizes } from 'lib/style/theme';\nimport { TitleWrapper } from '../../app/pages/lesaTV/LesaTV';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\ntype PreviewProps = {\n onSaveVideo: Function;\n isSaveDisabled?: boolean;\n setInsertAfterSave: (arg: boolean) => void;\n uploadLoading: boolean;\n};\n\nexport const PreviewVideoBar = ({\n onSaveVideo,\n isSaveDisabled,\n setInsertAfterSave,\n uploadLoading,\n}: PreviewProps) => {\n const { t } = useTranslation();\n const { isCdkEnviroment, colors } = useTheme();\n const history = useHistory();\n const { showInsertFeature, containerWidth } = useConfigurationContext();\n return (\n <TopBar\n left={\n <Button\n text={t('Back')}\n variant='transparent'\n icon={<MdArrowBack size='18' />}\n onClick={() => {\n history.push('/');\n }}\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{''}</TitleWrapper>}\n right={\n <>\n <Button\n onClick={() => {\n onSaveVideo();\n }}\n text={t('Save')}\n variant={isCdkEnviroment ? 'white' : 'secondary'}\n disabled={isSaveDisabled || uploadLoading}\n icon={\n uploadLoading ? <Spinner size={12} /> : <SaveIcon height='15px' />\n }\n />\n {showInsertFeature && (\n <Button\n onClick={() => {\n setInsertAfterSave(true);\n onSaveVideo();\n }}\n text={\n containerWidth > screenSizes.sm\n ? t('Continue to Insert')\n : t('Insert')\n }\n disabled={isSaveDisabled || uploadLoading}\n variant={isCdkEnviroment ? 'white' : 'primary'}\n />\n )}\n </>\n }\n />\n );\n};\n","import { EXPRESS_API } from '../config';\n\nconst cachedTags = {\n all: [] as object[],\n user: [] as object[],\n};\n\ntype TagParams = {\n page?: number;\n size?: number;\n search?: string;\n all?: boolean;\n sort?: string;\n refresh?: boolean;\n};\n\nexport const getTags = async ({\n page = 0,\n size = 50,\n search = '',\n all = false,\n sort,\n refresh = true,\n}: TagParams) => {\n const params = {\n start: page * size,\n limit: size,\n search: search,\n sort: sort,\n all: '',\n };\n\n if (all) {\n params.all = 'true';\n }\n\n if (!refresh) {\n if (all && cachedTags?.all?.length) {\n return cachedTags.all;\n }\n\n if (!all && cachedTags?.user?.length) {\n return cachedTags.user;\n }\n }\n\n const { data } = await EXPRESS_API.get('/video-tags', { params });\n\n if (all) {\n cachedTags.all = data;\n } else {\n cachedTags.user = data;\n }\n\n return data;\n};\n\nexport const putVideoTags = async (videoId: string, data: object[]) => {\n const response = await EXPRESS_API.put(`/videos/${videoId}/video-tags`, data);\n return { videoTags: response.data };\n};\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\n\ntype TextProps = {\n color?: string;\n};\n\nconst Text = styled.div<TextProps>`\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: ${props => props.color || theme.palette.gray60};\n`;\n\ntype Props = {\n text: string;\n color?: string;\n};\n\nexport const Label = ({ text, color }: Props) => {\n return <Text color={color}>{text}</Text>;\n};\n","import * as React from \"react\";\nconst SvgIconCar = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 14, viewBox: \"0 0 16 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M12.5833 0.333252C13.1333 0.333252 13.6 0.683252 13.7667 1.17492L15.4083 5.89992C15.4667 6.07492 15.5 6.26659 15.5 6.44992V12.4166C15.5 13.1083 14.9333 13.6666 14.25 13.6666C13.5583 13.6666 13 13.0999 13 12.4166V11.9999H3V12.4166C3 13.1083 2.44167 13.6666 1.75 13.6666C1.05833 13.6666 0.5 13.1083 0.5 12.4166V6.44992C0.5 6.25825 0.533333 6.07492 0.591667 5.89992L2.23333 1.17492C2.40833 0.683252 2.86667 0.333252 3.41667 0.333252H12.5833ZM2.16667 8.24992C2.16667 8.94159 2.725 9.49992 3.41667 9.49992C4.10833 9.49992 4.66667 8.94159 4.66667 8.24992C4.66667 7.55825 4.10833 6.99992 3.41667 6.99992C2.725 6.99992 2.16667 7.55825 2.16667 8.24992ZM12.5833 9.49992C11.8917 9.49992 11.3333 8.94159 11.3333 8.24992C11.3333 7.55825 11.8917 6.99992 12.5833 6.99992C13.275 6.99992 13.8333 7.55825 13.8333 8.24992C13.8333 8.94159 13.275 9.49992 12.5833 9.49992ZM3.225 2.14992L2.16667 5.33325H13.8333L12.775 2.14992C12.6583 1.81659 12.3417 1.58325 11.9833 1.58325H4.01667C3.65833 1.58325 3.34167 1.81659 3.225 2.14992Z\", fill: \"#001B53\", fillOpacity: 0.4 }));\nexport default SvgIconCar;\n","import styled from 'styled-components';\nimport Car from './icon-car.svg?react';\n\nconst CarIcon = styled(Car)`\n width: ${props => props.width || '24px'};\n height: ${props => props.height || '24px'};\n g {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CarIcon;\n","import * as React from \"react\";\nconst SvgHashtag = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 12, height: 12, viewBox: \"0 0 12 12\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", null, /* @__PURE__ */ React.createElement(\"path\", { d: \"M11.3327 3.99935C11.3327 3.63268 11.0327 3.33268 10.666 3.33268H8.66602V1.33268C8.66602 0.966016 8.36602 0.666016 7.99935 0.666016C7.63268 0.666016 7.33268 0.966016 7.33268 1.33268V3.33268H4.66602V1.33268C4.66602 0.966016 4.36602 0.666016 3.99935 0.666016C3.63268 0.666016 3.33268 0.966016 3.33268 1.33268V3.33268H1.33268C0.966016 3.33268 0.666016 3.63268 0.666016 3.99935C0.666016 4.36602 0.966016 4.66602 1.33268 4.66602H3.33268V7.33268H1.33268C0.966016 7.33268 0.666016 7.63268 0.666016 7.99935C0.666016 8.36602 0.966016 8.66602 1.33268 8.66602H3.33268V10.666C3.33268 11.0327 3.63268 11.3327 3.99935 11.3327C4.36602 11.3327 4.66602 11.0327 4.66602 10.666V8.66602H7.33268V10.666C7.33268 11.0327 7.63268 11.3327 7.99935 11.3327C8.36602 11.3327 8.66602 11.0327 8.66602 10.666V8.66602H10.666C11.0327 8.66602 11.3327 8.36602 11.3327 7.99935C11.3327 7.63268 11.0327 7.33268 10.666 7.33268H8.66602V4.66602H10.666C11.0327 4.66602 11.3327 4.36602 11.3327 3.99935ZM7.33268 7.33268H4.66602V4.66602H7.33268V7.33268Z\", fill: \"#001B53\" })));\nexport default SvgHashtag;\n","import styled from 'styled-components';\nimport HashtagSvg from './hashtag.svg?react';\n\nconst HashtagIcon = styled(HashtagSvg)`\n width: ${props => props.width || '14px'};\n height: ${props => props.height || '14px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n fill-opacity: ${props => props.opacity || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default HashtagIcon;\n","import { useCreateVideo } from 'lib/hooks/useCreateVideo';\nimport { useEncodeVideo } from 'lib/hooks/useEncodeVideo';\nimport { CONTENT_TYPE } from 'lib/hooks/useMediaRecorder';\nimport { usePresignedUrl } from 'lib/hooks/usePresignedUrl';\nimport { useS3Upload } from 'lib/hooks/useS3Upload';\nimport styled, { useTheme } from 'styled-components';\nimport React, { useState, useEffect } from 'react';\nimport { theme } from 'lib/style';\nimport { MoonLoader } from 'react-spinners';\nimport { Circle } from 'rc-progress/lib';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useTranslation } from 'react-i18next';\n\nconst FlexCenter = styled.div`\n margin-top: 16px;\n background-color: #f6f7f9;\n border-radius: 4px;\n padding: 32px;\n height: 168px;\n display: flex;\n justify-content: center;\n flex-direction: column;\n`;\n\nconst CircleContainer = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\ntype TextProps = {\n isActive?: boolean;\n};\n\nconst CircleText = styled.div<TextProps>`\n display: flex;\n flex-direction: column;\n position: relative;\n &:nth-child(2) {\n align-items: center;\n justify-content: space-between;\n }\n &:nth-child(3) {\n align-items: flex-end;\n justify-content: flex-end;\n }\n span {\n top: 0px;\n font-size: 16px;\n line-height: 1.5;\n color: ${props =>\n props.isActive ? theme.palette.black_1_100 : 'rgba(39, 42, 50, 0.4)'};\n margin-bottom: 8px;\n }\n .checkmark {\n border-radius: 20px;\n position: absolute;\n top: 106px;\n z-index: 4;\n color: white;\n background-color: ${props => props.theme.colors.primary[100]};\n }\n .rc-progress-circle {\n background-color: #f6f7f9;\n }\n & > div {\n background-color: #f6f7f9;\n z-index: 3;\n border-radius: 50px;\n position: absolute;\n }\n`;\n\nconst ContentBody = styled.div`\n ${theme.fontNormal400}\n font-size: ${theme.fontSizes.m};\n color: ${theme.palette.blackRgb75};\n margin: 0;\n width: 100%;\n margin-bottom: 32px;\n min-height: 190px;\n position: relative;\n`;\ntype ProgressBarProps = {\n color: string;\n};\nconst ProgressBar = styled.progress<ProgressBarProps>`\n z-index: 1;\n margin-top: -14.5px;\n width: 100%;\n background-color: ${theme.palette.lightgray};\n border: none;\n border-radius: 15px;\n height: 4px;\n &::-webkit-progress-bar {\n margin: 0 auto;\n background-color: ${theme.palette.lightgray};\n border-radius: 15px;\n height: 4px;\n }\n &::-moz-progress-bar {\n margin: 0 auto;\n background-color: ${({ color }) => color};\n border-radius: 15px;\n height: 4px;\n }\n &::-webkit-progress-value {\n float: left;\n height: 4px;\n margin: 0px -10px 0 0;\n background: ${({ color }) => color};\n border-radius: 15px;\n }\n`;\nconst ProgressText = styled.div`\n width: 100%;\n text-align: left;\n margin-bottom: 16px;\n height: 24px;\n font-size: 16px;\n line-height: 1.5;\n color: #4e5461;\n margin-top: 32px;\n`;\n\nconst MoonLoaderContainer = styled.div`\n position: absolute;\n top: 30px;\n`;\n\nconst circleStyle = {\n width: '24px',\n zIndex: 2,\n backgroundColor: 'f6f7f9',\n};\n\nenum View {\n UPLOADING = 1,\n CREATE = 2,\n ENCODE = 3,\n}\n\ntype UploadProps = {\n title: string;\n beginUploadProcess: boolean;\n afterUpload?: () => void;\n setSavedVideoId: (arg1: string) => void;\n file: any;\n fileName: string;\n};\n\nconst Upload = ({\n title,\n beginUploadProcess,\n afterUpload,\n setSavedVideoId,\n file,\n fileName,\n}: UploadProps) => {\n const { t } = useTranslation();\n const { colors } = useTheme();\n const { userData } = useAuthorizationContext();\n const [progress, setProgress] = useState(View.UPLOADING);\n const [uploadProgress, setUploadProgress] = useState({\n loaded: 0,\n total: 0,\n percentage: 0,\n });\n\n // upload, encode\n const {\n presignedUrl,\n fetch: getPresignedUrl,\n loading: isLoadingUrl,\n error: urlError,\n } = usePresignedUrl();\n const {\n uploadVideo,\n loading: isUploading,\n data: uploadData,\n error: uploadError,\n } = useS3Upload();\n const {\n fetch: createVideo,\n loading: isCreating,\n videoData,\n error: createError,\n progress: createProgress,\n } = useCreateVideo();\n const {\n fetch: encodeVideo,\n loading: isEncoding,\n encodeData,\n error: encodeError,\n progress: encodeProgress,\n } = useEncodeVideo();\n\n // uploading process\n // STEP 1 - presigned url\n const handleSubmit = async () => {\n if (file) {\n getPresignedUrl({\n fileName: fileName,\n type: CONTENT_TYPE,\n });\n }\n };\n useEffect(() => {\n if (beginUploadProcess) {\n if ((presignedUrl && presignedUrl.url) || !title) {\n return;\n }\n handleSubmit();\n }\n }, [beginUploadProcess]);\n\n // STEP 2 - upload\n useEffect(() => {\n if (!presignedUrl) {\n return;\n }\n if (!isLoadingUrl && !urlError && file) {\n setProgress(View.UPLOADING);\n uploadVideo({\n url: presignedUrl.url,\n file,\n contentType: CONTENT_TYPE,\n onUploadProgress: onUploadProgress,\n });\n }\n }, [presignedUrl]);\n\n // STEP 3 - create video\n useEffect(() => {\n if (!isUploading && !uploadError && uploadData && file) {\n setProgress(View.CREATE);\n createVideo({\n filename: fileName,\n title,\n });\n }\n }, [isUploading, uploadData]);\n\n // STEP 4 - encode video\n useEffect(() => {\n if (!isCreating && !createError && videoData && file) {\n setProgress(View.ENCODE);\n setSavedVideoId(videoData.video_id);\n encodeVideo({\n videoId: videoData.video_id,\n customerId: userData.customerId,\n });\n }\n }, [isCreating, videoData]);\n\n // post - upload\n useEffect(() => {\n if (!isEncoding && !encodeError && encodeData && file && afterUpload) {\n afterUpload();\n }\n }, [isEncoding, encodeData]);\n\n // progress bar\n const getPercentage = () => {\n if (!progress) {\n return 0;\n }\n if (progress == View.UPLOADING) {\n return (uploadProgress.percentage * 50) / 100;\n }\n if (progress == View.CREATE) {\n return 50 + (createProgress || 0);\n }\n return 100;\n };\n\n const onUploadProgress = (e: ProgressEvent) => {\n var percentCompleted = Math.round((e.loaded * 100) / e.total);\n setUploadProgress({\n loaded: Math.floor(e.loaded / 1024),\n total: Math.floor(e.total / 1024),\n percentage: percentCompleted,\n });\n };\n\n const toMB = (KB: any) => {\n return (KB / 1000).toFixed(2);\n };\n\n return (\n <ContentBody>\n <FlexCenter>\n <CircleContainer>\n <CircleText isActive={isUploading}>\n <span>{isUploading ? t('Uploading') : t('Uploaded')}</span>\n {uploadProgress.percentage < 100 && (\n <MoonLoaderContainer>\n <MoonLoader\n size={19.5}\n color={colors.primary[100]}\n loading={true}\n />\n </MoonLoaderContainer>\n )}\n {(!uploadProgress.percentage ||\n uploadProgress.percentage === 100) && (\n <Circle\n style={circleStyle}\n percent={0}\n trailWidth={10}\n strokeWidth={10}\n strokeColor={colors.primary[100]}\n />\n )}\n </CircleText>\n <CircleText isActive={isCreating}>\n <span>{isCreating ? t('Creating') : t('Created')}</span>\n {createProgress < 100 && (\n <MoonLoaderContainer>\n <MoonLoader\n size={19.5}\n color={colors.primary[100]}\n loading={true}\n />\n </MoonLoaderContainer>\n )}\n {(!createProgress || createProgress === 100) && (\n <Circle\n style={circleStyle}\n percent={0}\n trailWidth={10}\n strokeWidth={10}\n strokeColor={colors.primary[100]}\n />\n )}\n </CircleText>\n <CircleText isActive={isEncoding}>\n <span>{isEncoding ? t('Encoding') : t('Encoded')}</span>\n {encodeProgress < 100 && (\n <MoonLoaderContainer>\n <MoonLoader\n size={19.5}\n color={colors.primary[100]}\n loading={true}\n />\n </MoonLoaderContainer>\n )}\n {(!encodeProgress || encodeProgress === 100) && (\n <Circle\n style={circleStyle}\n percent={0}\n trailWidth={10}\n strokeWidth={10}\n strokeColor={colors.primary[100]}\n />\n )}\n </CircleText>\n </CircleContainer>\n <ProgressBar\n value={getPercentage()}\n max={100}\n color={colors.primary[100]}\n />\n <ProgressText>\n {toMB(uploadProgress.loaded) +\n ' MB/' +\n toMB(uploadProgress.total) +\n ' MB'}\n </ProgressText>\n </FlexCenter>\n </ContentBody>\n );\n};\n\nexport default Upload;\n","import * as React from 'react';\nimport styled, { css, useTheme } from 'styled-components';\nimport { Field, FieldProps, useFormikContext } from 'formik';\nimport { theme } from 'lib/style';\nimport { useAuthorizationContext } from 'lib/context';\nimport {\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n checkIfVideoRequestFieldsRequired,\n checkIfAutomotive,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { screenSizes } from 'lib/style/theme';\nimport { Dropdown } from 'lib/components/NewDropdown';\n\ntype ComponentProps = {\n attributes: any[];\n initValues: any;\n setIsSaveDisabled: (arg: boolean) => void;\n};\n\nconst Content = styled.div`\n width: auto;\n margin-top: 8px;\n .error {\n border-color: #e84c3d;\n }\n .disabled {\n background-color: #eeeff2;\n cursor: not-allowed;\n }\n\n .disabled > div {\n background-color: #eeeff2;\n cursor: not-allowed;\n }\n`;\n\nconst VideoAttribute = styled.div`\n margin: 24px 0;\n display: flex;\n flex-direction: column;\n`;\n\nconst Label = styled.div`\n height: 20px;\n font-size: 14px;\n font-weight: 500;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.43;\n letter-spacing: normal;\n color: ${theme.palette.label};\n margin-bottom: 8px;\n`;\n\nconst TextInput = styled.input`\n padding-left: 8px;\n height: 40px;\n width: 100%;\n border-radius: 4px;\n border: solid 1px #d0d3d9;\n font-size: 16px;\n font-weight: normal;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.5;\n letter-spacing: normal;\n color: ${theme.palette.black_1_100};\n margin-right: 8px;\n box-sizing: border-box;\n &:focus {\n outline: 0;\n }\n`;\n\nconst Textarea = styled.textarea`\n padding-left: 8px;\n width: 242px;\n min-width: 242px;\n max-width: 242px;\n height: 100px;\n min-height: 100px;\n max-height: 300px;\n border-radius: 4px;\n border: solid 1px #d0d3d9;\n &:focus {\n outline: 0;\n }\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.lg &&\n css`\n width: 368px;\n min-width: 368px;\n max-width: 368px;\n `}\n`;\n\nexport const AttributeFields = ({\n attributes,\n initValues,\n setIsSaveDisabled,\n}: ComponentProps) => {\n const { colors } = useTheme();\n const { userData } = useAuthorizationContext();\n const showVideoRequestFields = checkIfAutomotive(userData);\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSalesRole = checkIfAutomotiveSalesRole(userData);\n const videoRequestFieldsRequired =\n checkIfVideoRequestFieldsRequired(userData);\n const [requiredAttributesState, setRequiredAttributesState] =\n React.useState<any>();\n\n const { errors, validateForm, setFieldValue }: any = useFormikContext();\n\n React.useEffect(() => {\n validateForm();\n countRequiredAndValidate();\n }, [attributes]);\n\n React.useEffect(() => {\n requiredAttributesState?.length !== 0\n ? setIsSaveDisabled(true)\n : setIsSaveDisabled(false);\n }, [requiredAttributesState]);\n\n const countRequiredAndValidate = () => {\n let count = 0;\n const requiredAttr: any = [];\n attributes.forEach(attribute => {\n if (\n attribute &&\n attribute.isRequired &&\n (attribute.default === '' || attribute.default === null)\n ) {\n ++count;\n requiredAttr.push(attribute);\n }\n });\n setRequiredAttributesState(requiredAttr);\n if (isAutomotiveSalesRole && videoRequestFieldsRequired) count += 1;\n if (isAutomotiveServiceRole && videoRequestFieldsRequired) count += 2;\n\n return count;\n };\n // required fields validation logic\n const validateFields = (value: any, attribute: any) => {\n if (value !== '' && attribute.isRequired) {\n const target = requiredAttributesState.find(\n (at: any) => at.attributeId === attribute.attributeId\n );\n target &&\n setRequiredAttributesState(\n requiredAttributesState.filter(\n (at: any) => at.attributeId !== attribute.attributeId\n )\n );\n }\n if (value === '' && attribute.isRequired) {\n const target = requiredAttributesState.find(\n (at: any) => at.attributeId === attribute.attributeId\n );\n !target &&\n setRequiredAttributesState([...requiredAttributesState, attribute]);\n }\n };\n\n if (!showVideoRequestFields && !attributes.length) {\n return null;\n }\n\n return (\n <Content>\n {attributes.map((attribute: any, index) => {\n const isDisabled =\n (!!attribute.isReadOnly || !!attribute.isLocked) &&\n !!initValues[index];\n const hasError = !!errors[`attributes${index}`];\n const isRequired = !!attribute.isRequired;\n let className = '';\n if (isDisabled) {\n className = 'disabled';\n }\n\n if (hasError) {\n className += ' error';\n }\n return (\n <VideoAttribute key={index}>\n <Label>\n {attribute.title}\n {isRequired && (\n <span style={{ color: colors.primary[100] }}>*</span>\n )}\n </Label>\n {attribute.type === 'text' && (\n <>\n <Field\n name={`attributes${index}`}\n disabled={isDisabled}\n as={TextInput}\n type='text'\n required={isRequired}\n className={className}\n defaultValue={attribute.default}\n onChange={(event: any) => {\n validateFields(event.target.value, attribute);\n setFieldValue(`attributes${index}`, event.target.value);\n }}\n onFocus={() => {\n validateForm();\n }}\n />\n {hasError ? (\n <div style={{ color: '#E84C3D', marginTop: '3px' }}>\n {errors[`attributes${index}`]}\n </div>\n ) : (\n <></>\n )}\n </>\n )}\n {attribute.type === 'textarea' && (\n <>\n <Field\n disabled={isDisabled}\n name={`attributes${index}`}\n as={Textarea}\n defaultValue={attribute.default}\n className={className}\n required={isRequired}\n type='text'\n onChange={(event: any) => {\n validateFields(event.target.value, attribute);\n setFieldValue(`attributes${index}`, event.target.value);\n }}\n />\n {hasError ? (\n <div style={{ color: '#E84C3D', marginTop: '3px' }}>\n {errors[`attributes${index}`]}\n </div>\n ) : (\n <></>\n )}\n </>\n )}\n {attribute.type === 'dropdown' && (\n <Field\n name={`attributes${index}`}\n disabled={isDisabled}\n required={isRequired}\n className={className}\n >\n {({ field, form }: FieldProps) => {\n const { value } = field;\n const options = attribute.dropdownValues.map(\n (dropdown: any) => ({\n value: dropdown.value,\n label: dropdown.value,\n })\n );\n return (\n <Dropdown\n creatable={false}\n isSearchable={true}\n disabled={isDisabled}\n maxMenuHeight={100}\n options={options}\n defaultValue={\n options.find(\n (o: any) => o.value === attribute.default\n ) || ''\n }\n value={options.find((o: any) => o.value == value)}\n onChange={(option: any) => {\n validateFields(option.value, attribute);\n if (\n (attribute.isReadOnly || attribute.isLocked) &&\n initValues[index]\n ) {\n form.setFieldValue(\n `attributes${index}`,\n initValues[index]\n );\n } else {\n form.setFieldValue(\n `attributes${index}`,\n option.value\n );\n }\n }}\n />\n );\n }}\n </Field>\n )}\n </VideoAttribute>\n );\n })}\n </Content>\n );\n};\n","import {\n AttributeListItem,\n deleteVideo,\n putVideoAttributes,\n trimVideo,\n updateVideo,\n} from 'lib/api';\nimport { getInventoryItems } from 'lib/api/inventoryApi';\nimport { createVideoRequest } from 'lib/api/videoRequestApi';\nimport { getTags, putVideoTags } from 'lib/api/videoTagsApi';\nimport { getAttributes } from 'lib/api';\nimport { Input, useToastNotifications } from 'lib/components';\nimport { Label } from 'lib/components/Label';\nimport RouteLeavingGuard from 'lib/components/RouteLeavingGuard';\nimport { VideoTypeSales, VideoType } from 'lib/const';\nimport {\n InventoryItem,\n SelectProps,\n useAuthorizationContext,\n} from 'lib/context';\nimport { FILE_EXTENSION } from 'lib/hooks/useMediaRecorder';\nimport CarIcon from 'lib/images/CarIcon';\nimport HashtagIcon from 'lib/images/HashtagIcon';\nimport { theme } from 'lib/style';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport {\n checkIfVideoIsTrimmed,\n generateFileName,\n generateVideoTitle,\n} from 'lib/utils/functions';\nimport { createRef, useState, useEffect, useMemo, useRef } from 'react';\nimport { IoMdCalendar } from 'react-icons/io';\nimport { useHistory } from 'react-router-dom';\nimport styled, { css } from 'styled-components';\nimport Upload from '../Upload';\nimport { VideoPlayer } from './videoPlayer';\nimport Trim from './videoPlayer/components/trim/Trim';\nimport { AttributeFields } from '../videoDetails/components/AttributesFields';\nimport { Form, Formik } from 'formik';\nimport { components } from 'react-select';\nimport { screenSizes } from 'lib/style/theme';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { Button } from 'react-covideo-common';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nconst Content = styled.div`\n display: flex;\n justify-content: space-between;\n box-sizing: border-box;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n flex-direction: column;\n `}\n`;\n\nconst RightSide = styled.div`\n box-sizing: border-box;\n width: 100%;\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.xs &&\n css`\n width: 50%;\n `}\n ${({ theme }) =>\n theme.containerWidth < screenSizes.xs &&\n css`\n margin-top: 8px;\n `}\n`;\n\nconst LeftSide = styled.div`\n box-sizing: border-box;\n width: 100%;\n ${({ theme }) =>\n theme.containerWidth >= screenSizes.xs &&\n css`\n padding-right: 52px;\n width: 50%;\n `}\n`;\n\nconst VideoCard = styled.div`\n box-shadow:\n 0px 0px 2px rgba(66, 79, 104, 0.08),\n 0px 4px 8px rgba(66, 79, 104, 0.03);\n margin-bottom: 32px;\n`;\n\ntype FormGroupProps = {\n marginBottom?: string;\n};\n\nconst FormGroup = styled.div<FormGroupProps>`\n margin-bottom: ${props => props.marginBottom || '16px'};\n display: grid;\n gap: 8px;\n`;\n\nconst DateContainer = styled.div`\n background-color: ${theme.palette.white};\n padding: 18px;\n display: flex;\n align-items: center;\n border-bottom-left-radius: 6px;\n border-bottom-right-radius: 6px;\n margin-top: -7px;\n`;\n\nconst OptionLabel = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nconst RightOption = styled.div`\n color: ${({ theme }) => theme.colors.primary[40]};\n`;\n\nconst LeftOption = styled.div`\n font-weight: 600;\n color: ${({ theme }) => theme.colors.primary[100]};\n display: flex;\n align-items: center;\n`;\n\nconst TagContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n`;\n\nconst TRIM_INITIAL_VALUE = [0, 0];\n\nconst TagOption = ({ children, ...props }: any) => {\n const selectedValueText = props.data.label;\n const isCreateNewOption = !props.data?.__isNew__;\n return (\n <components.Option {...props}>\n <LeftOption>\n {isCreateNewOption && (\n <HashtagIcon\n style={{ marginRight: '8px' }}\n width={15}\n height={15}\n color={'inherit'}\n />\n )}\n {selectedValueText}\n </LeftOption>\n </components.Option>\n );\n};\n\ntype PreviewProps = {\n recordingBlobUrl: string;\n recordDate: string;\n insertAfterSave?: boolean;\n setSaveFunction: (arg1: any) => void;\n setIsSaveDisabled: (arg: boolean) => void;\n skipUploadProcess?: boolean;\n videoId?: string;\n initialTitle?: string;\n updateUploadLoading?: (val: boolean) => void;\n};\n\nconst Preview = ({\n recordingBlobUrl,\n recordDate,\n setSaveFunction,\n insertAfterSave = false,\n setIsSaveDisabled,\n skipUploadProcess = false,\n videoId,\n initialTitle,\n updateUploadLoading,\n}: PreviewProps) => {\n const { t } = useTranslation();\n const TAG_PLACEHOLDER = t('Search tags or create new...');\n\n const showPreviewTrim = false;\n const { userData } = useAuthorizationContext();\n const { showTrimFeature } = useConfigurationContext();\n const fileName = useMemo(\n () => generateFileName(userData, FILE_EXTENSION),\n [userData, FILE_EXTENSION]\n ); // send to upload\n const isAutomotiveSales = checkIfAutomotiveSalesRole(userData);\n const isAutomotiveService = checkIfAutomotiveServiceRole(userData);\n\n const videoRef = createRef<HTMLVideoElement>();\n const [title, setTitle] = useState(initialTitle || recordDate);\n const [vehicleOptions, setVehicleOptions] = useState<SelectProps[]>([]);\n const [vin, setVin] = useState({ value: '', label: t('Select vehicle') });\n const [videoType, setVideoType] = useState({\n value: '',\n label: t('Select video type'),\n });\n const [videoAttributes, setVideoAttributes] = useState<AttributeListItem[]>(\n []\n );\n const [initialValues, setInitialValues] = useState<any>();\n const [tags, setTags] = useState<SelectProps[]>([]);\n const [selectedTags, setSelectedTags] = useState<SelectProps[]>([]);\n const [tag, setTag] = useState<SelectProps>({\n value: '',\n label: TAG_PLACEHOLDER,\n });\n const [isVideoSaved, setIsVideoSaved] = useState(false);\n const [beginUploadProcess, setBeginUploadProcess] = useState(false);\n const [error, setError] = useState({\n title: '',\n tags: '',\n });\n const [file, setFile] = useState();\n const [videoDuration, setVideoDuration] = useState(0);\n const [attributesValues, setAttributesValues] = useState<any>({});\n const [isVideoLoading, setIsVideoLoading] = useState(true);\n\n // trim\n const trimRef = useRef<Array<number>>([0, 0]);\n const [trimValue, setTrimValue] = useState(TRIM_INITIAL_VALUE);\n const [isVideoTrimmed, setIsVideoTrimmed] = useState(false);\n const [savedVideoId, setSavedVideoId] = useState(videoId || '');\n const [initialObjectState, setInitialObjectState] = useState<any>();\n\n const history = useHistory();\n const formRef: any = useRef(null);\n const { toast } = useToastNotifications();\n\n const getvideoTypeOptions = () =>\n Object.values(isAutomotiveSales ? VideoTypeSales : VideoType)\n .filter(Boolean)\n .map(videoType => ({\n value: videoType,\n label: t(videoType),\n }));\n\n const videoTypeOptions = getvideoTypeOptions();\n const initValueObject: any = {};\n\n initValueObject[`covideoName`] = title;\n initValueObject[`saveToCompanyFolder`] = false;\n\n const validateFields = () => {\n let newErrors = {\n title: '',\n tags: '',\n };\n if (!title || !title.length) newErrors.title = t('Title cannot be empty.');\n\n setError(newErrors);\n const valid = Object.values(newErrors).every(field => field === '');\n\n return valid;\n };\n\n const onSaveVideo = () => {\n // set video attributes values - from formik form\n const attrValues = formRef.current.values;\n setAttributesValues(attrValues);\n setIsVideoSaved(false);\n // form validation\n const isFormValid = validateFields();\n if (!isFormValid) {\n return;\n }\n updateUploadLoading?.(true);\n // begin upload\n skipUploadProcess ? afterUpload(attrValues) : setBeginUploadProcess(true);\n };\n\n const sortTags = (unsortedTags: any) => {\n return unsortedTags.sort((a: any, b: any) =>\n a.labelField?.localeCompare(b.labelField)\n );\n };\n\n const onTagChange = (newTag: SelectProps) => {\n if (!newTag || !newTag.value) {\n return;\n }\n\n const exists = tags.some((tag: any) => tag.value == newTag.value);\n const newTagValue = exists\n ? newTag\n : {\n value: newTag.value,\n label: newTag.label,\n labelField: newTag.label,\n __isNew__: true,\n };\n const isAlreadySelected = selectedTags.find(\n tag => tag.value === newTagValue.value\n );\n\n if (!isAlreadySelected) {\n setSelectedTags(prev => [...(prev || []), newTagValue]);\n }\n if (!exists) {\n setTags(sortTags([...tags, newTagValue]));\n }\n setTag(newTagValue);\n };\n\n const onDeleteTag = (currentTag: any, index: number) => {\n // remove from selected\n const currentSelectedTags = [...selectedTags];\n currentSelectedTags.splice(index, 1);\n setSelectedTags(currentSelectedTags);\n // reset tag\n setTag({ value: '', label: TAG_PLACEHOLDER });\n // if new, remove from all tags\n if (tag.__isNew__) {\n const currentAllTags = [...tags];\n const tagIndex = tags.findIndex(\n (item: any) => item.value === currentTag.value\n );\n if (tagIndex > -1) {\n currentAllTags.splice(tagIndex, 1);\n setTags(currentAllTags);\n }\n }\n };\n\n const fetchTags = async () => {\n try {\n const tagList = await getTags({});\n const formattedTags: SelectProps[] = [];\n\n tagList.forEach((item: any) => {\n formattedTags.push({\n label: item.tag,\n value: item.tagId,\n labelField: item.tag,\n });\n });\n\n const sortedTags = sortTags(formattedTags);\n setTags(sortedTags);\n } catch (e) {\n console.log(e);\n }\n };\n\n const fetchAttributes = async () => {\n try {\n const results = await getAttributes({});\n setVideoAttributes(results.attributes || []);\n\n const initValues = results.attributes.map((att: any, index: number) => {\n if (att.type === 'dropdown') {\n const defaultValue = att.dropdownValues.find(\n (value: any) => value.default\n );\n if (defaultValue && defaultValue.value) {\n initValueObject[`attributes${index}`] = defaultValue.value;\n return defaultValue.value;\n }\n\n initValueObject[`attributes${index}`] = '';\n return '';\n }\n\n initValueObject[`attributes${index}`] = att.default || '';\n\n return att.default || '';\n });\n formRef.current.values = initValueObject;\n setInitialObjectState(initValueObject);\n setInitialValues(initValues);\n } catch (e) {\n console.log(e);\n }\n };\n\n const fetchVehicles = async () => {\n try {\n const inventoryList = await getInventoryItems({});\n\n if (inventoryList.items) {\n const formattedInventory: SelectProps[] = [];\n inventoryList.items.forEach(item => {\n formattedInventory.push({\n label: (\n <OptionLabel>\n <LeftOption>\n <CarIcon\n style={{ marginRight: '8px' }}\n width={15}\n height={15}\n />\n {item.title}\n </LeftOption>\n <RightOption>{item.vin}</RightOption>\n </OptionLabel>\n ),\n value: item.vin,\n labelField: item.vin,\n });\n });\n setVehicleOptions(formattedInventory);\n }\n } catch (e) {\n console.log(e);\n }\n };\n\n const modifyTags = async () => {\n const formattedTags = selectedTags.map(item => ({\n value: item.value,\n label: item.labelField,\n __isNew__: item.__isNew__,\n }));\n await putVideoTags(savedVideoId, formattedTags);\n };\n\n const addVideoRequest = async () => {\n if (!checkIfAutomotive(userData)) return 0;\n const videoRequest = {\n videoId: parseInt(savedVideoId),\n videoType: videoType?.value || '',\n ...(!!isAutomotiveSales && {\n vin: vin?.value || '',\n }),\n };\n const result = await createVideoRequest({ data: videoRequest });\n\n return result.videoRequestId;\n };\n\n const updateVideoAttributes = async (attrValues?: any) => {\n const values = attrValues || attributesValues;\n const attributes = videoAttributes.map((attribute: any, index: number) => {\n return {\n attributeId: attribute.attributeId,\n value: values[`attributes${index}`] || '',\n videoId: parseInt(savedVideoId),\n };\n });\n attributes &&\n attributes.length &&\n (await putVideoAttributes(savedVideoId, attributes).catch(err => err));\n };\n\n // send to upload component\n const afterUpload = async (attrValues?: any) => {\n try {\n if (selectedTags.length) await modifyTags();\n await updateVideoAttributes(attrValues);\n await addVideoRequest();\n\n if (isVideoTrimmed) {\n const trimmedVideoData = await trimVideoCreate(savedVideoId);\n if (trimmedVideoData) setSavedVideoId(trimmedVideoData.id);\n }\n if (!!initialTitle && !!videoId && initialTitle !== title) {\n // update video title\n await updateVideo({\n videoId,\n videoBody: {\n title,\n },\n });\n }\n setIsVideoSaved(true);\n toast({ message: t('Successfully saved video!') });\n } catch (e) {\n toast({\n message: t(\n 'There was an error while creating your video request. Please try again.'\n ),\n });\n }\n };\n\n const onLoad = async () => {\n await fetchAttributes();\n await fetchTags();\n await fetchVehicles();\n };\n\n const fetchFileFromBlobUrl = async (blobUrl: string) => {\n try {\n const file = await fetch(blobUrl || '').then((r: any) => r.blob());\n setFile(file);\n } catch (error) {\n console.log(error);\n }\n };\n\n const trimVideoCreate = async (videoId: any) => {\n const start = Math.floor(trimValue[0] * 100) / 100;\n const duration = Math.floor(trimValue[1] * 100) / 100;\n try {\n return await trimVideo(videoId, {\n duration,\n start,\n });\n } catch (error) {\n toast({\n message: t(\n 'Something went wrong while trimming the video, try again later!'\n ),\n });\n }\n };\n\n useEffect(() => {\n onLoad();\n }, []);\n\n useEffect(() => {\n if (!recordingBlobUrl) {\n return;\n }\n fetchFileFromBlobUrl(recordingBlobUrl);\n }, [recordingBlobUrl]);\n\n useEffect(() => {\n if (isVideoSaved) {\n setTimeout(() => {\n updateUploadLoading?.(false);\n if (insertAfterSave && savedVideoId) {\n history.push(`/insert-video/${savedVideoId}`);\n return;\n }\n history.push('/');\n }, 400);\n }\n }, [isVideoSaved, savedVideoId]);\n\n useEffect(() => {\n setTrimValue([0, videoDuration]);\n }, [videoDuration]);\n\n useEffect(() => {\n const checkTrim = checkIfVideoIsTrimmed({\n trimStart: trimValue[0],\n trimEnd: trimValue[1],\n videoDuration,\n });\n\n setIsVideoTrimmed(checkTrim);\n return () => {\n setIsVideoTrimmed(false);\n };\n }, [trimValue, videoDuration]);\n\n useEffect(() => {\n title === '' ? setIsSaveDisabled(true) : setIsSaveDisabled(false);\n }, [title]);\n\n useEffect(() => {\n if (setSaveFunction) setSaveFunction(() => onSaveVideo);\n }, [title, trimValue, videoDuration, vin, isVideoTrimmed]);\n\n const deleteUploadedVideo = async () => {\n if (!videoId) return;\n await deleteVideo({ videoIds: [videoId], deleteMultiple: false });\n };\n\n return (\n <div>\n <RouteLeavingGuard\n when={true}\n stay={true}\n onConfirm={() => {}}\n navigate={(path: string) => {\n if (videoId) {\n deleteUploadedVideo();\n }\n history.push(path);\n }}\n shouldBlockNavigation={() => {\n return !isVideoSaved;\n }}\n title={t('Delete Current Video?')}\n text={t('Do you want to go back? The current video will be deleted.')}\n confirmButtonText={t('No, Keep Video ')}\n discardButtonText={t('Yes, Delete Video')}\n showDiscardIcon={false}\n showSaveIcon={false}\n />\n {beginUploadProcess ? (\n <Upload\n title={title}\n beginUploadProcess={beginUploadProcess}\n afterUpload={afterUpload}\n setSavedVideoId={setSavedVideoId}\n file={file}\n fileName={fileName}\n />\n ) : (\n <Content>\n <LeftSide>\n <VideoCard>\n <VideoPlayer\n id=''\n videoSource={recordingBlobUrl}\n videoRef={videoRef}\n preventWideSize={true}\n borderBottomRadius={'0px'}\n setVideoDuration={setVideoDuration}\n setIsVideoLoading={setIsVideoLoading}\n />\n <DateContainer>\n <IoMdCalendar\n size={16}\n color={theme.palette.gray40}\n style={{ marginRight: 6 }}\n ></IoMdCalendar>\n <div>{generateVideoTitle()}</div>\n </DateContainer>\n </VideoCard>\n {showPreviewTrim && showTrimFeature && (\n <Trim\n isVideoTrimmed={isVideoTrimmed}\n videoRef={videoRef}\n videoDuration={videoDuration}\n videoSource={recordingBlobUrl}\n setValue={setTrimValue}\n value={trimValue}\n valueRef={trimRef}\n isVideoLoading={isVideoLoading}\n />\n )}\n </LeftSide>\n <RightSide>\n <Formik\n enableReinitialize\n innerRef={formRef}\n initialValues={initialObjectState}\n validateOnMount={true}\n onSubmit={() => {}}\n >\n {({ errors, isValid, values, setFieldValue }) => {\n return (\n <Form>\n <FormGroup>\n <Label text={t('Title')} />\n {!!error.title && (\n <Label\n text={error.title}\n color={theme.palette.red100}\n />\n )}\n <Input\n type='text'\n onChange={e => setTitle(e.target.value)}\n value={title}\n {...(error.title && {\n borderColor: theme.palette.red100,\n })}\n />\n </FormGroup>\n <FormGroup marginBottom='8px'>\n <Label text={t('Tags')} />\n {!!error.tags && (\n <Label text={error.tags} color={theme.palette.red100} />\n )}\n <Dropdown\n options={tags.filter(\n tag =>\n !tag ||\n !selectedTags.length ||\n !selectedTags.some(\n selectedTag => selectedTag.value === tag.value\n )\n )}\n placeholder={TAG_PLACEHOLDER}\n controlShouldRenderValue={false}\n value={tag}\n onChange={val => onTagChange(val)}\n isSearchable={true}\n creatable={true}\n extendStyles={{\n control: {\n ...(error.tags && {\n borderColor: theme.palette.red100,\n }),\n },\n }}\n customComponents={{ Option: TagOption }}\n />\n <TagContainer>\n {selectedTags.map((item, index) => (\n <Button\n icon={<HashtagIcon width={15} height={15} />}\n key={item.value}\n text={item.label}\n onClick={() => onDeleteTag(item, index)}\n size='small'\n variant='white'\n />\n ))}\n </TagContainer>\n </FormGroup>\n {isAutomotiveSales && (\n <FormGroup>\n <Label text={t('VIN / search vehicle')} />\n <Dropdown\n options={vehicleOptions}\n value={vin}\n onChange={newVin => setVin(newVin)}\n isSearchable={true}\n isClearable={!!vin?.value}\n creatable={false}\n />\n </FormGroup>\n )}\n {(isAutomotiveService || isAutomotiveSales) && (\n <FormGroup marginBottom='8px'>\n <Label text={t('Video Type')} />\n <Dropdown\n options={videoTypeOptions}\n value={videoType}\n onChange={newVideoType => setVideoType(newVideoType)}\n isSearchable={true}\n isClearable={!!videoType?.value}\n creatable={false}\n />\n </FormGroup>\n )}\n <AttributeFields\n attributes={videoAttributes || []}\n initValues={initialValues}\n setIsSaveDisabled={setIsSaveDisabled}\n />\n </Form>\n );\n }}\n </Formik>\n </RightSide>\n </Content>\n )}\n </div>\n );\n};\n\nexport default Preview;\n","import { VideoListItem, getVideo } from 'lib/api';\nimport { Container, LoadingIndicator } from 'lib/components';\nimport { PreviewVideoBar } from 'lib/components/PreviewVideoBar';\nimport { useState, useEffect } from 'react';\nimport { useParams } from 'react-router-dom';\nimport Preview from '../video/components/Preview';\n\nconst INITIAL_VIDEO = {\n id: '',\n title: '',\n recordDate: '',\n views: '0',\n videoLength: 0,\n thumbnail: '',\n videoSource: '',\n tags: [],\n videoRequest: {\n videoRequestId: '0',\n },\n folder: '',\n processing: 0,\n autogeneratedThumbnail: '',\n};\n\nconst PreviewUpload = () => {\n // @ts-ignore\n const { videoId } = useParams();\n const [video, setVideo] = useState<VideoListItem>(INITIAL_VIDEO as any);\n const [videoLoading, setVideoLoading] = useState(true);\n const [onSaveVideo, setOnSaveVideo] = useState<Function>();\n const [insertAfterSave, setInsertAfterSave] = useState(false);\n const [isSaveDisabled, setIsSaveDisabled] = useState(false);\n const [uploadLoading, setUploadLoading] = useState(false);\n\n const updateUploadLoading = (val: boolean) => setUploadLoading(val);\n\n const fetchVideo = async () => {\n if (!videoId) return;\n const data = await getVideo(videoId);\n if (data) {\n setVideo(data);\n setVideoLoading(false);\n }\n };\n\n useEffect(() => {\n if (!video.id) {\n fetchVideo();\n }\n }, []);\n\n if (videoLoading) {\n return <LoadingIndicator isLoading={videoLoading} />;\n }\n\n return (\n <div>\n <PreviewVideoBar\n onSaveVideo={onSaveVideo ? onSaveVideo : () => {}}\n setInsertAfterSave={setInsertAfterSave}\n isSaveDisabled={isSaveDisabled}\n uploadLoading={uploadLoading}\n />\n <Container>\n <Preview\n recordingBlobUrl={video.videoSource}\n recordDate={video.recordDate}\n insertAfterSave={insertAfterSave}\n setSaveFunction={setOnSaveVideo}\n setIsSaveDisabled={setIsSaveDisabled}\n skipUploadProcess\n videoId={videoId}\n initialTitle={video.title}\n updateUploadLoading={updateUploadLoading}\n />\n </Container>\n </div>\n );\n};\n\nexport default PreviewUpload;\n","import { IVideoSettings } from '../types';\n\nconst mergeAudioStreams = (\n desktopStream: MediaStream,\n micStream: MediaStream\n) => {\n const context = new AudioContext();\n const desktopStreamSource = context.createMediaStreamSource(desktopStream);\n const micStreamSource = context.createMediaStreamSource(micStream);\n const destination = context.createMediaStreamDestination();\n\n const desktopGain = context.createGain();\n const micGain = context.createGain();\n\n desktopGain.gain.value = 0.7;\n micGain.gain.value = 0.7;\n\n desktopStreamSource.connect(desktopGain).connect(destination);\n micStreamSource.connect(micGain).connect(destination);\n\n return destination.stream.getTracks();\n};\n\nexport const handleScreenCapture = async (\n displayMediaRef: React.MutableRefObject<MediaStream | null>,\n audioSettings: boolean | { deviceId: string },\n videoSettings: MediaTrackConstraints\n) => {\n const displayMediaStreamConstraints: DisplayMediaStreamOptions = {\n video: {\n ...videoSettings,\n displaySurface: 'monitor',\n } as MediaTrackConstraints,\n audio: true,\n };\n\n // Get video stream from screen sharing\n const displayMediaStream = await navigator.mediaDevices.getDisplayMedia(\n displayMediaStreamConstraints\n );\n\n // Display media stream helper for clean up\n displayMediaRef.current = displayMediaStream;\n const audioTracks = displayMediaStream.getAudioTracks();\n // check if audio settings exist\n if (audioSettings) {\n const userMediaStream = await navigator.mediaDevices.getUserMedia({\n audio: audioSettings,\n });\n // if audio tab is shared\n if (audioTracks.length > 0) {\n const combinedStreamTracks = [\n ...displayMediaStream.getVideoTracks(),\n ...mergeAudioStreams(displayMediaStream, userMediaStream),\n ];\n\n return new MediaStream(combinedStreamTracks);\n }\n\n // of tab audio is not shared\n const combinedStreamTracks = [\n ...displayMediaStream.getVideoTracks(),\n ...userMediaStream.getAudioTracks(),\n ];\n return new MediaStream(combinedStreamTracks);\n }\n\n return displayMediaStream;\n};\n\nexport const enableCamera = async (\n cameraStreamRef: React.MutableRefObject<MediaStream | null>,\n audioSettings: boolean | { deviceId: string },\n videoSettings: IVideoSettings\n) => {\n const cameraStream = await navigator.mediaDevices.getUserMedia({\n audio: audioSettings,\n video: {\n ...videoSettings,\n deviceId: { exact: videoSettings.deviceId },\n },\n });\n\n cameraStreamRef.current = cameraStream;\n\n return cameraStreamRef.current;\n};\n\nexport const getScreenAndCameraStreams = async (\n displayMediaRef: React.MutableRefObject<MediaStream | null>,\n cameraStreamRef: React.MutableRefObject<MediaStream | null>,\n audioSettings: boolean | { deviceId: string },\n videoSettings: IVideoSettings,\n videoCameraPipRef: React.RefObject<HTMLVideoElement>\n) => {\n const displayMediaStreamConstraints: DisplayMediaStreamOptions = {\n video: {\n displaySurface: 'monitor',\n logicalSurface: true,\n cursor: 'always',\n } as MediaTrackConstraints,\n };\n\n // Get camera stream\n const userMediaStream = await navigator.mediaDevices.getUserMedia({\n audio: audioSettings,\n video: videoSettings,\n });\n if (videoCameraPipRef.current) {\n videoCameraPipRef.current.srcObject = userMediaStream;\n videoCameraPipRef.current.muted = true;\n\n // Play the video element to ensure it's ready for PiP\n await videoCameraPipRef.current.play();\n videoCameraPipRef.current.requestPictureInPicture();\n }\n // Get screen stream\n const displayMediaStream = await navigator.mediaDevices.getDisplayMedia(\n displayMediaStreamConstraints\n );\n\n // Display media stream helper for clean up\n displayMediaRef.current = displayMediaStream;\n\n // Camera stream media helper for clean up\n cameraStreamRef.current = userMediaStream;\n\n const combinedStream = new MediaStream();\n // Add audio track from userMediaStream to combined stream\n userMediaStream.getAudioTracks().forEach(track => {\n combinedStream.addTrack(track);\n });\n\n // Add video track from displayMediaStream to combined stream\n displayMediaStream.getVideoTracks().forEach(track => {\n combinedStream.addTrack(track);\n });\n\n return combinedStream;\n};\n\nexport const getSafariScreenAndCameraStreams = async (\n displayMediaRef: React.MutableRefObject<MediaStream | null>,\n cameraStreamRef: React.MutableRefObject<MediaStream | null>,\n audioSettings: boolean | { deviceId: string },\n videoSettings: IVideoSettings,\n videoCameraPipRef: React.RefObject<HTMLVideoElement>\n) => {\n const displayMediaStreamConstraints: DisplayMediaStreamOptions = {\n video: {\n displaySurface: 'browser',\n logicalSurface: true,\n cursor: 'always',\n } as MediaTrackConstraints,\n };\n // Get screen stream\n const displayMediaStream = await navigator.mediaDevices.getDisplayMedia(\n displayMediaStreamConstraints\n );\n // Get camera stream\n const userMediaStream = await navigator.mediaDevices.getUserMedia({\n audio: audioSettings,\n video: videoSettings,\n });\n\n // Display media stream helper for clean up\n displayMediaRef.current = displayMediaStream;\n\n // Camera stream media helper for clean up\n cameraStreamRef.current = userMediaStream;\n\n const combinedStream = new MediaStream();\n // Add audio track from userMediaStream to combined stream\n userMediaStream.getAudioTracks().forEach(track => {\n combinedStream.addTrack(track);\n });\n\n // Add video track from displayMediaStream to combined stream\n displayMediaStream.getVideoTracks().forEach(track => {\n combinedStream.addTrack(track);\n });\n if (videoCameraPipRef.current) {\n videoCameraPipRef.current.srcObject = userMediaStream;\n videoCameraPipRef.current.muted = true;\n\n // Play the video element to ensure it's ready for PiP\n await videoCameraPipRef.current.play();\n }\n return combinedStream;\n};\n","import { some } from 'lodash';\nexport const getDevices = () => {\n return new Promise(async (resolve, reject) => {\n let devices = await navigator.mediaDevices.enumerateDevices();\n if (some(devices, { label: '' })) {\n try {\n const s = await navigator.mediaDevices.getUserMedia({\n audio: true,\n video: true,\n });\n devices = await navigator.mediaDevices.enumerateDevices();\n s.getTracks().forEach((t: any) => t.stop());\n } catch (e) {\n reject(e);\n }\n }\n resolve(devices);\n });\n};\n\nexport const capitalizeWords = (str: string) => {\n return str\n .toLowerCase()\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n","import { ReactNode } from 'react';\n\nexport type IRecordSettingsProvider = {\n children: ReactNode;\n};\nexport type Option = {\n label: string;\n value: boolean | string;\n};\n\nexport enum DEVICE_KIND {\n AUDIO_INPUT = 'audioinput',\n VIDEO_INPUT = 'videoinput',\n}\n\nexport enum VIDEO_QUALITY {\n LOW = 'low',\n STANDARD = 'standard',\n HIGH = 'high',\n}\n\nexport type Device = {\n deviceId: string;\n kind: DEVICE_KIND.AUDIO_INPUT | DEVICE_KIND.VIDEO_INPUT;\n label: string;\n groupId: string;\n};\n\nexport interface IUserSettings {\n audioSource: Option | null;\n videoSource: Option | null;\n videoQuality: string;\n}\n\nexport interface IRecordConfigSettings {\n audioSource: Option[];\n videoSource: Option[];\n}\n","import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { getDevices } from './functions';\nimport {\n IUserSettings,\n IRecordSettingsProvider,\n IRecordConfigSettings,\n VIDEO_QUALITY,\n Device,\n DEVICE_KIND,\n Option,\n} from './types';\nimport { useTranslation } from 'react-i18next';\n\nexport const RecordSettingsContext = createContext(\n {} as {\n recorderSettings: { audioSource: Option[]; videoSource: Option[] };\n setUserSettings: React.Dispatch<React.SetStateAction<IUserSettings>>;\n userSettings: IUserSettings;\n recordingError: string | null;\n updateErrorMessage: () => void;\n initialUserSettings: IUserSettings;\n onSubmitModalHandler: () => void;\n }\n);\n\nconst LOCAL_STORAGE_KEY = 'record_settings';\n\nconst initialSettings = {\n audioSource: null,\n videoSource: null,\n videoQuality: VIDEO_QUALITY.STANDARD,\n};\n\nconst getUserSettings = (\n defaultAudio: Option,\n defaultVideo: Option\n): IUserSettings => {\n try {\n const item = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (item) {\n return JSON.parse(item) as IUserSettings;\n }\n return {\n videoQuality: VIDEO_QUALITY.STANDARD,\n videoSource: defaultVideo,\n audioSource: defaultAudio,\n };\n } catch (error) {\n console.error('Error parsing user settings from localStorage:', error);\n return {\n videoQuality: VIDEO_QUALITY.STANDARD,\n videoSource: defaultVideo,\n audioSource: defaultAudio,\n };\n }\n};\n\nexport const RecordSettingsProvider = ({\n children,\n}: IRecordSettingsProvider) => {\n const { t } = useTranslation();\n const noAudio: Option = { label: t('No Audio'), value: false };\n const noVideo: Option = { label: t('No Video'), value: false };\n\n const [recorderSettings, setRecorderSettings] =\n useState<IRecordConfigSettings>({\n audioSource: [],\n videoSource: [],\n });\n\n const [userSettings, setUserSettings] =\n useState<IUserSettings>(initialSettings);\n const [recordingError, setRecordingError] = useState<string | null>(null);\n const [initialUserSettings, setInitialUserSettings] =\n useState<IUserSettings>(initialSettings);\n\n const updateErrorMessage = () => {\n setRecordingError(\n t(\n 'You do not have the necessary permissions to access this feature. Please check your browser permissions.'\n )\n );\n };\n\n const fetchDevices = async () => {\n try {\n const devicesResponse = await getDevices();\n\n // Ensure devicesResponse is in the expected format (array of Device objects)\n const devices: Device[] = Array.isArray(devicesResponse)\n ? devicesResponse\n : [];\n\n // Build the config for audio and video sources\n const newConfig = devices.reduce(\n (config, device) => {\n if (device.kind === DEVICE_KIND.AUDIO_INPUT) {\n config.audio.push({ label: device.label, value: device.deviceId });\n } else if (device.kind === DEVICE_KIND.VIDEO_INPUT) {\n config.video.push({ label: device.label, value: device.deviceId });\n }\n return config;\n },\n { audio: [] as Option[], video: [] as Option[] }\n );\n\n // Handle default audio and video selection\n const defaultAudio =\n newConfig.audio.find(item => item.value === 'default') || noAudio;\n const defaultVideo = newConfig.video?.[0] || noVideo;\n\n // Get user settings based on the default selections\n const initialUserSettings = getUserSettings(defaultAudio, defaultVideo);\n\n // Set recorder and user settings\n setRecorderSettings({\n audioSource: [...newConfig.audio, noAudio],\n videoSource: newConfig.video,\n });\n\n setUserSettings(initialUserSettings);\n setInitialUserSettings(initialUserSettings);\n setRecordingError(null);\n } catch (error) {\n updateErrorMessage();\n\n // Reset the recorder settings in case of an error\n setRecorderSettings({\n audioSource: [noAudio],\n videoSource: [noVideo],\n });\n }\n };\n\n const onSubmitModalHandler = () => {\n setInitialUserSettings(userSettings);\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(userSettings));\n };\n\n useEffect(() => {\n const handleDeviceChange = () => {\n fetchDevices();\n };\n // Check if the navigator.mediaDevices API is supported\n if (navigator?.mediaDevices?.ondevicechange !== undefined) {\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n handleDeviceChange\n );\n\n fetchDevices();\n\n // Cleanup event listener on component unmount\n return () => {\n navigator.mediaDevices.removeEventListener(\n 'devicechange',\n handleDeviceChange\n );\n };\n } else {\n console.log(\n 'The navigator.mediaDevices API is not supported in this browser.'\n );\n handleDeviceChange();\n }\n }, []);\n\n return (\n <RecordSettingsContext.Provider\n value={{\n recorderSettings,\n userSettings,\n setUserSettings,\n recordingError,\n updateErrorMessage,\n initialUserSettings,\n onSubmitModalHandler,\n }}\n >\n {children}\n </RecordSettingsContext.Provider>\n );\n};\n\nexport const useRecordSettings = () => {\n const context = useContext(RecordSettingsContext);\n if (context === undefined) {\n throw new Error(\n 'useRecordSettings must be used within a RecordSettingsProvider'\n );\n }\n return context;\n};\n","import React from 'react';\nimport { Modal, RadioInput } from 'lib/components';\nimport { Button } from 'react-covideo-common';\nimport { Gap, Stack } from 'lib/components/styles/layout';\nimport {\n ParagraphNormal,\n ParagraphSmall,\n} from 'lib/components/styles/typography';\nimport { useRecordSettings } from 'lib/context/record/provider';\nimport { VIDEO_QUALITY } from 'lib/context/record/types';\nimport styled, { css, useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { screenSizes } from 'lib/style/theme';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nconst LabelContainerWrapper = styled.div`\n display: flex;\n width: 90%;\n align-items: center;\n padding: 0 12px;\n height: 38px;\n`;\n\nconst LabelContainer = styled.div`\n text-wrap: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n ${theme.mediaQueryMinWidth.mb} {\n width: 250px;\n }\n`;\n\nconst RadioLabel = styled.label`\n display: flex;\n gap: 4px;\n color: ${theme.palette.black_1_100};\n cursor: pointer;\n`;\n\nconst ModalItem = styled.div`\n box-sizing: border-box;\n width: 592px;\n padding: 32px;\n background-color: ${theme.palette.white};\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n width: 100%;\n `}\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 15px;\n`;\nconst Title = styled.div`\n color: ${theme.palette.gray100};\n font-weight: bold;\n font-size: 18px;\n line-height: 24px;\n`;\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nconst CustomValueContainer = ({ children }: { children: React.ReactNode }) => {\n return (\n <LabelContainerWrapper>\n <LabelContainer>{children}</LabelContainer>\n </LabelContainerWrapper>\n );\n};\n\ninterface IProps {\n handleModalClose: () => void;\n}\n\ntype Option = {\n label: string;\n value: string;\n};\n\nexport const ModalRecordingVideosSettings = ({ handleModalClose }: IProps) => {\n const { colors, isCdkEnviroment } = useTheme();\n const { t } = useTranslation();\n const {\n recorderSettings,\n setUserSettings,\n userSettings,\n onSubmitModalHandler,\n initialUserSettings,\n } = useRecordSettings();\n\n const onSubmit = () => {\n onSubmitModalHandler();\n handleModalClose();\n };\n\n const onCancelOrCloseModalSettings = () => {\n setUserSettings(initialUserSettings);\n handleModalClose();\n };\n\n const onChangeVideoSettingsHandler = (value: Option) =>\n setUserSettings({\n ...userSettings,\n videoSource: value,\n });\n\n const onChangeAudioSettingsHandler = (value: Option) =>\n setUserSettings({\n ...userSettings,\n audioSource: value,\n });\n\n const onVideoQualityHandler = (videoQuality: VIDEO_QUALITY) =>\n setUserSettings({\n ...userSettings,\n videoQuality,\n });\n\n return (\n <Modal>\n <ModalItem>\n <Header>\n <Title>{t('Recording settings')}</Title>\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n />\n </CloseButtonWrapper>\n </Header>\n <Gap>\n {!!recorderSettings.videoSource.length && (\n <Stack width='100%' alignItems='start' gap='4px'>\n <ParagraphSmall color={colors.neutral[60]}>\n {t('Video source')}\n </ParagraphSmall>\n <Dropdown\n creatable={false}\n value={userSettings.videoSource as any}\n placeholder={t('No settings')}\n options={recorderSettings.videoSource}\n onChange={onChangeVideoSettingsHandler}\n height={40}\n extendStyles={{ container: { width: '100%' } }}\n customComponents={{ ValueContainer: CustomValueContainer }}\n isSearchable={false}\n />\n </Stack>\n )}\n {!!recorderSettings.audioSource.length && (\n <Stack width='100%' alignItems='start' gap='4px'>\n <ParagraphSmall color={colors.neutral[60]}>\n {t('Audio source')}\n </ParagraphSmall>\n <Dropdown\n creatable={false}\n placeholder={t('No settings')}\n value={userSettings.audioSource as any}\n options={recorderSettings.audioSource}\n onChange={onChangeAudioSettingsHandler}\n extendStyles={{ container: { width: '100%' } }}\n height={40}\n customComponents={{ ValueContainer: CustomValueContainer }}\n isSearchable={false}\n />\n </Stack>\n )}\n <>\n <ParagraphSmall color={colors.neutral[60]}>\n {t('Video quality')}\n </ParagraphSmall>\n <Stack\n alignItems='flex-start'\n width='100%'\n gap='8px'\n m='0 0 16px 0'\n >\n <Gap width='100%' justifyContent='space-between'>\n <RadioLabel>\n <RadioInput\n checked={userSettings.videoQuality === VIDEO_QUALITY.LOW}\n name='quality'\n value={VIDEO_QUALITY.LOW}\n onClick={() => onVideoQualityHandler(VIDEO_QUALITY.LOW)}\n onChange={() => onVideoQualityHandler(VIDEO_QUALITY.LOW)}\n />\n <ParagraphNormal color={colors.neutral[100]}>\n {t('Low')}\n </ParagraphNormal>\n </RadioLabel>\n <ParagraphSmall>{t('Faster Upload')}</ParagraphSmall>\n </Gap>\n <Gap width='100%' justifyContent='space-between'>\n <RadioLabel>\n <RadioInput\n checked={\n userSettings.videoQuality === VIDEO_QUALITY.STANDARD\n }\n name='quality'\n value={VIDEO_QUALITY.STANDARD}\n onClick={() =>\n onVideoQualityHandler(VIDEO_QUALITY.STANDARD)\n }\n onChange={() =>\n onVideoQualityHandler(VIDEO_QUALITY.STANDARD)\n }\n />\n <ParagraphNormal color={colors.neutral[100]}>\n {t('Standard')}\n </ParagraphNormal>\n </RadioLabel>\n <ParagraphSmall> {t('Fast Upload')}</ParagraphSmall>\n </Gap>\n <Gap width='100%' justifyContent='space-between'>\n <RadioLabel>\n <RadioInput\n checked={userSettings.videoQuality === VIDEO_QUALITY.HIGH}\n name='quality'\n value={VIDEO_QUALITY.HIGH}\n onClick={() => onVideoQualityHandler(VIDEO_QUALITY.HIGH)}\n onChange={() => onVideoQualityHandler(VIDEO_QUALITY.HIGH)}\n />\n <ParagraphNormal color={colors.neutral[100]}>\n {t('High')}\n </ParagraphNormal>\n </RadioLabel>\n <ParagraphSmall>{t('Slow Upload')}</ParagraphSmall>\n </Gap>\n </Stack>\n </>\n </Gap>\n <Gap width='100%' justifyContent='flex-end'>\n <Button\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n text={t('Cancel')}\n onClick={onCancelOrCloseModalSettings}\n />\n <Button text={t('Save')} onClick={onSubmit} />\n </Gap>\n </ModalItem>\n </Modal>\n );\n};\n","export enum RECORDING_STATUS {\n IDLE = 'IDLE',\n RECORDING = 'RECORDING',\n PAUSED = 'PAUSED',\n CAMERA_READY = 'CAMERA_READY',\n COUNTDOWN = 'COUNTDOWN',\n DONE = 'DONE',\n}\n\nexport enum RECORD_LOADER_STATUS {\n UPLOADING = 1,\n CREATE = 2,\n ENCODE = 3,\n UPLOAD_COMPLETED = 4,\n ERROR = 5,\n}\n\nexport interface IVideoQuality {\n width: { ideal: number };\n height: { ideal: number };\n}\n\nexport interface IVideoSettings extends IVideoQuality {\n frameRate: number;\n deviceId?: string | undefined;\n}\n\nexport type VirtualBackgroundTypes = 'none' | 'default' | 'custom';\nexport type PrivacyTypes = 'PUBLIC' | 'PRIVATE' | 'TEAM';\n\nexport type VirtualBackground = {\n url: string; // required in case of custom backgrounds\n type: VirtualBackgroundTypes;\n index: number; // required in case of default backgrounds\n privacy: PrivacyTypes; // required in case of custom backgrounds\n id: string; // required in case of custom backgrounds\n};\n\nexport type DropItem = {\n id?: string;\n code: string;\n title: string;\n previewMedium: string;\n previewSmall: string;\n type: string;\n content: string;\n boards?: string[];\n tags?: string[];\n shortlink?: string;\n downloadable?: boolean;\n cloneable?: boolean;\n size: number;\n views: number;\n variant: string;\n password?: string;\n privacy?: string;\n selected?: boolean;\n createdAt?: number;\n groupsAccessList?: Array<any>;\n owner: number;\n lastAccess: number;\n};\n\nexport type ExtendedFile = {\n name: string;\n sizeText: string;\n size: number;\n currentUpload: number;\n status: string;\n progress: number;\n type?: string;\n};\ntype Access = {\n accessRight: string;\n email: string;\n userId: string;\n};\n\ntype Creator = {\n email: string;\n userId: string;\n};\n\ntype GroupAccess = {\n id: string;\n};\nexport const statuses = {\n WAITING: 'waiting',\n UPLOADING: 'uploading',\n CANCELING: 'canceling',\n CANCELED: 'canceled',\n FINISHED: 'finished',\n GENERATING_PREVIEW: 'preview',\n};\nexport interface DroplrBoard {\n accessList: Access[];\n creator?: Creator;\n deleted?: boolean;\n groupsAccessList: GroupAccess[];\n id: string;\n isPublic: boolean;\n name: string;\n password?: string;\n poweredBy: boolean;\n privacy: string;\n shortlink?: string;\n uploadPrivacy: string;\n userStatus?: string;\n}\nexport interface CombinedBoard extends DroplrBoard {\n thumbnailUrl: string;\n userId?: string;\n customerId?: string;\n}\n","import RouteLeavingGuard from 'lib/components/RouteLeavingGuard';\nimport { Gap } from 'lib/components/styles/layout';\nimport React from 'react';\nimport { Button } from 'react-covideo-common';\nimport { RECORDING_STATUS } from './types';\nimport { MdMovie } from 'react-icons/md';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\n\ninterface RecordingControlProps {\n status: RECORDING_STATUS;\n handleGoToRecordHome: () => void;\n teleprompterActions?: React.ReactNode;\n}\n\nexport const RecordingHeaderWithRouteGuard = ({\n status,\n handleGoToRecordHome,\n teleprompterActions,\n}: RecordingControlProps) => {\n const shouldHideChangeRecordingOptionBtn =\n status === RECORDING_STATUS.RECORDING || status === RECORDING_STATUS.PAUSED;\n const isMobileDevice = checkIfMobileDevice();\n const { t } = useTranslation();\n const { trackGTMDiscardVideoEvent } = useGTMAnalytics();\n return (\n <>\n <RouteLeavingGuard\n when={true}\n stay={true}\n onConfirm={() => {}}\n navigate={() => {\n trackGTMDiscardVideoEvent?.();\n handleGoToRecordHome();\n }}\n shouldBlockNavigation={() => {\n return status === RECORDING_STATUS.RECORDING;\n }}\n title={t('Leave without saving the recording?')}\n text={t(\n 'Your recording will not be saved. This action can’t be undone.'\n )}\n confirmButtonText={t('Continue')}\n discardButtonText={t('Leave')}\n />\n <Gap\n m={isMobileDevice ? '12px 0 12px 0' : '72px 0 32px 0'}\n width='100%'\n justifyContent='space-between'\n >\n {!shouldHideChangeRecordingOptionBtn ? (\n !isMobileDevice && (\n <Button\n icon={<MdMovie size={18} />}\n variant='secondary'\n text={t('Change recording option')}\n onClick={() => {\n trackGTMDiscardVideoEvent?.();\n handleGoToRecordHome();\n }}\n disabled={status === RECORDING_STATUS.COUNTDOWN}\n />\n )\n ) : (\n <div style={{ height: 40 }}></div>\n )}\n {teleprompterActions}\n </Gap>\n </>\n );\n};\n","import styled, { useTheme } from 'styled-components';\n\ntype WrapperProps = {\n hide?: boolean;\n};\n\nconst Wrapper = styled.div<WrapperProps>`\n display: ${props => (props.hide ? 'none' : 'flex')};\n flex-direction: row;\n justify-content: center;\n align-items: center;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 3;\n`;\n\ntype CounterProps = {\n willStart?: boolean;\n counter: number;\n isFreemium?: boolean;\n color: string;\n};\n\nconst Counter = styled.div<CounterProps>`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n color: #fff;\n font-size: 136px;\n font-weight: 900;\n background-color: ${props => props.color || props.theme.colors.primary[100]};\n width: 100%;\n height: 100%;\n opacity: ${props => (props.willStart ? 0.5 : 0)};\n transition: opacity 0.2s ease-in;\n border-radius: ${props => (props.isFreemium ? '24px' : '8px')};\n &:hover {\n cursor: pointer;\n }\n`;\n\ninterface IProps {\n hide: boolean;\n onClick?: () => void;\n isFreemium?: boolean;\n willStart: boolean;\n counter: number;\n}\n\nexport const CountDown = ({\n counter,\n willStart,\n onClick,\n hide,\n isFreemium,\n}: IProps) => {\n const { colors } = useTheme();\n\n const colorMap: { [key: number]: string } = {\n 3: colors.primary[80],\n 2: colors.primary[40],\n 1: colors.primary[20],\n };\n return (\n <Wrapper hide={hide}>\n <Counter\n counter={counter}\n willStart={willStart}\n onClick={onClick}\n isFreemium={isFreemium}\n color={colorMap[counter]}\n >\n {counter}\n </Counter>\n </Wrapper>\n );\n};\n","import { screenSizes } from 'lib/style/theme';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\nimport React from 'react';\nimport { Button } from 'react-covideo-common';\nimport { MdFlipCameraAndroid } from 'react-icons/md';\nimport styled, { css } from 'styled-components';\nimport { CountDown } from './Countdown';\nimport { RECORDING_STATUS } from './types';\n\ninterface RecorderBodyProps {\n countdown: number;\n videoRef: React.RefObject<HTMLVideoElement>;\n canvasRef?: React.RefObject<HTMLCanvasElement>;\n teleprompter?: React.ReactNode;\n status: RECORDING_STATUS;\n toggleCamera?: () => void;\n}\n\nconst RecorderBodyWrapper = styled.div`\n width: 770px;\n height: 440px;\n position: relative;\n border-radius: 8px;\n\n ${({ theme }) => {\n return (\n theme.containerWidth < screenSizes.sm &&\n css`\n height: 100%;\n width: auto;\n background: ${theme.colors.neutral[40]};\n max-height: 440px;\n `\n );\n }}\n`;\n\nconst VideoStyles = styled.video`\n width: 100%;\n height: 100%;\n pointer-events: none;\n border-radius: 8px;\n max-height: 440px;\n min-height: 440px;\n`;\n\nconst CanvasStyles = styled.canvas`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n border-radius: 8px;\n ${({ theme }) => {\n return (\n theme.containerWidth < screenSizes.sm &&\n css`\n max-height: 440px;\n min-height: 440px;\n `\n );\n }}\n`;\n\nexport const RecorderBody = ({\n countdown,\n videoRef,\n teleprompter,\n status,\n canvasRef,\n toggleCamera,\n}: RecorderBodyProps) => {\n const isMobileDevice = checkIfMobileDevice();\n const showCamera =\n status === RECORDING_STATUS.CAMERA_READY ||\n status === RECORDING_STATUS.IDLE;\n return (\n <RecorderBodyWrapper>\n {teleprompter}\n <CountDown\n counter={countdown}\n willStart={countdown > 0}\n hide={!countdown || status === RECORDING_STATUS.CAMERA_READY}\n />\n\n <VideoStyles ref={videoRef} controls={false} autoPlay playsInline />\n {canvasRef && <CanvasStyles ref={canvasRef} />}\n {isMobileDevice && showCamera && (\n <Button\n variant='secondary'\n icon={<MdFlipCameraAndroid size={20} />}\n style={{ position: 'absolute', right: 16, bottom: 16 }}\n onClick={toggleCamera}\n />\n )}\n </RecorderBodyWrapper>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useCountdown = (initialCount: number) => {\n const [countdown, setCountdown] = useState(initialCount);\n const countdownIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n return () => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n }\n };\n }, []);\n\n const startRecordingCountdown = () => {\n setCountdown(initialCount);\n countdownIntervalRef.current = setInterval(() => {\n setCountdown(prevCount => {\n if (prevCount <= 1) {\n clearInterval(countdownIntervalRef.current!);\n countdownIntervalRef.current = null;\n return 0;\n }\n return prevCount - 1;\n });\n }, 1000);\n };\n\n const stopRecordingCountdown = () => {\n if (countdownIntervalRef.current) {\n clearInterval(countdownIntervalRef.current);\n countdownIntervalRef.current = null;\n }\n setCountdown(initialCount);\n };\n\n return { countdown, startRecordingCountdown, stopRecordingCountdown };\n};\n","import { useEffect, useRef, useState } from 'react';\n\nexport const useRecordingTime = () => {\n const [timeInSeconds, setTimeInSeconds] = useState(0);\n const recordingIntervalRef = useRef<NodeJS.Timeout | null>(null);\n\n useEffect(() => {\n return () => {\n // Clean up on component unmount\n if (recordingIntervalRef.current) {\n clearInterval(recordingIntervalRef.current);\n }\n };\n }, []);\n\n const startRecordingTime = () => {\n recordingIntervalRef.current = setInterval(() => {\n setTimeInSeconds(prevTime => prevTime + 1);\n }, 1000);\n };\n\n const stopRecordingTime = () => {\n if (recordingIntervalRef.current) {\n clearInterval(recordingIntervalRef.current);\n }\n };\n\n return { timeInSeconds, startRecordingTime, stopRecordingTime };\n};\n","import { useEffect, useRef, useState } from 'react';\nimport RecordRTC, { MediaStreamRecorder } from 'recordrtc';\nimport { useCountdown } from './useRecorderCountdown';\nimport { useRecordingTime } from './useRecordingTime';\nimport { RECORDING_STATUS } from './types';\nimport { useRecordSettings } from 'lib/context/record/provider';\nimport { useToastNotifications } from 'lib/components';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\n\ninterface UseRecorderParams {\n screenStream: MediaStream;\n stopAllStreams?: () => void;\n videoRef: React.RefObject<HTMLVideoElement>;\n canvasRef?: React.RefObject<HTMLCanvasElement>;\n isSegmenterActive?: boolean;\n onStartUpladingVoiceOverHandler?: (blob: Blob) => void;\n shouldStartCountdown: boolean;\n handleGoToRecordHome: () => void;\n isCameraToggled?: boolean;\n}\n\nconst BITRATES: { [key: string]: number } = {\n low: 1000000,\n standard: 2500000,\n high: 5000000,\n};\n\nconst combineVideoAndAudioStreams = (\n videoStream: MediaStream,\n audioStream: MediaStream\n): MediaStream => {\n const combinedStream = new MediaStream();\n\n // Add the video track from the video stream\n const videoTracks = videoStream.getVideoTracks();\n videoTracks.forEach(track => combinedStream.addTrack(track));\n\n // Add the audio tracks from the audio stream\n const audioTracks = audioStream.getAudioTracks();\n audioTracks.forEach(track => combinedStream.addTrack(track));\n\n return combinedStream;\n};\n\ninterface UseRecorderReturn {\n startRecording: () => void;\n stopRecording: () => void;\n pauseRecording: () => void;\n startCountDown: () => void;\n stopCountDown: () => void;\n status: RECORDING_STATUS;\n recordedBlob: Blob | null;\n countdown: number;\n timeInSeconds: number;\n setStatus: React.Dispatch<React.SetStateAction<RECORDING_STATUS>>;\n}\nconst COUNTDOWN = 3;\nconst useRecorder = ({\n screenStream,\n stopAllStreams,\n videoRef,\n canvasRef,\n isSegmenterActive,\n onStartUpladingVoiceOverHandler,\n shouldStartCountdown,\n handleGoToRecordHome,\n isCameraToggled,\n}: UseRecorderParams): UseRecorderReturn => {\n const {\n trackGTMStartRecordingEvent,\n trackGTMStopRecordingEvent,\n trackGTMAddVideoAttributeEvent,\n } = useGTMAnalytics();\n const { t } = useTranslation();\n const { toast } = useToastNotifications();\n const { countdown, startRecordingCountdown, stopRecordingCountdown } =\n useCountdown(COUNTDOWN);\n const { startRecordingTime, stopRecordingTime, timeInSeconds } =\n useRecordingTime();\n const { userSettings } = useRecordSettings();\n const recorderRef = useRef<RecordRTC | null>(null);\n const [status, setStatus] = useState<RECORDING_STATUS>(RECORDING_STATUS.IDLE);\n const [recordedBlob, setRecordedBlob] = useState<Blob | null>(null);\n const videoBitsPerSecond =\n BITRATES?.[userSettings?.videoQuality] || BITRATES.low;\n\n useEffect(() => {\n return () => {\n stopAllStreams?.();\n if (recorderRef.current) {\n recorderRef.current.stopRecording(() => {\n recorderRef.current!.destroy();\n recorderRef.current = null;\n });\n }\n };\n }, []);\n\n useEffect(() => {\n if (videoRef.current && screenStream) {\n videoRef.current.srcObject = screenStream;\n\n videoRef.current.muted = true;\n videoRef.current.volume = 0;\n videoRef.current.onloadedmetadata = () => {\n setStatus(RECORDING_STATUS.CAMERA_READY);\n shouldStartCountdown && startCountDown();\n };\n }\n }, [screenStream]);\n\n // videoTrack.onended\n useEffect(() => {\n if (videoRef.current && screenStream) {\n const videoTrack = screenStream.getVideoTracks()[0];\n\n videoTrack.onended = () => {\n if (\n status === RECORDING_STATUS.RECORDING ||\n status === RECORDING_STATUS.PAUSED\n ) {\n return stopRecording();\n }\n\n if (isCameraToggled) {\n return setStatus(RECORDING_STATUS.IDLE);\n }\n handleGoToRecordHome?.();\n };\n }\n }, [screenStream, status]);\n\n useEffect(() => {\n if (countdown === 0 && status === RECORDING_STATUS.COUNTDOWN) {\n trackGTMStartRecordingEvent?.();\n startRecording();\n }\n }, [countdown, status]);\n\n const getCombinedStream = (screenStream: MediaStream) => {\n if (isSegmenterActive) {\n const canvasStream = canvasRef?.current?.captureStream(30);\n const combinedStream = canvasStream\n ? combineVideoAndAudioStreams(canvasStream, screenStream)\n : screenStream;\n\n return combinedStream;\n }\n return screenStream;\n };\n const mimeType = MediaRecorder.isTypeSupported('video/webm')\n ? 'video/webm'\n : 'video/mp4'; // Fallback for unsupported browsers\n\n const startRecording = () => {\n if (screenStream) {\n const currentStream = getCombinedStream(screenStream);\n try {\n recorderRef.current = new RecordRTC(currentStream, {\n videoBitsPerSecond,\n type: 'video',\n mimeType,\n recorderType: MediaStreamRecorder, // Specify this explicitly\n });\n\n recorderRef.current.startRecording();\n setStatus(RECORDING_STATUS.RECORDING);\n\n startRecordingTime();\n } catch (error) {\n console.error('Failed to start recording:', error);\n toast({\n message: t('Failed to start recording.'),\n });\n }\n } else {\n toast({\n message: 'Something went wrong, try again later!',\n });\n }\n };\n\n const stopRecording = () => {\n if (recorderRef.current) {\n recorderRef.current.stopRecording(() => {\n setRecordedBlob(recorderRef.current!.getBlob());\n if (status === RECORDING_STATUS.PAUSED) {\n trackGTMAddVideoAttributeEvent?.();\n } else {\n trackGTMStopRecordingEvent?.();\n trackGTMAddVideoAttributeEvent?.();\n }\n stopAllStreams?.();\n setStatus(RECORDING_STATUS.DONE);\n onStartUpladingVoiceOverHandler?.(recorderRef.current!.getBlob());\n recorderRef.current!.destroy();\n recorderRef.current = null;\n });\n\n stopRecordingTime();\n }\n };\n\n const pauseRecording = () => {\n if (recorderRef.current && status === RECORDING_STATUS.RECORDING) {\n recorderRef.current.pauseRecording();\n setStatus(RECORDING_STATUS.PAUSED);\n stopRecordingTime();\n } else if (recorderRef.current && status === RECORDING_STATUS.PAUSED) {\n recorderRef.current.resumeRecording();\n trackGTMStartRecordingEvent?.();\n setStatus(RECORDING_STATUS.RECORDING);\n startRecordingTime();\n }\n };\n\n const startCountDown = () => {\n setStatus(RECORDING_STATUS.COUNTDOWN);\n startRecordingCountdown();\n };\n\n const stopCountDown = () => {\n setStatus(RECORDING_STATUS.CAMERA_READY);\n stopRecordingCountdown();\n };\n\n return {\n startRecording,\n stopRecording,\n pauseRecording,\n startCountDown,\n stopCountDown,\n setStatus,\n status,\n recordedBlob,\n countdown,\n timeInSeconds,\n };\n};\n\nexport default useRecorder;\n","import { Gap } from 'lib/components/styles/layout';\nimport CheckmarkIcon from 'lib/images/CheckmarkIcon';\nimport { screenSizes } from 'lib/style/theme';\nimport { toMMSS } from 'lib/utils/functions';\nimport React from 'react';\nimport { Button } from 'react-covideo-common';\nimport { MdOutlinePause, MdVideocam } from 'react-icons/md';\nimport styled, { css, useTheme } from 'styled-components';\nimport { RECORDING_STATUS } from './types';\nimport { useTranslation } from 'react-i18next';\n\nconst RecordingFlowWrapper = styled(Gap)`\n ${({ theme }) =>\n theme.containerWidth < screenSizes.sm &&\n css`\n width: 100%;\n justify-content: space-between;\n `}\n`;\nconst FinishBtnWrapper = styled(Gap)`\n position: absolute;\n width: 100%;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.sm &&\n css`\n position: initial;\n width: unset;\n `}\n`;\n\ninterface VideoRecorderActionsProps {\n status: RECORDING_STATUS;\n timeInSeconds: number;\n startCountDown: () => void;\n stopCountDown: () => void;\n pauseRecording: () => void;\n stopRecording: () => void;\n isLoadingVB?: boolean;\n}\nconst VideoRecorderActions: React.FC<VideoRecorderActionsProps> = ({\n status,\n timeInSeconds,\n startCountDown,\n stopCountDown,\n pauseRecording,\n stopRecording,\n isLoadingVB,\n}) => {\n const { isCdkEnviroment } = useTheme();\n const { t } = useTranslation();\n const preparingFlow =\n status === RECORDING_STATUS.CAMERA_READY ||\n status === RECORDING_STATUS.COUNTDOWN;\n\n const recordingFlow =\n status === RECORDING_STATUS.PAUSED || status === RECORDING_STATUS.RECORDING;\n\n return (\n <div style={{ width: '100%', position: 'relative', paddingBottom: 32 }}>\n {preparingFlow && (\n <Gap justifyContent='center' width='100%' m='36px 0 0 0'>\n {status === RECORDING_STATUS.CAMERA_READY && !isLoadingVB && (\n <Button\n variant={isCdkEnviroment ? 'primary' : 'red'}\n icon={<MdVideocam size={24} />}\n text={t('Start recording')}\n onClick={startCountDown}\n />\n )}\n {status === RECORDING_STATUS.COUNTDOWN && (\n <Button\n variant={isCdkEnviroment ? 'text' : 'secondary'}\n text={t('Cancel')}\n onClick={stopCountDown}\n />\n )}\n </Gap>\n )}\n {recordingFlow && (\n <RecordingFlowWrapper m='32px 0 0 0'>\n <Gap style={{ position: 'relative', zIndex: 22 }}>\n <Button\n variant={\n status === RECORDING_STATUS.PAUSED\n ? isCdkEnviroment\n ? 'text'\n : 'red'\n : 'secondary'\n }\n icon={\n status === RECORDING_STATUS.PAUSED ? (\n <MdVideocam size={24} />\n ) : (\n <MdOutlinePause />\n )\n }\n text={\n status === RECORDING_STATUS.PAUSED ? t('Resume') : t('Pause')\n }\n onClick={pauseRecording}\n />\n <span style={{ width: 50 }}>{toMMSS(timeInSeconds, 0)}</span>\n </Gap>\n <FinishBtnWrapper alignItems='center' justifyContent='center'>\n <Button\n icon={<CheckmarkIcon />}\n variant='primary'\n text={t('Finish')}\n onClick={stopRecording}\n />\n </FinishBtnWrapper>\n </RecordingFlowWrapper>\n )}\n </div>\n );\n};\n\nexport default VideoRecorderActions;\n","export const isSafari = /^((?!chrome|android).)*safari/i.test(\n navigator.userAgent\n);\n\nexport const isOpera =\n //@ts-ignore\n (!!window.opr && !!opr.addons) ||\n //@ts-ignore\n !!window.opera ||\n navigator.userAgent.indexOf(' OPR/') >= 0;\n\n//@ts-ignore\nexport const isFirefox = typeof InstallTrigger !== 'undefined';\n","import { QueryListParams } from '../types';\n\nexport const videoAttributesKeys = {\n all: (params: QueryListParams) => ['VIDEO_ATTRIBUTES', params],\n detail: (videoId: number) => ['VIDEO_ATTRIBUTES', videoId],\n};\n","import { QueryListParams, VideoAttribute } from '../types';\nimport { useQuery } from 'react-query';\nimport { videoAttributesKeys } from './videoAttributesKeys';\nimport { EXPRESS_API } from 'lib/config';\n\nexport interface IAttributesResponse {\n count: number;\n attributes: VideoAttribute[];\n}\n\nexport const getAttributes = async ({\n page = 0,\n size = 10,\n filterByDepartment = false,\n}: QueryListParams): Promise<IAttributesResponse> => {\n const start = page * size;\n const params = {\n start,\n limit: size,\n filterByDepartment,\n };\n\n const { data } = await EXPRESS_API.get('/video-attributes', {\n params,\n });\n\n const { videoAttributes = [], count = 0 } = data || {};\n\n return { count, attributes: videoAttributes };\n};\n\nexport const useGetAllVideoAttributesQuery = (params: QueryListParams) => {\n return useQuery(videoAttributesKeys.all(params), () => getAttributes(params));\n};\n","import React from 'react';\nimport { useFormikContext } from 'formik';\nimport { Gap } from 'lib/components/styles/layout';\nimport { Heading } from 'lib/components/styles/typography';\n\nimport { Button } from 'react-covideo-common';\nimport { MdDeleteForever, MdEmail, MdSave } from 'react-icons/md';\nimport { useAuthorizationContext } from 'lib/context';\nimport { checkIfAutomotiveSalesRole } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { screenSizes } from 'lib/style/theme';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\ninterface IDetailsPreviewHeaderProps {\n setContineToInsert: React.Dispatch<React.SetStateAction<boolean>>;\n onDiscardHandler: () => void;\n}\n\nexport const DetailsPreviewHeader = ({\n setContineToInsert,\n onDiscardHandler,\n}: IDetailsPreviewHeaderProps) => {\n const { t } = useTranslation();\n const { isValid, submitForm } = useFormikContext();\n const { userData } = useAuthorizationContext();\n const { showInsertFeature, containerWidth } = useConfigurationContext();\n const { colors, isCdkEnviroment } = useTheme();\n\n const handleContinueToSendShare = () => {\n setContineToInsert(true);\n submitForm();\n };\n const isAutomotiveSalesRole = checkIfAutomotiveSalesRole(userData);\n return (\n <>\n <Gap width='100%' justifyContent='space-between' m='0 0 32px 0'>\n <Heading color={colors.black[100]}>\n {t('Preview recorded video')}\n </Heading>\n <Gap gap='8px'>\n <Button\n icon={<MdDeleteForever size={20} />}\n text={t('Discard')}\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n onClick={onDiscardHandler}\n />\n <Button\n disabled={!isValid}\n icon={<MdSave size={18} />}\n text={isAutomotiveSalesRole ? t('Save') : t('Save Recording')}\n onClick={submitForm}\n variant={isCdkEnviroment ? 'secondary' : 'primary'}\n />\n\n {showInsertFeature && (\n <Button\n variant='primary'\n disabled={!isValid}\n icon={<MdEmail size={20} />}\n text={\n containerWidth > screenSizes.sm\n ? t('Continue to Insert')\n : t('Insert')\n }\n onClick={handleContinueToSendShare}\n />\n )}\n </Gap>\n </Gap>\n </>\n );\n};\n","import styled, { useTheme } from 'styled-components';\nimport { IoMdCloseCircle } from 'react-icons/io';\nimport { FaHashtag } from 'react-icons/fa';\n\nconst Tag = styled.span`\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n letter-spacing: 0px;\n text-align: left;\n border-radius: 5px;\n padding: 4px 8px;\n background: ${({ theme }) => theme.colors.primary[5]};\n color: #4e5461;\n flex: none;\n margin: 6px 8px 0 0;\n .hashtag-icon {\n margin-bottom: -2px;\n margin-right: 2px;\n }\n .close-icon {\n margin-bottom: -3px;\n margin-left: 3px;\n &:hover {\n cursor: pointer;\n path {\n fill: ${({ theme }) => theme.colors.primary[60]};\n }\n }\n }\n`;\n\nexport const VideoTag = ({\n tag,\n showRemove = false,\n onRemove = () => {},\n onClick = () => {},\n onMouseEnter = () => {},\n onMouseLeave = () => {},\n children,\n}: any) => {\n const { colors } = useTheme();\n\n return (\n <Tag\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className='video-tag'\n key={tag.value}\n >\n {!!tag.value && <FaHashtag className='hashtag-icon' />}\n {tag.label}\n {showRemove && (\n <IoMdCloseCircle\n onClick={() => onRemove(tag)}\n className='close-icon'\n color={colors.primary[40]}\n />\n )}\n {children}\n </Tag>\n );\n};\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Button } from 'react-covideo-common';\nimport styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { components } from 'react-select';\nimport { MdSearch } from 'react-icons/md';\nimport { MdAdd } from 'react-icons/md';\nimport { FaHashtag } from 'react-icons/fa';\nimport { Modal } from 'lib/components';\nimport { VideoTag } from './VideoTag';\nimport { getTags, Tag } from 'lib/api';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nexport const TAG_LIMIT = 50;\n\nconst ModalItem = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n background-color: ${theme.palette.white};\n padding: 32px;\n`;\nconst Section = styled.section`\n display: flex;\n flex-direction: column;\n width: 528px;\n max-width: 100%;\n gap: 12px;\n justify-content: flex-end;\n align-items: right;\n`;\nconst SelectInput = styled(Dropdown)`\n position: relative;\n display: block;\n font-size: 16px;\n height: 40px;\n box-sizing: border-box;\n transition:\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out;\n border: none;\n box-sizing: border-box;\n &:focus {\n color: red;\n background-color: #fff;\n outline: 0;\n }\n`;\n\nconst TagsContainer = styled.div`\n height: 150px;\n display: flex;\n flex-direction: row;\n margin-top: 18px;\n flex-flow: row wrap;\n align-content: flex-start;\n`;\n\nconst Footer = styled.div`\n display: flex;\n justify-content: flex-end;\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 15px;\n`;\nconst Title = styled.div`\n color: ${theme.palette.gray100};\n font-weight: bold;\n font-size: 18px;\n line-height: 24px;\n`;\n\nconst CloseButtonWrapper = styled.label`\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n color: ${theme.palette.themeDark50Percent};\n &:hover {\n cursor: pointer;\n }\n`;\n\nexport const ModalVideoTags = ({\n videoTags = [],\n handleModalClose,\n onSubmit,\n buttonTitle,\n}: any) => {\n const { t } = useTranslation();\n const [inputValue, setInputValue] = useState('');\n const [tags, setTags] = useState([] as Tag[]);\n const [displayValues, setDisplayValues] = useState(videoTags);\n const [errorMessage, setErrorMessage] = useState('');\n const { colors } = useTheme();\n\n const sortTags = (unsortedTags: any) => {\n return unsortedTags.sort((a: any, b: any) => {\n return a.label?.localeCompare(b.label);\n });\n };\n\n const loadTags = async () => {\n const tags = await getTags({});\n setTags(\n sortTags(\n tags\n .map((t: Tag) => ({ value: t.tagId, label: t.tag }))\n .filter(\n (t: Tag) => !displayValues.find((dv: Tag) => dv.value === t.value)\n )\n )\n );\n };\n\n React.useEffect(() => {\n loadTags();\n }, []);\n\n const escPress = (key: string) => {\n if (key === 'Escape') {\n handleModalClose();\n }\n };\n\n useEffect(() => {\n document.addEventListener('keyup', e => escPress(e.key));\n\n return () =>\n document.removeEventListener('keyup', e => escPress(e.key), true);\n }, []);\n\n const removeTag = (tag: Tag) => {\n setDisplayValues(\n sortTags(displayValues.filter((t: Tag) => t.value !== tag.value))\n );\n setTags(sortTags([...tags, tag]));\n };\n\n const onInputChange = (v: string) => {\n if (v.length > TAG_LIMIT) {\n return;\n }\n setInputValue(v);\n };\n\n const onChange = (v: object[]) => {\n if (!v || !v.length) {\n return;\n }\n const val = v[0] as any;\n /* SUS-908 changes */\n if (!val || !val.value || !val?.value?.toString().trim().length) {\n setErrorMessage(() => t(`Tag can not be empty.`));\n return false;\n }\n if (val.value.length > TAG_LIMIT) {\n setErrorMessage(() =>\n t('Tag cannot contain more than {{count}} characters', {\n count: TAG_LIMIT,\n })\n );\n return false;\n }\n /*****/\n const exists = displayValues.some((tag: any) => tag.label == val.value);\n if (exists) {\n setErrorMessage(() => t('Tag already exists.'));\n return false;\n }\n setErrorMessage('');\n setDisplayValues(sortTags([...displayValues, val]));\n setTags(sortTags(tags.filter((t: Tag) => t.value !== val.value)));\n };\n const DropdownIndicator = (props: any) => {\n return (\n components.DropdownIndicator && (\n <components.DropdownIndicator {...props}>\n <MdSearch />\n </components.DropdownIndicator>\n )\n );\n };\n\n const Option = (props: any) => {\n return props.data.__isNew__ ? (\n <components.Option {...props}>\n <MdAdd className={'add-icon'} color={colors.primary[100]} />\n {props.label}\n </components.Option>\n ) : (\n <components.Option {...props}>\n <FaHashtag\n color={colors.primary[60]}\n className='hashtag-icon'\n size={'14px'}\n />\n {props.label}\n </components.Option>\n );\n };\n const checkIfButtonIsDisabled = () => {\n try {\n return JSON.stringify(videoTags) === JSON.stringify(displayValues);\n } catch (ex) {\n return false;\n }\n };\n\n return (\n <Modal disableFullScreen={true} style={{ position: 'fixed', zIndex: 999 }}>\n <ModalItem>\n <Header>\n <Title>{t('Manage Tags')}</Title>\n <CloseButtonWrapper>\n <CloseIcon\n width={'24px'}\n height={'24px'}\n onClick={handleModalClose}\n />\n </CloseButtonWrapper>\n </Header>\n <Section>\n <SelectInput\n defaultValue={inputValue}\n onInputChange={onInputChange}\n customComponents={{\n IndicatorSeparator: () => null,\n DropdownIndicator: DropdownIndicator,\n Option: Option,\n }}\n placeholder={t('Add tag(s)...')}\n value={[]}\n createOptionPosition={'first'}\n onChange={onChange}\n options={tags}\n isMulti={true}\n />\n {errorMessage != null && (\n <span className='error-message'>{errorMessage}</span>\n )}\n\n <TagsContainer>\n {displayValues &&\n displayValues.map((tag: Tag) => (\n <VideoTag\n key={tag.value}\n tag={tag}\n showRemove={true}\n onRemove={removeTag}\n />\n ))}\n </TagsContainer>\n\n <Footer>\n <Button\n onClick={() => onSubmit(displayValues)}\n text={buttonTitle}\n type='submit'\n disabled={checkIfButtonIsDisabled()}\n />\n </Footer>\n </Section>\n </ModalItem>\n </Modal>\n );\n};\n","import { useState } from 'react';\n\nimport { useHistory } from 'react-router';\n\nimport { Button } from 'react-covideo-common';\nimport { useFormikContext } from 'formik';\nimport { Gap, Stack } from 'lib/components/styles/layout';\nimport { DetailsPreviewRecordFormValues, VideoTagOption } from '../types';\nimport { MdDeleteForever } from 'react-icons/md';\nimport { FaHashtag } from 'react-icons/fa';\nimport { VideoTag } from '../../VideoTag';\nimport { ModalVideoTags } from '../../ModalVideoTags';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\nexport const DetailsRecordPreviewTags = () => {\n const { t } = useTranslation();\n const { isCdkEnviroment } = useTheme();\n const history = useHistory();\n const { values, setFieldValue } =\n useFormikContext<DetailsPreviewRecordFormValues>();\n const [showModal, setShowModal] = useState(false);\n\n const openModal = () => {\n setShowModal(true);\n };\n\n const closeModal = () => {\n setShowModal(false);\n };\n\n const onSave = (values: VideoTagOption[]) => {\n setFieldValue('videoTags', values);\n closeModal();\n };\n\n return (\n <Stack alignItems='flex-start' width='100%' m='32px 0 32px 0'>\n <Gap width='100%' justifyContent='space-between'>\n <Button\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n icon={<MdDeleteForever size={18} />}\n text={t('Remove this video')}\n onClick={() => {\n history.push('/record/home');\n }}\n />\n <Button\n variant='secondary'\n icon={<FaHashtag size={'16px'} />}\n text={t('Add Tags...')}\n onClick={openModal}\n />\n </Gap>\n {!!values?.videoTags?.length && (\n <Gap gap='4px' m='4px 0 0 0'>\n {values?.videoTags?.map(tag => (\n <VideoTag key={tag.value} tag={tag} />\n ))}\n </Gap>\n )}\n {showModal && (\n <ModalVideoTags\n videoTags={values?.videoTags}\n handleModalClose={closeModal}\n onSubmit={onSave}\n buttonTitle={t('Save Changes')}\n />\n )}\n </Stack>\n );\n};\n","import React from 'react';\nimport { useField } from 'formik';\nimport styled from 'styled-components';\n\nimport { FormikErrorMessage } from './FormikErrorMessage';\nimport { FormikLabel } from './FormikLabel';\nimport { theme } from 'lib/style';\n\nconst Textarea = styled.textarea`\n width: 100%;\n height: 100px;\n padding: 8px 12px;\n min-height: 100px;\n max-height: 300px;\n border-radius: 4px;\n box-sizing: border-box;\n border: solid 1px #d0d3d9;\n &:focus {\n outline: none;\n border: solid 1px ${({ theme }) => theme.colors.primary[100]};\n }\n`;\n\ninterface CustomTextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n name: string;\n label: string;\n isRequired: boolean;\n}\n\nexport const FormikTextAreaField = ({\n label,\n isRequired,\n ...props\n}: CustomTextareaProps) => {\n const [field, meta] = useField(props);\n return (\n <div style={{ width: '100%' }}>\n <FormikLabel label={label} name={props.name} isRequired={isRequired} />\n <Textarea {...field} {...props} id={props.name} />\n <FormikErrorMessage meta={meta} />\n </div>\n );\n};\n","import { useField } from 'formik';\nimport { Dropdown } from '../NewDropdown';\nimport { FormikErrorMessage } from './FormikErrorMessage';\nimport { FormikLabel } from './FormikLabel';\n\ninterface CustomDropdownProps {\n name: string;\n label: string;\n isRequired: boolean;\n options: { value: string; label: string }[];\n disabled: boolean;\n}\n\nexport const FormikDropdownField = ({\n label,\n isRequired,\n options,\n disabled,\n ...props\n}: CustomDropdownProps) => {\n const [field, meta, helpers] = useField(props);\n\n const handleChange = (option: any) => {\n helpers.setValue(option ? option.value : '');\n };\n\n return (\n <div style={{ width: '100%' }}>\n <FormikLabel label={label} isRequired={isRequired} />\n <Dropdown\n disabled={disabled}\n value={options.find(option => option.value === field.value) as any}\n onChange={handleChange}\n placeholder={'Select...'}\n onMenuOpen={() => helpers.setTouched(true)}\n options={options}\n menuPortalTarget={document.body}\n creatable={false}\n isSearchable={false}\n />\n <FormikErrorMessage meta={meta} />\n </div>\n );\n};\n","import React from 'react';\nimport { FieldArray, useFormikContext } from 'formik';\n\nimport { DetailsPreviewRecordFormValues } from '../types';\nimport { FormikInputField } from 'lib/components/formik/FormikInputField';\nimport { FormikTextAreaField } from 'lib/components/formik/FormikTextAreaField';\nimport { Stack } from 'lib/components/styles/layout';\nimport { FormikDropdownField } from 'lib/components/formik/FormikDropdown';\n\nenum ATTRIBUTES_TYPES {\n TEXT = 'text',\n TEXTAREA = 'textarea',\n DROPDOWN = 'dropdown',\n}\n\nexport const DetailsPreviewVideoAttributes = () => {\n const { values } = useFormikContext<DetailsPreviewRecordFormValues>();\n\n if (!values?.attributes?.length) {\n return null;\n }\n\n return (\n <Stack width='100%' alignItems='flex-start'>\n <FieldArray name='attributes'>\n {() => {\n return (\n <>\n {values?.attributes?.map((attribute, index: number) => {\n const isRequired = !!attribute.isRequired;\n const isDisabled =\n !!attribute.isReadOnly || !!attribute.isLocked;\n\n return (\n <React.Fragment key={index}>\n {attribute.type === ATTRIBUTES_TYPES.TEXT && (\n <FormikInputField\n name={`attributes.${index}.value`}\n label={attribute.slug}\n disabled={isDisabled}\n isRequired={isRequired}\n />\n )}\n\n {attribute.type === ATTRIBUTES_TYPES.TEXTAREA && (\n <FormikTextAreaField\n name={`attributes.${index}.value`}\n label={attribute.slug}\n disabled={isDisabled}\n isRequired={isRequired}\n />\n )}\n {attribute.type === ATTRIBUTES_TYPES.DROPDOWN && (\n <FormikDropdownField\n name={`attributes.${index}.value`}\n label={attribute.slug}\n disabled={isDisabled}\n isRequired={isRequired}\n options={\n attribute?.dropdownValues.map(a => ({\n value: a.value,\n label: a.value,\n })) || []\n }\n />\n )}\n </React.Fragment>\n );\n })}\n </>\n );\n }}\n </FieldArray>\n </Stack>\n );\n};\n","import { InventoryItem } from \"lib/context\";\n\ntype VideoAttribute = {\n value: any;\n attributeId: number;\n customerId: number;\n departments: string[];\n default?: string;\n dropdownValues: Array<any>; // revisit\n index: number;\n isLocked: number;\n isReadOnly: number;\n isRequired: number;\n slug: string;\n title: string;\n type: string; // text | dropdown\n};\n\nexport interface DetailsRecordingPreviewProps {\n videoBlob: Blob;\n handleGoToRecordHome: () => void;\n}\nexport type FolderOption = {\n value: string | number;\n label: string | number;\n isFolderShared?: boolean | undefined;\n access?: string | boolean | undefined;\n};\n\nexport type VideoTagOption = {\n value: number;\n label: string;\n __isNew__?: boolean;\n};\n\nexport interface DetailsPreviewRecordFormValues {\n title: string;\n folder: FolderOption;\n videoTags: VideoTagOption[];\n attributes: VideoAttribute[];\n videoRequest?: {\n customerName: string;\n videoType: string;\n vehicle: Partial<InventoryItem>;\n advisorId: string;\n repairOrderNumber: string;\n note: string;\n };\n}\n\nexport enum AutomotiveRole {\n NO_ROLE = '0',\n TECHNICIAN = '1',\n SERVICE_ADVISOR = '2',\n SERVICE_MANAGER = '3',\n SALESPERSON = '4',\n SALES_MANAGER = '5',\n BDC = '6',\n}\n\nexport const automotiveRoleOptions = [\n { value: '', label: 'No role' },\n { value: '4', label: 'Salesperson' },\n { value: '5', label: 'Sales Manager' },\n { value: '3', label: 'Service Manager' },\n { value: '2', label: 'Service Advisor' },\n { value: '1', label: 'Technician' },\n { value: '6', label: 'BDC' },\n];\n","import styled from 'styled-components';\nimport { InventoryItem, useAuthorizationContext } from 'lib/context';\nimport { VideoType, VideoTypeSales } from 'lib/const/VideoType';\nimport { useFormikContext } from 'formik';\nimport { UseQueryResult } from 'react-query';\nimport { AutomotiveRole, DetailsPreviewRecordFormValues } from '../types';\nimport { FormikInputField } from 'lib/components/formik/FormikInputField';\nimport { FormikLabel } from 'lib/components/formik/FormikLabel';\nimport { FormikTextAreaField } from 'lib/components/formik/FormikTextAreaField';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { FormikDropdownField } from 'lib/components/formik/FormikDropdown';\nimport { VehicleSearch } from '../../../../pages/insertVideo/components';\nimport { useTranslation } from 'react-i18next';\n\nconst Wrapper = styled.div`\n margin-top: 24px;\n`;\ninterface UsersByAutmotiveRolesResponse {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n}\n\ninterface IVideoRequestDetailsProps {\n fetchSoldVehiclesForAutomotive?: boolean;\n results: UseQueryResult<UsersByAutmotiveRolesResponse[], unknown>[];\n}\n\nexport const VideoRequestDetails = ({\n fetchSoldVehiclesForAutomotive = true,\n results,\n}: IVideoRequestDetailsProps) => {\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n\n const { setFieldValue, values } =\n useFormikContext<DetailsPreviewRecordFormValues>();\n\n const showVideoRequestFields = checkIfAutomotive(userData);\n const isAutomotiveService = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSales = checkIfAutomotiveSalesRole(userData);\n const isTechnician = userData.automotiveRole === AutomotiveRole.TECHNICIAN;\n\n const getvideoTypeOptions = () =>\n Object.values(isAutomotiveSales ? VideoTypeSales : VideoType)\n .filter(Boolean)\n .map(videoType => ({\n value: videoType,\n label: t(videoType),\n }));\n\n const videoTypeOptions = getvideoTypeOptions();\n\n const advisorOptions = results.flatMap(result => {\n if (result.data) {\n return result.data.map(assignee => ({\n label: `${assignee.firstName} ${assignee.lastName}`,\n value: `${assignee.id}`,\n }));\n }\n return [];\n });\n\n if (!showVideoRequestFields) {\n return <></>;\n }\n\n return (\n <Wrapper>\n <FormikDropdownField\n name={`videoRequest.videoType`}\n label={t('Video Type')}\n disabled={false}\n isRequired={false}\n options={videoTypeOptions}\n />\n\n {isAutomotiveSales && (\n <>\n <div style={{ marginBottom: 16 }}>\n <FormikLabel label={t('Search vehicle')} isRequired={false} />\n <VehicleSearch\n onChangeVehicle={(item: InventoryItem) => {\n setFieldValue('videoRequest.vehicle', item);\n }}\n selectedVin={values.videoRequest?.vehicle?.vin || ''}\n placeholder={t('Search vehicle by name, VIN or stock number...')}\n fetchSold={fetchSoldVehiclesForAutomotive}\n />\n </div>\n\n <FormikInputField\n name={`videoRequest.vehicle.vin`}\n label={t('VIN')}\n isRequired={false}\n disabled={true}\n />\n <FormikInputField\n name={`videoRequest.vehicle.stockNumber`}\n label={t('Stock number')}\n isRequired={false}\n disabled={true}\n />\n </>\n )}\n {isAutomotiveService && (\n <FormikDropdownField\n name={`videoRequest.advisorId`}\n label={t('Assign To')}\n disabled={false}\n isRequired={isTechnician}\n options={advisorOptions}\n />\n )}\n {isAutomotiveService && (\n <FormikInputField\n name='videoRequest.repairOrderNumber'\n label={t('RO Number')}\n isRequired={isTechnician}\n />\n )}\n <FormikInputField\n name='videoRequest.customerName'\n label={t('Customer Name')}\n isRequired={false}\n />\n {isAutomotiveService && (\n <FormikTextAreaField\n name='videoRequest.note'\n label={t('Note')}\n isRequired={false}\n />\n )}\n </Wrapper>\n );\n};\n","import { useFormikContext } from 'formik';\nimport { Gap } from 'lib/components/styles/layout';\nimport { SubHeading, ParagraphSmall } from 'lib/components/styles/typography';\nimport { useAuthorizationContext } from 'lib/context';\nimport { checkIfVideoRequestFieldsRequired } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useTheme } from 'styled-components';\nimport { DetailsPreviewRecordFormValues } from '../types';\nimport { useTranslation } from 'react-i18next';\n\nexport const DetailsPreviewAttributesHeader = () => {\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n const { colors } = useTheme();\n const { values } = useFormikContext<DetailsPreviewRecordFormValues>();\n\n const videoRequestFieldsRequired =\n checkIfVideoRequestFieldsRequired(userData);\n\n const getRequiredAttributesCount = () => {\n let count = 0;\n values?.attributes?.forEach(attribute => {\n if (attribute && attribute.isRequired) {\n count++;\n }\n });\n\n if (videoRequestFieldsRequired)\n // two fields from video req Details are req\n count += 2;\n\n return count;\n };\n\n const totalRequiredAttributes = getRequiredAttributesCount();\n return (\n <Gap justifyContent='space-between' m='0 0 16px 0'>\n <SubHeading>{t('Video Attributes')}</SubHeading>\n <ParagraphSmall color={colors.primary[100]}>\n {totalRequiredAttributes} {t('required')}\n </ParagraphSmall>\n </Gap>\n );\n};\n","export const automotiveUsersKeys = {\n user: () => ['USER_AUTOMOTIVE'] as const,\n customer_user: (customerId: string, role: string) =>\n ['USER_AUTOMOTIVE', customerId, role] as const,\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQueries, UseQueryResult } from 'react-query';\nimport { automotiveUsersKeys } from './queryKeys';\n\nexport const getUsersByAutomotiveRoles = async ({\n customerId,\n role,\n}: {\n customerId: string;\n role: string;\n}) => {\n const response = await EXPRESS_API.get(\n `/users/${customerId}/automotive-users`,\n {\n params: { role },\n }\n );\n return response.data;\n};\n\ninterface IGetUsersByAutomotiveRoleParams {\n customerId: string;\n role: string;\n}\n\nexport interface UsersByAutmotiveRolesResponse {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n}\n\nexport const useGetUsersByAutomotiveRolesQuery = ({\n params,\n enabled,\n}: {\n params: IGetUsersByAutomotiveRoleParams[];\n enabled: boolean;\n}) => {\n const queries = params.map(({ customerId, role }) => ({\n queryKey: automotiveUsersKeys.customer_user(customerId, role),\n queryFn: () => getUsersByAutomotiveRoles({ customerId, role }),\n enabled: enabled,\n }));\n\n const results: UseQueryResult<UsersByAutmotiveRolesResponse[], unknown>[] =\n useQueries(queries);\n\n const isLoading = results.some(query => query.isLoading);\n const isError = results.some(query => query.isError);\n return { results, isLoading, isError };\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\n\nexport interface PresignedUrl {\n url: string;\n id?: number;\n}\n\nexport interface PresignedUrlParams {\n fileName: string;\n type: string;\n id?: number;\n}\n\nexport const getAwsSignedUrl = async (\n data: PresignedUrlParams\n): Promise<PresignedUrl> => {\n const { fileName, type } = data;\n const response = await EXPRESS_API.get(`/aws/signedurl`, {\n params: { filename: fileName, filetype: type },\n });\n return response.data;\n};\n\nexport const useAwsSignedUrlQuery = (\n params: PresignedUrlParams,\n enabled: boolean\n) => {\n return useQuery(\n ['AWS_SIGNED_URL', params.fileName],\n () => getAwsSignedUrl(params),\n {\n enabled,\n refetchOnMount: true,\n refetchOnReconnect: true,\n cacheTime: 5000,\n }\n );\n};\n","import { useMutation } from 'react-query';\nimport axios, { AxiosProgressEvent } from 'axios';\nimport { useState } from 'react';\nimport { useToastNotifications } from 'lib/components';\n\nexport interface UploadData {\n url: string;\n file: File;\n contentType?: string;\n id?: number;\n}\n\ninterface IProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\nconst S3UploadService = async (\n data: UploadData,\n onProgress?: (progress: IProgress) => void\n): Promise<any> => {\n const { url, file, contentType } = data;\n const isFirefox = navigator?.userAgent?.indexOf('Firefox') !== -1;\n\n const config = {\n onUploadProgress: (progressEvent: AxiosProgressEvent) => {\n if (onProgress) {\n const loaded = progressEvent.loaded;\n const total = progressEvent.total ?? 0;\n const percentCompleted = Math.round((loaded * 100) / total);\n onProgress({\n loaded: Math.floor(loaded / 1024),\n total: Math.floor(total / 1024),\n percentage: percentCompleted,\n });\n }\n },\n };\n\n const response = await axios.put(url, file, {\n headers: {\n 'content-type': !isFirefox && contentType ? contentType : file.type,\n },\n ...config,\n });\n\n return response;\n};\n\nexport const useS3UploadMutation = () => {\n const [uploadToS3Progress, setUploadToS3Progress] = useState({\n loaded: 0,\n total: 0,\n percentage: 0,\n });\n const { toast } = useToastNotifications();\n return {\n ...useMutation(\n (data: UploadData) => S3UploadService(data, setUploadToS3Progress),\n {\n onError: err => toast({ message: err }),\n }\n ),\n progress: uploadToS3Progress,\n };\n};\n","import { useToastNotifications } from 'lib/components';\nimport { EXPRESS_API } from 'lib/config';\nimport { AxiosProgressEvent } from 'axios';\nimport { InventoryItem } from 'lib/context';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useMutation } from 'react-query';\n\ninterface CreateVideoDataTags {\n value: string | number;\n label: string;\n __isNew__?: boolean;\n}\n\ninterface CreateVideoAttributes {\n value: string;\n attributeId: number;\n}\n\ninterface CreateVideoRequestRequest {\n advisorId?: number;\n videoType?: string;\n repairOrderNumber?: string;\n vin?: string;\n note?: string;\n customerName?: string;\n}\n\ninterface VideoData {\n title: string;\n filename: string;\n id?: number | string;\n isFreemium?: boolean;\n isGuide?: boolean;\n folder?: string | number;\n videoTags?: CreateVideoDataTags[];\n videoAttributeValues?: CreateVideoAttributes[];\n videoRequest?: CreateVideoRequestRequest;\n}\n\nexport interface CreateVideoResponse {\n title: string;\n flvName: string;\n userId: number;\n customerId: number;\n totalViews: number;\n folderName: string;\n processing: number;\n recordDate: string;\n recordDateUnix: number;\n serverID: number;\n animatedGifPath: string;\n templateText: string;\n forwardCount: number;\n androidLocation: string;\n notes: string;\n securityCode: string;\n sendReply: number;\n resellerId: number;\n recorderId: number;\n isGuide: number;\n apiProviderId: null;\n deletedAt: null;\n createdAt: Date;\n updatedAt: Date;\n id: number;\n merged: number;\n duplicated: number;\n isVoiceover: number;\n videoReplyEnabled: number;\n videoLength: number;\n videoRequest: VideoRequest;\n}\n\ninterface VideoRequest {\n videoId: number;\n advisorId: number;\n userId: number;\n customerId: number;\n customerName: string;\n status: string;\n videoType: string;\n automotiveDepartment: number;\n emailStatus: string;\n deletedAt: null;\n videoRequestId: number;\n createdAt: Date;\n advisor: Advisor;\n vin?: string;\n inventoryItem?: InventoryItem;\n}\n\ninterface Advisor {\n id: number;\n firstName: string;\n lastName: string;\n email: string;\n phone: string;\n phone2: string;\n website: string;\n title: string;\n}\n\ninterface IProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\nconst createVideo = async (\n props: VideoData,\n onProgress?: (progress: IProgress) => void\n): Promise<CreateVideoResponse> => {\n const {\n title,\n filename,\n isFreemium,\n isGuide,\n folder,\n id,\n videoAttributeValues,\n videoRequest,\n videoTags,\n } = props;\n\n const config = {\n onUploadProgress: (progressEvent: AxiosProgressEvent) => {\n if (onProgress) {\n const loaded = progressEvent.loaded;\n const total = progressEvent.total ?? 0;\n const percentCompleted = Math.round((loaded * 100) / total);\n onProgress({\n loaded: Math.floor(loaded / 1024),\n total: Math.floor(total / 1024),\n percentage: percentCompleted,\n });\n }\n },\n };\n\n const response = await EXPRESS_API.post(\n `/videos`,\n {\n filename,\n title,\n isFreemium,\n isGuide: !!isGuide,\n folder: folder || 'Primary',\n videoAttributeValues,\n videoRequest,\n videoTags,\n },\n config\n );\n\n return {\n ...response.data,\n ...(id !== undefined ? { id: id, videoId: response.data.id } : {}),\n };\n};\n\nexport const useCreateVideoMutation = () => {\n const [createProgress, setCreateProgress] = useState({\n loaded: 0,\n total: 0,\n percentage: 0,\n });\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n return {\n ...useMutation((data: VideoData) => createVideo(data, setCreateProgress), {\n onSuccess: () => {\n toast({ message: t('Video successfully created!') });\n },\n onError: () => {\n toast({\n message: t('Failed to create video. Please try again later.'),\n });\n },\n }),\n progress: createProgress,\n };\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { AxiosProgressEvent } from 'axios';\nimport { useState } from 'react';\nimport { useMutation } from 'react-query';\n\ninterface EncodeData {\n videoId: string;\n customerId: string;\n}\n\ninterface EncodeVideoResponse {\n success: boolean;\n job_id: number;\n}\ninterface IProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\nconst encodeVideo = async (\n data: EncodeData,\n onProgress?: (progress: IProgress) => void\n): Promise<EncodeVideoResponse> => {\n const { videoId } = data;\n const config = {\n onUploadProgress: (progressEvent: AxiosProgressEvent) => {\n if (onProgress) {\n const loaded = progressEvent.loaded;\n const total = progressEvent.total ?? 0;\n const percentCompleted = Math.round((loaded * 100) / total);\n onProgress({\n loaded: Math.floor(loaded / 1024),\n total: Math.floor(total / 1024),\n percentage: percentCompleted,\n });\n }\n },\n };\n\n const response = await EXPRESS_API.post(\n `/videos/${videoId}/encode`,\n {},\n config\n );\n return response.data;\n};\n\nexport const useEncodeVideoMutation = () => {\n const [encodeProggress, setEncodeProggress] = useState({\n loaded: 0,\n total: 0,\n percentage: 0,\n });\n\n return {\n ...useMutation((data: EncodeData) => encodeVideo(data, setEncodeProggress)),\n progress: encodeProggress,\n };\n};\n","import { useAwsSignedUrlQuery } from 'lib/api/aws/useAwsSignedUrlQuery';\nimport { useS3UploadMutation } from 'lib/api/aws/useS3UploadMutation';\nimport { useCreateVideoMutation } from 'lib/api/videos/useCreateVideoMutation';\nimport { useEncodeVideoMutation } from 'lib/api/videos/useEncodeVideoMutation';\nimport { useAuthorizationContext } from 'lib/context';\nimport { CONTENT_TYPE } from 'lib/hooks/useMediaRecorder';\nimport { checkIfAutomotive } from 'lib/utils/automotiveRolePermissionChecks';\nimport { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router';\nimport { DetailsPreviewRecordFormValues } from './detailsPreview/types';\nimport { RECORD_LOADER_STATUS } from './types';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport {\n getChangedFields,\n getVideoDurationMs,\n} from 'lib/hooks/GTM/actions/video/utils';\nimport { GTMSaveNewVideoInteractionTypes } from 'lib/hooks/GTM/actions/video';\nimport { CovideoGTMVehicleItem } from 'lib/hooks/GTM/types';\n\ninterface IUseRecordUploadFormDataProps extends DetailsPreviewRecordFormValues {\n file: File;\n}\n\nconst removeEmptyValues = (\n obj: { [s: string]: unknown } | ArrayLike<unknown>\n) => {\n return Object.fromEntries(\n Object.entries(obj).filter(([_, v]) => v !== null && v !== '')\n );\n};\n\nexport const useVideoRecordUpload = ({\n contineToInsert,\n}: {\n contineToInsert: boolean;\n}) => {\n const { userData } = useAuthorizationContext();\n const isAutomotive = checkIfAutomotive(userData);\n const history = useHistory();\n const [progressState, setProgressState] = useState(\n RECORD_LOADER_STATUS.UPLOADING\n );\n const [loadingStarted, setLoadingIsStared] = useState(false);\n const [recordingFormData, setRecordingFormData] =\n useState<IUseRecordUploadFormDataProps | null>(null);\n\n const [cdkAmplitudeFields, setCdkAmplitudeFields] = useState<{\n values: DetailsPreviewRecordFormValues;\n initialValues: DetailsPreviewRecordFormValues;\n }>({\n values: {\n title: '',\n folder: { label: '', value: '' },\n videoTags: [],\n attributes: [],\n videoRequest: undefined,\n },\n initialValues: {\n title: '',\n folder: { label: '', value: '' },\n videoTags: [],\n attributes: [],\n videoRequest: undefined,\n },\n });\n\n const { trackGTMSaveNewVideoInteractionEvent } = useGTMAnalytics();\n const {\n data: presignedUrlData,\n isLoading: isLoadingUrl,\n error: urlErrorData,\n } = useAwsSignedUrlQuery(\n {\n fileName: recordingFormData?.file?.name || '',\n type: recordingFormData?.file?.type || '',\n },\n !!recordingFormData?.title\n );\n\n const {\n mutateAsync: uploadVideoToS3,\n isLoading: isUploading,\n error: uploadError,\n progress: uploadToS3Progress,\n } = useS3UploadMutation();\n\n const {\n mutateAsync: createVideo,\n isLoading: isCreating,\n error: createError,\n progress: createProgress,\n } = useCreateVideoMutation();\n\n const {\n mutateAsync: encodeVideo,\n progress: encodeProgress,\n isLoading: isEncoding,\n isError: isErrorEncoding,\n } = useEncodeVideoMutation();\n\n useEffect(() => {\n if (presignedUrlData?.url && recordingFormData) {\n startUpload();\n }\n }, [presignedUrlData, recordingFormData]);\n\n const startUpload = async () => {\n setLoadingIsStared(true);\n try {\n if (presignedUrlData?.url && recordingFormData) {\n // Upload to S3\n setProgressState(RECORD_LOADER_STATUS.UPLOADING);\n await uploadVideoToS3({\n url: presignedUrlData.url,\n file: recordingFormData.file,\n contentType: CONTENT_TYPE,\n });\n\n // Create video\n setProgressState(RECORD_LOADER_STATUS.CREATE);\n const createResponse = await createVideo({\n filename: recordingFormData.file.name,\n title: recordingFormData.title,\n folder: recordingFormData.folder.label,\n isFreemium: false,\n videoTags: recordingFormData.videoTags,\n videoAttributeValues: recordingFormData.attributes.map(attr => ({\n attributeId: attr.attributeId,\n value: attr.value,\n })),\n ...(isAutomotive &&\n recordingFormData.videoRequest && {\n videoRequest: removeEmptyValues({\n repairOrderNumber:\n recordingFormData.videoRequest.repairOrderNumber,\n advisorId: !!recordingFormData.videoRequest.advisorId\n ? Number(recordingFormData.videoRequest.advisorId)\n : '',\n videoType: recordingFormData.videoRequest.videoType,\n vin: recordingFormData.videoRequest.vehicle.vin,\n note: recordingFormData.videoRequest.note,\n customerName: recordingFormData.videoRequest.customerName,\n }),\n }),\n });\n\n // Encode video if creation successful\n if (createResponse) {\n const durationMs = await getVideoDurationMs(recordingFormData.file);\n const { changed_fields, ...fields } = getChangedFields({\n initialValues: cdkAmplitudeFields.initialValues,\n currentValues: cdkAmplitudeFields.values,\n trackedFields: [\n 'title',\n 'folder.label',\n 'videoTags',\n 'videoRequest.customerName',\n ],\n trackedArrayFields: {\n videoTags: ['label'],\n attributes: ['value'],\n },\n });\n\n console.log('changed_fields', changed_fields);\n console.log('fields', fields);\n trackGTMSaveNewVideoInteractionEvent?.({\n type: GTMSaveNewVideoInteractionTypes.RECORD,\n vehicle: recordingFormData?.videoRequest\n ?.vehicle as CovideoGTMVehicleItem,\n videoAttributes: {\n videoId: Number(createResponse.id),\n videoType: recordingFormData.videoRequest?.videoType || undefined,\n videoCustomerName: !!recordingFormData.videoRequest?.customerName,\n videoTitle: recordingFormData.title,\n videoLength: durationMs,\n },\n changedFieldKeys: changed_fields,\n changes: fields,\n });\n setProgressState(RECORD_LOADER_STATUS.ENCODE);\n await encodeVideo({\n videoId: createResponse?.id?.toString(),\n customerId: userData.customerId,\n });\n }\n\n // Final upload completion state\n setProgressState(RECORD_LOADER_STATUS.UPLOAD_COMPLETED);\n if (contineToInsert) {\n history.push(`/insert-video/${createResponse.id}/`);\n return;\n }\n history.push(`/`);\n setLoadingIsStared(false);\n }\n } catch (error) {\n console.error('Error during upload:', error);\n setProgressState(RECORD_LOADER_STATUS.ERROR);\n setLoadingIsStared(false);\n }\n };\n\n const isLoading =\n isLoadingUrl || isUploading || isCreating || isEncoding || loadingStarted;\n const isError = uploadError || createError || urlErrorData || isErrorEncoding;\n\n return {\n isError,\n setRecordingFormData,\n isLoading,\n progressState,\n uploadToS3Progress,\n createProgress,\n encodeProgress,\n setCdkAmplitudeFields,\n };\n};\n","import styled, { useTheme } from 'styled-components';\nimport { Circle } from 'rc-progress';\nimport { useTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\n\nconst CircleText = styled.div`\n display: flex;\n flex-direction: column;\n &:nth-child(2) {\n align-items: center;\n justify-content: space-between;\n }\n &:nth-child(3) {\n align-items: flex-end;\n justify-content: flex-end;\n }\n\n .checkmark {\n border-radius: 20px;\n position: absolute;\n top: 106px;\n z-index: 4;\n color: white;\n }\n .rc-progress-circle {\n background-color: #f6f7f9;\n }\n & > div {\n z-index: 3;\n border-radius: 50px;\n position: absolute;\n top: 105px;\n }\n`;\n\nconst Text = styled.span<{ isInProgressOrDone: boolean }>`\n top: 0px;\n font-size: 16px;\n line-height: 1.5;\n color: ${props => {\n if (!props.isInProgressOrDone) {\n return `rgba(213,214,217,1);`;\n }\n return `${props.theme.colors.primary[100]};`;\n }}\n\n margin-bottom: 8px;\n`;\n\nconst getProgressStatusText = (\n progressType: string,\n percentage: number,\n t: TFunction<'translation', undefined>\n) => {\n switch (progressType) {\n case 'encode':\n if (percentage === 0) return t('Waiting...');\n if (percentage > 1 && percentage < 99) return t('Encoding');\n if (percentage === 100) return t('Encoded');\n break;\n case 'create':\n if (percentage === 0) return t('Waiting...');\n if (percentage > 1 && percentage < 99) return t('Creating');\n if (percentage === 100) return t('Created');\n break;\n case 'upload':\n if (percentage === 0) return t('Waiting...');\n if (percentage > 1 && percentage < 99) return t('Uploading');\n if (percentage === 100) return t('Uploaded');\n break;\n default:\n return '';\n }\n};\n\nexport const ProgressCircle = ({\n progress,\n progressType,\n}: {\n progress: {\n loaded: number;\n total: number;\n percentage: number;\n };\n progressType: string;\n}) => {\n const { t } = useTranslation();\n const themes = useTheme();\n const circleStyle = {\n width: '24px',\n zIndex: 2,\n backgroundColor: 'f6f7f9',\n };\n const { percentage } = progress;\n\n const isInProgressOrDone = percentage > 1 && percentage <= 100;\n\n return (\n <CircleText>\n <Text isInProgressOrDone={isInProgressOrDone}>\n {getProgressStatusText(progressType, percentage, t)}\n </Text>\n\n <Circle\n style={circleStyle}\n percent={percentage}\n trailWidth={10}\n strokeWidth={10}\n strokeColor={themes.colors.primary[100]}\n />\n </CircleText>\n );\n};\n","import styled, { useTheme } from 'styled-components';\nimport { theme } from 'lib/style';\nimport { ProgressCircle } from './ProgressCircle';\nimport { RECORD_LOADER_STATUS } from './types';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\n\nexport const FlexCenter = styled.div`\n margin-top: 16px;\n background-color: #f6f7f9;\n border-radius: 4px;\n padding: 32px;\n height: 168px;\n display: flex;\n justify-content: center;\n flex-direction: column;\n`;\n\nexport const ProgressContainer = styled.div`\n display: flex;\n justify-content: space-between;\n`;\n\nexport const ContentBody = styled.div`\n ${theme.fontNormal400}\n font-size: ${theme.fontSizes.m};\n color: ${theme.palette.blackRgb75};\n margin: 0;\n width: 100%;\n margin-bottom: 32px;\n min-height: 190px;\n position: relative;\n`;\ntype ProgressBarProps = {\n color: string;\n};\nconst ProgressBar = styled.progress<ProgressBarProps>`\n z-index: 1;\n margin-top: -14.5px;\n width: 100%;\n background-color: ${theme.palette.lightgray};\n border: none;\n border-radius: 15px;\n height: 4px;\n &::-webkit-progress-bar {\n margin: 0 auto;\n background-color: ${theme.palette.lightgray};\n border-radius: 15px;\n height: 4px;\n }\n &::-moz-progress-bar {\n margin: 0 auto;\n background-color: ${({ color }) => color};\n border-radius: 15px;\n height: 4px;\n }\n &::-webkit-progress-value {\n float: left;\n height: 4px;\n margin: 0px -10px 0 0;\n background: ${({ color }) => color};\n border-radius: 15px;\n }\n`;\nconst ProgressText = styled.div`\n width: 100%;\n text-align: left;\n margin-bottom: 16px;\n height: 24px;\n font-size: 16px;\n line-height: 1.5;\n color: #4e5461;\n margin-top: 32px;\n`;\n\nconst toMBString = (loaded: number, total: number) => {\n const loadedMB = (loaded / 1000).toFixed(2);\n const totalMB = (total / 1000).toFixed(2);\n return `${loadedMB} MB/${totalMB} MB`;\n};\n\ninterface IProgress {\n loaded: number;\n total: number;\n percentage: number;\n}\n\ninterface IUploadLoaderProps {\n progressState: RECORD_LOADER_STATUS;\n uploadToS3Progress: IProgress;\n createProgress: IProgress;\n encodeProgress: IProgress;\n}\n\nexport const UploadLoader = ({\n progressState,\n uploadToS3Progress,\n createProgress,\n encodeProgress,\n}: IUploadLoaderProps) => {\n const isMobileDevice = checkIfMobileDevice();\n const { colors } = useTheme();\n const getPercentage = () => {\n if (!progressState) {\n return 0;\n }\n if (progressState == RECORD_LOADER_STATUS.UPLOADING) {\n return (uploadToS3Progress.percentage * 50) / 100;\n }\n if (progressState == RECORD_LOADER_STATUS.CREATE) {\n return 50 + (createProgress.percentage || 0);\n }\n return 100;\n };\n\n return (\n <ContentBody>\n <FlexCenter style={{ padding: isMobileDevice ? 0 : 32 }}>\n <ProgressContainer>\n <ProgressCircle progress={uploadToS3Progress} progressType='upload' />\n <ProgressCircle progress={createProgress} progressType='create' />\n <ProgressCircle progress={encodeProgress} progressType='encode' />\n </ProgressContainer>\n <ProgressBar\n value={getPercentage()}\n max={100}\n color={colors.primary[100]}\n />\n <ProgressText>\n {toMBString(uploadToS3Progress.loaded, uploadToS3Progress.total)}\n </ProgressText>\n </FlexCenter>\n </ContentBody>\n );\n};\n","import dayjs from 'dayjs';\nimport { theme } from 'lib/style';\n\nimport { ExtendedFile, statuses } from '../types';\nimport { TFunction } from 'i18next';\nenum PROMPT_USE_CASE {\n INITIAL_REACH_OUT = 'Initial Reach Out',\n INITIAL_INQUIRY_REPLY = 'Initial Inquiry Reply',\n VEHICLE_WALKAROUND = 'Vehicle Walkaround',\n TEST_DRIVE_INVITATION = 'Test Drive Invitation',\n APPOINTMENT_REMINDER = 'Appointment Reminder',\n MISSED_APPOINTMENT = 'Missed Appointment',\n UNSOLD_FOLLOW_UP = 'Unsold Follow Up',\n EVENT_PROMOTION_ALERT = 'Event & Promotion Alert',\n POST_SALE_FOLLOW_UP = 'Post-Sale Follow-Up',\n REVIEW_REFERRAL_REQUEST = 'Review or Referral Request',\n SERVICE_MAINTENANCE_REMINDERS = 'Service and Maintenance Reminders',\n NONE = '',\n}\nexport const decodeAndReplaceText = (\n value: string,\n isReplace: boolean = false\n) => {\n try {\n return !!isReplace\n ? decodeURIComponent(value).replaceAll(' ', ' ')\n : decodeURIComponent(value);\n } catch (error) {\n return value;\n }\n};\n\nexport const getDefaultPromptUseCase = (\n isAutomotive: boolean\n): PROMPT_USE_CASE => {\n return isAutomotive\n ? PROMPT_USE_CASE.INITIAL_REACH_OUT\n : PROMPT_USE_CASE.NONE;\n};\n\nconst sizeToSpeedRatioLarge = (t: TFunction<'translation', undefined>) => [\n {\n value: 4000,\n label: `160 ${t('words / min')}`,\n },\n {\n value: 2000,\n label: `200 ${t('words / min')}`,\n },\n {\n value: 1000,\n label: `240 ${t('words / min')}`,\n },\n];\n\nexport const sizeToSpeedRatioMedium = (\n t: TFunction<'translation', undefined>\n) => [\n {\n value: 6000,\n label: `160 ${t('words / min')}`,\n },\n {\n value: 4000,\n label: `200 ${t('words / min')}`,\n },\n {\n value: 2000,\n label: `240 ${t('words / min')}`,\n },\n];\n\nconst sizeToSpeedRatioSmall = (t: TFunction<'translation', undefined>) => [\n {\n value: 8000,\n label: `160 ${t('words / min')}`,\n },\n {\n value: 6000,\n label: `200 ${t('words / min')}`,\n },\n {\n value: 4000,\n label: `240 ${t('words / min')}`,\n },\n];\n\nexport const handleScriptSpeedUsingScriptSize = (\n ele: any,\n t: TFunction<'translation', undefined>\n) => {\n switch (ele) {\n case 'small':\n return sizeToSpeedRatioSmall(t);\n\n case 'large':\n return sizeToSpeedRatioMedium(t);\n\n case 'x-large':\n return sizeToSpeedRatioLarge(t);\n\n default:\n return sizeToSpeedRatioMedium(t);\n }\n};\n\nexport const formatBytes = (bytes: number, decimals: number = 2) => {\n if (bytes === 0) {\n return '0 Bytes';\n }\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return (\n addThousandCommaSeparator(\n parseFloat((bytes / Math.pow(k, i)).toFixed(dm))\n ) +\n ' ' +\n sizes[i]\n );\n};\n\nexport const addThousandCommaSeparator = (\n n: number,\n roundDecimal: boolean = false\n) => {\n return n.toLocaleString(\n 'en',\n roundDecimal\n ? {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }\n : {}\n );\n};\n\nexport const getStatusText = (status: string) => {\n if (status === statuses.WAITING) {\n return 'Waiting…';\n }\n\n if (status === statuses.UPLOADING) {\n return 'Uploading…';\n }\n\n if (status === statuses.CANCELING) {\n return 'Canceling…';\n }\n\n if (status === statuses.CANCELED) {\n return 'Canceled';\n }\n\n if (status === statuses.GENERATING_PREVIEW) {\n return 'Generating Preview URL...';\n }\n\n return 'Finished';\n};\n\nexport const getStatusColor = (status: string) => {\n if (status === statuses.WAITING) {\n return '#9297A2';\n }\n\n return theme.palette.primaryDarkBlue;\n};\n\nexport const getStatusSize = (file: ExtendedFile) => {\n if (file.status === statuses.UPLOADING) {\n return `${file.currentUpload} / ${file.sizeText}`;\n }\n\n return file.sizeText;\n};\n\nexport const getTitle = () => {\n const dateOfMonth = dayjs(new Date()).date();\n let ordinalLetters = 'th';\n if (dateOfMonth === 1 || dateOfMonth === 21 || dateOfMonth === 31) {\n ordinalLetters = 'st';\n } else if (dateOfMonth === 2 || dateOfMonth === 22) {\n ordinalLetters = 'nd';\n } else if (dateOfMonth === 3 || dateOfMonth === 23) {\n ordinalLetters = 'rd';\n }\n\n return dayjs(new Date()).format(`MMM D[${ordinalLetters}] YYYY @ h:mm A`);\n};\n","export const foldersKeys = {\n all: () => ['FOLDERS'] as const,\n};\n","import { useQuery } from 'react-query';\nimport { foldersKeys } from './foldersKeys';\nimport { EXPRESS_API } from 'lib/config';\nimport { ALL_FOLDERS } from '../videosApi';\n\nexport type Folder = {\n access?: string;\n folderId: number | string;\n name: string;\n isDeletable: boolean;\n userId?: number;\n isFolderShared?: boolean;\n sharedBy?: string;\n includeNewUsers?: boolean;\n folderAccessPermission?: string;\n};\n\nexport type GetFolderParams = {\n getShared: boolean;\n};\n\ntype FolderResponse = {\n folders: Folder[];\n};\n\nconst getFolders = async (\n params?: GetFolderParams\n): Promise<FolderResponse> => {\n return (await EXPRESS_API.get(`folders/new`, { params })).data;\n};\n\nexport const useGetFolders = (params?: GetFolderParams) => {\n return useQuery(foldersKeys.all(), () => getFolders(params), {\n select: (data: FolderResponse) => {\n const folders: Folder[] = (data && data.folders) || [];\n\n return [\n ...folders,\n {\n folderId: ALL_FOLDERS.value,\n name: ALL_FOLDERS.label,\n isDeletable: false,\n },\n ];\n },\n });\n};\n","import styled, { useTheme } from 'styled-components';\nimport Select, { components, ControlProps, OptionProps } from 'react-select';\nimport { theme } from 'lib/style';\n\nimport {\n OptionWrapper,\n DropdownArrowIcon,\n OptionIconWrapper,\n getControlStyles,\n DropdownIndicatorProps,\n getOptionStyles,\n} from 'lib/components/NewDropdown';\nimport {\n MdArrowDropDown,\n MdCreateNewFolder,\n MdFolderShared,\n MdSupervisorAccount,\n} from 'react-icons/md';\nimport { IoMdCheckmark } from 'react-icons/io';\nimport { CommonTypography } from 'lib/components/styles/typography';\nimport { ALL_FOLDERS } from 'lib/api';\n\nexport const FOLDER_GROUP_LABEL = {\n MY_FOLDERS: 'MY FOLDERS',\n SHARED_WITH_ME: 'SHARED WITH ME',\n};\n\ntype Option = {\n value: string | number;\n label: string | number;\n isFolderShared?: boolean;\n access?: boolean | string;\n sharedBy?: string;\n};\n\ntype Icon = 'folder' | 'sharedFolder' | 'accounts' | '';\n\nconst LabelContainer = styled.div`\n display: flex;\n align-items: center;\n padding: 7px 16px 0px 16px;\n gap: 12px;\n`;\n\nconst Label = styled(CommonTypography).attrs({ as: 'p' })`\n font-size: 11px;\n line-height: 16px;\n font-weight: 600;\n color: ${({ theme }) => theme.colors.primary[40]};\n`;\n\nconst Line = styled.div`\n flex: 1;\n width: 100%;\n height: 1px;\n background-color: ${({ theme }) => theme.colors.primary[5]};\n`;\n\nconst OptionChildSubTitle = styled.div`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n align-self: stretch;\n overflow: hidden;\n color: var(--covideo-grey-80, #4e5461);\n text-overflow: ellipsis;\n\n /* Other/Charts Label */\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n line-height: 16px; /* 133.333% */\n`;\n\nconst SharedOptionWrapper = styled.div`\n display: block;\n width: 100%;\n`;\n\ntype Props = {\n value: Option;\n options: Array<Option>;\n onChange: (value: any, actionMeta?: any) => void; // any is used as its type is unknown.\n};\n\nconst OptionChildWrapper = styled.div`\n width: 100%;\n overflow: hidden;\n color: var(--covideo-grey-80, #4e5461);\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\n//generate icon if selected\nconst getIcon = (\n iconName: Icon | undefined,\n isSelected: boolean,\n id: string,\n value: number | string\n) => {\n if (typeof iconName === 'undefined') return null;\n switch (iconName) {\n case 'folder':\n return id.includes('option-0') && value !== ALL_FOLDERS.value ? (\n <div style={{ marginRight: '-6px', marginBottom: '-3px' }}>\n <MdCreateNewFolder size={16} />\n </div>\n ) : (\n isSelected && <IoMdCheckmark size={20} />\n );\n case 'sharedFolder':\n return !isSelected ? (\n <div style={{ marginRight: '-6px', marginBottom: '-3px' }}>\n <MdFolderShared size={16} />\n </div>\n ) : (\n isSelected && <IoMdCheckmark size={20} />\n );\n case 'accounts':\n return !isSelected ? (\n <div style={{ marginRight: '-6px', marginBottom: '-3px' }}>\n <MdSupervisorAccount size={16} />\n </div>\n ) : (\n isSelected && <IoMdCheckmark size={20} />\n );\n default:\n return null;\n }\n};\n\n// show different option UI if icon exist\nconst CustomOption = ({ children, ...props }: OptionProps<Option, false>) => {\n const { selectProps, isSelected, innerProps } = props;\n if (\n children === FOLDER_GROUP_LABEL.MY_FOLDERS ||\n children === FOLDER_GROUP_LABEL.SHARED_WITH_ME\n ) {\n return (\n <LabelContainer>\n <Label>{children}</Label>\n <Line />\n </LabelContainer>\n );\n }\n return (\n <components.Option {...props}>\n <SharedOptionWrapper>\n <OptionWrapper>\n <OptionChildWrapper>{children}</OptionChildWrapper>\n <OptionIconWrapper>\n {getIcon(\n !!props.data.isFolderShared || !!props.data.access\n ? !!props.data.access\n ? 'accounts'\n : 'sharedFolder'\n : (selectProps as any).icon,\n isSelected,\n innerProps.id ?? '',\n props.data.value\n )}\n </OptionIconWrapper>\n </OptionWrapper>\n {!!props.data.sharedBy && (\n <OptionChildSubTitle>\n Shared by {props.data.sharedBy}\n </OptionChildSubTitle>\n )}\n </SharedOptionWrapper>\n </components.Option>\n );\n};\n\nexport const FolderDropdown = (props: Props) => {\n const { options, value, onChange } = props;\n const themes = useTheme();\n\n //common props\n const commonProps = {\n options,\n value,\n onChange,\n };\n\n const DropdownIndicator = (props: DropdownIndicatorProps) => {\n return (\n <DropdownArrowIcon menuIsOpen={props.selectProps.menuIsOpen}>\n <MdArrowDropDown size={18} opacity={0.5} />\n </DropdownArrowIcon>\n );\n };\n\n const CustomSingleValue = (props: any) => {\n return props.children;\n };\n\n //dropdown styles\n const styles = {\n container: (base: any) => {\n return {\n ...base,\n };\n },\n\n control: (base: any, props: ControlProps<Option, false>): any => {\n return {\n ...base,\n boxShadow: 'none',\n borderRadius: 6,\n minHeight: '40px',\n cursor: 'pointer',\n ...getControlStyles(props),\n //@ts-ignore\n '&:hover': {\n borderColor: themes.colors.primary[100],\n },\n '&:focus-within': {\n borderColor: themes.colors.primary[100],\n },\n };\n },\n singleValue: (base: any) => ({\n ...base,\n width: '95%',\n }),\n valueContainer: (base: any) =>\n ({\n ...base,\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n flexWrap: 'nowrap',\n }) as any,\n input: (base: any) => ({\n ...base,\n }),\n menuPortal: (base: any) => ({\n ...base,\n zIndex: 9999,\n }),\n menuList: (base: any) => ({\n ...base,\n height: 'auto',\n }),\n menu: (base: any) => ({\n ...base,\n marginTop: 2,\n color: theme.palette.primaryDarkBlue,\n }),\n option: (base: any, props: OptionProps<Option, false>): any => {\n return {\n ...base,\n height: 40,\n display: 'flex',\n alignItems: 'center',\n padding: '0 16px',\n cursor: 'pointer',\n transition: 'all 0.3s',\n fontWeight: 600,\n fontSize: 15,\n zIndex: 1,\n //@ts-ignore\n ...getOptionStyles(props, themes),\n };\n },\n };\n\n return (\n <Select\n {...commonProps}\n {...({ icon: 'folder', error: false } as any)}\n className='dropdown'\n isDisabled={false}\n aria-label='Aria label is missing'\n menuPosition='absolute'\n menuPlacement='auto'\n maxMenuHeight={220}\n menuShouldScrollIntoView={false}\n menuPortalTarget={null}\n isLoading={false}\n components={{\n DropdownIndicator: DropdownIndicator,\n IndicatorSeparator: () => null,\n Option: CustomOption,\n SingleValue: CustomSingleValue,\n }}\n styles={styles}\n isSearchable={true}\n />\n );\n};\n","import { UserData } from 'lib/context';\n\ntype ProductFeatureType = { [key: string]: number };\n\nexport const productFeature: ProductFeatureType = {\n FILES_AND_BOARDS: 1,\n WEB_RECORDER: 2,\n CHROME_EXTENSION: 3,\n MOBILE_APPS: 4,\n OUTLOOK_LEGACY: 5,\n OUTLOOK_365_INTEGRATION: 6,\n SALESFORCE_INTEGRATION_BASIC: 7,\n SALESFORCE_INTEGRATION_NATIVE: 8,\n ZOOM_INTEGRATION: 9,\n VIRTUAL_BACKGROUNDS: 10,\n FOLDER_ORGANIZATION: 11,\n SHARED_FOLDER: 12,\n VIDEO_EDITING: 13,\n VIDEO_MERGE: 14,\n CUSTOM_THUMBNAILS: 15,\n GIF_THUMBNAILS: 16,\n ANNOTATIONS: 17,\n CAPTIONS: 18,\n LINK_SHARING: 19,\n CRM_AND_SOCIAL_SHARING: 20,\n VIDEO_EMBEDS: 21,\n WEBSITE_OVERLAY: 22,\n BUILT_IN_SMS: 23,\n SMS_ADMIN_CONTROLS: 24,\n NATIVE_SOCIAL_VIDEOS: 25,\n VIDEO_EXPIRATION: 26,\n VIDEO_REPLY: 27,\n LANDING_PAGE_BUILDER: 28,\n CTAS: 29,\n CUSTOM_BRANDING: 30,\n VIEW_NOTIFICATIONS: 31,\n HOTSPOTS_AND_ANALYTICS: 32,\n REPORTS: 33,\n VIDEO_PLAYER_APPEARANCE: 34,\n VIDEO_ANALYTICS_REPORTS: 35,\n PASSWORD_PROTECTION: 36,\n GMAIL_INTEGRATION: 37,\n USER_ROLES_AND_MANAGEMENT: 38,\n MANAGE_USERS_AS_TEAMS: 39,\n SSO: 40,\n SCIM_PROVISIONING: 41,\n SOC_2: 42,\n PLAYBACK_DOMAIN: 43,\n WTV: 44,\n REPAIR_ORDER_APPROVAL: 45,\n INVENTORY: 46,\n VIDEO_ATTRIBUTES: 47,\n NOTIFICATION_CENTER: 48,\n VIDEO_TAGS: 49,\n TELEPROMPTER: 50,\n ELEMENT451_INTEGRATION: 51,\n ELEAD_INTEGRATION: 52,\n CHAT_SUPPORT: 53,\n LINKEDIN: 54,\n HUBSPOT: 55,\n VINSOLUTIONS: 58,\n IPACKET: 59,\n AFFILIATE: 60,\n CODIRECT: 61,\n FACEBOOK: 62,\n YOUTUBE: 63,\n DEALERSOCKET_INTEGRATION: 64,\n CHAPTERS: 65,\n CONVERSATIONS: 66,\n VIDEO_VOICEOVER: 67,\n QR_CODE: 68,\n SECURITY: 69,\n REACTIONS_AND_COMMENTS: 70,\n SCHEDULES: 71,\n TEMPLATES: 72,\n INTERACTIVE_CTAS: 73,\n FOLDER_SHARING: 74,\n LIVE_VIDEO: 75,\n};\n\nexport const checkIfFeatureIsEnabled = (\n userData: UserData,\n featureId: string | number\n): boolean => {\n if (!featureId) {\n return false;\n }\n\n if (userData && userData.user && userData.user.packageDetails) {\n // legacy user has access to all features\n if (userData.user.packageDetails.id === 0) {\n return true;\n }\n\n if (\n !userData.user.packageDetails.products ||\n !userData.user.packageDetails.products.length\n ) {\n return false;\n }\n\n return userData.user.packageDetails.products.includes(featureId);\n }\n\n return false;\n};\n","import { useGetFolders } from 'lib/api/folders/getFolders';\nimport React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\n\nimport { useAuthorizationContext } from 'lib/context';\nimport { FolderDropdown } from './FolderDropdown';\nimport { ALL_FOLDERS } from 'lib/api';\nimport {\n checkIfFeatureIsEnabled,\n productFeature,\n} from 'lib/utils/productFeature';\nimport { useTranslation } from 'react-i18next';\n\nexport type Option = {\n value: string | number;\n label: string | number;\n isFolderShared?: boolean;\n access?: boolean | string;\n};\n\nexport const FOLDER_GROUP_LABEL = {\n MY_FOLDERS: 'MY FOLDERS',\n SHARED_WITH_ME: 'SHARED WITH ME',\n};\n\nexport const FOLDER_GROUP_VALUE = {\n MY_FOLDERS: 'my_folders',\n SHARED_WITH_ME: 'shared_with_me',\n};\n\ninterface Props {\n value: Option;\n setValue: React.Dispatch<React.SetStateAction<Option>> | undefined;\n showSharedWithMeFolders?: boolean;\n showAllFolderOption?: boolean;\n showLabel?: boolean;\n width?: string;\n}\n\nconst DropdownWrapper = styled.div<{ width: string }>`\n width: ${({ width }) => width};\n margin-top: 12px;\n margin-bottom: 12px;\n justify-content: center;\n`;\n\nconst Label = styled.div`\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n color: ${theme.palette.midGrey};\n margin-bottom: 8px;\n`;\n\nconst VideoUploadFolderDropdown = ({\n value,\n setValue,\n showSharedWithMeFolders = true,\n showLabel = true,\n width = '100%',\n showAllFolderOption = true,\n}: Props) => {\n const { t } = useTranslation();\n const { userData } = useAuthorizationContext();\n const { data: folders = [], refetch: getLatestFolders } = useGetFolders({\n getShared: true,\n });\n const isFolderOrganizationEnabled = checkIfFeatureIsEnabled(\n userData,\n productFeature.FOLDER_ORGANIZATION\n );\n\n useEffect(() => {\n getLatestFolders();\n }, []);\n\n let folderOptions: {\n value: number | string;\n label: string;\n isFolderShared?: boolean;\n access: boolean;\n }[] = [];\n\n if (isFolderOrganizationEnabled) {\n let ownedFolders =\n folders\n ?.filter(\n folder =>\n !!!folder.hasOwnProperty('access') &&\n folder.folderId !== ALL_FOLDERS.value\n )\n .map(folder => ({\n value: folder.folderId,\n label: folder.name,\n isFolderShared: !!folder.isFolderShared,\n access: !!folder.hasOwnProperty('access'),\n })) || [];\n let sharedFolders =\n folders\n ?.filter(\n folder =>\n !!folder.hasOwnProperty('access') && folder.access === 'edit'\n )\n .map(folder => ({\n value: folder.folderId,\n label: folder.name,\n isFolderShared: !!folder.isFolderShared,\n access: !!folder.hasOwnProperty('access'),\n sharedBy: folder.sharedBy,\n })) || [];\n if (showAllFolderOption) {\n folderOptions = [\n {\n value: ALL_FOLDERS.value,\n label: ALL_FOLDERS.label,\n isFolderShared: false,\n access: false,\n },\n ];\n }\n folderOptions = folderOptions.concat([\n {\n value: FOLDER_GROUP_VALUE.MY_FOLDERS,\n label: FOLDER_GROUP_LABEL.MY_FOLDERS,\n isFolderShared: false,\n access: false,\n },\n ]);\n\n if (ownedFolders.length) {\n folderOptions = folderOptions.concat(ownedFolders);\n }\n if (showSharedWithMeFolders) {\n if (sharedFolders.length) {\n folderOptions = folderOptions.concat(\n [\n {\n value: FOLDER_GROUP_VALUE.SHARED_WITH_ME,\n label: FOLDER_GROUP_LABEL.SHARED_WITH_ME,\n isFolderShared: false,\n access: false,\n },\n ],\n sharedFolders\n );\n }\n }\n }\n\n useEffect(() => {\n if (folders && !!folders.length && setValue) {\n setValue({\n value: folders[0].folderId.toString(),\n label: folders[0].name,\n });\n }\n }, [folders]);\n\n return (\n <DropdownWrapper width={width}>\n {showLabel && <Label>{t('Select Folder')}</Label>}\n <FolderDropdown\n value={value}\n onChange={option => {\n setValue && setValue(option);\n }}\n options={[...folderOptions]}\n />\n </DropdownWrapper>\n );\n};\n\nexport default VideoUploadFolderDropdown;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { Field, Form, Formik } from 'formik';\nimport { useGetAllVideoAttributesQuery } from 'lib/api/videoAttributes/useGetAllVideoAttributesQuery';\nimport { Gap } from 'lib/components/styles/layout';\nimport { useAuthorizationContext, UserData } from 'lib/context';\nimport styled, { css } from 'styled-components';\nimport { DetailsPreviewHeader } from './form/DetailsPreviewHeader';\nimport { DetailsRecordPreviewTags } from './form/DetailsRecordPreviewTags';\nimport { DetailsPreviewVideoAttributes } from './form/DetailsPreviewVideoAttributes';\nimport * as Yup from 'yup';\nimport { VideoRequestDetails } from './form/VideoRequestDetails';\nimport { DetailsPreviewAttributesHeader } from './form/DetailsPreviewAtrributesHeader';\nimport { useGetUsersByAutomotiveRolesQuery } from 'lib/api/users/automotive/useUsersByAutomotiveRolesQuery';\nimport {\n DetailsRecordingPreviewProps,\n DetailsPreviewRecordFormValues,\n FolderOption,\n AutomotiveRole,\n} from './types';\nimport { useVideoRecordUpload } from '../useVideoRecorderUpload';\nimport { FILE_EXTENSION } from 'lib/hooks/useMediaRecorder';\nimport { UploadLoader } from '../UploadLoader';\nimport { LoadingIndicator } from 'lib/components';\nimport { useHistory } from 'react-router';\nimport { FormikInputField } from 'lib/components/formik/FormikInputField';\nimport RouteLeavingGuard from 'lib/components/RouteLeavingGuard';\nimport { VideoPlayer } from '../../../pages/video/components/videoPlayer';\nimport { getTitle } from '../utils/functions';\nimport VideoUploadFolderDropdown from '../VideoUploadFolderDropdown';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveServiceRole,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { screenSizes } from 'lib/style/theme';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\n\nconst DEFAULT_UPLOAD_FOLDER = {\n value: -2,\n label: 'Primary',\n isFolderShared: false,\n access: 'edit',\n};\n\nconst Container = styled.div`\n padding-bottom: 64px;\n display: flex;\n position: relative;\n margin: 32px auto 0 auto;\n width: 1000px;\n flex-direction: column;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.md &&\n css`\n width: 100%;\n `}\n`;\nconst VideoWrapper = styled.div`\n margin-bottom: 24px;\n max-width: 488px;\n .fullscreen {\n height: auto;\n display: block;\n }\n`;\n\nconst FormStyles = styled(Form)`\n width: 380px;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.md &&\n css`\n width: 100%;\n `}\n`;\n\nconst FormBody = styled(Gap)`\n flex-flow: initial;\n align-items: flex-start;\n justify-content: space-between;\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.md &&\n css`\n flex-direction: column-reverse;\n `}\n`;\n\nconst RecorderLoaderWrapper = styled(Gap)`\n width: 770px;\n height: 437px;\n background: '#f6f7f9';\n margin-top: 90px;\n`;\n\nconst generateName = (fileExt: string, userData: UserData) => {\n const randomSuffix = (Math.random() + 1).toString(36).substring(2);\n const fileName = `${userData.userId}_${userData.customerId}_${randomSuffix}.${fileExt}`;\n return fileName;\n};\n\nexport const DetailsRecordingPreview = ({\n videoBlob,\n handleGoToRecordHome,\n}: DetailsRecordingPreviewProps) => {\n const { t } = useTranslation();\n const [videoUrl, setVideoUrl] = useState<string | null>(null);\n const { userData } = useAuthorizationContext();\n const history = useHistory();\n const { customer } = userData;\n const { userId } = userData;\n const [contineToInsert, setContineToInsert] = useState(false);\n const initialCovideoName = getTitle();\n const isMobileDevice = checkIfMobileDevice();\n const { trackGTMDiscardVideoEvent } = useGTMAnalytics();\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n\n const {\n setCdkAmplitudeFields,\n setRecordingFormData,\n isLoading: isSubmittingForm,\n createProgress,\n encodeProgress,\n uploadToS3Progress,\n progressState,\n } = useVideoRecordUpload({ contineToInsert });\n const isAutomotive = checkIfAutomotive(userData);\n const isAutomotiveService = checkIfAutomotiveServiceRole(userData);\n const isTechnician = userData.automotiveRole === AutomotiveRole.TECHNICIAN;\n const ref = useRef();\n const { data, isLoading } = useGetAllVideoAttributesQuery({\n page: 0,\n size: 200, // attempt to fetch all on the first render\n filterByDepartment: true,\n });\n\n const params = [\n { customerId: customer.customerId, role: AutomotiveRole.SERVICE_ADVISOR },\n {\n customerId: customer.customerId,\n role: AutomotiveRole.SERVICE_MANAGER,\n },\n ];\n\n const { isLoading: isGettingAutomotiveUsers, results } =\n useGetUsersByAutomotiveRolesQuery({\n params,\n enabled: isAutomotiveService,\n });\n\n useEffect(() => {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.RECORD_VIDEOS_DETAILS,\n });\n }, []);\n\n useEffect(() => {\n const url = URL.createObjectURL(videoBlob);\n setVideoUrl(url);\n\n // Clean up the URL object when the component unmounts or the videoSource changes\n return () => {\n URL.revokeObjectURL(url);\n };\n }, [videoBlob]);\n\n const onSubmitHandler = (values: DetailsPreviewRecordFormValues) => {\n const fileName = generateName(FILE_EXTENSION, userData);\n const videoFile = new File([videoBlob], fileName, { type: videoBlob.type });\n setRecordingFormData({ ...values, file: videoFile });\n };\n\n const onDiscardHandler = () => {\n handleGoToRecordHome();\n trackGTMDiscardVideoEvent?.();\n };\n\n const attributes =\n data?.attributes?.map(field => {\n const defaultDropdownValue =\n field.type === 'dropdown' &&\n field.dropdownValues?.find(value => value.default)?.value;\n\n return {\n value: defaultDropdownValue || field?.default || '',\n ...field,\n };\n }) || [];\n\n const validationSchema = Yup.object().shape({\n attributes: Yup.array().of(\n Yup.object().shape({\n value: Yup.string().when('isRequired', {\n is: 1,\n then: Yup.string().required(t('This field is required')),\n otherwise: Yup.string(),\n }),\n })\n ),\n title: Yup.string()\n .trim()\n .required(t('This field is required'))\n .matches(/^[^.]*$/, t('Title should not contain a dot (.)')),\n ...(isAutomotive\n ? {\n videoRequest: Yup.object().shape({\n advisorId: Yup.string().when([], {\n is: () => isTechnician,\n then: Yup.string()\n .nullable()\n .required(t('Advisor ID is required')),\n otherwise: Yup.string(),\n }),\n repairOrderNumber: Yup.string().when([], {\n is: () => isTechnician,\n then: Yup.string().required(\n t('Repair Order Number is required.')\n ),\n otherwise: Yup.string(),\n }),\n }),\n }\n : {}),\n });\n\n if (isLoading || isGettingAutomotiveUsers || videoUrl === null) {\n return <LoadingIndicator isLoading />;\n }\n\n if (isSubmittingForm) {\n return (\n <RecorderLoaderWrapper style={{ width: isMobileDevice ? '100%' : 770 }}>\n <UploadLoader\n progressState={progressState}\n encodeProgress={encodeProgress}\n uploadToS3Progress={uploadToS3Progress}\n createProgress={createProgress}\n />\n </RecorderLoaderWrapper>\n );\n }\n\n const INITIAL_VALUES: DetailsPreviewRecordFormValues = {\n title: initialCovideoName,\n folder: DEFAULT_UPLOAD_FOLDER,\n videoTags: [],\n attributes,\n ...(isAutomotive\n ? {\n videoRequest: {\n customerName: '',\n videoType: '',\n vehicle: {\n vin: '',\n stockNumber: '',\n },\n //assign to self if service and not technician\n advisorId: isAutomotiveService && !isTechnician ? userId : '',\n repairOrderNumber: '',\n note: '',\n },\n }\n : {}),\n };\n return (\n <Container>\n <Formik\n initialValues={INITIAL_VALUES}\n validateOnMount={true}\n onSubmit={(values: DetailsPreviewRecordFormValues) => {\n setCdkAmplitudeFields({ values, initialValues: INITIAL_VALUES });\n return onSubmitHandler(values);\n }}\n validationSchema={validationSchema}\n >\n {({ values, setFieldValue }) => (\n <>\n <DetailsPreviewHeader\n onDiscardHandler={onDiscardHandler}\n setContineToInsert={setContineToInsert}\n />\n <FormBody flexDirection='column' width='100%' gap='36px'>\n <FormStyles>\n <FormikInputField\n name='title'\n label={t('Video Title')}\n isRequired\n />\n <Field\n name='folder'\n component={VideoUploadFolderDropdown}\n value={values.folder}\n setValue={(val: FolderOption) => setFieldValue('folder', val)}\n showAllFolderOption={false}\n />\n <DetailsRecordPreviewTags />\n <DetailsPreviewAttributesHeader />\n <VideoRequestDetails\n results={results}\n fetchSoldVehiclesForAutomotive={false}\n />\n <DetailsPreviewVideoAttributes />\n </FormStyles>\n <VideoWrapper>\n <VideoPlayer videoRef={ref} videoSource={videoUrl} />\n </VideoWrapper>\n </FormBody>\n </>\n )}\n </Formik>\n <RouteLeavingGuard\n when={true}\n stay={true}\n navigate={path => history.push(path)}\n shouldBlockNavigation={() => {\n return true;\n }}\n title={t('Leave without saving the recording?')}\n text={t(\n 'Your recording will not be saved. This action can’t be undone.'\n )}\n confirmButtonText={t('Continue')}\n discardButtonText={t('Leave')}\n />\n </Container>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { RecordingHeaderWithRouteGuard } from './RecordingHeadingWithRouteGuard';\nimport { RecorderBody } from './RecorderBody';\nimport { RECORDING_STATUS } from './types';\nimport useRecorder from './useRecorder';\nimport VideoRecorderActions from './VideoRecorderActions';\nimport { isSafari } from './utils/browserChecks';\nimport { DetailsRecordingPreview } from './detailsPreview/DetailsPreview';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\ninterface IRecordBothProps {\n screenStream: MediaStream;\n stopAllStreams: () => void;\n handleGoToRecordHome: () => void;\n showPreview?: boolean;\n onStartUpladingVoiceOverHandler?: (blob: Blob) => void;\n}\n\nexport const RecordBoth = ({\n screenStream,\n stopAllStreams,\n handleGoToRecordHome,\n showPreview = true,\n onStartUpladingVoiceOverHandler,\n}: IRecordBothProps) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n const {\n stopRecording,\n pauseRecording,\n startCountDown,\n stopCountDown,\n status,\n recordedBlob,\n countdown,\n timeInSeconds,\n } = useRecorder({\n screenStream,\n stopAllStreams,\n onStartUpladingVoiceOverHandler,\n videoRef,\n shouldStartCountdown: !isSafari,\n handleGoToRecordHome,\n });\n\n useEffect(() => {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_RECORDER,\n });\n }, []);\n\n if (status === RECORDING_STATUS.DONE && recordedBlob && showPreview) {\n return (\n <DetailsRecordingPreview\n videoBlob={recordedBlob}\n handleGoToRecordHome={() => {\n handleGoToRecordHome();\n }}\n />\n );\n }\n\n return (\n <>\n <RecordingHeaderWithRouteGuard\n status={status}\n handleGoToRecordHome={handleGoToRecordHome}\n />\n <RecorderBody videoRef={videoRef} countdown={countdown} status={status} />\n <VideoRecorderActions\n startCountDown={startCountDown}\n stopCountDown={stopCountDown}\n pauseRecording={pauseRecording}\n stopRecording={stopRecording}\n status={status}\n timeInSeconds={timeInSeconds}\n />\n </>\n );\n};\n","import { useEffect, useRef } from 'react';\nimport { DetailsRecordingPreview } from './detailsPreview/DetailsPreview';\nimport { RecorderBody } from './RecorderBody';\nimport { RecordingHeaderWithRouteGuard } from './RecordingHeadingWithRouteGuard';\nimport { RECORDING_STATUS } from './types';\nimport useRecorder from './useRecorder';\nimport VideoRecorderActions from './VideoRecorderActions';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\n\ninterface ScreenRecorderProps {\n screenStream: MediaStream;\n stopAllStreams: () => void;\n handleGoToRecordHome: () => void;\n showPreview?: boolean;\n onStartUpladingVoiceOverHandler?: (blob: Blob) => void;\n}\n\nexport const ScreenRecorder = ({\n screenStream,\n stopAllStreams,\n handleGoToRecordHome,\n showPreview = true,\n onStartUpladingVoiceOverHandler,\n}: ScreenRecorderProps) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n const {\n stopRecording,\n pauseRecording,\n startCountDown,\n stopCountDown,\n status,\n recordedBlob,\n countdown,\n timeInSeconds,\n } = useRecorder({\n screenStream,\n stopAllStreams,\n onStartUpladingVoiceOverHandler,\n shouldStartCountdown: true,\n videoRef,\n handleGoToRecordHome,\n });\n\n useEffect(() => {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_RECORDER,\n });\n }, []);\n\n if (status === RECORDING_STATUS.DONE && recordedBlob && showPreview) {\n return (\n <DetailsRecordingPreview\n videoBlob={recordedBlob}\n handleGoToRecordHome={() => {\n handleGoToRecordHome();\n }}\n />\n );\n }\n\n return (\n <>\n <RecordingHeaderWithRouteGuard\n status={status}\n handleGoToRecordHome={handleGoToRecordHome}\n />\n\n <RecorderBody videoRef={videoRef} countdown={countdown} status={status} />\n <VideoRecorderActions\n startCountDown={startCountDown}\n stopCountDown={stopCountDown}\n pauseRecording={pauseRecording}\n stopRecording={stopRecording}\n status={status}\n timeInSeconds={timeInSeconds}\n />\n </>\n );\n};\n","export enum SelectRecordingType {\n SCREEN = 'Screen',\n CAM = 'Camera',\n SCREEN_AND_CAM = 'Screen+Camera',\n}\n\nexport enum RecordingToolAction {\n OPENED = 'Opened',\n APPLIED = 'Applied',\n CLOSED = 'Closed',\n REMOVED = 'Removed',\n}\n","import { createContext, ReactNode, useContext, useState } from 'react';\nimport { ITeleprompterSettings, Speed } from './types';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { RecordingToolAction } from 'lib/hooks/GTM/actions/recording/types';\n\nexport const TeleprompterContext = createContext(\n {} as {\n isUsingTeleprompter: boolean;\n showTeleprompterModal: boolean;\n teleprompterSettings: ITeleprompterSettings | null;\n isTeleprompterPlaying: boolean;\n isTeleprompterDisabled: boolean;\n saveTeleprompterSettingsHandler: (\n currentSettings: ITeleprompterSettings\n ) => void;\n onEditOrTurnOnTeleprompterHandler: () => void;\n onDropdownTeleprompterSpeedChange: (newValue: Speed) => void;\n toggleTeleprompterPlaying: () => void;\n onTeleprompterModalClose: () => void;\n turnOffTeleprompter: () => void;\n turnOnTeleprompter: () => void;\n turnOnTeleprompterPlaying: () => void;\n disableOrEnableTeleprompter: (isEnabled: boolean) => void;\n }\n);\n\nconst fetchSettingsFromStorage = (): ITeleprompterSettings | null => {\n const settingsFromStorage = localStorage.getItem('TeleprompterSettings');\n if (settingsFromStorage === null) {\n return null;\n }\n\n try {\n const parsedData: ITeleprompterSettings = JSON.parse(settingsFromStorage);\n return parsedData;\n } catch (error) {\n console.error('Error parsing localStorage data:', error);\n return null;\n }\n};\n\nconst saveSettingsToStorage = (data: ITeleprompterSettings | null): void => {\n localStorage.setItem('TeleprompterSettings', JSON.stringify(data));\n};\n\nexport const TeleprompterProvider = ({ children }: { children: ReactNode }) => {\n // teleprompter state\n const { trackGTMRecordingToolIntearctionEvent } = useGTMAnalytics();\n const [isUsingTeleprompter, setIsUsingTeleprompter] = useState(false);\n const [showTeleprompterModal, setShowTeleprompterModal] = useState(false);\n const [teleprompterSettings, setTeleprompterSettings] =\n useState<ITeleprompterSettings | null>(fetchSettingsFromStorage());\n const [isTeleprompterPlaying, setIsTeleprompterPlaying] = useState(false);\n const [isTeleprompterDisabled, setTeleprompterDisabled] = useState(false);\n\n const saveTeleprompterSettingsHandler = (\n currentSettings: ITeleprompterSettings\n ) => {\n setTeleprompterSettings(currentSettings);\n\n saveSettingsToStorage({\n ...currentSettings,\n activeScriptId: '',\n content: '',\n });\n setShowTeleprompterModal(false);\n };\n\n const onEditOrTurnOnTeleprompterHandler = () => {\n if (!isTeleprompterDisabled) {\n setIsUsingTeleprompter(true);\n setShowTeleprompterModal(true);\n trackGTMRecordingToolIntearctionEvent?.({\n action: RecordingToolAction.OPENED,\n });\n }\n };\n\n const onDropdownTeleprompterSpeedChange = (newValue: Speed) => {\n setIsTeleprompterPlaying(false);\n setTeleprompterSettings({\n ...teleprompterSettings,\n speed: newValue,\n scriptSize: teleprompterSettings?.scriptSize || '',\n });\n setIsTeleprompterPlaying(true);\n };\n\n const toggleTeleprompterPlaying = () => {\n setIsTeleprompterPlaying(!isTeleprompterPlaying);\n };\n\n const onTeleprompterModalClose = () => {\n setShowTeleprompterModal(false);\n setIsUsingTeleprompter(false);\n trackGTMRecordingToolIntearctionEvent?.({\n action: RecordingToolAction.CLOSED,\n });\n };\n\n const turnOffTeleprompter = () => {\n setIsUsingTeleprompter(false);\n trackGTMRecordingToolIntearctionEvent?.({\n action: RecordingToolAction.REMOVED,\n });\n };\n const turnOnTeleprompter = () => {\n setIsUsingTeleprompter(true);\n };\n\n const turnOnTeleprompterPlaying = () => {\n setIsTeleprompterPlaying(true);\n };\n\n const disableOrEnableTeleprompter = (isEnabled: boolean) => {\n setTeleprompterDisabled(isEnabled);\n };\n\n return (\n <TeleprompterContext.Provider\n value={{\n isUsingTeleprompter,\n showTeleprompterModal,\n teleprompterSettings,\n isTeleprompterPlaying,\n isTeleprompterDisabled,\n saveTeleprompterSettingsHandler,\n onEditOrTurnOnTeleprompterHandler,\n onDropdownTeleprompterSpeedChange,\n turnOnTeleprompterPlaying,\n toggleTeleprompterPlaying,\n onTeleprompterModalClose,\n turnOffTeleprompter,\n turnOnTeleprompter,\n disableOrEnableTeleprompter,\n }}\n >\n {children}\n </TeleprompterContext.Provider>\n );\n};\n\nexport const useTeleprompter = () => {\n const context = useContext(TeleprompterContext);\n if (context === undefined) {\n throw new Error(\n 'useTeleprompter must be used within a TeleprompterProvider'\n );\n }\n return context;\n};\n","import { MdSubtitles, MdPowerSettingsNew } from 'react-icons/md';\n\nimport { Button } from 'react-covideo-common';\nimport { Gap } from 'lib/components/styles/layout';\nimport { ParagraphSmallBold } from 'lib/components/styles/typography';\nimport { RECORDING_STATUS } from '../types';\nimport { useTeleprompter } from 'lib/context/teleprompter/provider';\nimport { useTheme } from 'styled-components';\nimport { useTranslation } from 'react-i18next';\n\ninterface TeleprompterProps {\n status: RECORDING_STATUS;\n}\n\nexport const BaseTeleprompterActions = ({ status }: TeleprompterProps) => {\n const { colors, isCdkEnviroment } = useTheme();\n const { t } = useTranslation();\n const {\n turnOffTeleprompter,\n onEditOrTurnOnTeleprompterHandler,\n isUsingTeleprompter,\n isTeleprompterDisabled,\n } = useTeleprompter();\n\n return (\n <Gap>\n <Gap gap='4px'>\n <MdSubtitles color={colors.neutral[60]} size={20} />\n <ParagraphSmallBold color={colors.neutral[60]}>\n {t('Teleprompter')}\n </ParagraphSmallBold>\n </Gap>\n <Button\n variant='secondary'\n disabled={\n isTeleprompterDisabled || status === RECORDING_STATUS.COUNTDOWN\n }\n text={isUsingTeleprompter ? t('Edit') : t('Turn on')}\n onClick={onEditOrTurnOnTeleprompterHandler}\n />\n\n {isUsingTeleprompter && (\n <Button\n title={t('Turn Off Teleprompter')}\n icon={<MdPowerSettingsNew size={20} />}\n onClick={turnOffTeleprompter}\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n />\n )}\n </Gap>\n );\n};\n","import { MdPause, MdPlayArrow } from 'react-icons/md';\nimport { Button } from 'react-covideo-common';\nimport { Gap } from 'lib/components/styles/layout';\nimport { useTeleprompter } from 'lib/context/teleprompter/provider';\nimport { handleScriptSpeedUsingScriptSize } from '../utils/functions';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nexport const RecordingTeleprompterActions = () => {\n const {\n teleprompterSettings,\n isUsingTeleprompter,\n toggleTeleprompterPlaying,\n isTeleprompterPlaying,\n onDropdownTeleprompterSpeedChange,\n } = useTeleprompter();\n const { t } = useTranslation();\n\n if (!isUsingTeleprompter) {\n return <></>;\n }\n\n return (\n <>\n <Gap m='0 0 0 auto'>\n <Dropdown\n placeholder={t('Set teleprompter speed')}\n value={teleprompterSettings?.speed}\n onChange={newValue => onDropdownTeleprompterSpeedChange(newValue)}\n options={handleScriptSpeedUsingScriptSize(\n teleprompterSettings?.scriptSize,\n t\n )}\n isSearchable={false}\n height={40}\n zIndexProp={9999}\n menuZIndexProp={9}\n extendStyles={{ container: { width: 180 } }}\n creatable={false}\n />\n <Button\n text={`${isTeleprompterPlaying ? 'Pause' : 'Play'} Teleprompter`}\n icon={\n isTeleprompterPlaying ? (\n <MdPause size={20} />\n ) : (\n <MdPlayArrow size={20} />\n )\n }\n onClick={toggleTeleprompterPlaying}\n />\n </Gap>\n </>\n );\n};\n","import * as React from 'react';\n\nimport { BaseTeleprompterActions } from './BaseTeleprompterActions';\nimport { RECORDING_STATUS } from '../types';\nimport { RecordingTeleprompterActions } from './RecordingTeleprompterActions';\n\ninterface TeleprompterProps {\n status: RECORDING_STATUS;\n}\n\nexport const TeleprompterActions = ({ status }: TeleprompterProps) => {\n const isRecording =\n status === RECORDING_STATUS.RECORDING || status === RECORDING_STATUS.PAUSED;\n return (\n <>\n {!isRecording ? (\n <BaseTeleprompterActions status={status} />\n ) : (\n <RecordingTeleprompterActions />\n )}\n </>\n );\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ntype ComponentProps = {\n content: string;\n fontSize: string;\n};\n\ninterface ScrollProps {\n fontSize: string;\n}\n\nconst ScrollContainer = styled.div<ScrollProps>`\n overflow-wrap: break-word;\n max-width: 600px;\n font-size: ${props => props.fontSize};\n`;\n\nexport const Scroller = ({ content, fontSize }: ComponentProps) => {\n return (\n <>\n <ScrollContainer fontSize={fontSize}>{content}</ScrollContainer>\n </>\n );\n};\n","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { animateScroll } from 'react-scroll';\nimport { RECORDING_STATUS } from '../types';\nimport { useTeleprompter } from 'lib/context/teleprompter/provider';\nimport { decodeAndReplaceText } from '../utils/functions';\nimport { Scroller } from '../Scroller';\n\nconst TeleprompterShadow = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n z-index: 1;\n &.top {\n top: 0;\n bottom: 55%;\n background: linear-gradient(\n 180deg,\n rgba(39, 42, 50, 0.54) 0%,\n rgba(39, 42, 50, 0.48) 47.4%,\n rgba(39, 42, 50, 0) 100%\n );\n }\n &.bottom {\n top: 30%;\n bottom: 0;\n background: linear-gradient(\n 180deg,\n rgba(39, 42, 50, 0) 0%,\n rgba(39, 42, 50, 0.48) 47.4%,\n rgba(39, 42, 50, 0.54) 100%\n );\n }\n overflow: hidden;\n`;\n\nconst TeleprompterContainer = styled.div`\n scroll-behavior: smooth;\n box-sizing: border-box;\n font-style: normal;\n font-weight: bold;\n font-size: 20px;\n line-height: 32px;\n color: #fff;\n z-index: 2;\n border-radius: 8px;\n padding: 32px 128px;\n text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n white-space: pre-line;\n position: absolute;\n overflow: auto;\n width: 100%;\n display: flex;\n justify-content: center;\n overflow: hidden;\n max-height: 300px;\n @media screen and (max-width: 768px) {\n width: 100%;\n padding: 16px;\n max-height: 135px;\n }\n /* this will hide the scrollbar in mozilla based browsers */\n overflow: -moz-scrollbars-none;\n scrollbar-width: none;\n\n /* this will hide the scrollbar in internet explorers */\n -ms-overflow-style: none;\n ::-webkit-scrollbar {\n width: 0 !important;\n display: none;\n }\n .marquee-container {\n width: 500px;\n }\n .marquee-container:not(.horizontal)::before {\n background: transparent;\n }\n .marquee-container:not(.horizontal)::after {\n background: transparent;\n }\n`;\n\ninterface TeleprompterProps {\n status: RECORDING_STATUS;\n}\n\nexport const TeleprompterDisplay = ({ status }: TeleprompterProps) => {\n const { teleprompterSettings, isUsingTeleprompter, isTeleprompterPlaying } =\n useTeleprompter();\n\n const play = () => {\n animateScroll.scrollMore(20, {\n containerId: 'teleprompter',\n duration: 50,\n smooth: true,\n offset: 50,\n });\n };\n\n useEffect(() => {\n let interval: NodeJS.Timeout | undefined;\n\n if (isTeleprompterPlaying && status === RECORDING_STATUS.RECORDING) {\n if (interval) {\n clearInterval(interval);\n }\n\n interval = setInterval(play, teleprompterSettings?.speed?.value || 100);\n } else {\n if (interval) clearInterval(interval);\n }\n\n return () => {\n if (interval) clearInterval(interval);\n };\n }, [isTeleprompterPlaying, teleprompterSettings?.speed, status]);\n\n if (!isUsingTeleprompter) {\n return <></>;\n }\n\n return (\n <>\n <TeleprompterShadow className={teleprompterSettings?.scriptPosition} />\n <TeleprompterContainer\n id='teleprompter'\n style={{\n top: teleprompterSettings?.scriptPosition === 'top' ? '0px' : '30%',\n }}\n >\n <Scroller\n content={decodeAndReplaceText(teleprompterSettings?.content || '')}\n fontSize={teleprompterSettings?.scriptSize || '16px'}\n />\n </TeleprompterContainer>\n </>\n );\n};\n\nexport default TeleprompterDisplay;\n","import { LoadingIndicator } from 'lib/components/LoadingIndicator';\nimport styled from 'styled-components';\n\nconst RecordCamLoaderWrapper = styled.div`\n height: 440px;\n width: 100%;\n z-index: 4;\n background: rgb(246, 247, 249);\n position: absolute;\n border-radius: 6;\n display: flex;\n align-items: center;\n justify.content: center;\n top: 0;\n`;\n\nexport const RecordCamLoader = ({ text }: { text: string }) => {\n return (\n <RecordCamLoaderWrapper>\n <div>\n <LoadingIndicator isLoading={true} text={text} />\n </div>\n </RecordCamLoaderWrapper>\n );\n};\n","import { VirtualBackground } from '../types';\n\nconst initialVirtualBgState: VirtualBackground = {\n url: '',\n type: 'none',\n index: -1,\n privacy: 'PUBLIC',\n id: '',\n};\n\nexport const getVirtualBackgroundFromStorage = (\n id: string\n): VirtualBackground => {\n const vbSelection = localStorage.getItem('covideoVirtualBackground') || '';\n try {\n const savedVirtualBackground: Record<string, VirtualBackground> =\n JSON.parse(vbSelection);\n if (savedVirtualBackground && typeof savedVirtualBackground === 'object') {\n return savedVirtualBackground?.[id] || initialVirtualBgState;\n }\n return initialVirtualBgState;\n } catch (ex) {\n return initialVirtualBgState;\n }\n};\n\nexport const getAllackgroundFromStorage = (): Record<\n string,\n VirtualBackground\n> => {\n const vbSelection = localStorage.getItem('covideoVirtualBackground') || '';\n try {\n const savedVirtualBackground: Record<string, VirtualBackground> =\n JSON.parse(vbSelection);\n if (savedVirtualBackground && typeof savedVirtualBackground === 'object') {\n return savedVirtualBackground;\n }\n return {};\n } catch (ex) {\n return {};\n }\n};\n\nexport const saveVirtualBackgroundToStorage = (\n currentVirtualBackground: VirtualBackground,\n id: string\n) => {\n const currentVb = getAllackgroundFromStorage();\n const newItems = { ...currentVb, [id]: currentVirtualBackground };\n\n localStorage.setItem('covideoVirtualBackground', JSON.stringify(newItems));\n};\n","export const customVirtualBackgroundKeys = {\n all: () => ['CUSTOM_VIRTUAL_BACKGROUND'] as const,\n};\n","import { customVirtualBackgroundKeys } from './customVirtualBackgroundKeys';\nimport { useQuery } from 'react-query';\nimport { useToastNotifications } from 'lib/components';\nimport { EXPRESS_API } from 'lib/config';\nimport { useTranslation } from 'react-i18next';\n\nexport interface ICustomVirtualBackground {\n id: number;\n resellerId: number | null;\n customerId: number | null;\n url: string;\n}\nconst getCustomVirtualBackgrounds = async (): Promise<\n ICustomVirtualBackground[]\n> => {\n return (await EXPRESS_API.get(`custom-virtual-background`)).data;\n};\n\nexport const useCustomVirtualBackgroundQuery = () => {\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n const { data, isLoading, refetch } = useQuery(\n customVirtualBackgroundKeys.all(),\n () => getCustomVirtualBackgrounds(),\n {\n refetchOnMount: true,\n onError: () => {\n toast({\n message: t(\n \"We're currently experiencing difficulties fetching custom virtual backgrounds.\"\n ),\n });\n },\n }\n );\n return { data: data || [], isLoading, refetch };\n};\n","import * as React from \"react\";\nconst SvgVirtualBackground = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 20 20\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M2 3C2 2.45 2.45 2 3 2H8C8.55 2 9 1.55 9 1C9 0.45 8.55 0 8 0H2C0.9 0 0 0.9 0 2V8C0 8.55 0.45 9 1 9C1.55 9 2 8.55 2 8V3ZM7.61 11.49L4.65 15.19C4.39 15.52 4.62 16 5.04 16H15C15.41 16 15.65 15.53 15.4 15.2L13.4 12.53C13.2 12.26 12.8 12.26 12.6 12.53L10.97 14.71L8.39 11.49C8.19 11.24 7.81 11.24 7.61 11.49ZM15 6.5C15 5.67 14.33 5 13.5 5C12.67 5 12 5.67 12 6.5C12 7.33 12.67 8 13.5 8C14.33 8 15 7.33 15 6.5ZM18 0H12C11.45 0 11 0.45 11 1C11 1.55 11.45 2 12 2H17C17.55 2 18 2.45 18 3V8C18 8.55 18.45 9 19 9C19.55 9 20 8.55 20 8V2C20 0.9 19.1 0 18 0ZM18 17C18 17.55 17.55 18 17 18H12C11.45 18 11 18.45 11 19C11 19.55 11.45 20 12 20H18C19.1 20 20 19.1 20 18V12C20 11.45 19.55 11 19 11C18.45 11 18 11.45 18 12V17ZM1 11C0.45 11 0 11.45 0 12V18C0 19.1 0.9 20 2 20H8C8.55 20 9 19.55 9 19C9 18.45 8.55 18 8 18H3C2.45 18 2 17.55 2 17V12C2 11.45 1.55 11 1 11Z\", fill: \"#272A32\" }));\nexport default SvgVirtualBackground;\n","import styled from 'styled-components';\nimport virtualBackground from './virtualBackground.svg?react';\n\nconst VideoIcon = styled(virtualBackground)`\n width: ${props => props.width || '16px'};\n height: ${props => props.height || '16px'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default VideoIcon;\n","// webglUtils.ts\nexport const VIEWPORT_HEIGHT = 720;\nexport const VIEWPORT_WIDTH = 1280;\nexport type WebGlState = {\n gl: WebGL2RenderingContext | null;\n program: WebGLProgram | null;\n};\n\n// Helper function to create a WebGL shader\nexport const createShader = (\n gl: WebGLRenderingContext,\n type: number,\n source: string\n) => {\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n console.error('Error compiling shader:', gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n return null;\n }\n return shader;\n};\n\n// Helper function to create a WebGL program\nexport const createProgram = (\n gl: WebGLRenderingContext,\n vertexShaderSource: string,\n fragmentShaderSource: string\n) => {\n const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);\n const fragmentShader = createShader(\n gl,\n gl.FRAGMENT_SHADER,\n fragmentShaderSource\n );\n if (!vertexShader || !fragmentShader) {\n return null;\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n console.error('Error linking program:', gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n return null;\n }\n\n // Use the program immediately after linking\n gl.useProgram(program);\n\n return program;\n};\n\nexport const updateTexture = (\n gl: WebGLRenderingContext,\n texture: WebGLTexture,\n source: HTMLVideoElement | Uint8Array | HTMLImageElement,\n width: number,\n height: number\n) => {\n gl.bindTexture(gl.TEXTURE_2D, texture);\n if (source instanceof Uint8Array) {\n gl.texImage2D(\n gl.TEXTURE_2D,\n 0,\n gl.ALPHA,\n width,\n height,\n 0,\n gl.ALPHA,\n gl.UNSIGNED_BYTE,\n source\n );\n } else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n }\n};\n\n// Helper function to create a texture from an image\nexport const createTexture = (gl: WebGLRenderingContext) => {\n const texture = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n return texture;\n};\n\n// Initialize WebGL context and shaders\nexport const initWebGL = (canvas: HTMLCanvasElement): WebGlState => {\n const gl = canvas.getContext('webgl2');\n if (!gl) {\n console.error('WebGL not supported');\n return { gl: null, program: null };\n }\n // Set the viewport to cover the entire canvas\n gl.viewport(0, 0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT);\n\n const vertexShaderSource = `\n precision highp float;\n\n attribute vec4 a_position;\n attribute vec2 a_texCoord;\n varying vec2 v_texCoord;\n\n void main() {\n gl_Position = a_position; // Pass the position through to gl_Position\n // Flip the texture coordinates vertically by inverting the Y axis\n v_texCoord = vec2(a_texCoord.x, 1.0 - a_texCoord.y);\n }\n `;\n\n const fragmentShaderSource = `\n precision highp float;\n\n uniform sampler2D u_foreground;\n uniform sampler2D u_background;\n uniform sampler2D u_confidenceMask;\n uniform sampler2D u_confidenceMaskHair;\n uniform sampler2D u_confidenceMaskBody;\n uniform sampler2D u_confidenceMaskFace;\n uniform sampler2D u_confidenceMaskClothes;\n uniform sampler2D u_confidenceMaskOther;\n uniform vec2 u_backgroundScale;\n\n varying vec2 v_texCoord;\n\n // Function to blend two colors\n vec4 blendColors(vec4 base, vec4 added) {\n float mixAlpha = 1.0 - (1.0 - added.a) * (1.0 - base.a);\n\n vec3 mixRGB;\n if (mixAlpha == 0.0) {\n mixRGB = vec3(0.0, 0.0, 0.0);\n } else {\n mixRGB.r = (added.r * added.a / mixAlpha) + (base.r * base.a * (1.0 - added.a) / mixAlpha);\n mixRGB.g = (added.g * added.a / mixAlpha) + (base.g * base.a * (1.0 - added.a) / mixAlpha);\n mixRGB.b = (added.b * added.a / mixAlpha) + (base.b * base.a * (1.0 - added.a) / mixAlpha);\n }\n\n return vec4(mixRGB, 1.0);\n }\n\n void main() {\n\n // Adjust texture coordinates to scale the background, ensuring it's centered\n vec2 centeredCoord = (v_texCoord - 0.5) * u_backgroundScale + 0.5;\n\n vec4 fgColor = texture2D(u_foreground, v_texCoord); // Foreground color\n vec4 bgColor = texture2D(u_background, centeredCoord); // Scaled and centered background color\n\n //float confidence = 1.0 - texture2D(u_confidenceMask, v_texCoord).r;\n float confidenceSum = texture2D(u_confidenceMaskHair, v_texCoord).r + texture2D(u_confidenceMaskBody, v_texCoord).r + texture2D(u_confidenceMaskFace, v_texCoord).r + texture2D(u_confidenceMaskClothes, v_texCoord).r + texture2D(u_confidenceMaskOther, v_texCoord).r;\n float confidence = min(confidenceSum, 1.0);\n float minConfidence = 0.1;\n float maxConfidence = 0.95;\n\n // Full background when below min confidence\n if (confidence < minConfidence) {\n gl_FragColor = bgColor;\n } \n // Full foreground when above max confidence\n else if (confidence > maxConfidence) {\n gl_FragColor = fgColor;\n } \n // Blending between foreground and background\n else {\n vec4 blended = blendColors(vec4(fgColor.rgb, confidence), vec4(bgColor.rgb, 1.0 - confidence));\n gl_FragColor = blended;\n }\n }\n `;\n\n const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);\n\n if (!program) {\n console.error('Failed to create WebGL program');\n return { gl: null, program: null };\n }\n\n return { gl, program };\n};\n\n// Function to set up positions and texture coordinates for a rectangle\nexport const setupRectangle = (\n gl: WebGLRenderingContext,\n program: WebGLProgram\n) => {\n const positionLocation = gl.getAttribLocation(program, 'a_position');\n const texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');\n\n // Full-screen quad positions (covering the entire clip space from -1 to 1)\n const positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);\n const positions = new Float32Array([\n -1,\n -1, // Bottom-left\n 1,\n -1, // Bottom-right\n -1,\n 1, // Top-left\n 1,\n 1, // Top-right\n ]);\n gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);\n\n gl.enableVertexAttribArray(positionLocation);\n gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);\n\n // Texture coordinates (mapping the texture from (0,0) to (1,1))\n const texCoordBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);\n const texCoords = new Float32Array([\n 0,\n 0, // Bottom-left\n 1,\n 0, // Bottom-right\n 0,\n 1, // Top-left\n 1,\n 1, // Top-right\n ]);\n gl.bufferData(gl.ARRAY_BUFFER, texCoords, gl.STATIC_DRAW);\n\n gl.enableVertexAttribArray(texCoordLocation);\n gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);\n};\n\n// Function to render using the WebGL program\nexport const render = (\n gl: WebGLRenderingContext,\n program: WebGLProgram,\n fgTexture: WebGLTexture,\n bgTexture: WebGLTexture,\n confidenceMaskTexture: WebGLTexture,\n confidenceMaskHairTexture: WebGLTexture,\n confidenceMaskBodyTexture: WebGLTexture,\n confidenceMaskFaceTexture: WebGLTexture,\n confidenceMaskClothesTexture: WebGLTexture,\n confidenceMaskOtherTexture: WebGLTexture,\n backgroundScale: number[] = [1.0, 1.0]\n) => {\n // Bind the program before rendering\n gl.useProgram(program);\n\n // Activate the textures and bind them\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, fgTexture);\n\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, bgTexture);\n\n // Bind Mask textures\n gl.activeTexture(gl.TEXTURE2);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskTexture);\n gl.activeTexture(gl.TEXTURE3);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskHairTexture);\n gl.activeTexture(gl.TEXTURE4);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskBodyTexture);\n gl.activeTexture(gl.TEXTURE5);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskFaceTexture);\n gl.activeTexture(gl.TEXTURE6);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskClothesTexture);\n gl.activeTexture(gl.TEXTURE7);\n gl.bindTexture(gl.TEXTURE_2D, confidenceMaskOtherTexture);\n\n // Set the textures to the uniform locations\n const fgLocation = gl.getUniformLocation(program, 'u_foreground');\n const bgLocation = gl.getUniformLocation(program, 'u_background');\n const maskLocation = gl.getUniformLocation(program, 'u_confidenceMask');\n const maskLocationHair = gl.getUniformLocation(\n program,\n 'u_confidenceMaskHair'\n );\n const maskLocationBody = gl.getUniformLocation(\n program,\n 'u_confidenceMaskBody'\n );\n const maskLocationFace = gl.getUniformLocation(\n program,\n 'u_confidenceMaskFace'\n );\n const maskLocationClothes = gl.getUniformLocation(\n program,\n 'u_confidenceMaskClothes'\n );\n const maskLocationOther = gl.getUniformLocation(\n program,\n 'u_confidenceMaskOther'\n );\n\n gl.uniform1i(fgLocation, 0); // Foreground texture bound to TEXTURE0\n gl.uniform1i(bgLocation, 1); // Background texture bound to TEXTURE1\n gl.uniform1i(maskLocation, 2); // Confidence mask texture bound to TEXTURE2\n gl.uniform1i(maskLocationHair, 3); // ...\n gl.uniform1i(maskLocationBody, 4);\n gl.uniform1i(maskLocationFace, 5);\n gl.uniform1i(maskLocationClothes, 6);\n gl.uniform1i(maskLocationOther, 7);\n\n // Clear the color buffer\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Scale values to maintain background texture aspect ratio\n const backgroundScaleLocation = gl.getUniformLocation(\n program,\n 'u_backgroundScale'\n );\n gl.uniform2fv(backgroundScaleLocation, backgroundScale);\n\n // Draw the full-screen quad (2 triangles)\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n};\n\nexport const clear = (gl: WebGLRenderingContext) => {\n gl.useProgram(null);\n gl.clearColor(0, 0, 0, 0);\n // Clear the color buffer\n gl.clear(gl.COLOR_BUFFER_BIT);\n};\n","import {\n FilesetResolver,\n ImageSegmenter,\n ImageSegmenterResult,\n} from '@mediapipe/tasks-vision';\nimport { useRef } from 'react';\nimport {\n clear,\n createTexture,\n initWebGL,\n render,\n setupRectangle,\n updateTexture,\n VIEWPORT_HEIGHT,\n VIEWPORT_WIDTH,\n} from './webgl/webglUtils';\n\nexport type WebGlState = {\n gl: WebGL2RenderingContext | null;\n program: WebGLProgram | null;\n};\n\nconst bgImgCanvasElement = document.createElement('canvas');\nconst bgImgCanvasCtx = bgImgCanvasElement.getContext('2d');\nlet lastTimestamp = 0;\n\nconst calculateBackgroundImageData = (\n imgElement: HTMLImageElement,\n videoWidth: number,\n videoHeight: number\n) => {\n let newWidth = videoWidth;\n let newHeight = videoHeight;\n let startX = 0;\n let startY = 0;\n\n if (videoWidth / videoHeight < imgElement.width / imgElement.height) {\n newWidth = videoHeight * (imgElement.width / imgElement.height);\n startX = (newWidth - videoWidth) / 2;\n } else {\n newHeight = (videoWidth * imgElement.height) / imgElement.width;\n startY = (newHeight - videoHeight) / 2;\n }\n\n bgImgCanvasElement.width = newWidth;\n bgImgCanvasElement.height = newHeight;\n\n bgImgCanvasCtx!.drawImage(imgElement, 0, 0, newWidth, newHeight);\n return bgImgCanvasCtx!.getImageData(startX, startY, videoWidth, videoHeight)\n .data;\n};\n\nconst calculateBackgroundScale = (\n canvasWidth: number,\n canvasHeight: number,\n backgroundWidth: number,\n backgroundHeight: number\n) => {\n const canvasAspect = canvasWidth / canvasHeight;\n const backgroundAspect = backgroundWidth / backgroundHeight;\n let scaleX = 1.0;\n let scaleY = 1.0;\n\n // If the background aspect ratio is less than the canvas aspect ratio, scale the background to fit width\n if (backgroundAspect < canvasAspect) {\n scaleY = backgroundAspect / canvasAspect;\n }\n // Otherwise, scale the background to fit height\n else {\n scaleX = canvasAspect / backgroundAspect;\n }\n\n return [scaleX, scaleY];\n};\n\nexport const useImageSegmenter = (\n canvasRef: React.RefObject<HTMLCanvasElement>,\n videoRef: React.RefObject<HTMLVideoElement>,\n setIsLoading: React.Dispatch<React.SetStateAction<boolean>>\n) => {\n const imageSegmenterRef = useRef<ImageSegmenter | null>(null);\n const isFirstFrameRef = useRef<boolean>(true);\n const resultimageRef = useRef<Uint8ClampedArray | null>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const webGlRef = useRef<WebGlState>({ gl: null, program: null });\n const bgTexture = useRef<WebGLTexture>();\n const backgroundScale = useRef([1.0, 1.0]);\n\n let fgTexture: WebGLTexture;\n\n const initTextures = (gl: WebGLRenderingContext) => {\n fgTexture = createTexture(gl);\n bgTexture.current = createTexture(gl);\n };\n\n const initWebGLContext = () => {\n // Initialize WebGL context and program\n if (!canvasRef.current) {\n return;\n }\n webGlRef.current = initWebGL(canvasRef.current);\n if (webGlRef.current.gl) {\n initTextures(webGlRef.current.gl);\n if (imageRef.current) {\n updateTexture(\n webGlRef.current.gl,\n bgTexture.current!,\n imageRef.current,\n canvasRef.current.width,\n canvasRef.current.height\n );\n backgroundScale.current = calculateBackgroundScale(\n VIEWPORT_WIDTH,\n VIEWPORT_HEIGHT,\n imageRef.current.width,\n imageRef.current.height\n );\n }\n }\n };\n\n const onCreateVirtualBackgroundHandler = async () => {\n if (imageSegmenterRef.current) {\n return;\n }\n const audio = await FilesetResolver.forVisionTasks(\n 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.2/wasm'\n );\n\n initWebGLContext();\n\n const segmenter = await ImageSegmenter.createFromOptions(audio, {\n baseOptions: {\n modelAssetPath:\n 'https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_multiclass_256x256/float32/latest/selfie_multiclass_256x256.tflite',\n delegate: 'GPU',\n },\n runningMode: 'VIDEO', // Always set to 'VIDEO' for webcam\n outputCategoryMask: false,\n outputConfidenceMasks: true,\n canvas: canvasRef.current!,\n });\n\n imageSegmenterRef.current = segmenter;\n\n setIsLoading(false);\n predictWebcam();\n };\n\n const onDestroyVirtualBackgroundHandler = () => {\n if (imageSegmenterRef.current) {\n imageSegmenterRef.current.close();\n imageSegmenterRef.current = null;\n }\n if (webGlRef.current.gl) {\n clear(webGlRef.current.gl);\n }\n\n if (canvasRef.current) {\n const canvasRefCtx = canvasRef.current.getContext('2d');\n if (canvasRefCtx) {\n canvasRefCtx.clearRect(\n 0,\n 0,\n canvasRef.current.width,\n canvasRef.current.height\n );\n }\n }\n };\n\n const drawSegmentationResult = (result: ImageSegmenterResult) => {\n if (\n !result.confidenceMasks ||\n !canvasRef.current ||\n !resultimageRef.current ||\n !imageRef.current ||\n !videoRef.current\n ) {\n result.close();\n return;\n }\n const { gl, program } = webGlRef.current;\n\n if (!gl || !program) return;\n\n // Setup positions and texture coordinates for the rectangle\n setupRectangle(gl, program);\n\n const confidenceMaskTexture = result.confidenceMasks[0].getAsWebGLTexture();\n const confidenceMaskHairTexture =\n result.confidenceMasks[1].getAsWebGLTexture();\n const confidenceMaskBodyTexture =\n result.confidenceMasks[2].getAsWebGLTexture();\n const confidenceMaskFaceTexture =\n result.confidenceMasks[3].getAsWebGLTexture();\n const confidenceMaskClothesTexture =\n result.confidenceMasks[4].getAsWebGLTexture();\n const confidenceMaskOtherTexture =\n result.confidenceMasks[5].getAsWebGLTexture();\n\n // // Render the result using WebGL\n render(\n gl,\n program,\n fgTexture,\n bgTexture.current!,\n confidenceMaskTexture,\n confidenceMaskHairTexture,\n confidenceMaskBodyTexture,\n confidenceMaskFaceTexture,\n confidenceMaskClothesTexture,\n confidenceMaskOtherTexture,\n backgroundScale.current\n );\n\n // Continue processing the next frame.\n window.requestAnimationFrame(predictWebcam);\n result.close();\n };\n\n const getCavansBgImage = () => {\n if (canvasRef.current && videoRef.current && imageRef.current) {\n resultimageRef.current = calculateBackgroundImageData(\n imageRef.current,\n canvasRef.current.width,\n canvasRef.current.height\n );\n if (webGlRef.current.gl) {\n backgroundScale.current = calculateBackgroundScale(\n VIEWPORT_WIDTH,\n VIEWPORT_HEIGHT,\n imageRef.current.width,\n imageRef.current.height\n );\n updateTexture(\n webGlRef.current.gl,\n bgTexture.current!,\n imageRef.current,\n canvasRef.current.width,\n canvasRef.current.height\n );\n }\n }\n };\n\n function getTimestamp() {\n const currentTimestamp = Math.floor(performance.now());\n if (currentTimestamp <= lastTimestamp) {\n lastTimestamp += 1; // Ensure it's strictly increasing\n } else {\n lastTimestamp = currentTimestamp;\n }\n return lastTimestamp;\n }\n\n const predictWebcam = async () => {\n if (\n canvasRef.current &&\n videoRef.current &&\n imageSegmenterRef.current &&\n imageRef.current\n ) {\n const width = videoRef.current.videoWidth;\n const height = videoRef.current.videoHeight;\n if (isFirstFrameRef.current) {\n isFirstFrameRef.current = false;\n canvasRef.current.width = width;\n canvasRef.current.height = height;\n getCavansBgImage();\n }\n\n let nowInMs = getTimestamp();\n\n if (webGlRef.current.gl) {\n // Update the foreground texture with the current video frame\n updateTexture(\n webGlRef.current.gl,\n fgTexture,\n videoRef.current,\n width,\n height\n );\n }\n\n imageSegmenterRef.current.segmentForVideo(\n videoRef.current,\n nowInMs,\n drawSegmentationResult\n );\n }\n };\n\n return {\n imageRef,\n onDestroyVirtualBackgroundHandler,\n getCavansBgImage,\n onCreateVirtualBackgroundHandler,\n };\n};\n","import Cookies from 'js-cookie';\nimport { EXPRESS_API } from 'lib/config';\n//@ts-ignore\nimport Droplr from 'droplr-api';\n\nexport let client: any;\n\nexport const checkDropAuth = async () => {\n if (!client) {\n const { data } = await EXPRESS_API.get('/droplr/auth');\n Cookies.set('jwtToken', data.jwt, {\n domain: '.covideo.com',\n sameSite: 'strict',\n secure: true,\n });\n client = new Droplr.Client({\n auth: new Droplr.JwtAuth(data.jwt),\n });\n\n client.sharedDrop = new SharedDrop(client);\n }\n};\n\nexport class SharedDrop {\n path: string;\n client: any;\n constructor(client: any) {\n this.client = client;\n this.path = 'drops/groups/shared';\n }\n async get(id: string, options = {}) {\n const response = await this.client.get(`${this.path}/${id}`, options);\n return response.data;\n }\n async list(params = {}, options = {}) {\n const localOptions = {\n params,\n };\n const response = await this.client.get(\n this.path,\n Object.assign(localOptions, options)\n );\n return {\n count: response.headers['x-results-count'],\n hasMore: response.headers['x-has-more'],\n results: response.data,\n };\n }\n}\n","import { checkDropAuth, client } from './droplrAuth';\n\nexport const uploadDrop = async (\n title: string,\n type: string,\n content: any,\n progressUpdate?: (total: number, uploaded: number, percent: number) => void\n) => {\n await checkDropAuth();\n\n return client.drops.create(\n {\n type: 'FILE',\n variant: type,\n title,\n content,\n },\n {\n onUploadProgress: (progressEvent: { loaded: number; total: number }) => {\n const progress: number = progressEvent.loaded / progressEvent.total;\n const percentage: number = Number(progress.toFixed(2)) * 100;\n\n if (progressUpdate !== undefined)\n progressUpdate(progressEvent.total, progressEvent.loaded, percentage);\n },\n }\n );\n};\n","import { EXPRESS_API } from 'lib/config';\nimport { useQuery } from 'react-query';\nimport { checkDropAuth, client } from './droplrAuth';\nimport { droplrKeys } from './queryKeys';\nimport {\n BoardsResponse,\n CombinedBoard,\n CovideoBoard,\n DroplrBoard,\n} from './types';\n\nexport type GetBoardsParams = {\n userId: number;\n customerId: number;\n};\n\nexport const getBoards = async (\n params: GetBoardsParams\n): Promise<BoardsResponse> => {\n await checkDropAuth();\n\n // fetch boards from droplr\n const droplrResponse = await client.boards.list();\n const droplrBoards = (droplrResponse?.results as DroplrBoard[]) || [];\n\n // fetch board details from covideo\n const covideoResponse = (\n await EXPRESS_API.get('/board/all', {\n params,\n })\n ).data;\n const covideoBoards = (covideoResponse?.boards as CovideoBoard[]) || [];\n\n // add thumbnail to response\n const boards = [] as CombinedBoard[];\n droplrBoards.forEach((droplrBoard: DroplrBoard) => {\n const covideoBoard = covideoBoards.find(\n cb => cb.droplrBoardId === droplrBoard.id\n );\n boards.push({\n ...droplrBoard,\n thumbnailUrl: covideoBoard?.thumbnailUrl || '',\n });\n });\n\n return {\n boards,\n count: boards.length,\n };\n};\n\nexport const useGetBoards = (params: GetBoardsParams) => {\n return useQuery(droplrKeys.boards_list(params), () => getBoards(params));\n};\n","import { useQuery } from 'react-query';\nimport { droplrKeys } from './queryKeys';\nimport { checkDropAuth, client } from './droplrAuth';\nimport { DropItem } from './types';\n\nexport type GetDropParams = {\n dropId: string;\n};\n\nexport const getDrop = async (dropId: string) => {\n if (!dropId) {\n return;\n }\n await checkDropAuth();\n\n return client.drops.get(dropId) as DropItem;\n};\n\nexport const useGetDrop = (params: GetDropParams) => {\n return useQuery(droplrKeys.drop_details(params), () =>\n getDrop(params.dropId)\n );\n};\n","import { useQuery } from 'react-query';\nimport { checkDropAuth, client } from './droplrAuth';\nimport { droplrKeys } from './queryKeys';\nimport { DropItem, DroplrGetDropsParams } from './types';\n\nexport const DropType = {\n FILE: 'FILE',\n IMAGE: 'IMAGE',\n VIDEO: 'VIDEO',\n AUDIO: 'AUDIO',\n};\nexport const enum DROPTYPE_OPTIONS {\n SHARED = 'shared',\n OWNED = 'owned',\n}\nexport type GetDropsParams = {\n dropType: DROPTYPE_OPTIONS;\n search?: string;\n sort?: string;\n order?: string;\n page?: number;\n size?: number;\n boardId?: string;\n type?: string;\n variant?: string;\n};\n\nexport const getDrops = async (params: GetDropsParams) => {\n await checkDropAuth();\n const {\n order,\n sort,\n page = 0,\n size = 10,\n type = '',\n variant = '',\n search = '',\n boardId,\n } = params;\n let body = {\n order: order,\n sort_by: sort,\n offset: page * size,\n amount: size,\n board: '',\n } as DroplrGetDropsParams;\n\n if (type) {\n body.type = type;\n if (type === DropType.FILE && variant) {\n body.variant = variant;\n }\n }\n\n if (search) {\n body.search = search;\n }\n if (boardId) {\n body.board = boardId;\n }\n\n const response = await client.drops.list(body);\n return {\n drops: response.results as DropItem[],\n count: Number(response.count) || 0,\n hasMore: response?.hasMore || false,\n };\n};\n\nexport const getSharedDrops = async ({\n page = 0,\n size = 0,\n}: {\n page: number;\n size: number;\n}) => {\n await checkDropAuth();\n const response = await client.sharedDrop.list({\n offset: page * size,\n amount: size,\n });\n\n return {\n drops: response.results as DropItem[],\n count: Number(response.count) || 0,\n hasMore: response?.hasMore || false,\n };\n};\n\nexport const useGetDrops = (params: GetDropsParams) => {\n return useQuery(droplrKeys.drop_list(params), () =>\n params.dropType === DROPTYPE_OPTIONS.OWNED\n ? getDrops(params)\n : getSharedDrops({\n page: params.page || 0,\n size: params.size || 10,\n })\n );\n};\n","import React, { useCallback } from 'react';\nimport styled from 'styled-components';\nimport { useDropzone } from 'react-dropzone';\n\nimport {\n LoadingIndicator,\n /* Search, */\n useToastNotifications,\n} from 'lib/components';\nimport { theme } from 'lib/style';\nimport InfiniteScroll from 'react-infinite-scroll-component';\n\nimport { uploadDrop } from 'lib/api/droplr/uploadDrop';\nimport { getBoards } from 'lib/api/droplr/getBoards';\nimport { getDrop } from 'lib/api/droplr/getDrop';\nimport { DROPTYPE_OPTIONS, getDrops } from 'lib/api/droplr/getDrops';\nimport { useAuthorizationContext } from 'lib/context';\nimport { Button } from 'react-covideo-common';\nimport {\n formatBytes,\n getStatusColor,\n getStatusSize,\n getStatusText,\n} from '../utils/functions';\nimport { CombinedBoard, DropItem, ExtendedFile, statuses } from '../types';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { useTranslation } from 'react-i18next';\n\nconst DropContent = styled.div<{ isDragActive: boolean }>`\n margin-top: 24px;\n padding: 0 32px;\n width: 100%;\n height: 120px;\n box-sizing: border-box;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n background: ${props => (props.isDragActive ? '#F6F7F9' : '#F6F7F9')};\n border: 1px dashed #d0d3d9;\n > p {\n font-style: normal;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n text-align: center;\n color: ${theme.palette.coal};\n }\n`;\n\nconst UploadFileContent = styled.div`\n margin-top: 24px;\n background: #f6f7f9;\n border-radius: 4px;\n display: flex;\n padding: 16px 32px;\n`;\n\nconst UploadFileDescription = styled.div`\n width: 90%;\n`;\n\nconst UploadFileAction = styled.div`\n width: 10%;\n`;\n\nconst UploadFileTitle = styled.div`\n background: #ffffff;\n border: 1px solid #d0d3d9;\n box-sizing: border-box;\n border-radius: 4px;\n\n font-style: normal;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n color: ${theme.palette.coal};\n padding: 8px 12px;\n`;\n\nconst UploadFileProgress = styled.progress`\n background-color: ${theme.palette.lightgray};\n border: none;\n border-radius: 2px;\n height: 4px;\n width: 100%;\n &::-webkit-progress-bar {\n margin: 0 auto;\n background-color: ${theme.palette.lightgray};\n border-radius: 2px;\n height: 4px;\n }\n &::-moz-progress-bar {\n margin: 0 auto;\n background-color: #ff8b22;\n border-radius: 2px;\n height: 4px;\n }\n &::-webkit-progress-value {\n display: inline-block;\n float: left;\n height: 4px;\n background: #ff8b22;\n border-radius: 2px;\n }\n`;\n\nconst UploadFileDetails = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 8px;\n`;\n\nconst FileStatus = styled.div<{ color: string }>`\n font-style: normal;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n color: ${props => (props.color ? props.color : '#9297A2')};\n`;\n\nconst FileSize = styled.div`\n font-style: normal;\n font-weight: normal;\n font-size: 16px;\n line-height: 24px;\n text-align: right;\n color: ${theme.palette.coal};\n`;\n\nconst LibraryContainer = styled.div`\n margin-top: 24px;\n width: 100%;\n`;\n\nconst Menu = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 8px;\n`;\n\nconst DropdownContainer = styled.div`\n width: 200px;\n`;\n\nconst FilesSelector = styled.div`\n margin-top: 24px;\n height: 300px;\n overflow-y: auto;\n`;\n\nconst EmptyFiles = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100px;\n\n font-style: normal;\n font-weight: 600;\n font-size: 15px;\n line-height: 24px;\n color: #272a32;\n`;\n\nconst Grid = styled.div`\n display: grid;\n grid-gap: 16.5px;\n grid-template-columns: 166px 166px 166px;\n .selected {\n border: 3px solid ${({ theme }) => theme.colors.primary[100]} !important;\n }\n`;\n\ntype GridItemProps = {\n backgroundUrl?: string;\n};\nconst GridItem = styled.div<GridItemProps>`\n background: url('${props =>\n props.backgroundUrl ? props.backgroundUrl : ''}');\n background-color: white;\n background-repeat: no-repeat;\n background-size: cover;\n background-position: center;\n width: 100%;\n height: 100px;\n border-radius: 3px;\n cursor: pointer;\n justify-content: center;\n align-items: center;\n border: 1px solid rgba(39, 42, 50, 0.1);\n`;\n\nconst ItemTypes = [\n {\n value: 'file',\n text: 'Files',\n },\n {\n value: 'board',\n text: 'Boards',\n },\n];\n\ntype Props = {\n selectedFile?: any;\n handleModalClose: () => void;\n onSelect: any;\n selectedVirtualBackgroundUrl: string;\n};\n\nexport const FilesTabContent = (props: Props) => {\n const {\n handleModalClose,\n onSelect,\n selectedFile,\n selectedVirtualBackgroundUrl,\n } = props;\n const [file, setFile] = React.useState({\n name: '',\n sizeText: '',\n size: 0,\n currentUpload: 0,\n status: '',\n progress: 0,\n } as ExtendedFile);\n const { t } = useTranslation();\n\n const { toast } = useToastNotifications();\n const [page, setPage] = React.useState(0);\n const [res, setRes] = React.useState({ count: '0', hasMore: 'false' } as any);\n const [drops, setDrops] = React.useState([] as DropItem[]);\n const [searchQuery, setSearchQuery] = React.useState('');\n const [loading, setLoading] = React.useState(true);\n const [fields, setFields] = React.useState([{ label: t('All'), value: '' }]);\n const [field, setField] = React.useState<any>(fields[0]);\n const [boards, setBoards] = React.useState([] as CombinedBoard[]);\n const { userData } = useAuthorizationContext();\n\n const itemType = selectedFile?.itemType || ItemTypes[0].value;\n\n const onDrop = useCallback(async (acceptedFiles: File[]) => {\n let f = {\n name: acceptedFiles[0].name,\n status: statuses.WAITING,\n sizeText: formatBytes(acceptedFiles[0].size, 2),\n size: acceptedFiles[0].size,\n progress: 0,\n currentUpload: 0,\n };\n setFile(f);\n\n const reader = new FileReader();\n\n reader.onabort = () => console.log('file reading was aborted');\n reader.onerror = () => console.log('file reading has failed');\n reader.onload = async () => {\n f = {\n ...f,\n status: statuses.UPLOADING,\n };\n setFile(f);\n\n try {\n const uploadedDrop: DropItem = await uploadDrop(\n acceptedFiles[0].name,\n acceptedFiles[0].type,\n reader.result\n );\n\n let previewUrl: any = uploadedDrop?.previewMedium || '';\n if (!previewUrl) {\n if (!uploadedDrop || !uploadedDrop.code) {\n toast({\n message: t('Error while uploading file, please try again later.'),\n });\n return;\n }\n\n f = {\n ...f,\n status: statuses.GENERATING_PREVIEW,\n progress: 90,\n };\n setFile(f);\n\n previewUrl =\n (await getPreviewLink(file, uploadedDrop.code, 1500)) || '';\n f = {\n ...f,\n status: statuses.FINISHED,\n progress: 100,\n };\n setFile(f);\n setTimeout(() => {\n refreshDropsAndBoards();\n }, 150);\n } else {\n f = {\n ...f,\n status: statuses.FINISHED,\n progress: 100,\n };\n setFile(f);\n setTimeout(() => {\n refreshDropsAndBoards();\n }, 100);\n }\n } catch (err) {\n toast({\n message: t('Error while uploading file, please try again later.'),\n });\n }\n };\n reader.readAsArrayBuffer(acceptedFiles[0]);\n }, []);\n\n const getPreviewLink = async (\n file: ExtendedFile,\n dropId: string,\n timeout: number\n ) => {\n return new Promise(resolve => {\n getDrop(dropId)\n .then((dropDetails: any) => {\n if (dropDetails && dropDetails.previewMedium) {\n return resolve(dropDetails.previewMedium);\n } else {\n return helper(dropId, timeout);\n }\n })\n .then((previewUrl: any) => {\n return resolve(previewUrl);\n })\n .catch(() => {});\n });\n };\n\n const helper = (dropId: string, timeout: number) => {\n return new Promise(resolve => {\n setTimeout(() => {\n getDrop(dropId)\n .then((dropDetails: any) => {\n if (dropDetails && dropDetails.previewMedium) {\n return resolve(dropDetails.previewMedium);\n } else {\n if (timeout >= 96000) {\n return resolve('');\n } else {\n return resolve(helper(dropId, timeout * 2));\n }\n }\n })\n .catch(() => {});\n }, timeout);\n });\n };\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n multiple: false,\n accept: ['image/png', 'image/jpeg'],\n });\n\n const onSearch = (query: string) => {\n setSearchQuery(query.toLowerCase());\n };\n\n const fetchDrops = async () => {\n const response = await getDrops({\n boardId: field.value || '',\n search: searchQuery,\n page: page + 1,\n type: 'IMAGE',\n dropType: DROPTYPE_OPTIONS.OWNED,\n });\n\n setPage(page + 1);\n setRes(response);\n setDrops([...drops, ...response.drops]);\n };\n\n const refreshDropsAndBoards = async () => {\n if (itemType !== 'file') {\n return;\n }\n setLoading(true);\n const response = await getDrops({\n boardId: field.value || '',\n search: searchQuery,\n type: 'IMAGE',\n dropType: DROPTYPE_OPTIONS.OWNED,\n });\n\n if (!boards || boards.length <= 1) {\n const boardsResponse = await getBoards({\n userId: Number(userData.id),\n customerId: Number(userData.customerId),\n }).catch(() => {});\n if (boardsResponse && boardsResponse.boards) {\n setBoards(boardsResponse.boards || []);\n const boardFields = generateBoardFields(boardsResponse.boards);\n setFields([...fields, ...boardFields]);\n }\n }\n setRes(response);\n setLoading(false);\n setDrops(response.drops);\n };\n\n React.useEffect(() => {\n if (itemType !== 'file') {\n return;\n }\n refreshDropsAndBoards();\n }, [field, searchQuery, itemType]);\n\n const uploadingFiles = !!file.name;\n\n const generateBoardFields = (boards: any) => {\n const boardFields = boards.map((board: any) => {\n return {\n label: board.name,\n value: board.id,\n };\n });\n\n return boardFields || [];\n };\n return (\n <>\n {!uploadingFiles && (\n <DropContent isDragActive={isDragActive} {...getRootProps()}>\n <input {...getInputProps()} />\n {!isDragActive && (\n <>\n <p>{t('Drag and drop files here to upload new file')}</p>\n <Button text={t('Browse files...')} variant='ghost' />\n </>\n )}\n {isDragActive && <p>{t('Drop files here')}</p>}\n </DropContent>\n )}\n {uploadingFiles && (\n <UploadFileContent>\n <UploadFileDescription>\n <UploadFileTitle>{file.name}</UploadFileTitle>\n <UploadFileProgress value={file.progress} max={100} />\n <UploadFileDetails>\n <FileStatus color={getStatusColor(file.status)}>\n {getStatusText(file.status)}\n </FileStatus>\n <FileSize>{getStatusSize(file)}</FileSize>\n </UploadFileDetails>\n </UploadFileDescription>\n <UploadFileAction></UploadFileAction>\n </UploadFileContent>\n )}\n {loading && <LoadingIndicator isLoading={loading} height='200px' />}\n {!loading && (\n <LibraryContainer>\n <Menu>\n <div style={{ width: '280px' }}>\n {/* <Search\n placeholder={`Search files...`}\n onSearch={onSearch}\n prevSearch={searchQuery}\n /> */}\n </div>\n <div style={{ display: 'flex' }}>\n <DropdownContainer>\n <Dropdown\n value={field}\n onChange={newValue => {\n setField(newValue);\n }}\n options={fields}\n /* dropdownHeight={450} */\n /* height={40} */\n placeholder={t('All')}\n isSearchable={false}\n creatable={false}\n />\n </DropdownContainer>\n </div>\n </Menu>\n\n <FilesSelector>\n <InfiniteScroll\n dataLength={page * parseInt(res.count)}\n next={fetchDrops}\n hasMore={res.hasMore === 'true'}\n loader={<h4>{t('Loading...')}</h4>}\n height={300}\n endMessage={\n <p style={{ textAlign: 'center' }}>\n <b>{t('No more files')}</b>\n </p>\n }\n >\n <Grid>\n {drops.map(drop => (\n <GridItem\n key={drop.code}\n backgroundUrl={drop.previewMedium}\n onClick={() => {\n onSelect(\n drop.previewMedium,\n 'custom',\n -1,\n drop.privacy,\n drop.code\n );\n handleModalClose();\n }}\n className={\n selectedVirtualBackgroundUrl === drop.previewMedium\n ? 'selected'\n : ''\n }\n ></GridItem>\n ))}\n </Grid>\n\n {!drops.length && <EmptyFiles>{t('No files found.')}</EmptyFiles>}\n </InfiniteScroll>\n </FilesSelector>\n </LibraryContainer>\n )}\n </>\n );\n};\n","import { Modal } from 'lib/components';\nimport { theme } from 'lib/style';\nimport React from 'react';\nimport { IoMdClose } from 'react-icons/io';\nimport styled from 'styled-components';\nimport { FilesTabContent } from './FilesTabContent';\nimport { useTranslation } from 'react-i18next';\n\nconst Container = styled.div`\n width: 592px;\n height: 648px;\n background: #ffffff;\n border: 1px solid #f7f8fa;\n box-shadow: 0px 4px 12px rgba(29, 30, 36, 0.04);\n borde-rradius: 4px;\n padding: 25px;\n box-sizing: border-box;\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nconst Title = styled.div`\n width: 275px;\n height: 24px;\n\n font-style: normal;\n font-weight: bold;\n font-size: 18px;\n line-height: 24px;\n color: #272a32;\n`;\n\nconst CloseButtonWrap = styled.div`\n margin-left: 20px;\n color: ${theme.palette.white};\n height: 24px;\n width: 24px;\n &:hover {\n opacity: 0.7;\n cursor: pointer;\n }\n`;\n\ntype Props = {\n handleModalClose: () => void;\n onSelect: any;\n selectedVirtualBackgroundUrl: string;\n};\n\nexport const VirtualBackgroundLibraryModal = ({\n handleModalClose,\n selectedVirtualBackgroundUrl,\n onSelect,\n}: Props) => {\n const { t } = useTranslation();\n return (\n <Modal\n style={{\n position: 'fixed',\n }}\n >\n <Container\n style={{\n width: '592px',\n height: '648px',\n background: '#FFFFFF',\n border: '1px solid #F7F8FA',\n boxShadow: '0px 4px 12px rgba(29, 30, 36, 0.04)',\n borderRadius: '4px',\n }}\n >\n <Header>\n <Title>{t('Select your virtual background')}</Title>\n <CloseButtonWrap title={'Close'}>\n <IoMdClose\n size={24}\n onClick={handleModalClose}\n color={theme.palette.label}\n />\n </CloseButtonWrap>\n </Header>\n\n <br />\n <FilesTabContent\n onSelect={onSelect}\n handleModalClose={handleModalClose}\n selectedVirtualBackgroundUrl={selectedVirtualBackgroundUrl}\n />\n </Container>\n </Modal>\n );\n};\n","import React from 'react';\nimport { FaBan } from 'react-icons/fa';\nimport { MdAddCircle, MdCheck } from 'react-icons/md';\nimport styled, { useTheme } from 'styled-components';\nimport { VirtualBackgroundLibraryModal } from './VirtualBackgroundLibraryModal';\n\nimport { ICustomVirtualBackground } from 'lib/api/customVirtualBackground/useCustomVirtualBackgroundQuery';\nimport { Button } from 'react-covideo-common';\nimport { useAuthorizationContext } from 'lib/context';\nimport { useTranslation } from 'react-i18next';\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: auto;\n background: #f6f7f9;\n border-radius: 5px;\n padding: 15px;\n flex-direction: column;\n box-sizing: border-box;\n .selected {\n border: 3px solid ${({ theme }) => theme.colors.primary[100]} !important;\n }\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n box-sizing: border-box;\n`;\n\nconst Title = styled.div`\n height: 24px;\n\n font-style: normal;\n font-weight: 500;\n font-size: 14px;\n line-height: 24px;\n color: #4e5461;\n`;\n\nconst GridContainer = styled.div`\n display: flex;\n width: 100%;\n height: 278px;\n box-sizing: border-box;\n overflow-y: scroll;\n margin-top: 20px;\n flex-wrap: wrap;\n`;\n\nconst Grid = styled.div`\n display: grid;\n width: 100%;\n grid-gap: 16.5px;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n @media screen and (max-width: 768px) {\n grid-template-columns: 1fr 1fr;\n }\n`;\n\ntype GridItemProps = {\n backgroundUrl?: string;\n};\nconst GridItem = styled.div<GridItemProps>`\n background: url('${props =>\n props.backgroundUrl ? props.backgroundUrl : ''}');\n background-color: white;\n background-repeat: no-repeat;\n background-size: cover;\n background-position: center;\n width: 100%;\n height: 100px;\n border-radius: 3px;\n cursor: pointer;\n justify-content: center;\n align-items: center;\n border: 1px solid rgba(39, 42, 50, 0.1);\n box-sizing: border-box;\n`;\n\nexport const VirtualBackgroundImages = [\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb1.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb2.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb3.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb4.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb5.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb6.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb7.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb8.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb9.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb10.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb11.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb12.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb13.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb14.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb15.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb16.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb17.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb18.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb19.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb20.webp',\n 'https://virtualbackgrounds.s3.amazonaws.com/Embed/vb21.webp',\n];\n\nconst CUSTOM_BACKGROUND_BUCKET_URL =\n 'https://cv-custom-virtual-backgrounds.s3.amazonaws.com/';\n\ninterface Props {\n onSelect: any;\n onMainButtonClick: any;\n showVideoLoader?: any;\n setShowVideoLoader?: any;\n selectedVirtualBackgroundUrl?: any;\n customVirtualBackgrounds?: ICustomVirtualBackground[];\n}\nexport const VirtualBackgrounds = ({\n onSelect,\n onMainButtonClick,\n selectedVirtualBackgroundUrl,\n customVirtualBackgrounds,\n}: Props) => {\n const { colors } = useTheme();\n const { t } = useTranslation();\n const [showLibraryModal, setShowLibraryModal] = React.useState(false);\n const customVbUrls = customVirtualBackgrounds?.map(vb => vb.url) || [];\n const { userData } = useAuthorizationContext();\n const virtualBackgrounds = [...customVbUrls, ...VirtualBackgroundImages];\n return (\n <>\n {showLibraryModal && (\n <VirtualBackgroundLibraryModal\n selectedVirtualBackgroundUrl={selectedVirtualBackgroundUrl}\n onSelect={onSelect}\n handleModalClose={() => {\n setShowLibraryModal(false);\n }}\n />\n )}\n <Container>\n <Header>\n <Title>{t('Select a virtual background')}</Title>\n <Button\n variant='primary'\n text={t('Done')}\n icon={<MdCheck size={24} />}\n onClick={onMainButtonClick}\n />\n </Header>\n <GridContainer>\n <Grid>\n <GridItem\n onClick={() => {\n onSelect('', 'none', -1);\n }}\n >\n <div\n style={{\n display: 'flex',\n color: colors.primary[100],\n justifyContent: 'center',\n alignItems: 'center',\n height: '100px',\n fontSize: '34px',\n borderRadius: '3px',\n boxSizing: 'border-box',\n }}\n className={\n selectedVirtualBackgroundUrl === '' ? 'selected' : ''\n }\n >\n <FaBan />\n </div>\n </GridItem>\n {userData.droplrAccess && (\n <GridItem\n onClick={() => {\n setShowLibraryModal(true);\n }}\n >\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n color: '#FF8B22',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100px',\n fontSize: '28px',\n borderRadius: '3px',\n boxSizing: 'border-box',\n }}\n >\n <MdAddCircle color={colors.primary[100]} />\n <div\n style={{\n marginTop: '5px',\n width: 'auto',\n display: 'flex',\n color: colors.primary[100],\n justifyContent: 'center',\n alignItems: 'center',\n height: 'auto',\n fontSize: '14px',\n boxSizing: 'border-box',\n }}\n >\n {t('Select your own')}\n </div>\n </div>\n </GridItem>\n )}\n {virtualBackgrounds.map((image: string, index: number) => {\n return (\n <GridItem\n key={image + index}\n backgroundUrl={image}\n className={\n selectedVirtualBackgroundUrl === image ? 'selected' : ''\n }\n onClick={() => {\n if (image.includes(CUSTOM_BACKGROUND_BUCKET_URL)) {\n onSelect(image, 'custom', -1);\n return;\n }\n onSelect(image, 'default', index);\n }}\n ></GridItem>\n );\n })}\n </Grid>\n </GridContainer>\n </Container>\n </>\n );\n};\n","import { useCustomVirtualBackgroundQuery } from 'lib/api/customVirtualBackground/useCustomVirtualBackgroundQuery';\nimport {\n ParagraphSmallBold,\n ParagraphSmall,\n} from 'lib/components/styles/typography';\nimport { useAuthorizationContext } from 'lib/context';\nimport VirtualBgIcon from 'lib/images/VirtualBgIcon';\nimport {\n checkIfFeatureIsEnabled,\n productFeature,\n} from 'lib/utils/productFeature';\n\nimport React, { useEffect, useState } from 'react';\nimport { Button, Tooltip } from 'react-covideo-common';\nimport styled, { useTheme } from 'styled-components';\nimport { RecordCamLoader } from './RecordCamLoader';\nimport {\n PrivacyTypes,\n RECORDING_STATUS,\n VirtualBackground,\n VirtualBackgroundTypes,\n} from './types';\nimport { useImageSegmenter } from './useImageSegmenter';\nimport { saveVirtualBackgroundToStorage } from './utils/virtualBackgrounds';\nimport { VirtualBackgrounds } from './virtualBackgrounds/VirtualBackgrounds';\nimport { useTranslation } from 'react-i18next';\n\nconst VirtualBackgroundsWrapper = styled.div`\n max-width: 770px;\n margin-top: 25px;\n`;\n\nconst VirtualBackgroundButtonWrapper = styled.div`\n position: absolute;\n bottom: 25px;\n right: 20px;\n z-index: 2;\n`;\n\ninterface IVirtualBackgroundButtonProps {\n videoRef: React.RefObject<HTMLVideoElement>;\n canvasRef: React.RefObject<HTMLCanvasElement>;\n isSegmenterActive: boolean;\n setIsSegmenterActive: React.Dispatch<React.SetStateAction<boolean>>;\n status: RECORDING_STATUS;\n initialImage: VirtualBackground;\n setIsLoadingVB: React.Dispatch<React.SetStateAction<boolean>>;\n isLoadingVb: boolean;\n}\n\nconst DisabledTooltipPopup = () => {\n const { t } = useTranslation();\n return (\n <>\n <ParagraphSmallBold>{t('Virtual Backgrounds')}</ParagraphSmallBold>\n <ParagraphSmall>\n {t(\n 'Select from a library of high-resolution images, or upload your own for extra personalization.'\n )}\n </ParagraphSmall>\n </>\n );\n};\n\nexport const VirtualBackgroundsButton = ({\n videoRef,\n canvasRef,\n isSegmenterActive,\n setIsSegmenterActive,\n status,\n initialImage,\n setIsLoadingVB,\n isLoadingVb,\n}: IVirtualBackgroundButtonProps) => {\n const { t } = useTranslation();\n const { colors, isCdkEnviroment } = useTheme();\n const [showVirtualBackgrounds, setShowVirtualBackgrounds] = useState(false);\n const { userData } = useAuthorizationContext();\n const [showVirtualBackgroundButton, setShowVirtualBackgroundButton] =\n useState(true);\n const [selectedVirtualBackground, setSelectedVirtualBackground] =\n useState<VirtualBackground>(initialImage);\n\n const {\n onCreateVirtualBackgroundHandler,\n onDestroyVirtualBackgroundHandler,\n imageRef,\n getCavansBgImage,\n } = useImageSegmenter(canvasRef, videoRef, setIsLoadingVB);\n\n const { data: customVirtualBackgrounds } = useCustomVirtualBackgroundQuery();\n\n const startVirtualBg = () => {\n if (\n !!canvasRef.current?.width &&\n !!canvasRef.current?.height &&\n !!videoRef.current?.videoWidth &&\n !!videoRef.current.videoHeight\n ) {\n onCreateVirtualBackgroundHandler();\n setIsSegmenterActive(true);\n }\n };\n\n const stopVirtualBg = () => {\n onDestroyVirtualBackgroundHandler();\n setIsSegmenterActive(false);\n };\n\n const onChangeImageHandler = (url: string, getCavansBgImage?: () => void) => {\n if (imageRef.current) {\n const imageElement = imageRef.current;\n imageElement.src = `${url}?t=virtual`;\n imageElement.crossOrigin = 'Anonymous';\n\n const handleImageLoad = () => {\n getCavansBgImage?.();\n if (!isSegmenterActive) {\n startVirtualBg();\n }\n };\n\n // Assign the onload handler\n imageElement.onload = handleImageLoad;\n\n // Cleanup function to remove the onload event handler\n return () => {\n imageElement.onload = null;\n };\n }\n };\n\n const onSelectImageSaveToLocalStorageHandler = ({\n url,\n type,\n index,\n privacy,\n id,\n }: VirtualBackground) => {\n const saveParams = { url, type, index, privacy, id };\n setSelectedVirtualBackground(saveParams);\n saveVirtualBackgroundToStorage(saveParams, userData.id);\n };\n\n const onVirtualBacgroundClickHandler = () => {\n setShowVirtualBackgrounds(!showVirtualBackgrounds);\n };\n\n useEffect(() => {\n if (userData.user?.packageDetails?.id == 0) {\n setShowVirtualBackgroundButton(true);\n } else if (userData.user?.packageDetails?.products) {\n const status = checkIfFeatureIsEnabled(\n userData,\n productFeature.VIRTUAL_BACKGROUNDS\n );\n setShowVirtualBackgroundButton(status);\n }\n }, []);\n\n useEffect(() => {\n if (status === RECORDING_STATUS.CAMERA_READY) {\n const { url } = selectedVirtualBackground;\n if (!!url && imageRef.current) {\n const imageElement = imageRef.current;\n imageElement.crossOrigin = 'Anonymous';\n imageElement.src = `${url}?t=virtual`;\n\n imageElement.onload = async () => {\n if (!isSegmenterActive) {\n getCavansBgImage?.();\n startVirtualBg();\n }\n };\n\n // Cleanup function to remove the onload event handler\n return () => {\n imageElement.onload = null;\n };\n }\n }\n }, [status]);\n\n useEffect(() => {\n return () => {\n onDestroyVirtualBackgroundHandler();\n };\n }, []);\n\n return (\n <>\n {!showVirtualBackgrounds && (\n <>\n {isLoadingVb && (\n <RecordCamLoader text={t('Applying Virtual Background')} />\n )}\n {status === RECORDING_STATUS.CAMERA_READY && (\n <>\n {!isLoadingVb && (\n <VirtualBackgroundButtonWrapper>\n <Tooltip\n position='bottom'\n children={\n <Button\n icon={<VirtualBgIcon />}\n variant={isCdkEnviroment ? 'text' : 'white'}\n disabled={!showVirtualBackgroundButton}\n text={t('Virtual Backgrounds')}\n onClick={onVirtualBacgroundClickHandler}\n />\n }\n popup={\n !showVirtualBackgroundButton ? (\n <DisabledTooltipPopup />\n ) : null\n }\n extendStyles={{\n popup: !showVirtualBackgroundButton\n ? {\n width: 210,\n gap: 8,\n display: 'flex',\n flexDirection: 'column',\n padding: '10px 24px',\n ...(isCdkEnviroment\n ? {\n color: colors.white[100],\n background: colors.black[100],\n }\n : {}),\n }\n : { display: 'none' },\n }}\n />\n </VirtualBackgroundButtonWrapper>\n )}\n </>\n )}\n </>\n )}\n <>\n <VirtualBackgroundsWrapper\n hidden={\n !showVirtualBackgrounds || status === RECORDING_STATUS.RECORDING\n }\n >\n <VirtualBackgrounds\n selectedVirtualBackgroundUrl={selectedVirtualBackground.url}\n customVirtualBackgrounds={customVirtualBackgrounds}\n onMainButtonClick={() => {\n setShowVirtualBackgrounds(false);\n }}\n onSelect={(\n url: string = '',\n type: VirtualBackgroundTypes,\n index: number,\n privacy: PrivacyTypes = 'PUBLIC',\n id: string = ''\n ) => {\n const saveParams = {\n url,\n type,\n index,\n privacy,\n id,\n };\n if (type === 'none') {\n stopVirtualBg();\n onSelectImageSaveToLocalStorageHandler(saveParams);\n return;\n }\n onSelectImageSaveToLocalStorageHandler(saveParams);\n onChangeImageHandler(url, getCavansBgImage);\n }}\n />\n </VirtualBackgroundsWrapper>\n </>\n\n <img\n ref={imageRef}\n crossOrigin='anonymous'\n alt='Segmentation'\n style={{ display: 'none' }}\n />\n </>\n );\n};\n","import { EXPRESS_API } from 'lib/config';\n\nexport type CreateTeleprompterScriptParams = {\n data: object;\n scriptId?: string;\n};\n\nexport type GetScriptsParams = {\n start?: number;\n limit?: number;\n search?: string;\n field?: string;\n order?: string;\n};\n\nexport const getScripts = async (params: GetScriptsParams): Promise<any> => {\n const response = await EXPRESS_API.get(`/teleprompter`, {\n params: { ...params, field: 'createdAt', order: 'desc' },\n });\n return response.data;\n};\n\nexport const getScript = async (scriptId: string): Promise<any> => {\n const response = await EXPRESS_API.get(`/teleprompter/${scriptId}`);\n return response.data;\n};\n\nexport const createScript = async ({\n data,\n}: CreateTeleprompterScriptParams) => {\n const response = await EXPRESS_API.post(`/teleprompter`, data);\n return response.data;\n};\n\nexport const updateScript = async ({\n scriptId,\n data,\n}: CreateTeleprompterScriptParams): Promise<any> => {\n const response = await EXPRESS_API.put(`/teleprompter/${scriptId}`, data);\n return response.data;\n};\n\nexport const deleteScript = async (scriptId: string): Promise<any> => {\n const response = await EXPRESS_API.delete(`/teleprompter/${scriptId}`);\n return response.data;\n};\n","import * as React from \"react\";\nconst SvgCovideoSmallLogoActive = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 15, height: 14, viewBox: \"0 0 15 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M3.31556 1.25854L0 4.66606V9.33212L3.31662 12.7638L6.49739 9.94768V3.954L3.31556 1.25854Z\", fill: \"#09534A\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M15.0001 6.74778V4.66606L10.4863 0H4.54083L3.50781 1.06115L10.2023 6.74778H15.0001Z\", fill: \"#09534A\" }), /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M10.2012 7.02661L3.50781 12.9614L4.51217 13.9999H10.4863L15.0001 9.33204V7.02661H10.2012Z\", fill: \"#09534A\" }));\nexport default SvgCovideoSmallLogoActive;\n","import styled from 'styled-components';\nimport SmallLogo from './covideoSmallLogoActive.svg?react';\n\nconst CovideoSmallLogoActive = styled(SmallLogo)`\n width: ${props => props.width || '21px'};\n height: ${props => props.height || '21px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CovideoSmallLogoActive;\n","import * as React from \"react\";\nconst SvgCdkSmallLogoActive = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 144, height: 145, viewBox: \"0 0 144 145\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { clipPath: \"url(#clip0_16_1167)\" }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M70.94 64.3999H65.67V79.9099H70.94C73.83 79.9099 75.3 79.2599 76.56 78.0499C78.03 76.6199 78.85 74.8499 78.85 72.2199C78.85 69.7599 78.12 67.9399 76.78 66.5199C75.53 65.1799 74.06 64.3999 70.95 64.3999H70.94Z\", fill: \"#231F20\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M72 0.23999C32.34 0.23999 0.0799866 32.5 0.0799866 72.16C0.0799866 111.82 32.34 144.08 72 144.08C111.66 144.08 143.92 111.82 143.92 72.16C143.92 32.5 111.66 0.23999 72 0.23999ZM38.5 87.12C29.04 87.12 22.77 80.38 22.77 72.13C22.77 63.88 29.08 57.18 38.28 57.18C43.46 57.18 48.73 59.17 52.36 62.02L47.82 66.94C45.18 64.78 41.77 63.53 39.22 63.53C33.99 63.53 30.62 67.46 30.62 72.17C30.62 76.88 34.08 80.81 39.43 80.81C42.71 80.81 46.13 78.87 48.63 76.53L53.21 81.37C49.8 84.39 44.7 87.12 38.48 87.12H38.5ZM82.7 82.24C80.24 84.66 76.7 86.26 71.12 86.26H58.12V58.05H71.12C76.39 58.05 80.28 59.52 82.91 62.28C85.33 64.83 86.67 68.28 86.67 72.13C86.67 75.98 85.29 79.69 82.7 82.24ZM113.45 86.26L103.82 74.12L100.41 77.36V86.26H92.81V58.05H100.41V68.63L111.51 58.05H121.1L109.13 69.24L122.82 86.26H113.45Z\", fill: \"#231F20\" })), /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"clipPath\", { id: \"clip0_16_1167\" }, /* @__PURE__ */ React.createElement(\"rect\", { width: 144, height: 145, fill: \"white\" }))));\nexport default SvgCdkSmallLogoActive;\n","import styled from 'styled-components';\nimport SmallLogo from './cdkSmallLogoActive.svg?react';\n\nconst CdkSmallLogoActive = styled(SmallLogo)`\n width: ${props => props.width || '21px'};\n height: ${props => props.height || '21px'};\n fill: ${props => props.color || 'currentColor'};\n path {\n fill: ${props => props.color || 'currentColor'};\n opacity: ${props => props.opacity || 'inherit'};\n }\n`;\n\nexport default CdkSmallLogoActive;\n","import { ChangeEvent, useEffect, useState } from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport { IoIosCheckmarkCircle, IoMdClose } from 'react-icons/io';\nimport dayjs from 'dayjs';\nimport { theme } from 'lib/style';\nimport {\n Modal,\n ButtonSwitch,\n NewTextInput,\n useToastNotifications,\n} from 'lib/components';\nimport { MdSave, MdOutlineClose } from 'react-icons/md';\nimport { apiKey, token } from 'lib/config';\nimport {\n handleScriptSpeedUsingScriptSize,\n sizeToSpeedRatioMedium,\n} from './utils/functions';\nimport { useAuthorizationContext } from 'lib/context';\nimport { CovideoMagicButton } from 'react-covideo-ai-assist';\nimport { uniqBy } from 'lodash';\nimport { Button } from 'react-covideo-common';\nimport { ITeleprompterSettings } from 'lib/context/teleprompter/types';\nimport {\n checkIfAutomotive,\n checkIfAutomotiveSalesRole,\n checkIfAutomotiveServiceRole,\n getMarkAsSentValue,\n} from 'lib/utils/automotiveRolePermissionChecks';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport {\n decodeAndReplaceText,\n getDefaultPromptUseCase,\n} from './utils/functions';\nimport { Gap } from 'lib/components/styles/layout';\nimport {\n getScripts,\n updateScript,\n createScript,\n} from 'lib/api/teleprompterApi';\nimport { PROMPT_TYPE } from '../library/components/const';\nimport { Dropdown } from 'lib/components/NewDropdown';\nimport { components, OptionProps } from 'react-select';\nimport CovideoSmallLogoActive from 'lib/images/CovideoSmallLogoActive';\nimport CdkSmallLogoActive from 'lib/images/CdkSmallLogoActive';\nimport { useTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { RecordingToolAction } from 'lib/hooks/GTM/actions/recording/types';\n\ntype Props = {\n handleModalClose: (shouldRefresh?: boolean) => void;\n handleSubmit?: (data?: any) => void;\n settings: ITeleprompterSettings | null;\n};\n\ntype ScriptType = {\n scriptId: number;\n content: string;\n customerId: number;\n sharedWithCompany: boolean;\n title: string;\n userId: number;\n sharedWithAll?: boolean;\n};\n\nconst ModalItem = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n width: auto;\n background-color: #fff;\n padding: 32px;\n width: 100%;\n`;\n\nconst ContentHeaderWrap = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 28px;\n &.list {\n width: 100%;\n justify-content: center;\n margin-bottom: 20px;\n }\n`;\n\nconst ContentHeader = styled.div`\n ${theme.fontBold700}\n font-size: ${theme.fontSizes.lg};\n color: ${theme.palette.themeDark};\n`;\n\nconst TabHeader = styled.div`\n display: flex;\n width: 100%;\n padding: 4px;\n align-items: center;\n background: linear-gradient(\n 0deg,\n rgba(0, 27, 83, 0.05),\n rgba(0, 27, 83, 0.05)\n ),\n #ffffff;\n border-radius: 24px;\n .scriptTab,\n .appearanceTab {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 50%;\n color: ${theme.palette.primaryDarkBlue};\n opacity: 0.5;\n font-weight: 600;\n font-size: 14px;\n cursor: pointer;\n &.active {\n background: #ffffff;\n height: 32px;\n border-radius: 16px;\n box-shadow: 0px 2px 4px rgba(29, 30, 36, 0.04);\n opacity: 1;\n }\n }\n`;\n\nconst StyledIoIosCheckmarkCircle = styled(IoIosCheckmarkCircle)`\n background: white;\n border-radius: 50%;\n`;\n\nconst SelectContent = styled.div`\n display: flex;\n width: 100%;\n margin: 16px 0;\n align-items: baseline;\n justify-content: space-between;\n .scriptList {\n width: 70%;\n }\n .fullWidth {\n width: 100%;\n }\n`;\n\nconst ContentBody = styled.section`\n display: flex;\n flex-direction: column;\n width: 528px;\n max-width: 100%;\n gap: 12px;\n justify-content: flex-end;\n align-items: right;\n`;\n\nconst CloseButtonWrap = styled.div<{ position?: string }>`\n margin-left: 10px;\n color: ${theme.palette.black_1_100};\n height: 24px;\n width: 24px;\n position: ${props => (props.position ? props.position : 'relative')};\n &.list--bth--wrap {\n left: 0;\n display: flex;\n align-items: center;\n width: 150px;\n }\n &:hover {\n opacity: 0.7;\n cursor: pointer;\n }\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n width: 100%;\n gap: 15px;\n justify-content: space-between;\n margin-top: 15px;\n .newScriptDiv {\n display: flex;\n justify-content: space-between;\n width: 100%;\n }\n .saveNewScript {\n display: flex;\n column-gap: 8px;\n width: 100%;\n .closeCreateScriptView {\n background: #eeeff2;\n display: flex;\n align-items: center;\n padding: 5px;\n cursor: pointer;\n border-radius: 5px;\n }\n }\n`;\n\ninterface TextAreaProps {\n onChange: any;\n value?: string;\n}\nconst Label = styled.label`\n font-weight: 500;\n`;\nconst Textarea = styled.textarea<TextAreaProps>`\n display: block;\n width: 100%;\n height: 200px;\n background: #ffffff;\n border: 1px solid #d0d3d9;\n box-sizing: border-box;\n border-radius: 4px;\n padding: 16px;\n`;\n\nconst Row = styled.div`\n float: left;\n width: 100%;\n display: flex;\n flex-direction: row;\n &:nth-child(1) {\n margin-top: 24px;\n }\n &:nth-child(2) {\n margin-top: 42px;\n margin-bottom: 36px;\n }\n`;\n\nconst Col = styled.div`\n flex: 100%;\n min-height: 60px;\n display: flex;\n flex-direction: column;\n row-gap: 8px;\n .scriptSizeContainer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n div {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n height: 65px;\n width: 32%;\n border-radius: 4px;\n border: solid 1px #d0d3d9;\n font-stretch: normal;\n font-style: normal;\n line-height: 1.5;\n letter-spacing: normal;\n color: black;\n cursor: pointer;\n font-weight: 700;\n &.smallSize {\n font-size: 14px;\n }\n &.mediumSize {\n font-size: 18px;\n }\n &.largeSize {\n font-size: 24px;\n }\n &.active {\n border: solid 1px ${props => props.theme.colors.primary[100]};\n outline: 0;\n }\n svg {\n position: absolute;\n top: -10px;\n right: -10px;\n }\n }\n }\n`;\n\nconst FieldWrapper = styled.div<{ width: string }>`\n width: ${props => (props.width ? props.width : 'auto')};\n > div {\n margin-left: 0;\n width: 90%;\n }\n`;\n\nconst Form = styled.form`\n float: left;\n width: 100%;\n color: #9297a2;\n`;\n\nconst Container = styled.div`\n width: 592px;\n height: 648px;\n background: #ffffff;\n border: 1px solid #f7f8fa;\n box-shadow: 0px 4px 12px rgba(29, 30, 36, 0.04);\n border-radius: 4px;\n padding: 25px;\n box-sizing: border-box;\n`;\n\nconst Header = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nconst Title = styled.div`\n width: 275px;\n height: 24px;\n font-style: normal;\n font-weight: bold;\n font-size: 18px;\n line-height: 24px;\n color: #272a32;\n`;\n\nconst CloseButtonWrap2 = styled.div`\n margin-left: 20px;\n color: ${theme.palette.white};\n height: 24px;\n width: 24px;\n &:hover {\n opacity: 0.7;\n cursor: pointer;\n }\n`;\n\nconst CovideoScriptTitle = styled.div`\n display: flex;\n gap: 8px;\n flex-direction: row;\n align-items: center;\n`;\n\nenum Views {\n LIST = 1,\n FILES = 2,\n CANCEL = 3,\n}\n\nconst CREATE_NEW_SCRIPT_ID = -1;\n\nfunction getSpeedOption(\n t: TFunction,\n settings?: { speed?: { value?: number; label?: string } }\n) {\n const fallback = sizeToSpeedRatioMedium(t)[2]; // { value, label }\n\n const raw = settings?.speed?.label ?? '';\n const m = String(raw).match(/(\\d+(?:[.,]\\d+)?)/);\n const parsed = m ? Number(m[1].replace(',', '.')) : undefined;\n\n if (parsed != null && !Number.isNaN(parsed)) {\n return { value: parsed, label: `${parsed} ${t('words / min')}` };\n }\n\n return fallback;\n}\n\nexport const ModalTeleprompterRecord = ({\n handleModalClose,\n handleSubmit,\n settings,\n}: Props) => {\n const { trackGTMRecordingToolIntearctionEvent } = useGTMAnalytics();\n const { t, i18n } = useTranslation();\n const scriptPositions = [\n {\n value: 'top',\n text: t('Top'),\n },\n {\n value: 'bottom',\n text: t('Bottom'),\n },\n ];\n\n const { isCdkEnviroment } = useTheme();\n const { env } = useConfigurationContext();\n const { userData } = useAuthorizationContext();\n const { toast } = useToastNotifications();\n const isAutomotiveServiceRole = checkIfAutomotiveServiceRole(userData);\n const isAutomotiveSalesRole = checkIfAutomotiveSalesRole(userData);\n const isAutomotive = checkIfAutomotive(userData);\n const isIMSEnabled = !!userData?.customer.isIMSEnabled;\n const defaultOptions = [\n { title: t('Create a new script'), scriptId: CREATE_NEW_SCRIPT_ID },\n ];\n const [currentView, setCurrentView] = useState<Views>(Views.LIST);\n const [currentTab, setCurrentTab] = useState<any>(0); // 0: Script, 1: appearance\n const [scriptTextTouched, setScriptTextTouched] = useState(false);\n const [appearanceConfig, setAppearanceConfig] = useState<any>({\n speed: getSpeedOption(t, settings as any),\n scriptSize: settings?.scriptSize || 'large',\n scriptPosition: settings?.scriptPosition || scriptPositions[0].value,\n content: decodeAndReplaceText(settings?.content || ''),\n activeScriptId: settings?.activeScriptId || CREATE_NEW_SCRIPT_ID,\n });\n\n const [scriptText, setScriptText] = useState<any>(\n decodeAndReplaceText(appearanceConfig.content || '')\n );\n const defaultScriptTitle = `New Script ${dayjs(new Date()).format('YYYY-MM-DD')}`;\n const [isNewScript, setIsNewScript] = useState(false);\n const [scriptTitleText, setScriptTitleText] = useState(defaultScriptTitle);\n\n const [scriptLoading, setScriptLoading] = useState<any>(false);\n\n const [scriptArray, setScriptArray] = useState<any>(defaultOptions);\n\n const themes = useTheme();\n\n const getAllScripts = async () => {\n try {\n setScriptLoading(true);\n const scriptsArrayObj: {\n scripts: ScriptType[];\n count: number;\n } = await getScripts({});\n sortScripts(scriptsArrayObj.scripts);\n\n if (!scriptsArrayObj.count) {\n setScriptLoading(false);\n }\n\n let scriptOptions = JSON.parse(JSON.stringify(scriptArray));\n\n scriptsArrayObj.scripts.forEach((e: ScriptType) => {\n scriptOptions = [...scriptOptions, e];\n });\n\n scriptOptions = uniqBy(scriptOptions, 'scriptId');\n\n setScriptArray(scriptOptions);\n setScriptLoading(false);\n } catch (exp) {\n console.log('exp at get scripts', exp);\n }\n };\n\n const sortScripts = (unsortedScripts: any) => {\n return unsortedScripts.sort(\n (\n a: { scriptId: string; title: string },\n b: { scriptId: string; title: string }\n ) => a.title.localeCompare(b.title)\n );\n };\n\n const handleScript = (ele: any) => {\n if (ele.scriptId !== '' && ele.scriptId > CREATE_NEW_SCRIPT_ID) {\n const content = decodeAndReplaceText(ele.content || '');\n setScriptTitleText(ele.title);\n setScriptText(content);\n setAppearanceConfig({\n ...appearanceConfig,\n content,\n activeScriptId: ele.sharedWithAll ? CREATE_NEW_SCRIPT_ID : ele.scriptId,\n });\n } else {\n setScriptText('');\n setAppearanceConfig({\n ...appearanceConfig,\n content: '',\n activeScriptId: ele.sharedWithAll ? CREATE_NEW_SCRIPT_ID : ele.scriptId,\n });\n setScriptTitleText(ele.title ?? defaultScriptTitle);\n }\n\n setScriptTextTouched(false);\n setScriptLoading(false);\n };\n\n const handleChange = (event: any) => {\n setScriptText(event.target.value);\n setScriptTextTouched(true);\n };\n const handleScriptSpeed = (ele: any) => {\n setAppearanceConfig({ ...appearanceConfig, speed: ele });\n };\n\n const handleScriptSize = (ele: any) => {\n setAppearanceConfig({ ...appearanceConfig, scriptSize: ele });\n };\n\n const handleScriptPosition = (ele: any) => {\n setAppearanceConfig({ ...appearanceConfig, scriptPosition: ele });\n };\n\n const handleNewScript = async () => {\n if (appearanceConfig.activeScriptId < 0) {\n setIsNewScript(true);\n } else {\n await updateOldScript();\n }\n };\n\n const updateOldScript = async () => {\n const content = encodeURIComponent(scriptText || '');\n const res = await updateScript({\n scriptId: appearanceConfig.activeScriptId,\n data: {\n content,\n },\n });\n if (res) {\n let scriptArrayLocal = JSON.parse(JSON.stringify(scriptArray));\n let indexOfListedEle = scriptArrayLocal.findIndex(\n (element: any) => element.scriptId == appearanceConfig.activeScriptId\n );\n if (indexOfListedEle != -1) {\n scriptArrayLocal[indexOfListedEle].content = decodeAndReplaceText(\n res.content\n );\n }\n setScriptArray(scriptArrayLocal);\n setIsNewScript(false);\n setAppearanceConfig({ ...appearanceConfig, content });\n setScriptTextTouched(false);\n toast({\n message: t('Script updated sucessfully.'),\n });\n }\n };\n\n const createNewScript = async () => {\n const content = encodeURIComponent(scriptText || '');\n const res = await createScript({\n data: {\n title: scriptTitleText,\n content,\n },\n });\n if (res) {\n let newList = scriptArray.filter((option: any) => !!option.scriptId);\n newList = [...newList, res];\n sortScripts(newList);\n newList = [...defaultOptions, ...newList];\n setScriptArray(newList);\n setIsNewScript(false);\n setAppearanceConfig({\n ...appearanceConfig,\n activeScriptId: res.scriptId,\n content,\n });\n setScriptTextTouched(false);\n toast({\n message: t('Script saved as {{scriptTitleText}}.', { scriptTitleText }),\n });\n setScriptTitleText(\n `New Script ${dayjs(new Date()).format('YYYY-MM-DD')}`\n );\n }\n };\n\n const readFileAndUpdateAppearanceConfig = async (source: any) => {\n fetch(source).then(function (response) {\n response.text().then(function (text) {\n setAppearanceConfig({ ...appearanceConfig, content: text });\n });\n });\n };\n\n const defaultPromptUseCase = getDefaultPromptUseCase(isAutomotive);\n\n useEffect(() => {\n getAllScripts();\n }, []);\n\n const sortedScriptArray = [\n ...scriptArray.filter((script: ScriptType) => !script.sharedWithAll),\n ...scriptArray.filter((script: ScriptType) => script.sharedWithAll),\n ];\n\n const CustomSingleValue = (props: any) => {\n const { data } = props;\n return (\n <components.SingleValue {...props}>\n {data.sharedWithAll ? (\n <CovideoScriptTitle>\n {isCdkEnviroment ? (\n <CdkSmallLogoActive\n width='20px'\n height='20px'\n aria-label='CDK Logo'\n />\n ) : (\n <CovideoSmallLogoActive\n width='20px'\n height='20px'\n aria-label='Covideo Logo'\n />\n )}\n {data.title}\n </CovideoScriptTitle>\n ) : (\n <>{data.title}</>\n )}\n </components.SingleValue>\n );\n };\n\n const CustomOption = (props: OptionProps<any>) => {\n const { data, innerRef, innerProps } = props;\n return (\n <div\n ref={innerRef}\n {...innerProps}\n style={{\n padding: '10px 15px',\n fontSize: '14px',\n lineHeight: '20px',\n fontWeight: 500,\n color: '##001B53',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n }}\n >\n {data.sharedWithAll ? (\n <CovideoScriptTitle>\n {isCdkEnviroment ? (\n <CdkSmallLogoActive\n width='20px'\n height='20px'\n aria-label='CDK Logo'\n />\n ) : (\n <CovideoSmallLogoActive\n width='20px'\n height='20px'\n aria-label='Covideo Logo'\n />\n )}\n {data.title}\n </CovideoScriptTitle>\n ) : (\n data.title\n )}\n </div>\n );\n };\n\n const List = (\n <ModalItem>\n <ContentHeaderWrap>\n <ContentHeader>{t('Telepromter')}</ContentHeader>\n <CloseButtonWrap title={t('Close')}>\n <IoMdClose\n size={24}\n onClick={() => setCurrentView(Views.CANCEL)}\n color={theme.palette.label}\n />\n </CloseButtonWrap>\n </ContentHeaderWrap>\n <ContentBody>\n <TabHeader>\n <div\n className={` scriptTab ${currentTab == 0 ? 'active' : ''}`}\n onClick={() => setCurrentTab(0)}\n >\n {t('Script')}\n </div>\n\n <div\n className={` appearanceTab ${currentTab == 1 ? 'active' : ''}`}\n onClick={() => {\n setCurrentTab(1);\n setIsNewScript(false);\n }}\n >\n {t('Appearance')}\n </div>\n </TabHeader>\n {currentTab == 1 ? (\n <Form>\n <Row>\n <Col>\n <Label htmlFor='videoSource'>{t('Speed')}</Label>\n <Dropdown\n name='videoSource'\n value={appearanceConfig.speed}\n placeholder={t('Select script...')}\n options={handleScriptSpeedUsingScriptSize(\n appearanceConfig.scriptSize,\n t\n )}\n onChange={handleScriptSpeed}\n dropdownHeight={140}\n height={40}\n isSearchable={false}\n creatable={false}\n />\n </Col>\n \n <Col>\n <Label htmlFor='audioSource'>{t('Position')}</Label>\n <div>\n <FieldWrapper width='150px'>\n <ButtonSwitch\n defaultValue={appearanceConfig.scriptPosition}\n values={scriptPositions}\n onChange={handleScriptPosition}\n />\n </FieldWrapper>\n </div>\n {/* {error && <Text>{error}</Text>} */}\n </Col>\n </Row>\n\n <Row>\n <Col>\n <Label>{t('Text size')}</Label>\n <div className='scriptSizeContainer'>\n <div\n className={` smallSize ${\n appearanceConfig.scriptSize == 'small' ? 'active' : ''\n }`}\n onClick={() => {\n handleScriptSize(`small`);\n }}\n >\n {t('Small')}\n {appearanceConfig.scriptSize == 'small' ? (\n <StyledIoIosCheckmarkCircle\n fill={themes.colors.primary[100]}\n size={22}\n />\n ) : null}\n </div>\n <div\n className={` mediumSize ${\n appearanceConfig.scriptSize == 'large' ? 'active' : ''\n }`}\n onClick={() => {\n handleScriptSize(`large`);\n }}\n >\n {t('Medium')}\n\n {appearanceConfig.scriptSize == 'large' ? (\n <StyledIoIosCheckmarkCircle\n fill={themes.colors.primary[100]}\n size={22}\n />\n ) : null}\n </div>\n <div\n className={` largeSize ${\n appearanceConfig.scriptSize == 'x-large' ? 'active' : ''\n }`}\n onClick={() => {\n handleScriptSize(`x-large`);\n }}\n >\n {t('Large')}\n {appearanceConfig.scriptSize == 'x-large' ? (\n <StyledIoIosCheckmarkCircle\n fill={themes.colors.primary[100]}\n size={22}\n />\n ) : null}\n </div>\n </div>\n </Col>\n </Row>\n </Form>\n ) : (\n <>\n <Gap flexWrap='no-wrap' alignItems='center'>\n <SelectContent>\n <div\n className={`scriptList ${\n userData.droplrAccess ? '' : 'fullWidth'\n }`}\n >\n <Dropdown\n options={sortedScriptArray}\n menuPortalTarget={document.body}\n menuPosition='fixed'\n menuPlacement={'bottom'}\n placeholder={t('Select script...')}\n value={sortedScriptArray.find(\n ele => ele.scriptId == appearanceConfig.activeScriptId\n )}\n onChange={handleScript}\n getOptionLabel={option => option.title}\n getOptionValue={option => option.scriptId}\n isLoading={scriptLoading}\n onMenuClose={() => setScriptLoading(false)}\n isSearchable={false}\n creatable={false}\n disabled={scriptLoading}\n customComponents={{\n SingleValue: CustomSingleValue,\n Option: CustomOption,\n }}\n />\n </div>\n </SelectContent>\n <CovideoMagicButton\n userInput={scriptText}\n defaultPromptType={PROMPT_TYPE.TELEPROPTER_SCRIPT}\n defaultPromptUseCase={defaultPromptUseCase}\n handleSubmitGeneratedContent={(generatedContent: string) => {\n setScriptText(generatedContent);\n setScriptTextTouched(true);\n }}\n variant='gradient'\n token={token}\n userData={{\n customer: {\n business: userData.customer.business,\n hasCovideoMagic:\n userData?.customer?.hasCovideoMagic?.toString() === '1',\n markVideosAsSent: getMarkAsSentValue(userData),\n },\n firstName: userData.firstName,\n isAutomotiveSalesRole: isAutomotiveSalesRole,\n isAutomotiveServiceRole: isAutomotiveServiceRole,\n isIMSEnabled: isIMSEnabled,\n isCompanyAdmin: userData.isCompanyAdmin,\n isAutomotive: isAutomotive,\n preferredLanguage: i18n.language,\n }}\n aiAssistTheme={'branding'}\n env={env}\n apiKey={apiKey}\n size={'small'}\n />\n </Gap>\n <Textarea\n value={scriptText}\n onChange={handleChange}\n placeholder={t('Type or paste your script here...')}\n />\n </>\n )}\n </ContentBody>\n <ButtonContainer>\n {!isNewScript ? (\n <div className='newScriptDiv'>\n {currentTab != 1 ? (\n <Button\n disabled={\n !appearanceConfig.activeScriptId ||\n !scriptText ||\n (scriptText && !scriptTextTouched) ||\n scriptText.trim() === ''\n }\n variant='secondary'\n text={t('Save To My Scripts')}\n icon={<MdSave size={18} />}\n onClick={handleNewScript}\n />\n ) : (\n <div> </div>\n )}\n <Button\n text={t('Turn on')}\n disabled={\n (appearanceConfig.activeScriptId !== CREATE_NEW_SCRIPT_ID &&\n !appearanceConfig.content) ||\n (appearanceConfig.activeScriptId === CREATE_NEW_SCRIPT_ID &&\n (!scriptText ||\n scriptText.trim() === '' ||\n (scriptText && !scriptTextTouched)))\n }\n onClick={() => {\n const data = appearanceConfig;\n if (data.activeScriptId === CREATE_NEW_SCRIPT_ID) {\n data.content = scriptText;\n }\n if (handleSubmit) {\n trackGTMRecordingToolIntearctionEvent?.({\n action: RecordingToolAction.APPLIED,\n });\n handleSubmit(data);\n }\n }}\n />\n </div>\n ) : (\n <div className='saveNewScript'>\n <NewTextInput\n style={{ boxSizing: 'border-box', width: '75%' }}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setScriptTitleText(e.target.value)\n }\n value={scriptTitleText}\n />\n <Button\n text={t('Save')}\n icon={<MdSave />}\n onClick={async () => {\n await createNewScript();\n }}\n />\n <div className='closeCreateScriptView'>\n <MdOutlineClose\n size='24px'\n color='#272A32'\n onClick={() => {\n setIsNewScript(false);\n }}\n />\n </div>\n </div>\n )}\n </ButtonContainer>\n </ModalItem>\n );\n\n const CancelView = (\n <ModalItem>\n <ContentHeaderWrap>\n <ContentHeader>{t('Cancel Teleprompter?')}</ContentHeader>\n </ContentHeaderWrap>\n <ContentBody>\n {t('You will lose all changes for the Teleprompter.')}\n </ContentBody>\n <ButtonContainer style={{ justifyContent: 'end' }}>\n <Button\n text={t('Yes, cancel')}\n onClick={() => {\n trackGTMRecordingToolIntearctionEvent?.({\n action: RecordingToolAction.REMOVED,\n });\n handleModalClose();\n }}\n variant={isCdkEnviroment ? 'text' : 'destructive'}\n />\n <Button\n text={t('Back to editing')}\n onClick={() => setCurrentView(Views.LIST)}\n />\n </ButtonContainer>\n </ModalItem>\n );\n\n let CurrentVievComponent = null;\n switch (currentView) {\n case Views.LIST:\n CurrentVievComponent = List;\n break;\n\n case Views.CANCEL:\n CurrentVievComponent = CancelView;\n break;\n }\n return (\n <Modal\n disableFullScreen={true}\n style={{ position: 'fixed', zIndex: 9 }}\n // maxHeight={\n // currentView == Views.CONFIRM\n // ? '200px'\n // : currentView == Views.LIST\n // ? '100%'\n // : currentView == Views.CANCEL\n // ? 'auto'\n // : undefined\n // }\n // overrideBodyHeight={true}\n >\n {CurrentVievComponent}\n </Modal>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\nimport VideoRecorderActions from './VideoRecorderActions';\nimport useRecorder from './useRecorder';\n\nimport { TeleprompterActions } from './Teleprompter/TeleprompterActions';\nimport TeleprompterDisplay from './Teleprompter/TeleprompterDisplay';\n\nimport { RecorderBody } from './RecorderBody';\n\nimport { useTeleprompter } from 'lib/context/teleprompter/provider';\nimport { RECORDING_STATUS } from './types';\nimport { RecordCamLoader } from './RecordCamLoader';\nimport { getVirtualBackgroundFromStorage } from './utils/virtualBackgrounds';\nimport { RecordingHeaderWithRouteGuard } from './RecordingHeadingWithRouteGuard';\nimport { VirtualBackgroundsButton } from './VirtualBackgroundsButton';\nimport { ModalTeleprompterRecord } from './ModalTeleprompterRecord';\nimport { DetailsRecordingPreview } from './detailsPreview/DetailsPreview';\nimport {\n checkIfFeatureIsEnabled,\n productFeature,\n} from 'lib/utils/productFeature';\nimport { useAuthorizationContext } from 'lib/context';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\n\ninterface ScreenRecorderProps {\n screenStream: MediaStream;\n stopAllStreams: () => void;\n handleGoToRecordHome: () => void;\n showPreview?: boolean;\n onStartUpladingVoiceOverHandler?: (blob: Blob) => void;\n toggleCamera: () => Promise<void>;\n isCameraToggled: boolean;\n}\n\nexport const RecordCam = ({\n screenStream,\n stopAllStreams,\n handleGoToRecordHome,\n showPreview = true,\n onStartUpladingVoiceOverHandler,\n toggleCamera,\n isCameraToggled,\n}: ScreenRecorderProps) => {\n const { t } = useTranslation();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const videoRef = useRef<HTMLVideoElement>(null);\n const { userData } = useAuthorizationContext();\n const { showVirtualBgFeature, showTeleprompterFeature } =\n useConfigurationContext();\n const initialImage = getVirtualBackgroundFromStorage(userData.id);\n // virtual background state\n const [isLoadingVB, setIsLoadingVB] = useState(!!initialImage.url);\n const [isSegmenterActive, setIsSegmenterActive] = useState(false);\n const isMobileDevice = checkIfMobileDevice();\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({ vin: '' });\n\n const {\n disableOrEnableTeleprompter,\n turnOnTeleprompterPlaying,\n saveTeleprompterSettingsHandler,\n onTeleprompterModalClose,\n showTeleprompterModal,\n isUsingTeleprompter,\n teleprompterSettings,\n } = useTeleprompter();\n\n const {\n stopRecording,\n pauseRecording,\n startCountDown,\n stopCountDown,\n status,\n recordedBlob,\n countdown,\n timeInSeconds,\n } = useRecorder({\n isSegmenterActive,\n canvasRef,\n videoRef,\n screenStream,\n stopAllStreams,\n onStartUpladingVoiceOverHandler,\n shouldStartCountdown: false,\n handleGoToRecordHome,\n isCameraToggled,\n });\n\n useEffect(() => {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_RECORDER,\n });\n }, []);\n\n useEffect(() => {\n if (\n countdown === 0 &&\n status === RECORDING_STATUS.COUNTDOWN &&\n isUsingTeleprompter\n ) {\n turnOnTeleprompterPlaying();\n }\n }, [countdown, status]);\n\n useEffect(() => {\n if (userData?.user?.packageDetails?.id) {\n const status = !checkIfFeatureIsEnabled(\n userData,\n productFeature.TELEPROMPTER\n );\n disableOrEnableTeleprompter(status);\n }\n }, []);\n\n if (status === RECORDING_STATUS.DONE && recordedBlob && showPreview) {\n return (\n <DetailsRecordingPreview\n videoBlob={recordedBlob}\n handleGoToRecordHome={() => {\n handleGoToRecordHome();\n }}\n />\n );\n }\n\n return (\n <>\n <RecordingHeaderWithRouteGuard\n status={status}\n handleGoToRecordHome={() => {\n handleGoToRecordHome();\n }}\n teleprompterActions={\n showTeleprompterFeature ? (\n <TeleprompterActions status={status} />\n ) : (\n <></>\n )\n }\n />\n\n <div style={{ position: 'relative' }}>\n {status === RECORDING_STATUS.IDLE && (\n <RecordCamLoader text={t('Loading camera')} />\n )}\n\n <RecorderBody\n videoRef={videoRef}\n canvasRef={canvasRef}\n countdown={countdown}\n status={status}\n teleprompter={<TeleprompterDisplay status={status} />}\n toggleCamera={toggleCamera}\n />\n\n {!isMobileDevice && showVirtualBgFeature && (\n <VirtualBackgroundsButton\n setIsLoadingVB={setIsLoadingVB}\n isLoadingVb={isLoadingVB}\n initialImage={initialImage}\n videoRef={videoRef}\n canvasRef={canvasRef}\n isSegmenterActive={isSegmenterActive}\n setIsSegmenterActive={setIsSegmenterActive}\n status={status}\n />\n )}\n </div>\n <VideoRecorderActions\n startCountDown={startCountDown}\n stopCountDown={stopCountDown}\n pauseRecording={pauseRecording}\n stopRecording={stopRecording}\n status={status}\n timeInSeconds={timeInSeconds}\n isLoadingVB={isLoadingVB}\n />\n\n {showTeleprompterModal && (\n <ModalTeleprompterRecord\n handleModalClose={onTeleprompterModalClose}\n handleSubmit={saveTeleprompterSettingsHandler}\n settings={teleprompterSettings}\n />\n )}\n </>\n );\n};\n","import { IUserSettings } from 'lib/context/record/types';\nimport { IVideoQuality, IVideoSettings } from '../types';\nconst FRAME_RATE = 24;\n\nexport const getAudioSettings = (\n userSettings: IUserSettings\n): { deviceId: string } | false => {\n const deviceId = userSettings?.audioSource?.value as string | undefined;\n if (!deviceId) {\n return false;\n }\n return { deviceId };\n};\n\nconst QUALITY_MAP: { [key: string]: IVideoQuality } = {\n low: { width: { ideal: 640 }, height: { ideal: 360 } },\n standard: { width: { ideal: 1280 }, height: { ideal: 720 } },\n high: { width: { ideal: 1920 }, height: { ideal: 1080 } },\n};\n\nexport const getVideoSettings = (\n userSettings: IUserSettings\n): IVideoSettings => {\n const quality = userSettings?.videoQuality\n ? QUALITY_MAP[userSettings.videoQuality]\n : QUALITY_MAP.standard;\n\n return {\n ...quality,\n frameRate: FRAME_RATE,\n deviceId: !!userSettings?.videoSource?.value\n ? (userSettings?.videoSource?.value as string)\n : undefined,\n };\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { Gap, Stack } from 'lib/components/styles/layout';\nimport {\n Heading,\n ParagraphNormal,\n ParagraphSmallBold,\n} from 'lib/components/styles/typography';\nimport { Button } from 'react-covideo-common';\nimport { IoPersonCircle } from 'react-icons/io5';\nimport { MdLaptop, MdPerson, MdSettings } from 'react-icons/md';\nimport styled, { css, useTheme } from 'styled-components';\nimport {\n enableCamera,\n getSafariScreenAndCameraStreams,\n getScreenAndCameraStreams,\n handleScreenCapture,\n} from './utils/media';\nimport { ModalRecordingVideosSettings } from './ModalRecordingVideoSettings';\nimport { RecordBoth } from './RecordBoth';\nimport { ScreenRecorder } from './ScreenRecorder';\nimport { RecordCam } from './RecordCam';\nimport { useRecordSettings } from 'lib/context/record/provider';\nimport { isOpera, isFirefox, isSafari } from './utils/browserChecks';\nimport { getAudioSettings, getVideoSettings } from './utils/recorderSettings';\nimport { useHistory } from 'react-router-dom';\nimport { TeleprompterProvider } from 'lib/context/teleprompter/provider';\nimport { screenSizes } from 'lib/style/theme';\nimport { checkIfMobileDevice } from 'lib/utils/functions';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\nimport { useTranslation } from 'react-i18next';\nimport { useGTMTrackPageView } from 'lib/hooks/GTM/useGTMTrackPageView';\nimport { useGTMAnalytics } from 'lib/hooks/GTM/useGTMAnalytics';\nimport { SelectRecordingType } from 'lib/hooks/GTM/actions/recording/types';\nimport { TRACKED_PAGES } from 'lib/hooks/GTM/utils';\n\nconst RecordOption = styled.div<{ error: boolean }>`\n display: flex;\n flex-direction: column;\n width: 176px;\n height: 176px;\n padding: 32px;\n border-radius: 4px;\n border: solid 2px #eeeff2;\n background-color: white;\n justify-content: space-between;\n align-items: center;\n color: ${({ theme }) => theme.colors.neutral[80]};\n\n &:hover {\n cursor: ${({ error }) => (error ? 'not-allowed' : 'pointer')};\n border: solid 2px #d0d3d9;\n }\n`;\n\nconst MainRecordContentWrapper = styled(Gap)`\n border-radius: 8px;\n margin: 56px auto 0 auto;\n background-color: ${({ theme }) => theme.colors.neutral[10]};\n\n ${({ theme }) =>\n theme.containerWidth < screenSizes.sm &&\n css`\n width: 100%;\n padding: 24px 0;\n `}\n`;\n\nconst RecordingOptionWrapper = styled(Gap)`\n ${({ theme }) =>\n theme.containerWidth < screenSizes.sm &&\n css`\n flex-direction: column;\n `}\n`;\n\nconst ShowRecorderWrapper = styled.div`\n ${({ theme }) =>\n theme.containerWidth < screenSizes.sm &&\n css`\n width: 100%;\n padding: 0 16px;\n `}\n`;\n\nconst IoPersonCircleWrapper = styled.div`\n background-color: white;\n border-radius: 50px;\n position: absolute;\n border: 2px solid white;\n bottom: 65px;\n left: 35px;\n`;\n\nexport const ChooseRecordingOptions = ({\n extendStyles,\n showPreview,\n onStartUpladingVoiceOverHandler,\n}: {\n extendStyles?: {\n mainRecordContentWrapper?: React.CSSProperties;\n showRecorderWrapper?: React.CSSProperties;\n };\n showHelpDesk: boolean;\n showPreview?: boolean;\n onStartUpladingVoiceOverHandler?: (blob: Blob) => void;\n showLegacyRecorderSwitch: boolean;\n}) => {\n const {\n showRecordBothFeature,\n showRecordCamFeature,\n showRecordScreenFeature,\n } = useConfigurationContext();\n const { trackVideoSpecificPagesManually } = useGTMTrackPageView({\n vin: '',\n });\n const { trackGTMSelectRecordingTypeEvent } = useGTMAnalytics();\n const history = useHistory();\n const [settingsOpen, setSettingsOpen] = useState(false);\n const { t } = useTranslation();\n const { recordingError, updateErrorMessage, userSettings, recorderSettings } =\n useRecordSettings();\n const { colors } = useTheme();\n\n const [isFrontCamera, setIsFrontCamera] = useState<boolean>(); // Track which camera is being used\n\n const [showRecordOption, setShowRecordOption] = useState<\n 'cam' | 'screen' | 'both' | null\n >(null);\n const [isPromptOpen, setIsPromptOpen] = useState(false);\n // main stream\n const [screenStream, setScreenStream] = useState<MediaStream | null>(null);\n // helpers for cleaning streams\n const displayMediaRef = useRef<MediaStream | null>(null);\n const cameraStreamRef = useRef<MediaStream | null>(null);\n // PIP ref\n const videoCameraPipRef = useRef<HTMLVideoElement>(null);\n const isCameraToggled = useRef<boolean>(false);\n\n const audioSettings = getAudioSettings(userSettings);\n const videoSettings = getVideoSettings(userSettings);\n\n const stopAllStreams = async () => {\n if (displayMediaRef.current) {\n displayMediaRef.current.getTracks().forEach(track => track.stop());\n }\n if (cameraStreamRef.current) {\n cameraStreamRef.current.getTracks().forEach(track => track.stop());\n cameraStreamRef.current = null;\n }\n if (screenStream) {\n screenStream.getTracks().forEach(track => track.stop());\n }\n if (document.pictureInPictureElement) {\n await document.exitPictureInPicture();\n }\n if (videoCameraPipRef.current && videoCameraPipRef.current.srcObject) {\n const stream = videoCameraPipRef.current.srcObject as MediaStream;\n\n stream.getTracks().forEach(track => track.stop());\n\n videoCameraPipRef.current.srcObject = null;\n }\n };\n\n const screenCaptureHandler = async () => {\n if (recordingError || isPromptOpen) {\n return;\n }\n try {\n setIsPromptOpen(true);\n const stream = await handleScreenCapture(\n displayMediaRef,\n audioSettings,\n videoSettings\n );\n if (stream) {\n setScreenStream(stream);\n trackGTMSelectRecordingTypeEvent?.({\n type: SelectRecordingType.SCREEN,\n });\n setShowRecordOption('screen');\n }\n setIsPromptOpen(false);\n } catch (error) {\n stopAllStreams();\n setIsPromptOpen(false);\n console.log(error, 'screenCaptureHandler');\n }\n };\n\n const enableCameraHandler = async () => {\n if (recordingError || isPromptOpen) {\n return;\n }\n try {\n setIsPromptOpen(true);\n const stream = await enableCamera(\n cameraStreamRef,\n audioSettings,\n videoSettings\n );\n if (stream) {\n setScreenStream(stream);\n trackGTMSelectRecordingTypeEvent?.({ type: SelectRecordingType.CAM });\n setShowRecordOption('cam');\n }\n setIsPromptOpen(false);\n } catch (error) {\n stopAllStreams();\n setIsPromptOpen(false);\n console.log(error, 'enableCameraHandler');\n updateErrorMessage();\n }\n };\n\n const toggleCamera = async () => {\n try {\n isCameraToggled.current = true;\n const nextIsFrontCamera = !isFrontCamera;\n const toggledCamera = recorderSettings.videoSource.filter(source => {\n // Include sources that don't match \"front\" if isFrontCamera is true\n return nextIsFrontCamera\n ? source.label.toLowerCase().includes('front')\n : source.label.toLowerCase().includes('back');\n });\n\n await stopAllStreams();\n const stream = await enableCamera(cameraStreamRef, audioSettings, {\n ...videoSettings,\n deviceId: !!toggledCamera[0]?.value\n ? (toggledCamera[0]?.value as string)\n : undefined,\n });\n if (stream) {\n setScreenStream(stream);\n trackGTMSelectRecordingTypeEvent?.({ type: SelectRecordingType.CAM });\n setShowRecordOption('cam');\n }\n setIsFrontCamera(nextIsFrontCamera);\n } catch (error) {\n console.error('Error toggling camera:', error);\n }\n };\n\n const enableBothHandler = async () => {\n if (recordingError || videoCameraPipRef.current === null || isPromptOpen) {\n return;\n }\n\n try {\n setIsPromptOpen(true);\n const stream = !isSafari\n ? await getScreenAndCameraStreams(\n displayMediaRef,\n cameraStreamRef,\n audioSettings,\n videoSettings,\n videoCameraPipRef\n )\n : await getSafariScreenAndCameraStreams(\n displayMediaRef,\n cameraStreamRef,\n audioSettings,\n videoSettings,\n videoCameraPipRef\n );\n\n setScreenStream(stream);\n setShowRecordOption('both');\n trackGTMSelectRecordingTypeEvent?.({\n type: SelectRecordingType.SCREEN_AND_CAM,\n });\n setIsPromptOpen(false);\n } catch (error) {\n stopAllStreams();\n console.log(error, 'enableCameraHandler');\n setIsPromptOpen(false);\n }\n };\n\n const handleGoToRecordHome = () => {\n setShowRecordOption(null);\n stopAllStreams();\n };\n\n const isMobileDevice = checkIfMobileDevice();\n\n useEffect(() => {\n handleGoToRecordHome();\n }, [history.location]);\n\n useEffect(() => {\n const checkIfIsFrontCamera = !!userSettings?.videoSource?.label\n ?.toLowerCase()\n ?.includes('front');\n setIsFrontCamera(checkIfIsFrontCamera);\n }, [userSettings]);\n\n useEffect(() => {\n if (showRecordOption === null) {\n trackVideoSpecificPagesManually?.({\n ...TRACKED_PAGES.VIDEOS_RECORD,\n });\n }\n }, [showRecordOption]);\n\n return (\n <>\n <Stack gap='32px'>\n {showRecordOption === null && (\n <MainRecordContentWrapper\n flexDirection='column'\n gap='44px'\n style={extendStyles?.mainRecordContentWrapper}\n >\n <Heading color={colors.black[100]}>\n {t('Choose recording option')}\n </Heading>\n <RecordingOptionWrapper gap='32px'>\n {showRecordBothFeature &&\n !isOpera &&\n !isFirefox &&\n !isMobileDevice && (\n <RecordOption\n onClick={enableBothHandler}\n style={{ position: 'relative' }}\n error={!!recordingError}\n >\n <MdLaptop size={72} />\n <IoPersonCircleWrapper>\n <IoPersonCircle size={28} />\n </IoPersonCircleWrapper>\n <ParagraphNormal\n color={colors.black[100]}\n textAlign='center'\n >\n {t('Screen+Cam')}\n </ParagraphNormal>\n </RecordOption>\n )}\n {showRecordScreenFeature && !isMobileDevice && (\n <RecordOption\n onClick={screenCaptureHandler}\n error={!!recordingError}\n >\n <MdLaptop size={72} />\n <ParagraphNormal color={colors.black[100]} textAlign='center'>\n {t('Screen Only')}\n </ParagraphNormal>\n </RecordOption>\n )}\n {showRecordCamFeature && (\n <RecordOption\n onClick={enableCameraHandler}\n error={!!recordingError}\n >\n <MdPerson size={72} />\n <ParagraphNormal color={colors.black[100]} textAlign='center'>\n {t('Cam Only')}\n </ParagraphNormal>\n </RecordOption>\n )}\n </RecordingOptionWrapper>\n </MainRecordContentWrapper>\n )}\n {!!recordingError && showRecordOption === null && (\n <ParagraphSmallBold>{recordingError}</ParagraphSmallBold>\n )}\n\n {showRecordOption === 'screen' &&\n screenStream instanceof MediaStream && (\n <ShowRecorderWrapper style={extendStyles?.showRecorderWrapper}>\n <ScreenRecorder\n screenStream={screenStream}\n stopAllStreams={stopAllStreams}\n handleGoToRecordHome={handleGoToRecordHome}\n showPreview={showPreview}\n onStartUpladingVoiceOverHandler={\n onStartUpladingVoiceOverHandler\n }\n />\n </ShowRecorderWrapper>\n )}\n\n {showRecordOption === 'cam' && screenStream instanceof MediaStream && (\n <ShowRecorderWrapper style={extendStyles?.showRecorderWrapper}>\n <TeleprompterProvider>\n <RecordCam\n screenStream={screenStream}\n stopAllStreams={stopAllStreams}\n handleGoToRecordHome={handleGoToRecordHome}\n showPreview={showPreview}\n onStartUpladingVoiceOverHandler={\n onStartUpladingVoiceOverHandler\n }\n toggleCamera={toggleCamera}\n isCameraToggled={isCameraToggled.current}\n />\n </TeleprompterProvider>\n </ShowRecorderWrapper>\n )}\n {showRecordOption === 'both' && screenStream instanceof MediaStream && (\n <ShowRecorderWrapper style={extendStyles?.showRecorderWrapper}>\n <RecordBoth\n screenStream={screenStream}\n stopAllStreams={stopAllStreams}\n handleGoToRecordHome={handleGoToRecordHome}\n showPreview={showPreview}\n onStartUpladingVoiceOverHandler={onStartUpladingVoiceOverHandler}\n />\n </ShowRecorderWrapper>\n )}\n\n <video ref={videoCameraPipRef} style={{ display: 'none' }} />\n\n {showRecordOption === null && (\n <Button\n icon={<MdSettings size={18} />}\n variant='secondary'\n text={t('Recording settings')}\n onClick={() => setSettingsOpen(true)}\n />\n )}\n </Stack>\n {settingsOpen && (\n <ModalRecordingVideosSettings\n handleModalClose={() => setSettingsOpen(false)}\n />\n )}\n </>\n );\n};\n","import { ChooseRecordingOptions } from './ChooseRecordingOptions';\nimport { RecordSettingsProvider } from 'lib/context/record/provider';\nimport { TopBar } from 'lib/components';\nimport { Button } from 'react-covideo-common';\nimport { MdArrowBack } from 'react-icons/md';\nimport styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { useHistory } from 'react-router-dom';\nimport { TitleWrapper } from '../lesaTV/LesaTV';\n\nimport { useTranslation } from 'react-i18next';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nexport const RecordHome = () => {\n const { t } = useTranslation();\n const history = useHistory();\n\n return (\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n variant='transparent'\n icon={<MdArrowBack size='18' />}\n onClick={() => history.push('/')}\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{t('Record Video')}</TitleWrapper>}\n />\n <RecordSettingsProvider>\n <ChooseRecordingOptions showHelpDesk showLegacyRecorderSwitch />\n </RecordSettingsProvider>\n </Wrapper>\n );\n};\n","import { Route, Switch } from 'react-router-dom';\nimport { RecordHome } from './RecordHome';\n\nexport const RecordingRoutes = () => {\n return (\n <Switch>\n <Route path='/record/home' component={RecordHome} />\n </Switch>\n );\n};\n","// src/i18n.ts\nimport i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\n\nimport en from './locales/en.json';\nimport es from './locales/es.json';\nimport fr from './locales/fr.json';\n\ni18n.use(initReactI18next).init({\n resources: {\n en: { translation: en },\n es: { translation: es },\n fr: { translation: fr },\n },\n fallbackLng: 'en',\n supportedLngs: ['en', 'es', 'fr'],\n interpolation: { escapeValue: false },\n react: { useSuspense: false },\n saveMissing: true,\n missingKeyHandler: function (lng, ns, key, fallbackValue) {\n console.warn('Missing translation key:', { lng, ns, key, fallbackValue });\n },\n});\n\nexport default i18n;\n","import { theme } from 'lib/style';\nimport { screenSizes } from 'lib/style/theme';\nimport styled, { css } from 'styled-components';\n\nconst ContentWrapper = styled.div`\n display: flex;\n box-sizing: border-box;\n width: 1246px;\n max-width: 100%;\n margin: 0 auto;\n justify-content: space-between;\n align-items: flex-start;\n padding-bottom: 50px;\n`;\n\nexport const FullScreenModalContent = styled(ContentWrapper)`\n margin-top: 0;\n display: flex;\n flex-direction: column;\n width: 956px;\n padding-bottom: 0;\n`;\n\nexport const EmptySearch = styled.div`\n display: flex;\n height: 100%;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n min-height: 530px;\n`;\n\nexport const FullScreenModalFooter = styled(ContentWrapper)`\n display: flex;\n justify-content: flex-end;\n margin-top: 32px;\n padding-bottom: 0;\n`;\n\nexport const VideosList = styled.div`\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n max-width: 925px;\n`;\n\nexport const Video = styled.div`\n width: 100%;\n display: flex;\n align-items: center;\n height: 56px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nexport const BaseModalText = styled.div`\n height: 24px;\n margin-left: 24px;\n font-size: 16px;\n line-height: 1.5;\n text-align: left !important;\n color: ${props => props.theme.colors.neutral[100]};\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n`;\n\nexport const BaseHeaderText = styled(BaseModalText)`\n font-size: 14px;\n color: ${props => props.theme.colors.neutral[60]};\n display: flex;\n`;\n// vehicle year\nexport const VehicleYearWidth = css`\n max-width: 185px;\n min-width: 80px;\n`;\nexport const VehicleYear = styled(BaseModalText)`\n ${VehicleYearWidth}\n`;\n\nexport const VehicleYearHeader = styled(BaseHeaderText)`\n ${VehicleYearWidth}\n`;\n// vehicle make\nexport const VehicleMakeWidth = css`\n max-width: 180px;\n min-width: 130px;\n`;\nexport const VehicleMake = styled(BaseModalText)`\n ${VehicleMakeWidth}\n`;\nexport const VehicleMakeHeader = styled(BaseHeaderText)`\n ${VehicleMakeWidth}\n`;\n// vehicle model\nexport const VehicleModelWidth = css`\n width: inherit;\n`;\nexport const VehicleModel = styled(BaseModalText)`\n ${VehicleModelWidth}\n`;\n\nexport const VehicleModelHeader = styled(BaseHeaderText)`\n ${VehicleModelWidth}\n`;\n\nexport const PreviewModelHeader = styled(BaseHeaderText)`\n width: 105px;\n margin-left: 0;\n`;\n\nexport const Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nexport const TitleWrapper = styled.div`\n font-style: normal;\n font-weight: 600;\n font-size: 15px;\n line-height: 24px;\n text-align: center;\n color: white;\n`;\n\nexport const SearchAndFilterWrapper = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n gap: 8px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n flex-direction: column;\n width: 100%;\n `}\n`;\n\nexport const TableContentContainer = styled.div`\n background: ${theme.palette.white};\n`;\n\nexport const YearWrap = styled.div`\n width: 216px;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nexport const TablePaginationContainer = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: flex-end;\n margin-top: 16px;\n`;\n\nexport const PaginationText = styled.span`\n color: ${theme.palette.gray80};\n height: 20px;\n font-size: 14px;\n font-weight: 400;\n font-stretch: normal;\n font-style: normal;\n line-height: 20px;\n letter-spacing: normal;\n color: #4e5461;\n`;\n\nexport const PageInput = styled.input`\n height: 40px;\n width: 50px;\n margin-right: 16px;\n outline: 0;\n text-align: center;\n font-size: 15px;\n border: 1px solid ${({ theme }) => theme.colors.primary[20]};\n border-radius: 6px;\n`;\n\nexport const Navigation = styled.div`\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n align-items: center;\n ${({ theme }) =>\n theme.containerWidth < screenSizes.mb &&\n css`\n width: 100%;\n `}\n`;\n\nexport const SortCell = styled.div<{\n cursor?: 'pointer' | 'default' | 'auto';\n}>`\n padding-top: 2px;\n padding-left: 10px;\n cursor: ${props => (props.cursor ? props.cursor : 'default')};\n .active {\n fill: black;\n }\n`;\n\nexport const TableHeaderContainer = styled.div`\n width: 100%;\n display: flex;\n align-items: top;\n height: 32px;\n border-bottom: 1px solid rgb(223, 227, 230);\n`;\n\nexport const LoadingWrapper = styled.div`\n margin-top: 100px;\n`;\n","import { VideoPlayer } from '../../../app/pages/video/components/videoPlayer';\nimport CloseIcon from 'lib/images/CloseIcon';\nimport { Modal } from 'lib/components/modals/Modal';\nimport { theme } from 'lib/style';\nimport { screenSizes } from 'lib/style/theme';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport styled, { css } from 'styled-components';\n\nconst Content = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\nconst CloseButtonWrap = styled.div`\n background-color: ${theme.palette.themeDark};\n display: flex;\n justify-content: center;\n align-items: center;\n color: ${theme.palette.white};\n height: 24px;\n width: 24px;\n position: absolute;\n z-index: 10;\n right: 4px;\n top: 4px;\n border: 1px solid #fff;\n border-radius: 4px;\n &:hover {\n opacity: 0.7;\n cursor: pointer;\n }\n`;\n\nconst ModalItem = styled.div`\n display: block;\n position: relative;\n background-color: black;\n\n min-width: 660px;\n max-width: 800px;\n\n ${({ theme }) =>\n theme.containerWidth <= screenSizes.xs &&\n css`\n width: calc(100vw - 30px);\n min-width: unset;\n max-width: unset;\n `}\n`;\n\ntype PreviewProps = {\n handleModalClose: () => void;\n source: string;\n};\n\nexport const ModalVideoPreview = ({\n handleModalClose,\n source,\n}: PreviewProps) => {\n const { t } = useTranslation();\n const videoRef = React.createRef<HTMLVideoElement>();\n return (\n <Modal maxHeight='fit-content' onOutsideClick={handleModalClose}>\n <ModalItem>\n <CloseButtonWrap\n title={t('Close video preview')}\n onClick={handleModalClose}\n >\n <CloseIcon />\n </CloseButtonWrap>\n <Content>\n <VideoPlayer\n videoSource={source}\n videoRef={videoRef}\n autoplay={true}\n height='405px'\n width={'100%'}\n />\n </Content>\n </ModalItem>\n </Modal>\n );\n};\n","import { useToastNotifications } from 'lib/components';\nimport { EXPRESS_API } from 'lib/config';\nimport { InventoryItem } from 'lib/context';\nimport { useTranslation } from 'react-i18next';\nimport { useQuery } from 'react-query';\n\nexport enum VINReelStatus {\n PROCESSING = 'processing',\n COMPLETED = 'completed',\n FAILED = 'failed',\n PENDING = 'pending',\n}\n\nexport interface VINReel {\n itemId: number;\n vin: string;\n customerId: number;\n dealerId: number;\n status: VINReelStatus;\n videoUrl: string;\n thumbnailUrl: string;\n videoLength: number;\n gifUrl: string;\n\n inventoryItem?: InventoryItem;\n}\n\nexport enum VINReelSortKey {\n CREATED_AT = 'createdAt',\n YEAR = 'year',\n MAKE = 'make',\n MODEL = 'model',\n}\n\nexport enum PaginationConstants {\n DESCENDING = 'DESC',\n ASCENDING = 'ASC',\n}\n\nexport type GetVINReelsParams = {\n start?: number;\n limit?: number;\n search?: string;\n order?: PaginationConstants;\n sortKey?: VINReelSortKey;\n};\n\ninterface IGetVINReelsResult {\n count: number;\n data: VINReel[];\n}\n\nconst getVINReels = async (params: GetVINReelsParams) => {\n return (\n await EXPRESS_API.get('/vinreels', {\n params,\n })\n ).data as Promise<IGetVINReelsResult>;\n};\n\nexport const useGetVINReelsQuery = (params: GetVINReelsParams) => {\n const { toast } = useToastNotifications();\n const { t } = useTranslation();\n return useQuery(['VIN_REEL', params], () => getVINReels(params), {\n onError: err => {\n toast({\n message: t(\n \"We're currently experiencing difficulties fetching VINReels.\"\n ),\n });\n },\n });\n};\n","import { useToastNotifications } from 'lib/components';\nimport { EXPRESS_API } from 'lib/config';\nimport { useTranslation } from 'react-i18next';\nimport { useMutation } from 'react-query';\n\ninterface CopyVINReelData {\n itemId: number;\n videoTitle: string;\n}\n\nconst copyVINReel = async (body: CopyVINReelData) => {\n return (await EXPRESS_API.post('/vinreels/videos', body)).data;\n};\n\nexport const useCopyVINReelMutation = ({\n onSuccessCallback,\n}: {\n onSuccessCallback?: () => void;\n}) => {\n const { t } = useTranslation();\n const { toast } = useToastNotifications();\n\n return useMutation(copyVINReel, {\n onSuccess: () => {\n toast({ message: t('VINReel has been added to Video library.') });\n if (onSuccessCallback) {\n onSuccessCallback();\n }\n },\n onError: err => {\n toast({\n message: t(\n \"We're currently experiencing difficulties copying the VINReel to the Video library.\"\n ),\n });\n },\n });\n};\n","export default \"data:image/webp;base64,UklGRmgHAABXRUJQVlA4IFwHAACQbwCdASqAAuABPp1Op020NzKiopHoALATiWlu4XJx+s/50+yuzN5LT07P+uvZVjy2gXYbLyiFcmJVtPJ99F7iDa3Mx9NfEQfTXxEH018RB9NfEXEW+GSWku6CKN0gKVzhot39pAUrnDRbt6EBSucNFu/tIClc4aLd/aQFJCIPpr4iD6a+Il2V86F8zMfTX02Vbtg8lWeZj6a+PEkbPFnmY+mviIPpsO8XYPMKlc4bOt2weYVPKf2l1BgbkGlK7hNpAOB3f2kBrKY98cqBJq6R6rF6f2rnDRKj3NmOWiu5CGO7+0gKVzhotgbSAwB6IkT3maV9pAUkxKrdsHmFSQiD6a/Vsx9NfEQfTXxEFiXleOFr2CRwqk5d2kBSucNFu/U8WeZj6a+BC/7IHIcFZ5lKWhbXls3wt2P1ipChg52BghCKhvxZ5q7+0gKVzhosoKBiFb6hayiOe2VDCepc9JLy2Znyq3jKcSKGOo9pASKGS7+0gKVzheq8aOFTyUYRDE4N8ZCOOx4SA1Z2dVAVzilc4aLd/aK6Vzhot39pAMiFF8JvTmFkag4TaoRQPuer+YcG8j3ETWEIHzmYC9COcNFu/XA5aK7kIpFZwCPHKzQmBoDZCv/2yCrYRH1uje1uLegBPQd3qatUn6uacwFmBVniOtSucNFsDaQFK5w0W6SFx3yTKKfhc2HofMjMi3v8ZTWYJmdCbPTrv7SApXOF5MhfVxJDu52eZtJOPbPM5SKan+R9TeWrnDRI+mviIPpgzcQAKV8QKQQ/Dcco4ItRxaxwtewKKlVA4t1KXf2kBSucNEj6a+Ig+mDETtzQTushu6rxWradFTRxaxwtewLUBR2rmY+mviIRzzCpXOGi3esJ4NNIVRKRH4dF49j5QUiIcKT9QQRlhZFJLv7SApJiU/GvyxLVzhotaNe0OmOVjheD9eYhV3KtDnizzMfTXxEH018RB9N/orLksPtDRbv7SApXOCEzHtIClc4aLd/aQFK5w0W7+0gKVzhlmT7CxSucMqfU18RB9NfEQfTXxEH018RB+UgqVzhot39pAUrnDRbv7CxSucNFu/tFdK5gWAvR9NfEQfTXxEH018RB9NfFi7br2pXOGi3f2kBI3JLv7SApXOGi2BtIClc4DfX9gIg+mviIPpr4iD6a+Ig+m/2z5Jd/aP1nmY+mviIPpr4iD6a+Ig+mvgQAAP79ZMH00mGs/Vy5cuXLly5TlDbQbaDbQbaDbQbkkg7i0JnaQCDhhvwXlXNzCTXNc2RLlzZERAhkyZMmTI9tVpIZdzLuZkidA0U9cuXLlym3GB8OdtCi3ijpckE2jH6CGQpdOGfIyAg5wQqgm2ow1Krg7JAtNBtoNs3Iaow2KSsQHeBG5VCQSA3KqltQHgnrLvnZqnC4ycua8HYi6CBPgXPJiYZr80n6zn2E1jT3Vjsbc1W25h6vhl+WX3xj5aaPagtEKviRRNvgcJlhZWS+kfDfT+vLqqroKOeI3CQbXlpntcQmuGdGObqLzkFR+SYQoT3DpY8xfw+7FNN5ujkAjo6OAvOIP/NXbVMN0PFvwHSkJ3Y8UrMwOShDOKqVhuIcYnJVdBTyMDkMGuG+hKTEa5cjkrC5AeALlTgMv6ZUjydfffodVvh1NNhNwmbiEmuVx6Goy/mqbhH2Aa7uNFU7dtBKmNkVscjSlDWBCxVdHEknWPmeLa9ZD5K/appsdDgBILJmyOnbdcNJHxJe7S41pGqcwy43+9nU42FHxA9RbMJ9jEoh/uSrypP24fRZNdgJuxxh8vLgw3hP8c6TfxK1SHQkcZgcBsdn+DKvxDDb18Yqbnz6/GRJL0BqFFKKcF94rzCjW6CSU4oob5Kz7CH5XM2uz2TvSWVWZVm95WjT/MQtrqt1YCDo7FJFVJqa2Li0zdyKnAl/nxEUhwAyqH9z5gtZg86+6A2c6JXc6hcWyuTA+PK3w+fPnzPTSDa69QEZAXGbwRtuYOauK07sgn3jwXpO8tG16S75KDF4qh4KVgYsBKRDac5y19hBTztscqp56cDxqpFCXehgWuH7AbxR05igWMmsfPUeQRPA3O7Wo/lT7PGICl85jwU7LEOuf1kNCWmrXqdnK4hcv2fA2vE3Lokvq70Ta1YmI7lbnQeGf51YGxDon3oUagmcYMbkEefKizZWzGKh1187Ao7GNLxcywGkTvx3qPUXvkGRi5Irau39fMQcHay/ILTpdFwVKKeOOQMkvpA3ouEL2FQSCeeWl2phPl3H+pm4JqazzdT5TPvnWGie+wruyd4ORbf4AYMmAcV/j9lTVeVllfYL7poL1U78rvDqlWPnOLrd2CJSePegCVlIHELGc9drkze+9jSc9vtxSwYBiiVJVPdD7JxjzQPsp8/63yfQT6ENMXv+zo43gEWXX14820PPZvcIRt8nR5KUNg0BhMgfav5jVTnkZVc80m3ehSwL1JDdYEW62qi7JqkDYzKccAAA01AAh6/2AAAAHvvrf42kAAAXWDhqAAAAAAAAAAA=\"","import imagePlaceholder from './imagePlaceholder.webp';\n\nconst images = {\n imagePlaceholder,\n};\n\nexport default images;\n","import React, { useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n EmptySearch,\n LoadingWrapper,\n Navigation,\n PageInput,\n PaginationText,\n PreviewModelHeader,\n SearchAndFilterWrapper,\n SortCell,\n TableContentContainer,\n TableHeaderContainer,\n TablePaginationContainer,\n TitleWrapper,\n VehicleMake,\n VehicleMakeHeader,\n VehicleModel,\n VehicleModelHeader,\n VehicleYear,\n VehicleYearHeader,\n Video,\n VideosList,\n Wrapper,\n} from './style';\nimport { Gap } from 'lib/components/styles/layout';\nimport { IoMdArrowRoundDown, IoMdArrowRoundUp } from 'react-icons/io';\nimport { useHistory } from 'react-router-dom';\nimport { useConfigurationContext } from 'lib/context/ConfigurationContext';\n\nimport { LoadingIndicator } from 'lib/components/LoadingIndicator';\n\nimport { Button } from 'react-covideo-common';\n\nimport { screenSizes } from 'lib/style/theme';\nimport { PageInfo, Search } from '../lesaTV/components';\nimport { Container, TopBar } from 'lib/components';\nimport { MdArrowBack, MdChevronLeft, MdChevronRight } from 'react-icons/md';\n\nimport { VideoItemThumbnail } from '../library/components/VideoItemThumbnail';\nimport { ModalVideoPreview } from './ModalVideoPreview';\nimport {\n PaginationConstants,\n useGetVINReelsQuery,\n VINReel,\n VINReelSortKey,\n} from 'lib/api/vinReel/useGetVINReelsQuery';\nimport { useCopyVINReelMutation } from 'lib/api/vinReel/useCopyVINReelMutation';\nimport images from 'lib/images/Images';\n\nconst getDisplayName = (input: string[]) => input.filter(Boolean).join(' ');\n\ntype SortProps = {\n isSorted: boolean;\n order?: PaginationConstants;\n onChange: (value: PaginationConstants) => void;\n};\n\nexport const SortButtons = (props: SortProps) => {\n const { isSorted, order, onChange } = props;\n return (\n <SortCell cursor='pointer'>\n <IoMdArrowRoundUp\n className={\n isSorted && order === PaginationConstants.ASCENDING ? 'active' : ''\n }\n onClick={() => onChange(PaginationConstants.ASCENDING)}\n />\n <IoMdArrowRoundDown\n className={\n isSorted && order === PaginationConstants.DESCENDING ? 'active' : ''\n }\n onClick={() => onChange(PaginationConstants.DESCENDING)}\n />\n </SortCell>\n );\n};\n\nconst DEFAULT_PAGE = 1;\nconst DEFAULT_LIMIT = 8;\nconst DEFAULT_COUNT = 1;\n\nexport const VINReels = () => {\n const { containerWidth } = useConfigurationContext();\n const history = useHistory();\n const [searchTerm, setSearchTerm] = useState('');\n const [page, setPage] = useState(DEFAULT_PAGE);\n\n const { t } = useTranslation();\n const [vin, setVin] = useState('');\n const [order, setOrder] = useState<PaginationConstants>(\n PaginationConstants.ASCENDING\n );\n const [sortKey, setSortKey] = useState<VINReelSortKey | null>(null);\n const onSuccessCopy = () => {\n history.push(`/`);\n };\n const { data, isFetching, refetch } = useGetVINReelsQuery({\n start: ((page || 1) - 1) * (DEFAULT_LIMIT || 12),\n limit: DEFAULT_LIMIT,\n search: searchTerm,\n ...(!!sortKey && !!order ? { sortKey, order } : {}),\n });\n\n const { mutateAsync: copyVINReel, isLoading: isCopying } =\n useCopyVINReelMutation({ onSuccessCallback: onSuccessCopy });\n\n const isLoading = isFetching || isCopying;\n\n const selectedVINReel = (data?.data || []).find(\n vinReel => vinReel.vin === vin\n );\n\n const resetPage = () => {\n setPage(1);\n };\n\n const isNotSearchable = searchTerm.length > 0 && searchTerm.length < 3;\n\n useEffect(() => {\n if (isNotSearchable) {\n return;\n }\n refetch();\n }, [searchTerm]);\n\n const handleSortChange = (\n sortKey: VINReelSortKey,\n order: PaginationConstants\n ) => {\n setOrder(order);\n setSortKey(sortKey);\n setPage(DEFAULT_PAGE);\n };\n\n const copyVINReelHandler = async (vinReel: VINReel) => {\n const inventoryItem = vinReel?.inventoryItem;\n if (!inventoryItem) {\n return;\n }\n const videoTitle = getDisplayName([\n inventoryItem?.year.toString(),\n inventoryItem.make,\n inventoryItem.model,\n inventoryItem.stockNumber,\n ]);\n\n await copyVINReel({\n itemId: vinReel.itemId,\n videoTitle,\n });\n };\n\n const onPageChange = (direction: 'left' | 'right') => {\n if (direction === 'left') {\n setPage(prevPage => prevPage - 1);\n }\n if (direction === 'right') {\n setPage(prevPage => prevPage + 1);\n }\n };\n const lastPage = Math.ceil((data?.count || 0) / DEFAULT_LIMIT);\n const goToLibrary = () => history.push(`/`);\n\n const onSearchChangeHandler = async (search: string = '') => {\n setSearchTerm(search);\n resetPage();\n };\n\n return (\n <>\n <Wrapper>\n <TopBar\n left={\n <Button\n text={t('Back')}\n icon={<MdArrowBack size='18' />}\n onClick={() => goToLibrary()}\n variant='transparent'\n style={{\n color: 'white',\n }}\n />\n }\n center={<TitleWrapper>{t('VINReels Import')}</TitleWrapper>}\n />\n <Container>\n <SearchAndFilterWrapper>\n <Search\n handleSearch={onSearchChangeHandler}\n prevSearch={searchTerm}\n />\n </SearchAndFilterWrapper>\n </Container>\n </Wrapper>\n <TableContentContainer>\n <Container\n extendStyle={{\n wrapper: {\n padding:\n containerWidth >= screenSizes.xs ? '32px 16px' : '16px 0px',\n },\n }}\n >\n {isLoading ? (\n <LoadingWrapper>\n <LoadingIndicator isLoading={isLoading} />\n </LoadingWrapper>\n ) : isNotSearchable ? (\n <EmptySearch>\n <p>{t('Please enter at least three characters to search')}</p>\n </EmptySearch>\n ) : !data?.data.length ? (\n <EmptySearch>\n <p>\n {t(\n 'Oops! It looks like there are no videos matching your search terms.'\n )}\n </p>\n <p>{t('Try using different search term')}</p>\n </EmptySearch>\n ) : (\n <>\n <TableHeaderContainer>\n {containerWidth >= screenSizes.xs && (\n <PreviewModelHeader>{t('Preview')}</PreviewModelHeader>\n )}\n {containerWidth >= screenSizes.xs && (\n <VehicleYearHeader>\n {t('Year')}\n <SortButtons\n isSorted={sortKey === VINReelSortKey.YEAR}\n order={order}\n onChange={value =>\n handleSortChange(VINReelSortKey.YEAR, value)\n }\n />\n </VehicleYearHeader>\n )}\n <VehicleMakeHeader>\n {t('Make')}\n <SortButtons\n isSorted={sortKey === VINReelSortKey.MAKE}\n order={order}\n onChange={value =>\n handleSortChange(VINReelSortKey.MAKE, value)\n }\n />\n </VehicleMakeHeader>\n <VehicleModelHeader>\n {t('Model')}\n <SortButtons\n isSorted={sortKey === VINReelSortKey.MODEL}\n order={order}\n onChange={value =>\n handleSortChange(VINReelSortKey.MODEL, value)\n }\n />\n </VehicleModelHeader>\n </TableHeaderContainer>\n <VideosList>\n {(data?.data || [])?.map((vinReel: VINReel) => (\n <Video key={vinReel.vin}>\n {containerWidth >= screenSizes.xs && (\n <div style={{ width: '130px', height: '40px' }}>\n <VideoItemThumbnail\n onClick={() => setVin(vinReel.vin)}\n thumbnail={\n vinReel.thumbnailUrl || images.imagePlaceholder\n }\n videoId={vinReel.vin}\n processing={0}\n />\n </div>\n )}\n {containerWidth >= screenSizes.xs && (\n <VehicleYear>\n {vinReel?.inventoryItem?.year || ''}\n </VehicleYear>\n )}\n\n <VehicleMake>\n {vinReel?.inventoryItem?.make || ''}\n </VehicleMake>\n <VehicleModel>\n {vinReel?.inventoryItem?.model || ''}\n </VehicleModel>\n <Gap flexWrap='noWrap' gap='10px'>\n <Button\n variant='secondary'\n text={t('Add')}\n onClick={() => copyVINReelHandler(vinReel)}\n />\n </Gap>\n </Video>\n ))}\n </VideosList>\n\n <TablePaginationContainer>\n <Navigation>\n <PaginationText>{t('Go to:')}</PaginationText>\n <PageInput\n type='number'\n min={DEFAULT_COUNT}\n value={page}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (!e.currentTarget || !e.currentTarget.value) {\n return;\n }\n\n const newPage = parseInt(e.currentTarget.value);\n if (newPage <= 0) {\n resetPage();\n return;\n }\n if (newPage > lastPage) {\n setPage(lastPage);\n return;\n }\n\n setPage(newPage);\n }}\n />\n <PageInfo\n page={page - 1}\n size={DEFAULT_LIMIT}\n count={data?.count || 0}\n />\n <Button\n onClick={() => onPageChange('left')}\n icon={<MdChevronLeft size={20} />}\n disabled={page === DEFAULT_PAGE}\n size='small'\n variant='secondary'\n />\n <Button\n onClick={() => onPageChange('right')}\n icon={<MdChevronRight size={20} />}\n disabled={page === lastPage}\n size='small'\n variant='secondary'\n />\n </Navigation>\n </TablePaginationContainer>\n\n {!!vin && !!selectedVINReel && !!selectedVINReel?.videoUrl && (\n <ModalVideoPreview\n source={selectedVINReel?.videoUrl || ''}\n handleModalClose={() => {\n setVin('');\n }}\n />\n )}\n </>\n )}\n </Container>\n </TableContentContainer>\n </>\n );\n};\n","export enum AccessRole {\n USER = '1',\n ADMIN = '3',\n SUPERVISOR = '4',\n}\n","import styled from 'styled-components';\nimport { theme } from 'lib/style';\nimport { Logo, TopBar } from 'lib/components';\nimport { UserDropdown } from '../library/components';\nimport { useTranslation } from 'react-i18next';\n\nconst Wrapper = styled.div`\n background: ${theme.palette.gray10};\n`;\n\nconst NoAccessContainer = styled.div`\n position: absolute;\n height: 100%;\n top: 0;\n left: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: 16px;\n color: ${theme.palette.gray80};\n`;\n\nconst NoAccessContent = styled.div`\n max-width: 65%;\n`;\n\ntype Props = {\n handleUpdateToken: Function;\n};\n\nexport const NoAccessPage = ({ handleUpdateToken }: Props) => {\n const { t } = useTranslation();\n\n return (\n <Wrapper>\n <TopBar\n left={<UserDropdown handleUpdateToken={handleUpdateToken} />}\n center={<Logo />}\n />\n\n <NoAccessContainer>\n <NoAccessContent>\n {t(\n 'You are currently logged in with a user account that has no active functionalities assigned within Covideo integration.'\n )}\n </NoAccessContent>\n </NoAccessContainer>\n </Wrapper>\n );\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { MemoryRouter as Router, Route, Switch } from 'react-router-dom';\nimport { fetchUserData } from 'lib/api';\nimport {\n LoadingIndicator,\n MainWrapper,\n ToastNotificationsProvider,\n} from 'lib/components';\nimport { token, updateToken } from 'lib/config';\nimport { AuthorizationContextProvider } from 'lib/context';\nimport { Library } from './pages/library/Library';\nimport { Login } from './pages/login/Login';\nimport { ActionDispatchProvider } from 'lib/context/ActionDispatchContext';\nimport { InsertVideo } from './pages/insertVideo/InsertVideo';\n\nimport { VoiceOver } from './pages/voiceover/Voiceover';\nimport { WheelsTV } from './pages/wheelsTV/WheelsTV';\nimport { Merge } from './pages/merge/Merge';\nimport PreviewUpload from './pages/previewUpload/PreviewUpload';\nimport { LesaTV } from './pages/lesaTV/LesaTV';\nimport { RecordingRoutes } from './pages/recordv1/routes';\n\nimport '../i18n';\nimport { VINReels } from './pages/vinReels/VinReels';\nimport { AccessRole } from 'lib/const/AccessRole';\nimport { NoAccessPage } from './pages/noAccess/NoAccess';\nconst initialUser = {\n id: '',\n verified: 0,\n access: 0,\n customerId: 0,\n customer: {\n automotiveAccess: 0,\n },\n};\n\nfunction App() {\n const [isLoading, setIsLoading] = useState(true);\n const [user, setUser] = useState(initialUser);\n\n const isSupervisor = useMemo(\n () => String(user.access) === AccessRole.SUPERVISOR,\n [user.access]\n );\n\n const loadUser = async () => {\n if (!token) {\n setUser(initialUser);\n setIsLoading(false);\n return;\n }\n setIsLoading(true);\n try {\n const user = await fetchUserData();\n setUser(user);\n } catch (error) {}\n setIsLoading(false);\n };\n\n const onUpdateToken = async (jwt: string) => {\n updateToken(jwt);\n await loadUser();\n };\n\n useEffect(() => {\n loadUser();\n }, []);\n\n const isLoggedIn = !!user?.id;\n\n if (isLoading) {\n return (\n <MainWrapper>\n <LoadingIndicator height={400} isLoading={true} hideLoaderText />\n </MainWrapper>\n );\n }\n\n return (\n <AuthorizationContextProvider initialUser={user}>\n <ActionDispatchProvider>\n <ToastNotificationsProvider>\n <MainWrapper>\n <Router>\n {isLoggedIn && !isSupervisor && (\n <Switch>\n <Route path='/merge' component={Merge} exact={true} />\n <Route\n path='/voiceover/:videoId'\n component={VoiceOver}\n exact={true}\n />\n <Route\n path='/insert-video/:videoId'\n component={InsertVideo}\n exact={true}\n />\n <Route path='/wheels-tv' component={WheelsTV} />\n <Route path='/lesa-tv' component={LesaTV} />\n <Route path='/vinreels' component={VINReels} />\n\n <Route\n exact\n path='/preview-upload/:videoId'\n component={PreviewUpload}\n />\n <Route\n exact\n path='/'\n component={() => (\n <Library handleUpdateToken={onUpdateToken} />\n )}\n />\n <Route path='/record' component={RecordingRoutes} />\n </Switch>\n )}\n\n {isSupervisor && (\n <Switch>\n <Route\n exact\n path='/'\n component={() => (\n <NoAccessPage handleUpdateToken={onUpdateToken} />\n )}\n />\n </Switch>\n )}\n\n {!isLoggedIn && (\n <Switch>\n <Route\n exact\n path='/'\n component={() => (\n <Login handleUpdateToken={onUpdateToken} />\n )}\n />\n </Switch>\n )}\n </Router>\n </MainWrapper>\n </ToastNotificationsProvider>\n </ActionDispatchProvider>\n </AuthorizationContextProvider>\n );\n}\n\nexport default App;\n","import { useEffect, useState } from 'react';\n\nexport function useGTMInject({ gtmId }: { gtmId?: string }) {\n const [isLoadingScript, setIsLoadingScript] = useState(true);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !gtmId) {\n return setIsLoadingScript(false);\n }\n\n // Prevent duplicate script injection\n if (document.getElementById('gtm-script')) {\n return setIsLoadingScript(false);\n }\n\n // only CDK uses GTM for no\n\n // Inject GTM script\n const script = document.createElement('script');\n script.id = 'gtm-script';\n script.innerHTML = `\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','${gtmId}');\n `;\n document.head.appendChild(script);\n\n // Inject noscript fallback\n const noscript = document.createElement('noscript');\n noscript.id = 'gtm-noscript';\n noscript.innerHTML = `\n <iframe src=\"https://www.googletagmanager.com/ns.html?id=${gtmId}\"\n height=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"></iframe>\n `;\n document.body.appendChild(noscript);\n setIsLoadingScript(false);\n }, [gtmId]);\n return { isLoadingScript };\n}\n","import './index.css';\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport {\n ConfigurationProvider,\n WHITELABEL,\n} from 'lib/context/ConfigurationContext';\nimport App from './app/App';\nimport { updateToken } from 'lib/config';\nimport { clearCookies } from 'lib/utils/functions';\nimport { useState } from 'react';\nimport { useGTMInject } from 'lib/hooks/GTM/useGTMInject';\nimport { LoadingIndicator } from 'lib/components';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n retry: 0,\n },\n mutations: {\n retry: 0,\n },\n },\n});\n\nexport enum Feature {\n UPLOAD = 'upload',\n FOLDER = 'folder',\n RECORD_SCREEN = 'recordScreen',\n MERGE = 'merge',\n RECORD_CAM = 'recordCam',\n WHEELS_TV = 'wheelsTV',\n RECORD_BOTH = 'recordBoth',\n TRIM = 'trim',\n INSERT = 'insert',\n LANDING_PAGE = 'landingPage',\n QUICKSHARE = 'quickshare',\n CTA = 'CTA',\n VOICEOVER = 'voiceover',\n REACTIONS = 'reactions',\n AI_ASSIST = 'aiAssist',\n UPGRADE_MESSAGE = 'upgradeMessage',\n LESA_TV = 'lesaTV',\n MULTI_LOCATION = 'multiLocation',\n TELEPROMPTER = 'teleprompter',\n VIRTUAL_BG = 'virtualBg',\n WEBSITE_OVERLAY = 'websiteOverlay',\n LANGUAGE_DROPDOWN = 'languageDropdown',\n SSO = 'sso',\n VIN_REELS = 'vinReels',\n}\n\nexport type FeatureType =\n | 'insert'\n | 'recordScreen'\n | 'recordBoth'\n | 'recordCam'\n | 'upload'\n | 'trim'\n | 'merge'\n | 'wheelsTV'\n | 'voiceover'\n | 'quickshare'\n | 'folder'\n | 'landingPage'\n | 'CTA'\n | 'reactions'\n | 'aiAssist'\n | 'upgradeMessage'\n | 'lesaTV'\n | 'multiLocation'\n | 'teleprompter'\n | 'websiteOverlay'\n | 'virtualBg'\n | 'languageDropdown'\n | 'sso'\n | 'vinReels';\n\nexport enum Environment {\n DEVELOPMENT = 'development',\n SANDBOX = 'sandbox',\n STAGING = 'staging',\n PRODUCTION = 'production',\n}\n\nexport type EnvironmentType =\n | 'development'\n | 'sandbox'\n | 'staging'\n | 'production';\n\nexport type ShareData = {\n url: string;\n thumbnail: string;\n image: string;\n html: string;\n token: string;\n};\n\nexport type RecordData = {\n token: string;\n};\n\nexport type UploadData = {\n token: string;\n};\n\n/**\n * Logout from Covideo.\n * If called, removes the auth token and other Covideo data from local storage.\n */\nexport function logoutCovideo(): void {\n updateToken('');\n clearCookies();\n}\n\nexport type CovideoEmbedProps = {\n /** Used for tracking the origin of requests from this npm module. */\n apikey: string;\n /**\n * JWT token from Covideo.\n * If provided, disables the module's login/logout pages.\n * If not provided, users need to log in through the module's login page.\n */\n token?: string;\n /** Which Covideo environment to target */\n env?: Environment | EnvironmentType;\n /** Which Covideo features to hide */\n hideFeatures?: Feature[] | FeatureType[];\n /**\n * Callback triggered when a video is inserted.\n * @param shareData - Contains the auth token, video url, thumbnail url and HTML of the inserted video.\n */\n onVideoInsert?: (shareData: ShareData) => void;\n /**\n * Callback triggered when there is an error inserting a video.\n * @param error - The error occurred during video insert.\n */\n onVideoInsertError?: (error: unknown) => void;\n /**\n * Callback triggered when the record button is clicked.\n * @param data - Contains the auth token.\n */\n onRecordButtonClick?: (data: RecordData) => void;\n /**\n * Callback triggered when the upload button is clicked.\n * @param data - Contains the auth token.\n */\n onUploadButtonClick?: (data: UploadData) => void;\n /** Used for switching theme */\n whitelabel?: WHITELABEL;\n gtmId?: string;\n};\n\nexport const CovideoEmbed: React.FC<CovideoEmbedProps> = props => {\n const [render, setRender] = useState(0);\n const reRender = () => setRender(prev => prev + 1);\n if (!props?.apikey) {\n return <>Apikey is required.</>;\n }\n\n const { isLoadingScript } = useGTMInject({ gtmId: props.gtmId });\n\n if (isLoadingScript) {\n return (\n <div\n style={{\n fontFamily: 'Arial, sans-serif',\n }}\n >\n <LoadingIndicator isLoading={true} />\n </div>\n );\n }\n\n return (\n <QueryClientProvider client={queryClient}>\n <ConfigurationProvider {...props} reRender={reRender}>\n <App key={`${props?.env}${props?.token}${props?.apikey}${render}`} />\n </ConfigurationProvider>\n </QueryClientProvider>\n );\n};\n"],"names":["REACT_COVIDEO_EMBED_VERSION_HEADER_KEY","API_EXPRESS_MAP","COOKIE_NAMES","token","apiExpress","apiKey","updateToken","tokenNew","hasExternalJwt","EXPRESS_API","options","updateEnv","env","updateApiKey","key","axios","dayjs","utc","timezone","toString","o","k","toHHMMSSFF","sec_num","frame_rate","hours","minutes","seconds","milliseconds","frame","time","toMMSS","fractionDigits","generateFileName","userData","fileExt","generateVideoTitle","dateOfMonth","ordinalLetters","serverTimeToUserTime","format","userTimeZone","videoDate","serverUtcOffset","userTimezoneOffset","utcDateTime","reorder","list","startIndex","endIndex","result","removed","checkIfVideoIsTrimmed","trimStart","trimEnd","videoDuration","isSafari","toMB","KB","capitalizeFirstLetter","string","clearCookies","name","toMMSSTimestamp","checkIfMobileDevice","ConfigurationContext","createContext","GlobalStyle","createGlobalStyle","props","ConfigurationProvider","children","width","height","ref","useResizeDetector","onVideoInsert","onVideoInsertError","hideFeatures","apikey","onRecordButtonClick","onUploadButtonClick","reRender","featureVisibility","Feature","feature","showRecordFeature","showUploadFeature","showInsertFeature","value","themeName","isCdkEnviroment","jsxs","jsx","CovideoThemeProvider","useConfigurationContext","context","useContext","fetchUserData","data","DEFAULT_FOLDER_NAMES","COMPANY_FOLDER_ID","SHARED_FOLDER_PREFIX","ALL_FOLDERS","getFolders","folders","getVideos","params","videos","_a","_b","getVideo","videoId","deleteVideo","videoIds","deleteMultiple","companyVideos","url","mergeVideos","updateVideo","trimVideo","downloadVideo","fileName","response","saveAs","copyCompanyVideoToPrimary","startTranscription","getInventoryItems","createVideoRequest","getVoiceoverSignedURLs","uploadVoiceoverAudio","addVoiceoverToVideo","audioFileName","newVideoTitle","overwriteOriginal","cachedTags","getTags","page","size","search","all","sort","refresh","getWTVVideos","count","copyWTVVideo","getAttributes","filterByDepartment","videoAttributes","putVideoAttributes","SvgCovideoLogo","React","CovideoLogo","styled","Svg","SvgCdkLogo","CdkLogo","Logo","useTheme","screenSizes","systemFontStack","fontCommon","fontNormal400","fontNormal500","fontBold700","fontSizes","mediaQueryMinWidth","palette","Wrapper","DektopChildrenWrapper","Left","theme","css","Center","Right","EmptyDiv","TopBar","left","right","center","Container","extendStyle","Input","type","theme.palette","padding","ButtonStyled","backgroundColor","textColor","borderColor","fontSize","disabled","hoverBorderColor","IconWrapper","margin","IconOtherWrapper","TextWrapper","SubText","ButtonDropdown","text","subtext","icon","iconOther","onClick","title","animation","keyframes","Spinner","LoadingOverlay","LoadingSection","LoadingContainer","LoadingIndicator","isLoading","error","color","zIndex","onRetry","hideLoaderText","t","useTranslation","JWT_DECODED","GET_USER_START","GET_USER_ERROR","GET_USER_SUCCESS","authReducer","state","action","payload","AUTH_ACTIONS","defaultUseData","AuthorizationContext","AuthorizationContextProvider","initialUser","jwt","setJwt","useState","dispatch","useReducer","useEffect","decodedToken","jwtDecode","useAuthorizationContext","AutomotiveRole","MarkAsSentOptions","checkIfAutomotive","checkIfAutomotiveServiceRole","checkIfAutomotiveSalesRole","customer","automotiveRole","checkIfVideoRequestFieldsRequired","getMarkAsSentValue","Icon","CheckboxContainer","theme.mediaQueryMinWidth","HiddenCheckbox","CheckboxWrapper","StyledCheckbox","CheckboxInput","boxSize","checked","checkGroupIndicator","style","isAutomotive","event","removePadding","Dot","InsideDot","Radio","RadioInput","rest","DarkBackground","ModalContainer","ModalBody","Modal","widthOnDesktop","disableFullScreen","maxHeight","overrideBodyHeight","bodyOverflowY","bodyOverflowX","orig","Close","Component","light","marginTop","marginRight","MdClose","CloseButton","Message","theme.fontNormal500","theme.fontSizes","ToastNotification","message","ToastNotificationGroup","Context","ToastNotificationsProvider","scheduledNotification","setScheduledNotification","notifications","setNotifications","timeout","maxAge","notification","removeExpiredNotifications","isExpired","nextNotifications","n","Fragment","id","useToastNotifications","MainWrapper","Switch","NonSelectedBtn","ButtonSwitch","defaultValue","values","onChange","className","skipConfirmation","setValue","btn","Button","NewTextInput","VIDE0_ACTIVITY_TYPE","SvgClose","CloseIcon","CloseSvg","ModalItem","Header","Title","CloseButtonWrapper","Text","ButtonsWrapper","BlueBox","Disclaimer","DisclaimerIconWrap","ModalQuickShareMarkAsSent","handleModalClose","quickShareMarkAsSentHandler","isQuickShareLoading","markAsSentPayload","getMarkAsSentPayload","isCompanyAdmin","onSubmit","markAsSentConfirmed","finalPayload","AiFillInfoCircle","PROMPT_TYPE","getQuickshareDetails","useCopyClipboard","toast","copyToClipboardNonSafari","html","listener","e","copyToClipboardSafari","quickshareDetails","_","getQuickshareData","textArea","resolve","range","selection","markQuickShareAsSent","body","showProperToastAndCopyToClipboard","variables","useQuickShareMarkAsSentMutation","onSuccessCallback","copyClipboard","markAsSent","useMutation","dataToShow","useQuickShare","video","videoRequest","setShowModalQuickShareMarkAsSent","handleOnMarkAsSentSuccessCallback","isQuickshareLoading","quickShareMarkAsSentAsync","onQuickShareMutationHandler","videoActivityType","useImageLoadRetry","src","onLoad","imgRef","useRef","retryCount","setRetryCount","setError","handleLoad","handleError","VideoEncodingStatus","useVideoLoadRetry","checkField","enabled","videoData","setVideoData","isProcessed","cache","selectedVideos","index","VideoThumbnailWrapper","VideoThumbnail","VideoPlay","SpinnerWrapper","Label","VideoDuration","VideoItemThumbnail","thumbnail","duration","emailStatus","processing","thumbnailHeight","thumbnailWidth","refreshVideoList","prepareTime","d","imageLoadError","thumbnailAvailable","newDuration","isProcessingFailed","isVideoReady","isVideoFinishedProcessing","BsPlayFill","useOnClickOutside","callback","node","setNode","handleClickOutside","onOutsideClick","ProgressWrapper","Progress","ProgressBar","currentTime","scrub","small","progressRef","VolumeOffIcon","SvgIconPlay","PlayIcon","PlaySvg","SvgIconPause","PauseIcon","PauseSvg","SvgVector","VectorIcon","VectorSvg","SvgCheckmark","CheckmarkIcon","CheckmarkSvg","SvgCdkSmallLogo","CdkSmallLogo","SmallLogo","SvgCovideoSmallLogo","CovideoSmallLogo","VideoControlsLayout","BottomControlsLayout","LeftControls","RightControls","PlayButton","VolRange","VolControls","VolumeIconWrapper","TimeDisplay","ControlsButton","PlaybackSpeed","PLAYBACK_SPEEDS","VideoControls","isVideoPaused","isVideoMuted","togglePlay","handleMute","handleFullScreen","handleVolumeControl","volumeRange","playerIconsColor","playerBackgroundColor","setPlayBack","isVisible","videoRef","hideControls","showPlaybackSpeed","setShowPlaybackSpeed","playbackSpeed","setPlaybackSpeed","formatTimeToString","timeMinutes","timeMinutesString","timeSeconds","currentTimeString","volRangeRef","volumeMultiplied","setPlaybackRate","rate","openPlaybackSpeed","IoIosVolumeHigh","ps","MdFullscreen","VideoPlayerInteraction","GTMEvent","GTMPageApplication","GTMEventName","PageLocation","PageUrl","PageSection","toDecimalMinutes","unit","factor","mapToGTMVideoAttributes","mapToGtmVehicleAttributes","item","TRACKED_PAGES","hasDataLayer","pushToDataLayer","videoInteractonEvent","vehicleData","eventAttributes","gtmVideoAttributes","mapToGtmVideoMessageProperties","getVideoDurationMs","file","timeoutMs","reject","settled","timer","fail","cleanup","onLoadedMetadata","onCanPlay","onTimeUpdate","onError","finish","ms","err","forceComputeDuration","flattenObject","obj","trackedFields","trackedArrayFields","prefix","acc","fullKey","rootKey","isTrackedField","f","isTrackedArray","fieldsToTrack","field","isDottedTarget","isExactOrDeeper","getChangedFields","initialValues","currentValues","onlyChangedList","flatInitial","flatCurrent","changedFields","videoMessageInteractionEvent","videoMessageProperties","base","gtmVideoMessageProperties","gtmVideo","videoAttributeInteractionInteractionEvent","saveNewVideoInteractionEvent","mergedIds","changedFieldKeys","changes","GTMVideoInteractionActions","GTMSaveNewVideoInteractionTypes","GTMVideoMessageInteractionActions","selectRecordingTypeEvent","recordingToolIntearctionEvent","discardVideoEvent","startRecordingEvent","stopRecordingEvent","addVideoAttributeEvent","videoPlayerInteractionsEvent","useGTMAnalytics","isCdkUser","trackVideoInteractionEvent","useCallback","vehicle","trackVideoAttributeInteraction","trackSaveNewVideo","trackVideoMessageInteractionEvent","PlayerLayout","disablePointerEvents","Figure","FullscreenWrapper","FullScreen","Video","Overlay","Controls","RETRY_DELAY","VideoPlayer","videoSource","autoplay","playlist","preventWideSize","hideContext","startWithControls","disableControls","borderBottomRadius","FullscreenVideoWrapperBackgroundColor","setIsVideoLoading","setVideoDuration","setVideoIsProcessing","trackVideoPlayerInteractionsEvent","colors","playerBgColor","playerIcColor","setIsVideoPaused","setIsVideoMuted","setVolumeRange","setDuration","setCurrentTime","hasControls","setHasControls","isError","setIsError","retryTimeout","setRetryTimeout","hasControlsRef","playlistIndex","controlsRef","currentVideo","contextMenu","fullScreenHandle","useFullScreenHandle","toggleFullScreen","line","cues","i","volumeRef","volumeRefWidth","eventOffset","volume","progressElWidth","scrubTime","handleDurationChange","handleLoadedMetadata","controls","showControls","handleTimeUpdate","videoEndEvent","handleVideoEnded","start","end","newSrc","videoElement","playError","newColor","hex","Content","CloseButtonWrap","ModalVideoPreview","Card","opacity","Head","Date","Duration","LeftButtonsWrapper","VideoItem","isMerge","selectedVideosData","setSelectedVideosData","i18n","isCompanyVideo","showQuickshareFeature","showVoiceoverFeature","showAiAssistFeature","isAutomotiveServiceRole","isAutomotiveSalesRole","isIMSEnabled","trackGTMVideoInteractionEvent","history","useHistory","isCopyLoading","setIsCopyLoading","isDownloadLoading","setIsDownloadLoading","showPreviewModal","setShowPreviewModal","showModalMarkAsSent","onQuickShareButtonClick","clientTime","handleChange","handleDownload","createGTMVideoInteractionEvent","_c","handleCopy","IoMdAdd","IoIosShareAlt","CovideoMagicButton","content","MdCreateNewFolder","MdDownload","IoIosMic","v","IoMdCalendar","SearchWrapper","SearchIconWrapper","ClearIconWrapper","Search","prevSearch","handleSearch","containerWidth","searchTerm","setSearchTerm","handleSearchKeyUp","handleClear","placeholder","theme.screenSizes","IoMdSearch","MdClear","VideosGrid","NoVideos","locationKeys","userId","getUserLocations","useGetLocationsQuery","refetch","useQuery","signIntoLocation","locationId","useSignIntoLocation","DropdownArrowIcon","OptionWrapper","OptionIconWrapper","getControlStyles","isDisabled","menuIsOpen","selectProps","getOptionStyles","themes","isShareVideoModal","isFocused","isSelected","Dropdown","ariaLabel","getOptionLabel","getOptionValue","menuPosition","menuPlacement","menuPortalTarget","inputId","dropdownHeight","creatable","onMenuScrollToBottom","onMenuClose","extendStyles","showIndicator","chipValueSelected","isClearable","onInputChange","onCreateOption","isMulti","zIndexProp","menuZIndexProp","isSearchable","formatCreateLabel","closeMenuOnScroll","menuShouldBlockScroll","filterOption","formatOptionLabel","customComponents","onMenuOpen","maxMenuHeight","controlShouldRenderValue","createOptionPosition","autoFocus","commonProps","DropdownIndicator","MdArrowDropDown","styles","CreatableSelect","Select","Menu","SpainFlag","UKFlag","FranceFlag","UserDropdown","memo","handleUpdateToken","queryClient","useQueryClient","showMultiLocationFeature","showLanguageDropdownFeature","signIn","isChangingLocation","hasLocationsEnabled","locations","hasAccessToLocation","location","showMultiLocationPicker","open","setOpen","handleDropdownClick","prev","logout","currentLocation","locationOptions","changeLocation","languageOptions","menuItems","loc","MdLogout","doesMenuItemsExist","IoMdPerson","IoMdArrowDropup","IoMdArrowDropdown","option","opt","PageInfo","from","to","VideoTypeSales","VideoType","EXTERNAL_VIDEO_PREFIX","PackageName","initialState","getRandomInt","max","queryReducer","useQueryState","init","useQueryFetch","method","pathname","autoFetch","showToastMessage","loading","progress","fetchData","requestConfig","progressInterval","baseUrl","success","useCreateVideo","useEncodeVideo","fetch","usePresignedUrl","ActionDispatchContext","ActionDispatchProvider","setAction","useActionDispatchContextState","requestActionCreator","meta","successActionCreator","failureActionCreator","reducer","useActionListener","useS3Upload","checkIfFirefox","uploadVideo","uploadData","onUploadProgress","progressEvent","isFirefox","useVideoTranscriptionStart","SvgAdd","AddIcon","AddSvg","DragAndDropContainer","TextComponent","ButtonContainer","DragAndDrop","accept","inputStyle","onDrop","textStyle","validFile","handleDragEnter","handleDragLeave","handleDragOver","browseFiles","fileInput","ContentBody","ContentFooter","UploadFieldContainer","FlexContainer","Skill","ProgressData","ProgressContainer","UploadData","UploadingHeader","CancelContainer","ErrorMessage","MultipleUploadList","uploadingData","setUploadingData","uplVideo","uploadingArr","uploadingTotal","uploadActiveVideo","titleValidationArray","setTitleValidationArray","x","ele","total","editTitle","el","ud","isUploadInProgress","progressState","status","element","parseOptions","VideoUpload","onSuccess","currentView","setCurrentView","disableUpload","setDisableUpload","isSubmitClicked","setIsSubmitClicked","canceling","setCanceling","setProgress","uploadedVideoArray","setUploadedVideoArray","setUploadProgress","presignedUrl","getPresignedUrl","isLoadingUrl","urlError","isUploading","uploadError","createVideo","isCreating","createError","encodeVideo","isEncoding","encodeData","fileTitles","fileTitlesLength","transcribeVideo","appendFilesToQueue","files","filename","file_type","u","keys","handleSelectedFile","target","handleCloseWithCancel","handleSubmit","percentCompleted","isUploadingData","SubmitButton","btnTitle","uploadFormView","uploadingContent","cancelingContent","ModalUpload","useGtmVinInventoryQuery","vin","useGTMTrackPageView","vehiceReady","useLocation","cdkUserAttributes","_d","_e","trackVideoSpecificPagesManually","pageLocation","pageSection","excludeVehicleData","mergeIds","pageUrl","LAST_SELECTED_FOLDER_LOCAL_STORAGE_KEY_EMBED","getLastSelectedFolderFromLocalStorage","setLastSelectedFolderToLocalStorage","getValidInitialFolder","lastSelected","checkIfVinReelsAvailable","checkIfAISpotlightAvailable","checkIfAISpotlightAvailableForCustomer","checkIfQuickVideosAvailable","checkIfSuggestedContentAvailable","checkIfAIAssistantAvailable","checkIfAIAssistantAvailableForCustomer","checkIfAIMusicAvailable","checkIfAIScriptsAvailable","useAIFeatureFlags","useMemo","useAIFeatureAvailability","isVinReelsEnabled","isQuickVideosEnabled","isAISpotlightEnabled","isAIAssistantEnabled","isPronunciationAvailable","isDealershipHighlightsAvailable","isPersonalizationAvailable","isAIAssistantsAvailable","isQuickVideosAvailable","DropdownContainer","DropdownItem","AddonDropdown","dropdownItems","itemContent","CommonTypography","m","textAlign","maxWidth","ellipsis","CHeading","Heading","SubHeading","ParagraphNormal","ParagraphExtraSmall","ParagraphSmall","ParagraphSmallBold","DropdownTrigger","LesaSvg","WheelsTVIconSvg","VinReelsIconSvg","MediaTools","showActionDropdown","setShowActionDropdown","showWheelsTVFeature","showLesaTVFeature","showVinReelsFeature","isVinReelsAvailable","closeDropdown","isWheelsTVEnabled","isLesaEnabled","enabledFeatures","tooltipText","items","last","isDropdownEnabled","Tooltip","IoCarSport","BiChevronDown","IoMdCar","ActionBar","ActionBarSide","Navigation","FolderSelectWrapper","DEFAULT_FOLDER","DEFAULT_PAGE","DEFAULT_SIZE","CDS_FOLDERS","Library","showMergeFeature","showFolderFeature","setIsMerge","openUploadModal","setOpenUploadModal","uploadedVideoId","setUploadedVideoId","filter","setFilter","isLoadingFolders","filteredFolders","folder","foldersDictionary","keyBy","currentFolder","isSharedFolder","folderName","isLoadingVideos","videoCount","DEFAULT_FOLDER_VALUES","onSearch","query","searchQuery","onCancelMerge","onFolderChange","folderId","onPageChange","direction","handleMergeSelectedVideos","onUploadSuccess","uploadedVideoIds","userPackageId","showLoading","mergeDisabled","MdUpload","MdVideocam","MdChevronLeft","MdChevronRight","fadeUp","spin","LoginWrapper","LoginCard","HeadingSubtitle","CardSubtitle","FormGroup","LabelRow","FieldLabel","Anchor","InputRow","VerifyingText","PasswordWrapper","PasswordToggleIconWrapper","FormikErrorMessage","useCovideoTheme","CommonStyles","StyledLabel","StyledParagraph","TooltipContainer","IconTooltip","info","MdInfo","FormikLabel","label","isRequired","labelStyles","Gap","flexWrap","gap","flexDirection","alignItems","justifyContent","overflow","textOverflow","whiteSpace","Stack","p","Flex","flex","flexBasis","flexGrow","flexShrink","cursor","minWidth","border","borderLeft","borderBottom","borderRadius","TextInput","FormikInputField","useField","usernameSchema","Yup","passwordSchema","buildSSOUrl","ssoLoginUrl","relayState","checkUsername","useCheckUsernameMutation","UsernameForm","onVerified","onSso","Formik","setFieldError","trimmed","userExist","fullSSOUrl","isSubmitting","Form","MdArrowForward","SSOVerifyingLoader","SSOVerifying","username","SpinnerStyle","loginUser","useLoginMutation","PasswordForm","onPreviousStepHandler","showPassword","setShowPassword","accessToken","IoMdEyeOff","IoMdEye","MdArrowBack","Login","step","setStep","verifiedUsername","setVerifiedUsername","LINKSET_NONE_OPTION_VALUE","builderLandingPageTypeId","QUOTIBLE_LANDING_PAGE_TYPE_ID","SALES_PAGE_ID","WEBSITE_OVERLAY_LANDING_PAGE_ID","LandingPageType","defaultLPOption","getSalesServiceOption","prepareTemplateLandingPageOptions","templatesResponse","sendVehicle","sendQuote","lpDesign","disableCDSLandingPage","salesServicePageOption","disableStaticLandingPages","autoSelectedOption","defaultLandingPage","template","defaultLandingPageOption","uniqBy","Row","CheckboxInputWrapper","CheckboxLabel","AddWebsiteButton","NewWebsiteInput","InsertVideoSettings","linksetsData","templatesOptions","overlaysData","insertVideoData","setInsertVideoData","reactionsCustomerEnabled","showCTAFeature","showLandingPageFeature","showWebsiteOverlayFeature","showReactionsAndCommentsFeature","newWebsiteSelected","setNewWebsiteSelected","isWebsiteOverlaySelected","websitesOptions","linksetOptions","hasNone","setWebsite","debounce","currentTemplate","isQuotibleSelected","showWebsiteOverlayDropdown","showCTADropdown","websiteOverlayDropdownValue","ctaDropdownValue","selectedItem","useGetInventoryItems","soldFilter","videosRecordedFilter","countRecorded","OptionLabel","CustomOptionLabel","Vin","SingleValueWrapper","AddVehicleWrapper","SelectedVehicleWrapper","SelectedVehicleContainer","SelectedCarNameContainer","SelectedVehicleButtonContainer","VehicleSearchWrapper","CarInfoText","filterOptions","candidate","input","stockNumber","Option","components","SingleValue","NoOptionsMessage","VehicleSearch","onChangeVehicle","handleChangeVehicleButtonPress","handleRemoveVehicleButtonPress","setAddingVehicle","selectedVin","fetchSold","addingVehicle","hasIMS","vehicleTitle","setVehicleTitle","searchInventoryQuery","setSearchInventoryQuery","showUpgradeMessageFeature","selectStyle","selectedVehicleList","debouncedSearch","checkIfCustomerReactionsEnabled","checkIfReactionsEnabledByDefault","PreviewVideo","numberOfStills","PreviewVideoWrapper","VideoPreviewTrack","refArray","videoWidthPercent","RailOuter","RailInner","SliderRail","getRailProps","MainHandle","Slider","Handle","min","percent","showFloatingPreview","isActive","getHandleProps","changeVideoPosition","nChild","mouseOver","setMouseOver","previewvideoRef","onMouseEnter","onMouseLeave","miliseconds","Track","source","getTrackProps","Tick","tick","Wrap","VideoPreviewMemo","TimelineRange","setTrimDuration","setStart","addHistory","onSlideEnd","valueRef","showTickTime","showPreviewTrack","domain","onPlay","onTimeupdate","newValue","onUpdate","update","onSlideEndHandle","args","tickCount","sliderStyle","Rail","railProps","Handles","handles","activeHandleID","handle","Tracks","tracks","Ticks","ticks","TrimmedContainer","DisabledTimelineRange","Trim","isVideoTrimmed","isVideoLoading","InsertButton","disable","onCRMClick","insertingVideo","setInsertingVideo","showModalQuickShareMarkAsSent","modalGetMarkAsSentPayload","CopyVideoButton","copyingVideo","setCopyingVideo","getLandingPages","useGetTemplatesQuery","useVideoQuery","getCTASets","limit","useExitLinksetsQuery","getWebsiteOverlays","useWebsiteOverlayQuery","ContentWrapper","Main","Side","VideoWrapper","VinPendingStatus","toMaybeString","InsertVideo","showTrimFeature","useParams","isLoadingTemplates","templates","videoLoading","overlays","overlaysLoading","linksets","linksetsLoading","isAutomotiveService","isAutomotiveSales","reactionsEnabledByDefault","trackGTMVideoMessageInteractionEvent","isVideoProcessing","setIsVideoProcessing","setTemplatesOptions","setIsVideoTrimmed","isVideoTrimmingLoading","setIsVideoTrimmingLoading","trimValue","setTrimValue","trimDurationRef","linksetsList","goToLibrary","calculateTemplateAndVin","filteredOptions","currentTemplateOption","hasServicePages","old","defaultLinkset","ls","checkTrim","handleTrimVideo","useAutomotive","handleTrimeVideoHandler","trimmedVideoData","createGTMVideoMessageInteractionEvent","disableInsert","MdContentCut","VideoPlayerWrapper","VideoPreview","useCovideoPlayer","CONTENT_TYPE","FILE_EXTENSION","stopStream","s","RecorderErrors","BITRATES","useMediaRecorder","audio","onStop","blobPropertyBag","screen","mediaRecorderOptions","mimeType","quality","mediaRecorder","mediaChunks","mediaStream","setStatus","isAudioMuted","setIsAudioMuted","mediaBlobUrl","setMediaBlobUrl","mountedRef","videoBitsPerSecond","getMediaStream","requiredMedia","stream","audioStream","audioTrack","checkConstraints","mediaType","supportedMediaConstraints","unSupportedConstraints","constraint","startRecording","track","onRecordingActive","onRecordingStop","startRecordingForCanvas","canvasStream","chunk","blobProperty","blob","muteAudio","mute","pauseRecording","resumeRecording","stopRecording","previewStream","previewAudioStream","ModalPrompt","primaryButtonText","secondaryButtonText","primaryButtonType","RecordingProgress","Done","position","background","RecordingInfo","MicIconWrapper","CurrentTime","Audio","DEFAULT_SETTINGS","AudioRecorder","onChangeVoiceoverValid","onRecordingUrlGeneration","handleShowCard","audioRef","createRef","recordingStatus","setRecordingStatus","previewingStatus","setPreviewingStatus","audioPlayer","setAudioPlayer","showRetakePrompt","setShowRetakePrompt","settings","startRecordingClick","pauseRecordingClick","resumeRecordingClick","retakeButtonClick","retakeRecording","startPreview","pausePreview","resumePreview","seekTo","closeAndClear","handleVideoPlay","handleVideoPause","handleVideoSeeked","isPreview","isRecording","currentPosition","updatePosition","newPosition","currentTimeMMSS","BsRecordCircle","MdPause","MdPlayArrow","MdMic","MdRefresh","ModalInputText","inputValue","setInputValue","generateTempAudioName","lesaKeys","getLesaVideos","useLesaTvVideosQuery","copyLesaVideo","useLesaVideosCopyMutation","onSuccesCallback","getDisplayName","TitleWrapper","SearchAndFilterWrapper","YearWrap","TableContentContainer","VideosList","TableHeaderContainer","TableColumnTitle","VehicleYear","VehicleMake","VehicleStockId","VehicleModel","VideoOptions","LoadingWrapper","EmptySearch","TablePaginationContainer","PaginationText","PageInput","DEFAULT_LIMIT","DEFAULT_COUNT","LesaTV","setPage","isLoadingLesaTv","copyLesaVideosMutation","isCopyingVideo","resetPage","isNotSearchable","onSearchChangeHandler","copyLesaMutationHandler","prevPage","lastPage","newPage","VoiceOverMessage","VoiceOver","trackGTMSaveNewVideoInteractionEvent","setVideo","setVideoLoading","uploading","setUploading","voiceoverValid","setVoiceoverValid","showModalRename","setShowModalRename","recordingBlobUrl","setRecordingBlobUrl","fetchVideo","handleSaveVideo","submitVideo","r","newAudioFileName","signedUrlData","signedURL","DEFAULT_SEARCH_DELAY","DEFAULT_YEAR","WheelsTV","currentPage","setCurrentPage","searchDelay","setSearchDelay","selectedYear","setSelectedYear","setCount","setLastPage","setVideos","recordsLimit","setLoading","rejectSearch","year","copyVideoWTV","years","RangeWrapper","VideoRow","totalDuration","offset","hasProcessingVideos","vtm","startSec","endSec","SvgDragIcon","Drag","DragSvg","VideoImg","DragContainer","setVideoRef","isDragDisabled","setShouldFetch","isExternalVideo","onloadedmetadata","isFinishedProcessing","SvgZoomOut","ZoomOutIcon","StatsSvg","SvgZoomIn","ZoomInIcon","OnScreenPlayButtonWrapper","OnScreenPlayButton","playButtonPosition","VideoContainer","ControlsContainer","Player","displayVideos","currentVideoIndex","setIsLoading","isPlaying","setIsPlaying","trimmedDuration","setTrimmedDuration","currentPlaylistTime","setCurrentPlaylistTime","rangeValue","setRangeValue","playlistDuration","videoStartTime","loadedmetadata","updateProgress","playNextVideo","currentPlaylistVideo","skip","skipTo","videoStart","videoDurationStep","autoPlay","videoReady","percentage","rangerStyle","SvgCloseCircle","CloseCircleIcon","IconContainer","InformationBox","VideoMergeLayout","ThumbnailWrapper","RowWrapper","RangeContainer","RowContainer","BlankRowsContainer","ContentHeader","PreviewContainer","RowTime","RowTicker","Time","ZoomButton","AddVideoContainer","ZoomContainer","CloseContainer","InfoBoxWrapper","findNearestMultiple","multiple","VideoMerge","trimDuration","setWidth","setHeight","secWidth","setSecWidth","tickerCount","setTickerCount","sum","handleResize","w","removeVideo","removedVideo","filteredSelectedVideos","newVideos","calculateVideoOffset","previousVideo","onDragEnd","updatedVideos","DragDropContext","Droppable","provided","Draggable","SvgSave","SaveIcon","SaveSvg","SvgDelete","DeleteIcon","DeleteSvg","ModalLeave","disableSave","infoBoxText","discardButtonText","confirmButtonText","onClickDiscardButton","onClickConfirmButton","showDiscardIcon","showSaveIcon","RouteLeavingGuard","when","navigate","shouldBlockNavigation","onConfirm","onDiscard","onStay","stay","translatedTitle","translatedText","translatedDiscardButtonText","translatedConfirmButtonText","modalVisible","setModalVisible","lastLocation","setLastLocation","confirmedNavigation","setConfirmedNavigation","closeModal","handleBlockedNavigation","nextLocation","handleConfirmNavigationClick","handleDiscardNavigationClick","handleStay","Prompt","VideoSourceType","MainContainer","Merge","ids","videosToMerge","setVideosToMerge","showSaveModal","setShowSaveModal","saved","setSaved","fetchFromLS","setFetchFromLS","videosFromLs","videosObject","videoDetails","sourceType","handleMergeVideos","videoName","sources","path","PreviewVideoBar","onSaveVideo","isSaveDisabled","setInsertAfterSave","uploadLoading","putVideoTags","SvgIconCar","CarIcon","Car","SvgHashtag","HashtagIcon","HashtagSvg","FlexCenter","CircleContainer","CircleText","theme.fontNormal400","ProgressText","MoonLoaderContainer","circleStyle","Upload","beginUploadProcess","afterUpload","setSavedVideoId","uploadProgress","createProgress","encodeError","encodeProgress","getPercentage","MoonLoader","Circle","VideoAttribute","Textarea","AttributeFields","attributes","initValues","setIsSaveDisabled","showVideoRequestFields","videoRequestFieldsRequired","requiredAttributesState","setRequiredAttributesState","errors","validateForm","setFieldValue","useFormikContext","countRequiredAndValidate","requiredAttr","attribute","validateFields","at","hasError","Field","form","dropdown","RightSide","LeftSide","VideoCard","DateContainer","RightOption","LeftOption","TagContainer","TRIM_INITIAL_VALUE","TagOption","selectedValueText","isCreateNewOption","Preview","recordDate","setSaveFunction","insertAfterSave","skipUploadProcess","initialTitle","updateUploadLoading","TAG_PLACEHOLDER","showPreviewTrim","setTitle","vehicleOptions","setVehicleOptions","setVin","videoType","setVideoType","setVideoAttributes","setInitialValues","tags","setTags","selectedTags","setSelectedTags","tag","setTag","isVideoSaved","setIsVideoSaved","setBeginUploadProcess","setFile","attributesValues","setAttributesValues","savedVideoId","initialObjectState","setInitialObjectState","formRef","videoTypeOptions","initValueObject","newErrors","attrValues","sortTags","unsortedTags","a","b","onTagChange","newTag","exists","newTagValue","onDeleteTag","currentTag","currentSelectedTags","currentAllTags","tagIndex","fetchTags","tagList","formattedTags","sortedTags","fetchAttributes","results","att","fetchVehicles","inventoryList","formattedInventory","modifyTags","addVideoRequest","updateVideoAttributes","trimVideoCreate","fetchFileFromBlobUrl","blobUrl","deleteUploadedVideo","isValid","selectedTag","val","newVin","newVideoType","INITIAL_VIDEO","PreviewUpload","setOnSaveVideo","setUploadLoading","mergeAudioStreams","desktopStream","micStream","desktopStreamSource","micStreamSource","destination","desktopGain","micGain","handleScreenCapture","displayMediaRef","audioSettings","videoSettings","displayMediaStreamConstraints","displayMediaStream","audioTracks","userMediaStream","combinedStreamTracks","enableCamera","cameraStreamRef","cameraStream","getScreenAndCameraStreams","videoCameraPipRef","combinedStream","getSafariScreenAndCameraStreams","getDevices","devices","some","DEVICE_KIND","VIDEO_QUALITY","RecordSettingsContext","LOCAL_STORAGE_KEY","initialSettings","getUserSettings","defaultAudio","defaultVideo","RecordSettingsProvider","noAudio","noVideo","recorderSettings","setRecorderSettings","userSettings","setUserSettings","recordingError","setRecordingError","initialUserSettings","setInitialUserSettings","updateErrorMessage","fetchDevices","devicesResponse","newConfig","config","device","onSubmitModalHandler","handleDeviceChange","useRecordSettings","LabelContainerWrapper","LabelContainer","RadioLabel","CustomValueContainer","ModalRecordingVideosSettings","onCancelOrCloseModalSettings","onChangeVideoSettingsHandler","onChangeAudioSettingsHandler","onVideoQualityHandler","videoQuality","RECORDING_STATUS","RECORD_LOADER_STATUS","statuses","RecordingHeaderWithRouteGuard","handleGoToRecordHome","teleprompterActions","shouldHideChangeRecordingOptionBtn","isMobileDevice","trackGTMDiscardVideoEvent","MdMovie","Counter","CountDown","counter","willStart","hide","isFreemium","colorMap","RecorderBodyWrapper","VideoStyles","CanvasStyles","RecorderBody","countdown","teleprompter","canvasRef","toggleCamera","showCamera","MdFlipCameraAndroid","useCountdown","initialCount","setCountdown","countdownIntervalRef","prevCount","useRecordingTime","timeInSeconds","setTimeInSeconds","recordingIntervalRef","prevTime","combineVideoAndAudioStreams","videoStream","COUNTDOWN","useRecorder","screenStream","stopAllStreams","isSegmenterActive","onStartUpladingVoiceOverHandler","shouldStartCountdown","isCameraToggled","trackGTMStartRecordingEvent","trackGTMStopRecordingEvent","trackGTMAddVideoAttributeEvent","startRecordingCountdown","stopRecordingCountdown","startRecordingTime","stopRecordingTime","recorderRef","recordedBlob","setRecordedBlob","startCountDown","videoTrack","getCombinedStream","currentStream","RecordRTC","MediaStreamRecorder","RecordingFlowWrapper","FinishBtnWrapper","VideoRecorderActions","stopCountDown","isLoadingVB","preparingFlow","recordingFlow","MdOutlinePause","isOpera","videoAttributesKeys","useGetAllVideoAttributesQuery","DetailsPreviewHeader","setContineToInsert","onDiscardHandler","submitForm","handleContinueToSendShare","MdDeleteForever","MdSave","MdEmail","Tag","VideoTag","showRemove","onRemove","FaHashtag","IoMdCloseCircle","TAG_LIMIT","Section","SelectInput","TagsContainer","Footer","ModalVideoTags","videoTags","buttonTitle","displayValues","setDisplayValues","errorMessage","setErrorMessage","loadTags","dv","escPress","removeTag","MdSearch","MdAdd","checkIfButtonIsDisabled","DetailsRecordPreviewTags","showModal","setShowModal","openModal","onSave","FormikTextAreaField","FormikDropdownField","helpers","DetailsPreviewVideoAttributes","FieldArray","VideoRequestDetails","fetchSoldVehiclesForAutomotive","isTechnician","advisorOptions","assignee","DetailsPreviewAttributesHeader","totalRequiredAttributes","automotiveUsersKeys","customerId","role","getUsersByAutomotiveRoles","useGetUsersByAutomotiveRolesQuery","queries","useQueries","getAwsSignedUrl","useAwsSignedUrlQuery","S3UploadService","onProgress","contentType","loaded","useS3UploadMutation","uploadToS3Progress","setUploadToS3Progress","isGuide","videoAttributeValues","useCreateVideoMutation","setCreateProgress","useEncodeVideoMutation","encodeProggress","setEncodeProggress","removeEmptyValues","useVideoRecordUpload","contineToInsert","setProgressState","loadingStarted","setLoadingIsStared","recordingFormData","setRecordingFormData","cdkAmplitudeFields","setCdkAmplitudeFields","presignedUrlData","urlErrorData","uploadVideoToS3","isErrorEncoding","startUpload","createResponse","attr","durationMs","changed_fields","fields","getProgressStatusText","progressType","ProgressCircle","isInProgressOrDone","toMBString","loadedMB","totalMB","UploadLoader","decodeAndReplaceText","isReplace","getDefaultPromptUseCase","sizeToSpeedRatioLarge","sizeToSpeedRatioMedium","sizeToSpeedRatioSmall","handleScriptSpeedUsingScriptSize","formatBytes","bytes","decimals","dm","sizes","addThousandCommaSeparator","roundDecimal","getStatusText","getStatusColor","getStatusSize","getTitle","foldersKeys","useGetFolders","FOLDER_GROUP_LABEL","Line","OptionChildSubTitle","SharedOptionWrapper","OptionChildWrapper","getIcon","iconName","IoMdCheckmark","MdFolderShared","MdSupervisorAccount","CustomOption","innerProps","FolderDropdown","productFeature","checkIfFeatureIsEnabled","featureId","FOLDER_GROUP_VALUE","DropdownWrapper","VideoUploadFolderDropdown","showSharedWithMeFolders","showLabel","showAllFolderOption","getLatestFolders","isFolderOrganizationEnabled","folderOptions","ownedFolders","sharedFolders","DEFAULT_UPLOAD_FOLDER","FormStyles","FormBody","RecorderLoaderWrapper","generateName","randomSuffix","DetailsRecordingPreview","videoBlob","videoUrl","setVideoUrl","initialCovideoName","isSubmittingForm","isGettingAutomotiveUsers","onSubmitHandler","videoFile","validationSchema","INITIAL_VALUES","RecordBoth","showPreview","ScreenRecorder","SelectRecordingType","RecordingToolAction","TeleprompterContext","fetchSettingsFromStorage","settingsFromStorage","saveSettingsToStorage","TeleprompterProvider","trackGTMRecordingToolIntearctionEvent","isUsingTeleprompter","setIsUsingTeleprompter","showTeleprompterModal","setShowTeleprompterModal","teleprompterSettings","setTeleprompterSettings","isTeleprompterPlaying","setIsTeleprompterPlaying","isTeleprompterDisabled","setTeleprompterDisabled","saveTeleprompterSettingsHandler","currentSettings","onEditOrTurnOnTeleprompterHandler","onDropdownTeleprompterSpeedChange","toggleTeleprompterPlaying","onTeleprompterModalClose","turnOffTeleprompter","turnOnTeleprompter","turnOnTeleprompterPlaying","disableOrEnableTeleprompter","isEnabled","useTeleprompter","BaseTeleprompterActions","MdSubtitles","MdPowerSettingsNew","RecordingTeleprompterActions","TeleprompterActions","ScrollContainer","Scroller","TeleprompterShadow","TeleprompterContainer","TeleprompterDisplay","play","animateScroll","interval","RecordCamLoaderWrapper","RecordCamLoader","initialVirtualBgState","getVirtualBackgroundFromStorage","vbSelection","savedVirtualBackground","getAllackgroundFromStorage","saveVirtualBackgroundToStorage","currentVirtualBackground","newItems","customVirtualBackgroundKeys","getCustomVirtualBackgrounds","useCustomVirtualBackgroundQuery","SvgVirtualBackground","VideoIcon","virtualBackground","VIEWPORT_HEIGHT","VIEWPORT_WIDTH","createShader","gl","shader","createProgram","vertexShaderSource","fragmentShaderSource","vertexShader","fragmentShader","program","updateTexture","texture","createTexture","initWebGL","canvas","setupRectangle","positionLocation","texCoordLocation","positionBuffer","positions","texCoordBuffer","texCoords","render","fgTexture","bgTexture","confidenceMaskTexture","confidenceMaskHairTexture","confidenceMaskBodyTexture","confidenceMaskFaceTexture","confidenceMaskClothesTexture","confidenceMaskOtherTexture","backgroundScale","fgLocation","bgLocation","maskLocation","maskLocationHair","maskLocationBody","maskLocationFace","maskLocationClothes","maskLocationOther","backgroundScaleLocation","clear","bgImgCanvasElement","bgImgCanvasCtx","lastTimestamp","calculateBackgroundImageData","imgElement","videoWidth","videoHeight","newWidth","newHeight","startX","startY","calculateBackgroundScale","canvasWidth","canvasHeight","backgroundWidth","backgroundHeight","canvasAspect","backgroundAspect","scaleX","scaleY","useImageSegmenter","imageSegmenterRef","isFirstFrameRef","resultimageRef","imageRef","webGlRef","initTextures","initWebGLContext","onCreateVirtualBackgroundHandler","FilesetResolver","segmenter","ImageSegmenter","predictWebcam","onDestroyVirtualBackgroundHandler","canvasRefCtx","drawSegmentationResult","getCavansBgImage","getTimestamp","currentTimestamp","nowInMs","client","checkDropAuth","Cookies","Droplr","SharedDrop","localOptions","uploadDrop","progressUpdate","getBoards","droplrResponse","droplrBoards","covideoResponse","covideoBoards","boards","droplrBoard","covideoBoard","cb","getDrop","dropId","DropType","DROPTYPE_OPTIONS","getDrops","order","variant","boardId","DropContent","UploadFileContent","UploadFileDescription","UploadFileAction","UploadFileTitle","UploadFileProgress","UploadFileDetails","FileStatus","FileSize","LibraryContainer","FilesSelector","EmptyFiles","Grid","GridItem","ItemTypes","FilesTabContent","onSelect","selectedFile","selectedVirtualBackgroundUrl","res","setRes","drops","setDrops","setSearchQuery","setFields","setField","setBoards","itemType","acceptedFiles","reader","uploadedDrop","previewUrl","refreshDropsAndBoards","getPreviewLink","dropDetails","helper","getRootProps","getInputProps","isDragActive","useDropzone","fetchDrops","boardsResponse","boardFields","generateBoardFields","uploadingFiles","board","InfiniteScroll","drop","VirtualBackgroundLibraryModal","IoMdClose","GridContainer","VirtualBackgroundImages","CUSTOM_BACKGROUND_BUCKET_URL","VirtualBackgrounds","onMainButtonClick","customVirtualBackgrounds","showLibraryModal","setShowLibraryModal","customVbUrls","vb","virtualBackgrounds","MdCheck","FaBan","MdAddCircle","image","VirtualBackgroundsWrapper","VirtualBackgroundButtonWrapper","DisabledTooltipPopup","VirtualBackgroundsButton","setIsSegmenterActive","initialImage","setIsLoadingVB","isLoadingVb","showVirtualBackgrounds","setShowVirtualBackgrounds","showVirtualBackgroundButton","setShowVirtualBackgroundButton","selectedVirtualBackground","setSelectedVirtualBackground","startVirtualBg","stopVirtualBg","onChangeImageHandler","imageElement","handleImageLoad","onSelectImageSaveToLocalStorageHandler","privacy","saveParams","onVirtualBacgroundClickHandler","VirtualBgIcon","getScripts","createScript","updateScript","scriptId","SvgCovideoSmallLogoActive","CovideoSmallLogoActive","SvgCdkSmallLogoActive","CdkSmallLogoActive","ContentHeaderWrap","theme.fontBold700","TabHeader","StyledIoIosCheckmarkCircle","IoIosCheckmarkCircle","SelectContent","Col","FieldWrapper","CovideoScriptTitle","CREATE_NEW_SCRIPT_ID","getSpeedOption","fallback","raw","parsed","ModalTeleprompterRecord","scriptPositions","defaultOptions","currentTab","setCurrentTab","scriptTextTouched","setScriptTextTouched","appearanceConfig","setAppearanceConfig","scriptText","setScriptText","defaultScriptTitle","isNewScript","setIsNewScript","scriptTitleText","setScriptTitleText","scriptLoading","setScriptLoading","scriptArray","setScriptArray","getAllScripts","scriptsArrayObj","sortScripts","scriptOptions","exp","unsortedScripts","handleScript","handleScriptSpeed","handleScriptSize","handleScriptPosition","handleNewScript","updateOldScript","scriptArrayLocal","indexOfListedEle","createNewScript","newList","defaultPromptUseCase","sortedScriptArray","script","CustomSingleValue","innerRef","List","generatedContent","MdOutlineClose","CancelView","CurrentVievComponent","RecordCam","showVirtualBgFeature","showTeleprompterFeature","FRAME_RATE","getAudioSettings","deviceId","QUALITY_MAP","getVideoSettings","RecordOption","MainRecordContentWrapper","RecordingOptionWrapper","ShowRecorderWrapper","IoPersonCircleWrapper","ChooseRecordingOptions","showRecordBothFeature","showRecordCamFeature","showRecordScreenFeature","trackGTMSelectRecordingTypeEvent","settingsOpen","setSettingsOpen","isFrontCamera","setIsFrontCamera","showRecordOption","setShowRecordOption","isPromptOpen","setIsPromptOpen","setScreenStream","screenCaptureHandler","enableCameraHandler","nextIsFrontCamera","toggledCamera","enableBothHandler","checkIfIsFrontCamera","MdLaptop","IoPersonCircle","MdPerson","MdSettings","RecordHome","RecordingRoutes","Route","initReactI18next","en","es","fr","lng","ns","fallbackValue","BaseModalText","BaseHeaderText","VehicleYearWidth","VehicleYearHeader","VehicleMakeWidth","VehicleMakeHeader","VehicleModelWidth","VehicleModelHeader","PreviewModelHeader","SortCell","VINReelSortKey","PaginationConstants","getVINReels","useGetVINReelsQuery","copyVINReel","useCopyVINReelMutation","imagePlaceholder","images","SortButtons","isSorted","IoMdArrowRoundUp","IoMdArrowRoundDown","VINReels","setOrder","sortKey","setSortKey","onSuccessCopy","isFetching","isCopying","selectedVINReel","vinReel","handleSortChange","copyVINReelHandler","inventoryItem","videoTitle","AccessRole","NoAccessContainer","NoAccessContent","NoAccessPage","App","user","setUser","isSupervisor","loadUser","onUpdateToken","isLoggedIn","Router","useGTMInject","gtmId","isLoadingScript","setIsLoadingScript","noscript","QueryClient","Environment","logoutCovideo","CovideoEmbed","setRender","QueryClientProvider"],"mappings":"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"}
|