react-covideo-embed 1.0.82 → 1.0.83-flow.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.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>&nbsp;</Duration>\n </Head>\n <Content>\n <Title backgroundColor={theme.palette.gray20} width='100%'>\n &nbsp;\n </Title>\n <Date backgroundColor={theme.palette.gray20} width='70%'>\n &nbsp;\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 &nbsp;{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>&nbsp;{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('&nbsp;', ' ')\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 &nbsp;&nbsp;\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,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\"","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","buttonPadding","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","v","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","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","CustomSingleValue","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","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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"}