{"version":3,"file":"790.bundle.793e4dadc5224ee6d9d6.js","mappings":"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","sources":["webpack://fieldlevel.app/./app-core/components/ProgressBar.jsx","webpack://fieldlevel.app/./app-core/icons/UploadIcon.jsx","webpack://fieldlevel.app/./app-core/components/VideoUploadModal/useInterval.js","webpack://fieldlevel.app/./app-core/components/VideoUploadModal/VideoUploadModal.jsx","webpack://fieldlevel.app/./app-core/components/VideoUploadModal/VideoUploadService.js","webpack://fieldlevel.app/./app-core/constants/api.js"],"sourcesContent":["import PropTypes from 'prop-types';\r\nimport cx from 'classnames';\r\n\r\nconst ProgressBar = ({ percentComplete, hideNumber = false }) => {\r\n const roundPercent = Math.round(percentComplete);\r\n return (\r\n <div className=\"h-[20px] bg-[#eaeaea] shadow-inner rounded-sm\">\r\n <div\r\n className={cx(\r\n 'h-full text-on-dark bg-[#5cb85c] text-center rounded-sm',\r\n percentComplete < 100 && 'rounded-r-none'\r\n )}\r\n style={{ width: `${percentComplete}%`, transition: 'width .6s ease' }}\r\n >\r\n {!hideNumber && `${roundPercent}%`}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nProgressBar.propTypes = {\r\n percentComplete: PropTypes.number.isRequired,\r\n hideNumber: PropTypes.bool\r\n};\r\n\r\nexport default ProgressBar;\r\n","/**\r\n * MIT License\r\n *\r\n * Copyright (c) 2020-2023 Paweł Kuna\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n *\r\n */\r\n\r\n/*\r\n This icon was copied from the Tabler-Icons library (tabler-icons.io), \"IconUpload\"\r\n */\r\nconst UploadIcon = props => (\r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n strokeWidth=\"2\"\r\n stroke=\"currentColor\"\r\n fill=\"none\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n {...props}\r\n >\r\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n <path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2\" />\r\n <path d=\"M7 9l5 -5l5 5\" />\r\n <path d=\"M12 4l0 12\" />\r\n </svg>\r\n);\r\n\r\nexport default UploadIcon;\r\n","import { useEffect, useRef } from 'react';\r\n\r\nfunction useInterval(callback, delay) {\r\n const savedCallback = useRef();\r\n\r\n // Remember the latest callback.\r\n useEffect(() => {\r\n savedCallback.current = callback;\r\n }, [callback]);\r\n\r\n // Set up the interval.\r\n useEffect(() => {\r\n function tick() {\r\n savedCallback.current();\r\n }\r\n if (delay !== null) {\r\n let id = setInterval(tick, delay);\r\n return () => clearInterval(id);\r\n }\r\n }, [delay]);\r\n}\r\n\r\nexport default useInterval;\r\n","import React, { useReducer, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport clamp from 'lodash/clamp';\r\nimport random from 'lodash/random';\r\n\r\nimport {\r\n Select,\r\n TextInput,\r\n ChoiceGroup,\r\n FormLayout,\r\n ButtonGroup,\r\n Button,\r\n Modal,\r\n Heading,\r\n Icon,\r\n CloseMinor\r\n} from '@fieldlevel/playbook';\r\n\r\nimport { isInsideNativeApp, getMobileOperatingSystem, OS } from '@appCore/utility/nativeBridge';\r\nimport { reportError } from '@appCore/services/logger';\r\nimport { logImpression, logEvent } from '@appCore/utility/googleAnalytics';\r\nimport { logUploadStart, logUploadComplete, VideoInteractionContextEnum } from '@appCore/utility/videoAnalytics';\r\nimport { FilmTypeOptions } from '@appCore/constants/api';\r\nimport useValidatedForm from '@appCore/hooks/useValidatedForm';\r\nimport PlayIconDesign from '@appCore/components/PlayIconDesign';\r\nimport VideoDuration from '@appCore/components/video/VideoDuration';\r\nimport UploadIcon from '@appCore/icons/UploadIcon';\r\nimport ProgressBar from '@appCore/components/ProgressBar';\r\nimport * as VideoApi from '@appCore/api/videoApi';\r\n\r\nimport { uploadVideo } from './VideoUploadService';\r\nimport useInterval from './useInterval';\r\n\r\nconst MAX_UPLOAD_PROGRESS = 90;\r\nconst ANALYTICS_CATEGORY = 'Video Upload';\r\n\r\nconst createObjectURL = file => {\r\n if (file) {\r\n if (window.webkitURL) {\r\n return window.webkitURL.createObjectURL(file);\r\n } else if (window.URL && window.URL.createObjectURL) {\r\n return window.URL.createObjectURL(file);\r\n } else {\r\n return null;\r\n }\r\n }\r\n return null;\r\n};\r\n\r\nconst fileInputRef = React.createRef();\r\nconst UploadButton = ({ onFileSelected, disabled }) => {\r\n const openFileDialog = () => {\r\n if (disabled) return;\r\n logEvent('Choose Video Clicked', ANALYTICS_CATEGORY);\r\n fileInputRef.current.click();\r\n };\r\n\r\n const handleFilesSelected = e => {\r\n if (disabled) return;\r\n\r\n const files = e.target.files;\r\n if (onFileSelected) {\r\n const file = files[0];\r\n onFileSelected(file);\r\n fileInputRef.current.value = null; // reset the input value\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <Button variant=\"plain\" icon={UploadIcon} onClick={openFileDialog} disabled={disabled}>\r\n Choose video\r\n </Button>\r\n <input\r\n ref={fileInputRef}\r\n className=\"!hidden\"\r\n type=\"file\"\r\n accept=\"video/mp4,video/x-m4v,video/*\"\r\n onChange={handleFilesSelected}\r\n placeholder=\"Describe your video\"\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst VideoUploadStatusEnum = {\r\n Unknown: -1,\r\n NotSet: 0,\r\n Initiated: 1,\r\n Created: 2,\r\n Processing: 3,\r\n Ready: 4,\r\n Cancelled: 5,\r\n Errored: 6\r\n};\r\n\r\nconst VideoFormatEnum = {\r\n FileUpload: 0,\r\n WebResource: 1\r\n};\r\n\r\nconst VideoError = ({ message }) => {\r\n return <span className=\"text-critical\">{message}</span>;\r\n};\r\n\r\nconst renderVideoError = (error, maxDuration, maxFileSize) => {\r\n const duration = maxDuration / 60;\r\n const size = maxFileSize / 1000000;\r\n\r\n switch (error) {\r\n case 'duration':\r\n return (\r\n <VideoError\r\n message={`The video you chose is too long. Please trim it to be under ${duration}:00 minutes.`}\r\n />\r\n );\r\n case 'size':\r\n return <VideoError message={`The video you chose is too big. Please trim it to be under ${size}MB.`} />;\r\n case 'load':\r\n return <VideoError message=\"The video you chose is not supported. Please choose a different video.\" />;\r\n case 'other':\r\n return <VideoError message=\"Sorry, something went wrong. Please try again.\" />;\r\n default:\r\n throw new Error('Unknown video error');\r\n }\r\n};\r\n\r\nconst SelectedVideoCancel = ({ dispatch }) => (\r\n <button\r\n className=\"absolute right-[-6px] top-[-6px] flex items-center justify-center cursor-pointer bg-background-black rounded-full\"\r\n onClick={() => {\r\n logEvent('Remove Video Clicked', ANALYTICS_CATEGORY);\r\n dispatch({ type: 'file.cancel' });\r\n }}\r\n >\r\n <span className=\"scale-75\">\r\n <Icon source={CloseMinor} color=\"onDark\" />\r\n </span>\r\n </button>\r\n);\r\n\r\nconst getUploadTick = (current, next) => {\r\n // adjust upload progress to max percentage and prevent it from moving backwards\r\n const adjusted = (next / 100) * MAX_UPLOAD_PROGRESS;\r\n return adjusted > current ? adjusted : current;\r\n};\r\n\r\nconst getProcessingTick = current => {\r\n const next = current + random(0.2, 0.5, true);\r\n return clamp(next, 0, 99.4);\r\n};\r\n\r\nconst initialState = {\r\n video: null,\r\n file: null,\r\n upload: null,\r\n uploadStart: null,\r\n progress: 0,\r\n showModal: true,\r\n showCancel: false,\r\n cancelConfirm: false,\r\n uploadError: false,\r\n uploadErrorMessage: null,\r\n error: null,\r\n videoFormat: 0\r\n};\r\n\r\nconst reducer = (state, action) => {\r\n switch (action.type) {\r\n case 'videoFormat.selected':\r\n return {\r\n ...state,\r\n video: null,\r\n file: null,\r\n error: null,\r\n upload: null,\r\n uploadError: false,\r\n uploadErrorMessage: null,\r\n videoFormat: action.data.videoFormat\r\n };\r\n case 'videoUrl.selected':\r\n return { ...state, error: null, uploadError: false, uploadErrorMessage: null };\r\n case 'video.selected':\r\n return {\r\n ...state,\r\n error: null,\r\n uploadError: false,\r\n uploadErrorMessage: null\r\n };\r\n case 'file.loaded':\r\n const selectedVideo = {\r\n duration: action.data.duration\r\n };\r\n return { ...state, file: action.data.file, video: selectedVideo };\r\n case 'file.cancel':\r\n return {\r\n ...state,\r\n video: null,\r\n file: null,\r\n error: null,\r\n upload: null,\r\n uploadError: false,\r\n uploadErrorMessage: null\r\n };\r\n case 'upload.init':\r\n return {\r\n ...state,\r\n error: null,\r\n uploadError: false,\r\n uploadErrorMessage: null,\r\n progress: 0,\r\n uploadStart: Date.now()\r\n };\r\n case 'upload.start':\r\n const initiatedVideo = Object.assign({}, state.video, { Guid: action.data.guid });\r\n return {\r\n ...state,\r\n upload: action.data.upload,\r\n video: initiatedVideo\r\n };\r\n case 'upload.error':\r\n return { ...state, uploadError: true, uploadStart: null, uploadErrorMessage: action.message };\r\n case 'upload.tick':\r\n const uploadProgress = getUploadTick(state.progress, action.data);\r\n return { ...state, progress: uploadProgress };\r\n case 'processing.tick':\r\n const processingProgress = getProcessingTick(state.progress);\r\n return { ...state, progress: processingProgress };\r\n case 'processing.complete':\r\n return { ...state, progress: 100 };\r\n case 'modal.close':\r\n if (!state.upload) {\r\n return { ...initialState, showModal: false };\r\n }\r\n return { ...state, showCancel: true };\r\n case 'confirm.cancel':\r\n return { ...state, showModal: false };\r\n case 'dismiss.cancel':\r\n return { ...state, showCancel: false };\r\n case 'error':\r\n return {\r\n ...state,\r\n upload: null,\r\n uploadError: null,\r\n uploadErrorMessage: null,\r\n uploadStart: null,\r\n file: null,\r\n video: null,\r\n error: action.data\r\n };\r\n default:\r\n throw new Error('Unknown reducer action type!');\r\n }\r\n};\r\n\r\nconst VideoUploadForm = ({ isUploading, disabled, onSubmit, videoFormat, dispatch, isVerifyVideoUpload }) => {\r\n const { values, errors, handleChange, handleSubmit } = useValidatedForm(save, validate, null);\r\n\r\n function validate(vals) {\r\n let errors = {};\r\n\r\n if (!vals.title) {\r\n errors.title = 'Please enter a caption.';\r\n } else if (vals.title.length > 255) {\r\n errors.title = 'Please shorten your caption.';\r\n }\r\n\r\n if (!isVerifyVideoUpload && !vals.filmTypeEnum) {\r\n errors.filmTypeEnum = 'Please select video type.';\r\n }\r\n if (videoFormat === VideoFormatEnum.WebResource) {\r\n if (!vals.videoUrl) {\r\n errors.videoUrl = 'Please enter a video url.';\r\n } else if (!vals.videoUrl.match(/https?:/gi)) {\r\n errors.videoUrl = 'Please enter a valid url.';\r\n } else if (\r\n vals.videoUrl.indexOf('youtube.com') < 0 &&\r\n vals.videoUrl.indexOf('youtu.be') < 0 &&\r\n vals.videoUrl.indexOf('hudl.com') < 0\r\n ) {\r\n errors.videoUrl = 'Please enter a video url from youtube.com or hudl.com.';\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n function save() {\r\n if (!isVerifyVideoUpload) {\r\n onSubmit(\r\n values.title,\r\n values.filmTypeEnum,\r\n videoFormat === VideoFormatEnum.WebResource ? values.videoUrl : null\r\n );\r\n } else {\r\n onSubmit(values.title, 4, videoFormat === VideoFormatEnum.WebResource ? values.videoUrl : null);\r\n }\r\n }\r\n\r\n return (\r\n <form onSubmit={handleSubmit} noValidate>\r\n <FormLayout>\r\n {videoFormat === VideoFormatEnum.WebResource && (\r\n <FormLayout.Row>\r\n <FormLayout.Item size=\"full\">\r\n <TextInput\r\n label=\"Video url\"\r\n name=\"videoUrl\"\r\n disabled={isUploading}\r\n onChange={(value, name) => {\r\n dispatch({ type: 'videoUrl.selected', data: value });\r\n handleChange(value, name);\r\n }}\r\n error={errors.videoUrl}\r\n value={values.videoUrl || ''}\r\n placeholder=\"Link/URL of video\"\r\n />\r\n </FormLayout.Item>\r\n </FormLayout.Row>\r\n )}\r\n <FormLayout.Row>\r\n <FormLayout.Item size=\"full\">\r\n <TextInput\r\n label=\"Write a caption\"\r\n name=\"title\"\r\n disabled={isUploading}\r\n onChange={handleChange}\r\n error={errors.title}\r\n value={values.title || ''}\r\n placeholder=\"Describe the video briefly...\"\r\n maxLength={255}\r\n />\r\n </FormLayout.Item>\r\n </FormLayout.Row>\r\n {!isVerifyVideoUpload && (\r\n <FormLayout.Row>\r\n <FormLayout.Item size=\"full\">\r\n <ChoiceGroup\r\n title=\"Select type of video\"\r\n disabled={isUploading}\r\n selected={values.filmTypeEnum}\r\n onChange={handleChange}\r\n name=\"filmTypeEnum\"\r\n choices={FilmTypeOptions}\r\n error={errors.filmTypeEnum}\r\n />\r\n </FormLayout.Item>\r\n </FormLayout.Row>\r\n )}\r\n <div className=\"flex justify-end\">\r\n <ButtonGroup>\r\n <Button variant=\"primary\" disabled={disabled} submit>\r\n Post\r\n </Button>\r\n </ButtonGroup>\r\n </div>\r\n </FormLayout>\r\n </form>\r\n );\r\n};\r\n\r\nconst VideoFilePicker = ({ video, handleFileSelected, error, maxDuration, maxFileSize, isUploading, dispatch }) => {\r\n let selector = video ? (\r\n <div className=\"relative flex items-center justify-center w-[152px] h-[86px] bg-[#4b4b4b]\">\r\n <PlayIconDesign size=\"small\" />\r\n <div className=\"absolute right-1 bottom-1\">\r\n <VideoDuration duration={video.duration} />\r\n </div>\r\n {!isUploading && <SelectedVideoCancel dispatch={dispatch} />}\r\n </div>\r\n ) : (\r\n <UploadButton onFileSelected={handleFileSelected} />\r\n );\r\n return (\r\n <div className=\"pb-8\">\r\n {selector}\r\n {error && <div className=\"mt-4\">{renderVideoError(error, maxDuration, maxFileSize)}</div>}\r\n </div>\r\n );\r\n};\r\n\r\nconst VideoUploadModal = ({\r\n profileId,\r\n sportEnum,\r\n maxDuration = 180,\r\n maxFileSize = 600000000,\r\n onCancel,\r\n onComplete,\r\n isVerifyVideoUpload\r\n}) => {\r\n const [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n useEffect(() => {\r\n logImpression('Upload Form Viewed', ANALYTICS_CATEGORY);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (state.uploadError || !state.showModal) {\r\n state.upload && state.upload.pause();\r\n state.upload && state.video.Guid && VideoApi.CancelVideoUpload({ webResourceGuid: state.video.Guid });\r\n }\r\n\r\n !state.showModal && onCancel();\r\n }, [state.uploadError, state.showModal]);\r\n\r\n const isProcessing = state.progress >= MAX_UPLOAD_PROGRESS && state.progress < 100 && !state.uploadError;\r\n useInterval(\r\n () => {\r\n VideoApi.GetVideoUpload({ webResourceGuid: state.video.Guid })\r\n .then(data => {\r\n if (data && data.VideoUploadStatusEnum === VideoUploadStatusEnum.Ready) {\r\n // when processing finishes, move progress to 100% and close the modal second later\r\n dispatch({ type: 'processing.complete' });\r\n setTimeout(() => {\r\n onComplete({ webResourceGuid: state.video.Guid });\r\n }, 1000);\r\n }\r\n })\r\n .catch(error => {\r\n reportError('VideoUpload error - Processing failed', error);\r\n dispatch({ type: 'upload.error' });\r\n });\r\n },\r\n isProcessing ? 5000 : null\r\n );\r\n\r\n useInterval(\r\n () => {\r\n dispatch({ type: 'processing.tick' });\r\n },\r\n isProcessing ? 1000 : null\r\n );\r\n\r\n const createWebLinkVideo = (title, filmTypeEnum, videoUrl) => {\r\n dispatch({ type: 'upload.init' });\r\n VideoApi.CreateWebLinkVideo({\r\n ProfileId: profileId,\r\n SportEnum: sportEnum,\r\n Title: title,\r\n FilmTypeEnum: filmTypeEnum,\r\n Url: videoUrl\r\n })\r\n .then(data => {\r\n onComplete(data);\r\n })\r\n .catch(error => {\r\n reportError('Video Web Link upload error - Upload failed', error);\r\n dispatch({ type: 'upload.error', message: error.message });\r\n });\r\n };\r\n\r\n const startUpload = (file, title, filmTypeEnum) => {\r\n if (!file) return;\r\n\r\n dispatch({ type: 'upload.init' });\r\n\r\n // immediately tick to 5% to show something is happening while upload gets going\r\n setTimeout(() => {\r\n dispatch({ type: 'upload.tick', data: 5 });\r\n }, 100);\r\n\r\n VideoApi.CreateUpload({\r\n ProfileId: profileId,\r\n SportEnum: sportEnum,\r\n Title: title,\r\n Description: '',\r\n FilmTypeEnum: filmTypeEnum,\r\n FileName: file.name,\r\n FileLen: file.size\r\n })\r\n .then(data => {\r\n const guid = data.webResourceGuid;\r\n const upload = uploadVideo(\r\n file,\r\n data.uploadUrl,\r\n progress => {\r\n dispatch({ type: 'upload.tick', data: progress });\r\n },\r\n () => {\r\n logEvent('Upload Finished', ANALYTICS_CATEGORY);\r\n logUploadComplete(guid, VideoInteractionContextEnum.AthleteProfile);\r\n },\r\n error => {\r\n logEvent('Upload Failed', ANALYTICS_CATEGORY);\r\n reportError('VideoUpload error - Upload failed', error);\r\n dispatch({ type: 'upload.error' });\r\n },\r\n () => {\r\n logEvent('Upload Network Failed', ANALYTICS_CATEGORY);\r\n reportError('VideoUpload error - Upload network failed');\r\n dispatch({ type: 'upload.error' });\r\n }\r\n );\r\n\r\n logUploadStart(guid, VideoInteractionContextEnum.AthleteProfile);\r\n logEvent('Upload Started', ANALYTICS_CATEGORY);\r\n dispatch({ type: 'upload.start', data: { guid: guid, upload: upload } });\r\n })\r\n .catch(error => {\r\n reportError('VideoUpload error - Upload creation failed', error);\r\n if (error.status === 400) {\r\n dispatch({ type: 'error', data: 'size' });\r\n } else {\r\n dispatch({ type: 'error', data: 'other' });\r\n }\r\n });\r\n };\r\n\r\n const handleFileSelected = file => {\r\n const objectUrl = createObjectURL(file);\r\n const video = document.createElement('video');\r\n\r\n if (!file) {\r\n return;\r\n }\r\n\r\n dispatch({ type: 'video.selected' });\r\n\r\n //Android has a webview issue. So we are skipping trying to extra duration.\r\n //When the video loads for the first time, in the app, we will update the duration there.\r\n if (isInsideNativeApp() && OS.android == getMobileOperatingSystem()) {\r\n dispatch({ type: 'file.loaded', data: { file: file, duration: null } });\r\n return;\r\n }\r\n\r\n if (file.size > maxFileSize) {\r\n logEvent('Video File Validation Failed', ANALYTICS_CATEGORY, { label: 'size', value: file.size });\r\n dispatch({\r\n type: 'error',\r\n data: 'size'\r\n });\r\n return;\r\n }\r\n\r\n video.preload = 'metadata';\r\n video.src = objectUrl;\r\n video.onloadedmetadata = () => {\r\n const duration = video.duration;\r\n window.URL.revokeObjectURL(video.src);\r\n\r\n if (duration > maxDuration) {\r\n logEvent('Video File Validation Failed', ANALYTICS_CATEGORY, { label: 'duration', value: duration });\r\n dispatch({\r\n type: 'error',\r\n data: 'duration'\r\n });\r\n return;\r\n }\r\n\r\n logEvent('Video File Selected', ANALYTICS_CATEGORY, { value: duration });\r\n dispatch({ type: 'file.loaded', data: { file: file, duration: duration } });\r\n };\r\n\r\n video.onerror = () => {\r\n reportError('VideoUpload error - Video load failed', {\r\n errorCode: video.error && video.error.code,\r\n errorMessage: video.error && video.error.message,\r\n filesize: file.size,\r\n filename: file.name\r\n });\r\n dispatch({ type: 'error', data: 'load' });\r\n };\r\n };\r\n\r\n const handleFormSubmit = (title, filmTypeEnum, videoUrl) => {\r\n if (videoUrl) {\r\n createWebLinkVideo(title, filmTypeEnum, videoUrl);\r\n } else if (state.file) {\r\n startUpload(state.file, title, filmTypeEnum);\r\n }\r\n };\r\n\r\n const confirmUploadCancel = () => {\r\n const label = isProcessing ? 'During processing' : 'During uploading';\r\n const msSinceStart = Date.now() - state.uploadStart;\r\n const value = Math.floor(msSinceStart / 1000);\r\n\r\n logEvent('Upload Canceled', ANALYTICS_CATEGORY, { label, value });\r\n dispatch({ type: 'confirm.cancel' });\r\n };\r\n\r\n const isUploading = (state.upload || state.uploadStart) && !state.uploadError;\r\n\r\n const canPost = (state.video || state.videoFormat === VideoFormatEnum.WebResource) && !state.error && !isUploading;\r\n const videoFormatOptions = ['File Upload', 'Website link/URL'];\r\n return (\r\n <Modal\r\n open={state.showModal}\r\n title=\"Add video\"\r\n onDismiss={() => {\r\n dispatch({ type: 'modal.close' });\r\n }}\r\n >\r\n <div className=\"mb-4\">\r\n <Select\r\n label=\"Video Format\"\r\n name=\"videoformat\"\r\n disabled={isUploading}\r\n options={videoFormatOptions}\r\n onChange={(value, name) => {\r\n dispatch({\r\n type: 'videoFormat.selected',\r\n data: { videoFormat: videoFormatOptions.indexOf(value) }\r\n });\r\n }}\r\n />\r\n </div>\r\n\r\n {state.videoFormat === VideoFormatEnum.FileUpload && (\r\n <VideoFilePicker\r\n video={state.video}\r\n handleFileSelected={handleFileSelected}\r\n error={state.error}\r\n maxDuration={maxDuration}\r\n maxFileSize={maxFileSize}\r\n isUploading={isUploading}\r\n dispatch={dispatch}\r\n />\r\n )}\r\n\r\n <VideoUploadForm\r\n videoFormat={state.videoFormat}\r\n isUploading={isUploading}\r\n disabled={!canPost}\r\n onSubmit={handleFormSubmit}\r\n dispatch={dispatch}\r\n isVerifyVideoUpload={isVerifyVideoUpload}\r\n />\r\n\r\n {isUploading && state.videoFormat === VideoFormatEnum.FileUpload && (\r\n <div className=\"w-full mt-4 space-y-2\">\r\n <ProgressBar percentComplete={state.progress} hideNumber />\r\n <p className=\"text-muted text-center text-body\">Uploading...</p>\r\n </div>\r\n )}\r\n\r\n {state.uploadError && (\r\n <div className=\"w-3/4 mx-auto mt-4 text-center text-critical text-body\">\r\n {state.uploadErrorMessage ?? 'Upload failed. Please try again.'}\r\n </div>\r\n )}\r\n\r\n {state.showCancel && (\r\n <div className=\"absolute top-0 left-0 flex flex-col items-center justify-center gap-4 w-full h-full p-8 bg-foreground-base\">\r\n <Heading>Are you sure you want to cancel this post?</Heading>\r\n <div className=\"flex items-center justify-center gap-2\">\r\n <Button outline onClick={confirmUploadCancel}>\r\n Yes\r\n </Button>\r\n <Button\r\n onClick={() => {\r\n dispatch({ type: 'dismiss.cancel' });\r\n }}\r\n >\r\n No\r\n </Button>\r\n </div>\r\n </div>\r\n )}\r\n </Modal>\r\n );\r\n};\r\n\r\nVideoUploadModal.propTypes = {\r\n profileId: PropTypes.number.isRequired,\r\n sportEnum: PropTypes.string.isRequired,\r\n maxDuration: PropTypes.number,\r\n maxFileSize: PropTypes.number,\r\n onComplete: PropTypes.func.isRequired,\r\n onCancel: PropTypes.func.isRequired,\r\n isVerifyVideoUpload: PropTypes.bool\r\n};\r\n\r\nexport default VideoUploadModal;\r\n","import * as UpChunk from '@mux/upchunk';\r\n\r\nexport const uploadVideo = (videoFile, url, onProgress, onSuccess, onError, onOffline, onOnline) => {\r\n const upload = UpChunk.createUpload({\r\n file: videoFile,\r\n endpoint: url,\r\n // The size in kb of the chunks to split the file into, with the exception of the final chunk which may be smaller. This parameter should be in multiples of 256.\r\n chunkSize: 5120,\r\n // The number of times to retry any given chunk.\r\n retries: 5,\r\n // The time in seconds to wait before attempting to upload a chunk again.\r\n delayBeforeRetry: 1\r\n });\r\n\r\n // progress { detail: [0..100] }\r\n upload.on('progress', progress => {\r\n const detail = progress && progress.detail;\r\n onProgress && onProgress(detail);\r\n });\r\n\r\n // Fired when the upload is finished successfully.\r\n upload.on('success', () => {\r\n onSuccess && onSuccess();\r\n });\r\n\r\n // error { detail: { message: String, chunkNumber: Integer, attempts: Integer } }\r\n upload.on('error', error => {\r\n const detail = error && error.detail;\r\n onError && onError(detail);\r\n });\r\n\r\n // Fired with network goes offline\r\n upload.on('offline', () => {\r\n onOffline && onOffline();\r\n });\r\n\r\n // Fired with network goes online\r\n upload.on('online', () => {\r\n onOnline && onOnline();\r\n });\r\n\r\n return upload;\r\n};\r\n","export const FilmTypeOptions = [\r\n { label: 'Highlights', value: 1 },\r\n { label: 'Game footage', value: 2 },\r\n { label: 'Skills/Drills', value: 3 }\r\n];\r\n\r\nexport const PROFILE_INTERACTION_CONTEXT_ENUM = {\r\n AthleteProfile: 1,\r\n PublicPreview: 2,\r\n MarketplaceEvaluation: 3,\r\n PublicProfile: 4\r\n};\r\n"],"names":["ProgressBar","_ref","percentComplete","hideNumber","roundPercent","Math","round","_jsx","className","children","cx","style","width","concat","transition","propTypes","PropTypes","isRequired","props","_jsxs","xmlns","height","viewBox","strokeWidth","stroke","fill","strokeLinecap","strokeLinejoin","d","callback","delay","savedCallback","useRef","useEffect","current","id","setInterval","clearInterval","ANALYTICS_CATEGORY","fileInputRef","React","UploadButton","onFileSelected","disabled","_Fragment","Button","variant","icon","UploadIcon","onClick","openFileDialog","logEvent","click","ref","type","accept","onChange","e","files","target","file","value","placeholder","VideoUploadStatusEnum","VideoFormatEnum","VideoError","_ref2","message","renderVideoError","error","maxDuration","maxFileSize","duration","size","Error","SelectedVideoCancel","_ref3","dispatch","Icon","source","CloseMinor","color","initialState","video","upload","uploadStart","progress","showModal","showCancel","cancelConfirm","uploadError","uploadErrorMessage","videoFormat","reducer","state","action","data","selectedVideo","Date","now","initiatedVideo","Object","assign","Guid","guid","uploadProgress","getUploadTick","next","adjusted","processingProgress","random","clamp","getProcessingTick","VideoUploadForm","_ref4","isUploading","onSubmit","isVerifyVideoUpload","values","errors","handleChange","handleSubmit","useValidatedForm","title","filmTypeEnum","videoUrl","vals","length","match","indexOf","noValidate","FormLayout","Row","Item","TextInput","label","name","maxLength","ChoiceGroup","selected","choices","FilmTypeOptions","ButtonGroup","submit","VideoFilePicker","_ref5","handleFileSelected","selector","PlayIconDesign","VideoDuration","VideoUploadModal","_ref6","_state$uploadErrorMes","profileId","sportEnum","onCancel","onComplete","useReducer","logImpression","pause","VideoApi","webResourceGuid","isProcessing","useInterval","then","setTimeout","catch","reportError","startUpload","ProfileId","SportEnum","Title","Description","FilmTypeEnum","FileName","FileLen","uploadVideo","videoFile","url","onProgress","onSuccess","onError","onOffline","onOnline","UpChunk","endpoint","chunkSize","retries","delayBeforeRetry","on","detail","uploadUrl","logUploadComplete","VideoInteractionContextEnum","AthleteProfile","logUploadStart","status","canPost","videoFormatOptions","Modal","open","onDismiss","Select","options","objectUrl","window","webkitURL","createObjectURL","URL","document","createElement","isInsideNativeApp","OS","android","getMobileOperatingSystem","preload","src","onloadedmetadata","revokeObjectURL","onerror","errorCode","code","errorMessage","filesize","filename","handleFormSubmit","createWebLinkVideo","Url","Heading","outline","confirmUploadCancel","msSinceStart","floor","PROFILE_INTERACTION_CONTEXT_ENUM","PublicPreview","MarketplaceEvaluation","PublicProfile"],"sourceRoot":""}