{"version":3,"sources":["../configs/nextConfigs/next.config.js","../configs/npmPackage/npmPackage.ts","../services/baseUrl.ts","../helpers/environment.ts","../helpers/conditions/conditions.ts","../helpers/helpers.ts","../helpers/constants.ts","../services/apiCaller.ts","../services/services.ts","../redux/index.ts","../redux/actions/index.ts","../redux/actions/chat.actions.ts","../redux/actions/videoData.actions.ts","../logs/logs.ts","../redux/actions/controller.actions.ts","../logs/fluentdLogger.ts","../helpers/index.ts","../helpers/hooks/index.ts","../helpers/hooks/useActiveInActive.tsx","../helpers/hooks/useBackButton.tsx","../helpers/hooks/useBeforeUnload.tsx","../logs/index.ts","../ui/src/playerComponents/continuousPlayback/continuousePlayback.ts","../helpers/hooks/useFullScreen.tsx","../helpers/hooks/useHandleKeyPress.tsx","../helpers/hooks/useKeyPress.tsx","../helpers/hooks/useHandleParams.tsx","../redux/actions/user.actions.ts","../helpers/hooks/useHandleScroll.tsx","../helpers/hooks/useOnClickOutside.tsx","../helpers/hooks/useGetData/useGetData.tsx","../helpers/hooks/useGetData/useGetAggregat.tsx","../helpers/hooks/useGetData/useGetDetails.tsx","../helpers/hooks/useGetData/useGetMarkers.tsx","../helpers/hooks/useGetData/useGetPlayList.tsx","../helpers/hooks/useGetData/useGetProfile.tsx","../helpers/hooks/useGetData/useGetRecommendationList.tsx","../helpers/hooks/useGetData/useUserSettings.tsx","../helpers/hooks/useGetData/useVideoSettings.tsx","../helpers/hooks/useGetData/useWebListConfig.tsx","../helpers/hooks/usePingPong.tsx","../helpers/hooks/useRouteChange.tsx","../helpers/hooks/useWatchingDuration.tsx","../configs/getDetailsConfigs.ts","../services/index.ts","../redux/actions/cinemahamrah.actions.ts","../redux/actions/comment.action.ts","../redux/actions/progressbar.actions.ts","../redux/actions/tags.actions.ts","../redux/actions/playerCore.actions.ts","../redux/actions/quiz.actions.ts"],"sourcesContent":["module.exports = {\r\n    status: 'development',\r\n    baseUrl: \"https://hamrahi.cloud\",\r\n    driveRestAPI: \"https://hamrahi.cloud/api\",\r\n    chatBaseUrl: \"wss://hamrahi.cloud/\",\r\n    GA_MEASUREMENT_ID: \"G-5JZ2S6WR6D\",\r\n    favIconUrl: \"https://hamrahi.cloud/drive/hamrahi.svg\",\r\n    zarebinUserConfig: \"https://hamrahi.cloud/get-header\",\r\n    loginBaseUrl: 'https://landing-restapi.pr.mci.dev',\r\n    trackerRestAPI: 'https://hamrahi.cloud',\r\n    aggregatorBaseUrl: 'https://aggregator.hamrahi.cloud/',\r\n    setAggregatorBaseUrl: 'https://setaggregator.hamrahi.cloud/',\r\n    fluentdUrl: 'https://hamrahi.cloud',\r\n    loginRedirectUrl: 'zarebinlite://login',\r\n    cookieKey: 'HAMRAHI_CLOUD_AUTH_TOKEN',\r\n    whiteListTargets: 'abrehamrahi.ir,hamrahi.cloud,sthamrahi.ir',\r\n    whiteListGeneralUrl: 'hamrahi.cloud,abrehamrahi.ir,zarebin.ir,mohtava.cloud,eshterak.cloud,cinemahamrah.ir',\r\n    sendXToken: 'true',\r\n    voucherAPI: 'https://cinemahamrah.ir',\r\n    chatAPIBaseUrl: 'https://hamrahi.cloud/chatapi/',\r\n    ekran: 'https://ekrn.ir',\r\n    cinemaHamrah: 'false',\r\n    assistant: false,\r\n    initialLoadedFragmentCount: \"3\",\r\n    filmAndSerialAllowedUsers : JSON.stringify([\r\n        {\r\n            user_id: 216,\r\n        },\r\n        {\r\n            user_id: 196,\r\n        },\r\n    ]),\r\n    cinemaHamrahAllowedUsers: JSON.stringify([\r\n        {\r\n            user_id: 43873,\r\n            free: true\r\n        }\r\n    ]),\r\n    keshtAllowedUsers : JSON.stringify([\r\n        {\r\n            user_id: 98735,\r\n        },\r\n    ]),\r\n    filmAndSerialBasePath: \"/film-serial\"\r\n}\r\n","export const isNpmPackage = false;","\r\n\r\nconst envs = require('../configs/nextConfigs/next.config.js');\r\nconst isNpmPackage = require('../configs/npmPackage/npmPackage');\r\n\r\nimport Cookies from \"js-cookie\";\r\n\r\nexport const getStatus = () => isNpmPackage ? envs.status : process.env.status as string;\r\nexport const getGetAggregatorApiLiveUrl = () => isNpmPackage ? envs.aggregatorBaseUrl : process.env.aggregatorBaseUrl as string;\r\nexport const getSetAggregatorUrl = () => isNpmPackage ? envs.setAggregatorBaseUrl : process.env.setAggregatorBaseUrl as string;\r\nexport const getRestApiLiveUrl = () => (isNpmPackage ? envs.baseUrl : process.env.baseUrl as string) + \"/live/api\";\r\nexport const getRestApiUrl = () => (isNpmPackage ? envs.baseUrl : process.env.baseUrl as string) + \"/api\";\r\nexport const getRestApiCommentUrl = () => (isNpmPackage ? envs.baseUrl : process.env.baseUrl as string) + \"/comment-service/api\";\r\nexport const getFluentdUrl = () => isNpmPackage ? envs.fluentdUrl : process.env.fluentdUrl as string;\r\nexport const getEmojiUrl = () => (isNpmPackage ? envs.baseUrl : process.env.baseUrl as string) + \"/emoji\";\r\nexport const getLoginZarebinUrl = () => isNpmPackage ? envs.loginRedirectUrl : process.env.loginRedirectUrl as string;\r\nexport const getMagnix = () => isNpmPackage ? envs.baseUrl : process.env.baseUrl as string;\r\nexport const getChatBaseUrl = () => isNpmPackage ? envs.chatBaseUrl : process.env.chatBaseUrl as string;\r\nexport const uesrTracker = () => (isNpmPackage ? envs.trackerRestAPI : process.env.trackerRestAPI as string) + \"/tracker-service/api\";\r\nexport const voucherAPI = () => (isNpmPackage ? envs.voucherAPI : process.env.voucherAPI as string) + \"/voucher/api\";\r\nexport const getChatAPIUrl = () => isNpmPackage ? envs.chatAPIBaseUrl : process.env.chatAPIBaseUrl as string;\r\nexport const ekrnAPIUrl = () => (isNpmPackage ? envs.ekran : process.env.ekran as string) + \"/voucher/api\";\r\nexport const getLoginBaseUrl = () => (isNpmPackage ? envs.loginBaseUrl : process.env.loginBaseUrl as string) + \"/api\";\r\nexport const getWhiteListTargets = () => isNpmPackage ? envs.whiteListTargets : process.env.whiteListTargets as string;\r\nexport const getWhiteListGeneralUrlTargets = () => isNpmPackage ? envs.whiteListGeneralUrlTargets : process.env.whiteListGeneralUrlTargets as string;\r\nexport const getIsCinemaHamrah = () => isNpmPackage ? envs.cinemaHamrah : process.env.cinemaHamrah as string;\r\nexport const getIsSendToken = () => isNpmPackage ? envs.sendXToken : process.env.sendXToken as string;\r\nexport const getInitialLoadedFragmentCount = () => isNpmPackage ? envs.initialLoadedFragmentCount : process.env.initialLoadedFragmentCount as string;\r\nexport const getZarebinUserConfig = () => isNpmPackage ? envs.zarebinUserConfig : process.env.zarebinUserConfig as string;\r\nexport const getAccessToken = () => {\r\n    let cookieKey: string = getCookieKey();\r\n    const cookieValue = Cookies.get(cookieKey);\r\n    if (cookieValue) {\r\n        return (isNpmPackage ? (envs.status === \"fars\") : (process.env.status === \"fars\")) ? cookieValue : JSON.parse(cookieValue).access as string;\r\n    }\r\n    return false;\r\n};\r\nexport const getCookieKey = () => isNpmPackage ? envs.cookieKey : process.env.cookieKey as string;","import { getWhiteListGeneralUrlTargets, getWhiteListTargets } from \"services/baseUrl\";\r\nimport { ConditionName, IEnvironment } from \"../interfaces\";\r\nimport { conditions } from \"./conditions/conditions\";\r\n\r\nexport const whiteListTargets = getWhiteListTargets() ? getWhiteListTargets().split(',') : [];\r\n\r\nexport const whiteListGeneralUrlTargets = getWhiteListGeneralUrlTargets() ? getWhiteListGeneralUrlTargets().split(',') : [];\r\n\r\nexport const ENVIRONMENT: IEnvironment = {\r\n    reduxDevTool: true\r\n}\r\n\r\nexport const sportBackBtnArea = 16;  /// default padding equal 20\r\n\r\nexport const activeElementsTime = 3000;\r\n\r\nexport const showLoaderTime = 3000;\r\n\r\nexport const livePlayRetryDuration = 3000;\r\n\r\nexport const RetryCountGeneralDataFetch = 3;\r\n\r\nexport const RetryTimeDelayGeneralDataFetch = 5;\r\n\r\nexport const justAudio = 64;\r\n\r\nexport const footerPadding = () => {\r\n    if (conditions(ConditionName.footerPaddingZero)) return 0;\r\n    else return 64\r\n}\r\n\r\nexport const featureToggle = \"ft\";\r\n\r\nexport const sidebarWidth = 357;","import store from \"../../redux/store\";\r\nimport {getAccessToken, getInitialLoadedFragmentCount, getIsCinemaHamrah, getIsSendToken, getStatus} from \"../../services/baseUrl\";\r\nimport { justAudio } from \"../environment\";\r\nimport {\r\n    isIOS,\r\n    isFullMobilePortrait,\r\n    isTouchScreen,\r\n    isTouchScreenLandscape,\r\n    isTouchScreenPortrait,\r\n    isWhiteListUrl,\r\n    staticFormats\r\n} from \"../helpers\";\r\nimport Cookies from \"js-cookie\";\r\nimport { firstQuizQuestion, lastQuizQuestionStatus } from \"../../redux/actions/quiz.actions\"\r\nimport { ConditionName, QuizTypes } from \"interfaces\";\r\n\r\nexport const conditions = (type: string) => {\r\n\r\n    const {\r\n        trailer,\r\n        ads,\r\n        params,\r\n        details,\r\n        getDetailsFromVoucher,\r\n        gif,\r\n        isComplexPortrait,\r\n        isComplexDesktop,\r\n        markers,\r\n        subtitles,\r\n        question,\r\n        emojis,\r\n        onlineViewers,\r\n        alternative_Lives,\r\n        recommendationList,\r\n        multiAudio,\r\n        isLiveError,\r\n        isValidAddress,\r\n        isFetchDetails,\r\n        token,\r\n        selectedOptionId,\r\n        emojiList1,\r\n        emojiList2,\r\n        selectedSubtitle,\r\n        playList,\r\n        isManifestError,\r\n        videoElementSizeInfo,\r\n        chartPoints,\r\n        isReady,\r\n        cinemaHamrahState,\r\n        isAdBlockerActivate,\r\n    } = store.getState().videoData;\r\n    const {\r\n        firstPlay,\r\n        lock,\r\n        canPlayVideo,\r\n        qualityLevels,\r\n        manualQuality,\r\n        activeElements,\r\n        isLoading,\r\n        isLive,\r\n        isEnded,\r\n        isAutoPlay,\r\n        play,\r\n        isFullScreen,\r\n        autoQuality,\r\n        showMiniPlayer,\r\n        loadedFragmentsCount\r\n    } = store.getState().controller;\r\n    const {\r\n        trailerPopover,\r\n        settingPopover,\r\n        markersListPopover,\r\n        sharePopover,\r\n        feedbackPopover,\r\n        multiLivesPopover,\r\n        fullRatePopover,\r\n        autoPlayPopover,\r\n        recommendListPopover,\r\n        speedPopover,\r\n        tagsPopover,\r\n        personalMarkersPopover,\r\n        bookmarksPopover,\r\n        chatPopover,\r\n        loginPopover,\r\n        preFactorPopover,\r\n        chatEmojisPopover,\r\n        commentPopover,\r\n        playListCardPopover,\r\n        playListPopover,\r\n        pollPopover\r\n    } = store.getState().popovers;\r\n    const {canAddComment, canShowSubmittedComment, commentsCount} = store.getState().comments;\r\n    const {selectedTags, inputTagSearch} = store.getState().tags;\r\n    const {\r\n        isLogin,\r\n        settings,\r\n        bookmarkId,\r\n        avatar_url,\r\n        name,\r\n        phone_number,\r\n        showVoucherPopup,\r\n        voucherToken,\r\n        videoSettings,\r\n        showContinuousePlayback,\r\n        xToken\r\n    } = store.getState().user;\r\n    const {chatEnabled, showChat} = store.getState().chats;\r\n    const { quiz, chances } = store.getState().quiz;\r\n\r\n    switch (type) {\r\n        case ConditionName.showHeader:\r\n            return !firstPlay && canPlayVideo && !autoPlayPopover;\r\n        case ConditionName.showMain:\r\n            return !lock || firstPlay;\r\n        case ConditionName.showFooter:\r\n            return !firstPlay && canPlayVideo;\r\n        case ConditionName.showGif:\r\n            return !firstPlay && params.type === \"live\" && settings.poll_emoji && gif;\r\n        case ConditionName.showFullScreenIconInComplexPortrait:\r\n            return isComplexPortrait && !firstPlay && !lock;\r\n        case ConditionName.showElapsedTime:\r\n            return params.type !== \"live\" && (!isFullMobilePortrait() || staticFormats(params.type!));\r\n        case ConditionName.showLiveStatus:\r\n            return params.type === \"live\" && !firstPlay && !lock && ((isIOS() && isTouchScreenPortrait() || !isIOS())) && !isEnded;\r\n        case ConditionName.showLiveStatusInComplexPortrait:\r\n            return params.type === \"live\" && !isEnded;\r\n        case ConditionName.showAudioEqualizer:\r\n            return params.type === \"live\" && +qualityLevels[manualQuality!] === justAudio;\r\n        case ConditionName.showTouchVolumeBrightness:\r\n            return !firstPlay && isTouchScreenLandscape() && !lock && !isEnded && params.raw !== \"true\";\r\n        case ConditionName.showBackwardForward:\r\n            return !firstPlay && isTouchScreen() && !lock && params.raw !== \"true\" && (!isEnded || (isEnded && params.type !== \"live\"));\r\n        case ConditionName.showPoll:\r\n            return settings.poll_emoji && !firstPlay && question && question.active && !lock && params.type === \"live\" && ((isIOS() && isTouchScreenPortrait() || !isIOS()));\r\n        case ConditionName.showFullRate:\r\n            return !staticFormats(params.type!) && !firstPlay && params.fullrate === \"true\" && fullRatePopover !== undefined;\r\n        case ConditionName.showTitle:\r\n            return !staticFormats(params.type!) && params.type !== \"live\" && params.isGeneral !== \"true\" && !lock;\r\n        case ConditionName.showSnapShot:\r\n            return !firstPlay && params.portrait !== \"true\" && params.snapshot === \"true\" && (!staticFormats(params.type!) || isWhiteListUrl(params.src!));\r\n        case ConditionName.showInstagramEmoji:\r\n            return settings.poll_emoji && emojis && params.type === \"live\" && !firstPlay && !isComplexPortrait;\r\n        case ConditionName.showOnlineViewers:\r\n            return !!onlineViewers && onlineViewers > 0 && (!isComplexPortrait || params.quiz === \"true\");\r\n        case ConditionName.showMultiLivePopover:\r\n            return multiLivesPopover;\r\n        case ConditionName.showMarkerListPopover:\r\n            return markersListPopover;\r\n        case ConditionName.showFullRatePopover:\r\n            return fullRatePopover;\r\n        case ConditionName.showAutoPlayPopover:\r\n            return autoPlayPopover && isEnded && params.portrait === \"true\" && !showMiniPlayer && (recommendationList && recommendationList.length > 0);\r\n        case ConditionName.showRecommendListPopover:\r\n            return recommendListPopover;\r\n        case ConditionName.showSettingPopover:\r\n            return settingPopover;\r\n        case ConditionName.showSpeedPopover:\r\n            return speedPopover;\r\n        case ConditionName.showTagsPopover:\r\n            return tagsPopover;\r\n        case ConditionName.showPersonalMarkerPopover:\r\n            return personalMarkersPopover;\r\n        case ConditionName.showBookmarksPopover:\r\n            return !!bookmarksPopover;\r\n        case ConditionName.showFeedbackPopover:\r\n            return feedbackPopover;\r\n        case ConditionName.showChatPopover:\r\n            return !!chatPopover;\r\n        case ConditionName.showVoucherPopup:\r\n            return showVoucherPopup;\r\n        case ConditionName.showTrailerPopover:\r\n            return trailerPopover;\r\n        case ConditionName.showLoginPopover:\r\n            return loginPopover;\r\n        case ConditionName.showAutoPlayListTouchIcon:\r\n            return isEnded && !autoPlayPopover && isTouchScreenLandscape() && params.portrait === \"true\" && !isIOS() && !lock && (recommendationList && recommendationList.length > 0);\r\n        case ConditionName.showMultiLive:\r\n            return alternative_Lives && alternative_Lives.length > 0 && settings.poll_emoji;\r\n        case ConditionName.showBigReplayIcon:\r\n            return isEnded && params.portrait === \"true\" && isTouchScreen() && ((isIOS() && isTouchScreenPortrait() || !isIOS()));\r\n        case ConditionName.showReplayIcon:\r\n            return params.portrait === \"true\" && !isIOS() && !isTouchScreen() && showMiniPlayer !== true;\r\n        case ConditionName.showPlayNextIcon:\r\n            return params.portrait === \"true\" && !isIOS() && (!isTouchScreen() || isTouchScreenLandscape()) && params.isGeneral !== \"true\" && showMiniPlayer !== true;\r\n        case ConditionName.showAutoPlayToggleIcon:\r\n            return params.portrait === \"true\" && params.isGeneral !== \"true\" && ((isIOS() && isTouchScreenPortrait() || !isIOS())) && showMiniPlayer !== true;\r\n        case ConditionName.showSettingIcon:\r\n            return !staticFormats(params.type!) && !isIOS();\r\n        case ConditionName.showLikeDislike:\r\n            return !staticFormats(params.type!) && params.isGeneral !== \"true\" && !isComplexDesktop;\r\n        case ConditionName.showBanner:\r\n            return firstPlay && details.banner;\r\n        case ConditionName.showBannerStaticFiles:\r\n            return firstPlay && params.cover;\r\n        case ConditionName.showSpeedIcon:\r\n            return params.type !== \"live\";\r\n        case ConditionName.showShareInSetting:\r\n            return !isComplexPortrait && !isComplexDesktop;\r\n        case ConditionName.showPlayListIcon:\r\n            return (playList && playList.length > 0) && (isFullScreen || (!isFullScreen && params.portrait !== \"true\")) && showMiniPlayer !== true;\r\n        case ConditionName.showPlayListTabTouchscreen:\r\n            return (playList && playList.length > 0) && isTouchScreen();\r\n        case ConditionName.showCommentComponent:\r\n            return canAddComment || (!canAddComment && commentsCount > 0);\r\n        case ConditionName.showUnlockIconInHeader:\r\n            return (staticFormats(params.type!) || params.isGeneral === \"true\") && !lock\r\n        case ConditionName.showModuleTitle:\r\n            return params.showModuleTitle === \"true\"\r\n        case ConditionName.showProgressbar:\r\n            return !(isIOS() && params.type === \"live\") && !(params.type === \"live\" && isEnded);\r\n        case ConditionName.showAgeClassification:\r\n            return details.pg_state && !lock;\r\n        case ConditionName.showChat:\r\n            return params.type === \"live\" && chatEnabled && showChat;\r\n        case ConditionName.showMiniPlayer:\r\n            return showMiniPlayer;\r\n        case ConditionName.showPictureInPicture:\r\n            return showMiniPlayer !== true && !isIOS() && params.site !== \"zarebin.ir\";\r\n        case ConditionName.showPersonalMarker:\r\n            return params.authentication === \"true\" && (params.featureSet === undefined || params.featureSet.personalMarker !== \"false\");\r\n        case ConditionName.showFeedback:\r\n            return params.featureSet === undefined || params.featureSet.feedback !== \"false\";\r\n        case ConditionName.showPreFactorPopover:\r\n            return preFactorPopover;\r\n        case ConditionName.showTabNavigator:\r\n            return params.authentication === \"true\" && (params.featureSet === undefined || params.featureSet.profileFooter !== \"false\");\r\n        case ConditionName.showBookmark:\r\n            return params.authentication === \"true\" && (params.featureSet === undefined || params.featureSet.bookmark !== \"false\");\r\n        case ConditionName.showVideoUploadTime:\r\n            return params.featureSet === undefined || params.featureSet.videoUploadTime !== \"false\";\r\n        case ConditionName.showVideoViewers:\r\n            return params.featureSet === undefined || params.featureSet.videoViewers !== \"false\";\r\n        case ConditionName.showRecommendationList:\r\n            return params.featureSet === undefined || params.featureSet.recommendationList !== \"false\";\r\n        case ConditionName.hidePopovers:\r\n            return !markersListPopover && !settingPopover && !feedbackPopover && !sharePopover && !multiLivesPopover;\r\n        case ConditionName.isRaw:\r\n            return params.raw;\r\n        case ConditionName.isParamsPortrait:\r\n            return params.portrait === \"true\";\r\n        case ConditionName.isComplexPortrait:\r\n            return isComplexPortrait;\r\n        case ConditionName.isComplexDarkModePortrait:\r\n            return isComplexPortrait && params.theme === \"dark\";\r\n        case ConditionName.isComplexDesktop:\r\n            return isComplexDesktop;\r\n        case ConditionName.isLandscape:\r\n            return window.innerHeight <= window.innerWidth;\r\n        case ConditionName.isTouchScreen:\r\n            return isTouchScreen();\r\n        case ConditionName.isTouchScreenPortrait:\r\n            return isTouchScreenPortrait();\r\n        case ConditionName.isTouchScreenLandscape:\r\n            return isTouchScreenLandscape();\r\n        case ConditionName.isActiveElements:\r\n            return activeElements;\r\n        case ConditionName.isPlay:\r\n            return play;\r\n        case ConditionName.isFirstPlay:\r\n            return firstPlay;\r\n        case ConditionName.isLock:\r\n            return lock;\r\n        case ConditionName.isIOS:\r\n            return isIOS();\r\n        case ConditionName.isIOSLive:\r\n            return isIOS() && params.type === \"live\";\r\n        case ConditionName.isLoading:\r\n            return isLoading;\r\n        case ConditionName.isLive:\r\n            return isLive;\r\n        case ConditionName.isLiveParam:\r\n            return params.type === \"live\";\r\n        case ConditionName.isLiveError:\r\n            return isLiveError;\r\n        case ConditionName.isDarkMode:\r\n            return params.theme === \"dark\";\r\n        case ConditionName.isStaticFormat:\r\n            return staticFormats(params.type!);\r\n        case ConditionName.isEnded:\r\n            return isEnded;\r\n        case ConditionName.isAutoPlay:\r\n            return isAutoPlay;\r\n        case ConditionName.isFullScreen:\r\n            return isFullScreen;\r\n        case ConditionName.isGeneral:\r\n            return params.isGeneral === \"true\";\r\n        case ConditionName.isValidAddress:\r\n            return isValidAddress;\r\n        case ConditionName.isFetchDetails:\r\n            return isFetchDetails;\r\n        case ConditionName.isAutoQuality:\r\n            return settings.quality === -1;\r\n        case ConditionName.isAuth:\r\n            return token && params.isAuth === \"true\";\r\n        case ConditionName.isChildClassification:\r\n            return details.pg_state && details.pg_state < 14;\r\n        case ConditionName.isTeenagerClassification:\r\n            return details.pg_state && details.pg_state >= 14 && details.pg_state < 18;\r\n        case ConditionName.isYoungClassification:\r\n            return details.pg_state && details.pg_state >= 18;\r\n        case ConditionName.isSelectedSubtitle:\r\n            return !!subtitles && subtitles.length > 0 && selectedSubtitle;\r\n        case ConditionName.isManifestError:\r\n            return isManifestError;\r\n        case ConditionName.isZarebinSite:\r\n            return params.site === \"zarebin.ir\";\r\n        case ConditionName.isUserIdsParamsEqualAll:\r\n            return !!params.user_ids && params.user_ids === \"all\";\r\n        case ConditionName.isMiniPlayer:\r\n            return (params.portrait !== \"true\" || showMiniPlayer) && videoElementSizeInfo.width < 520;\r\n        case ConditionName.isFullMobilePortrait:\r\n            return isFullMobilePortrait();\r\n        case ConditionName.isLogin:\r\n            return isLogin\r\n        case ConditionName.isSpinSettingsIcon:\r\n            return settings.quality === -1 ? autoQuality === undefined : settings.quality !== manualQuality;\r\n        case ConditionName.isVttFitHeight:\r\n            return videoElementSizeInfo.height < 600 || isTouchScreen();\r\n        case ConditionName.isBookmark:\r\n            return bookmarkId !== undefined;\r\n        case ConditionName.isPressKeySpace:\r\n            return !lock && cinemaHamrahState === undefined && !ads.adStreamLink && !getDetailsFromVoucher && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyK:\r\n            return !lock && cinemaHamrahState === undefined && !getDetailsFromVoucher && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyI:\r\n            return !lock && !firstPlay && !showMiniPlayer && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyF:\r\n            return !lock && !firstPlay && !showMiniPlayer && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyS:\r\n            return params.type !== \"live\" && !lock && !firstPlay && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyC:\r\n            return !lock && !firstPlay && !showMiniPlayer && !!subtitles && subtitles.length > 0 && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyArrowRight:\r\n            return !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyArrowLeft:\r\n            return !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyL:\r\n            return !firstPlay && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyN:\r\n            return recommendationList && recommendationList.length > 0 && !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyQ:\r\n            return alternative_Lives && alternative_Lives.length > 0 && !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyE:\r\n            return markers.length !== 0 && !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isPressKeyM:\r\n            return !firstPlay && !lock && !ads.adStreamLink && !isAdBlockerActivate;\r\n        case ConditionName.isSendTimelineLog:\r\n            return !staticFormats(params.type!);\r\n        case ConditionName.isPointsQuiz:\r\n            return !!quiz && Object.keys(quiz).length > 0 && quiz.type === QuizTypes.Points;\r\n        case ConditionName.getDetailsFromVoucher:\r\n            return getDetailsFromVoucher;\r\n        case ConditionName.isReady:\r\n            return isReady;\r\n        case ConditionName.isAdBlockerActivate:\r\n            return !!isAdBlockerActivate;\r\n        case ConditionName.isPlayingAd:\r\n            return !!ads.adStreamLink;\r\n        case ConditionName.isSplusEnvironment:\r\n            return getStatus() === \"splus\";\r\n        case ConditionName.isCinemaHamrahEnvironment:\r\n            return getIsCinemaHamrah() === \"true\";\r\n        case ConditionName.isProduction:\r\n            return getStatus() === \"production\";\r\n        case ConditionName.isPaymentSuccess:\r\n            return getStatus() === \"production\";\r\n        case ConditionName.isPopoverOpen:\r\n            return [markersListPopover, settingPopover, sharePopover, feedbackPopover, multiLivesPopover, pollPopover, autoPlayPopover, recommendListPopover, tagsPopover, speedPopover, playListPopover, playListCardPopover, commentPopover, personalMarkersPopover, bookmarksPopover, chatPopover, chatEmojisPopover, trailerPopover, loginPopover, preFactorPopover].some((popover: boolean | undefined) => !!popover);\r\n        case ConditionName.backgroundColorInLightMode:\r\n            return isComplexDesktop || isComplexPortrait;\r\n        case ConditionName.heightScreen:\r\n            return !isComplexPortrait && !isComplexDesktop && !params.height;\r\n        case ConditionName.playByClickPoster:\r\n            return firstPlay && details.banner && cinemaHamrahState === undefined && !showVoucherPopup && !showContinuousePlayback;\r\n        case ConditionName.hasMarkers:\r\n            return markers.length !== 0;\r\n        case ConditionName.hasTitle:\r\n            return details.title;\r\n        case ConditionName.hasDescription:\r\n            return details.description;\r\n        case ConditionName.hasClipboard:\r\n            return navigator && navigator.clipboard && navigator.clipboard.writeText;\r\n        case ConditionName.hasRecommendationList:\r\n            return recommendationList && recommendationList.length > 0;\r\n        case ConditionName.hasTags:\r\n            return details.tag;\r\n        case ConditionName.hasPreviewTime:\r\n            return params.preview === \"true\";\r\n        case ConditionName.hasEmojis:\r\n            return emojis;\r\n        case ConditionName.hasEmojiList1Or2:\r\n            return (emojis && !!emojis.emoji_list_1) || (emojis && !!emojis.emoji_list_2);\r\n        case ConditionName.hasBanner:\r\n            return details.banner;\r\n        case ConditionName.hasMultiAudio:\r\n            return multiAudio.length > 0;\r\n        case ConditionName.hasDownloadLinks:\r\n            return details.download_links.length > 0 && (params.featureSet === undefined || params.featureSet.downloadUrl !== \"false\");\r\n        case ConditionName.hasStreamLink:\r\n            return details.stream_link;\r\n        case ConditionName.hasPoll:\r\n            return question && Object.keys(question).length > 0;\r\n        case ConditionName.hasUserIds:\r\n            return !!params.user_ids;\r\n        case ConditionName.hasAlternativeLives:\r\n            return alternative_Lives && alternative_Lives.length > 0;\r\n        case ConditionName.hasManualQuality:\r\n            return manualQuality !== undefined && manualQuality !== null;\r\n        case ConditionName.hasSound:\r\n            return !!settings.volume;\r\n        case ConditionName.hasVtt:\r\n            return !!details.vtt || !!details.vtt_mobile;\r\n        case ConditionName.hasAutoPlay:\r\n            return params.autoplay === \"true\";\r\n        case ConditionName.hasPlayList:\r\n            return (playList && playList.length > 0) && ((isTouchScreen() && playListPopover) || !isTouchScreen());\r\n        case ConditionName.hasXToken:\r\n            return !!params.xToken;\r\n        case ConditionName.hasMovieDetails:\r\n            return details.content_type !== null && details.content_type !== undefined;\r\n        case ConditionName.hasMovieContentType:\r\n            return details.content_type !== null;\r\n        case ConditionName.hasMovieReleaseYear:\r\n            return !!details.release_year;\r\n        case ConditionName.hasSubtitle:\r\n            return params.quiz !== \"true\" && !!subtitles && subtitles.length > 0 && !showMiniPlayer;\r\n        case ConditionName.hasIMDB:\r\n            return details.imdb_rate !== null;\r\n        case ConditionName.hasSelectedTags:\r\n            return !!selectedTags.length;\r\n        case ConditionName.hasInputTagSearch:\r\n            return !!inputTagSearch;\r\n        case ConditionName.hasFullScreenParams:\r\n            return params.fullscreen === \"true\";\r\n        case ConditionName.hasPreviewParams:\r\n            return params.preview === \"true\";\r\n        case ConditionName.hasChart:\r\n            return params.chart === \"true\" && !staticFormats(params.type!);\r\n        case ConditionName.hasChartPoints:\r\n            return !!chartPoints.length;\r\n        case ConditionName.hasOnFinishedParams:\r\n            return !!params.onFinished;\r\n        case ConditionName.hasOnSnapshotParams:\r\n            return !!params.onSnapshot;\r\n        case ConditionName.hasXTokenParamOrSendXToken:\r\n            const urlParams = new URLSearchParams(window.location.search);\r\n            const xTokenParams = urlParams.get('xToken');\r\n            return getIsSendToken() === \"true\" || xTokenParams;\r\n        case ConditionName.hasUserAvatar:\r\n            return !!avatar_url;\r\n        case ConditionName.hasUserName:\r\n            return !!name;\r\n        case ConditionName.hasUserPhoneNumber:\r\n            return !!phone_number;\r\n        case ConditionName.hasScrollElementId:\r\n            return !!params.scrollElementId && showMiniPlayer !== undefined && (isComplexDesktop || params.portrait === \"false\") && !isTouchScreen();\r\n        case ConditionName.hasSportProvider:\r\n            return params.provider === \"sport\";\r\n        case ConditionName.hasSidebar:\r\n            const container = document.getElementById(\"__container\");\r\n            return isComplexDesktop && ((playList && playList.length > 0) || (recommendationList && recommendationList.length > 0  && (params.featureSet === undefined || params.featureSet.recommendationList !== \"false\")) || isLogin) && (!!container ? container.getBoundingClientRect().width : window.innerWidth) > 900;\r\n        case ConditionName.isBeforeRequest:\r\n            return (params.type !== \"live\" && playList === undefined) || recommendationList === undefined\r\n        case ConditionName.hasCinemaHamrahState:\r\n            return !!cinemaHamrahState;\r\n        case ConditionName.hasVoucherToken:\r\n            return params.voucher === \"true\" && !!Cookies.get(\"voucher-token\");\r\n        case ConditionName.hasVoucherCodeParams:\r\n            return !!params.voucherCode;\r\n        case ConditionName.hasAdParam:\r\n            return params.ad === \"true\";\r\n        case ConditionName.hasTrailer:\r\n            return trailer.length !== 0;\r\n        case ConditionName.hasHParam:\r\n            return params.h === \"true\";\r\n        case ConditionName.hasPreviewStart:\r\n            return details.preview_start;\r\n        case ConditionName.hasPreviewEnd:\r\n            return details.preview_end;\r\n        case ConditionName.hasSubtitles:\r\n            return details.subtitles && details.subtitles.length > 0 && params.quiz !== \"true\";\r\n        case ConditionName.hasTransactionId:\r\n            return getIsCinemaHamrah() === \"true\" && !!params.transaction_id;\r\n        case ConditionName.hasHomeButtonClickFlag:\r\n            return !!params.homeButtonClickFlag;\r\n        case ConditionName.hasContinuousPlayback:\r\n            return !!videoSettings.time && showContinuousePlayback && !params.t && params.featureSet?.continuousPlayback === \"true\";\r\n        case ConditionName.hasPermittedLoadedFragment:\r\n            return loadedFragmentsCount.length >= Number(getInitialLoadedFragmentCount());\r\n        case ConditionName.getRecommendationList:\r\n            return params.portrait === \"true\" && params.quiz !== \"true\" && isFetchDetails;\r\n        case ConditionName.getLiveDetailsInIntervals:\r\n            return isLiveError && params.type === \"live\" && params.isGeneral !== \"true\";\r\n        case ConditionName.getDetails:\r\n            return !!params.type && params.id && params.isGeneral !== \"true\";\r\n        case ConditionName.getMarkers:\r\n            return [\"vod\", \"archive\", \"clip\"].includes(String(params.type)) && params.id && params.isGeneral !== \"true\" && params.quiz !== \"true\" && isFetchDetails;\r\n        case ConditionName.getPlayList:\r\n            return !staticFormats(params.type!) && params.type !== \"live\" && !isFullMobilePortrait() && isFetchDetails;\r\n        case ConditionName.firstGetDataIntervalAPI:\r\n            return params.type === \"live\" && params.isGeneral !== \"true\";\r\n        case ConditionName.getUserSetting:\r\n            return isLogin && params.quiz !== \"true\" && isFetchDetails;\r\n        case ConditionName.getVideoMetaData:\r\n            return isLogin && params.quiz !== \"true\" && isFetchDetails;\r\n        case ConditionName.getUserProfile:\r\n            return !!xToken && isFetchDetails;\r\n        case ConditionName.footerPaddingZero:\r\n            return (params.type !== \"live\" || (params.type === \"live\" && isTouchScreen())) || isTouchScreenPortrait();\r\n        case ConditionName.manaulPostAPI:\r\n            return !!selectedOptionId || emojiList1.length > 0 || emojiList2.length > 0\r\n        case ConditionName.canAccessVideo:\r\n            return !!(params.h === \"true\" && !!getAccessToken()) || !!(params.voucher === \"true\" && voucherToken) && !getDetailsFromVoucher;\r\n        case ConditionName.canAddComment:\r\n            return canAddComment;\r\n        case ConditionName.canShowSubmittedComment:\r\n            return canShowSubmittedComment;\r\n        case ConditionName.canPlayVideo:\r\n            return canPlayVideo;\r\n        case ConditionName.chatEnabled:\r\n            return chatEnabled;\r\n        case ConditionName.filterLastGif:\r\n            return +qualityLevels[qualityLevels.length - 2] === +qualityLevels[settings.quality === -1 ? (autoQuality ?? manualQuality!) : manualQuality!!];\r\n        case ConditionName.instagramEmojiAnimation:\r\n            return !isTouchScreen() || (isTouchScreen() && !activeElements);\r\n        case ConditionName.handleOverflowHidden:\r\n            return !isComplexDesktop || (isComplexDesktop && isFullScreen);\r\n        case ConditionName.thresholdOnlineViewers:\r\n            return !!onlineViewers && onlineViewers >= details.online_viewer_threshold;\r\n\r\n        // *** Quiz Conditions ***\r\n        case ConditionName.showQuizPopover:\r\n            return isLogin || firstQuizQuestion(quiz);\r\n        case ConditionName.isQuizStatusEqual1:\r\n            return !!quiz && Object.keys(quiz).length > 0 && quiz.questions.length > 0 && lastQuizQuestionStatus(quiz) === 1;\r\n        case ConditionName.isQuizStatusEqual2:\r\n            return !!quiz && Object.keys(quiz).length > 0 && quiz.questions.length > 0 && lastQuizQuestionStatus(quiz) === 2;\r\n        case ConditionName.isQuizStatusEqual4:\r\n            if (!!quiz && Object.keys(quiz).length > 0 && quiz.questions && quiz.questions.length > 0 && lastQuizQuestionStatus(quiz) === 4) return true\r\n            else return false\r\n        case ConditionName.isQuizEnd:\r\n            return !!quiz && Object.keys(quiz).length > 0 && quiz.questions && (quiz.number_of_questions === quiz.questions.length) && lastQuizQuestionStatus(quiz) === 4;\r\n        case ConditionName.hasQuizParams:\r\n            return params.quiz === \"true\";\r\n        case ConditionName.hasQuiz:\r\n            return !!quiz && Object.keys(quiz).length > 0 && !firstPlay;\r\n        case ConditionName.hasQuizQuestion:\r\n            return !!quiz && quiz.questions && quiz.questions.length; \r\n        case ConditionName.hasChances:\r\n            return chances !== -1;\r\n        case ConditionName.sendUserTrackerRequest:\r\n            return !!quiz && Object.keys(quiz).length > 0 && quiz.questions.length === 0 && !firstPlay && isLogin;\r\n        default:\r\n            break;\r\n    }\r\n}","import {\r\n    setClearControllerSlice,\r\n} from \"../redux/slices/controllerSlice\";\r\nimport {\r\n    setClearVideoDataSlice,\r\n    setErrorType,\r\n    setIsFetchDetails,\r\n    setIsValidAddress,\r\n    setStreamLinkParams,\r\n} from \"../redux/slices/videoDataSlice\";\r\nimport {livePoll} from \"./constants\";\r\nimport store from \"../redux/store\";\r\nimport {conditions} from \"./conditions/conditions\";\r\nimport {ConditionName, VideoNumberTypeEnum} from \"../interfaces/enums\";\r\nimport {apiCaller} from \"../services/apiCaller\";\r\nimport {API} from \"../services/services\";\r\nimport {setClearPopoversSlice} from \"../redux/slices/popoversSlice\";\r\nimport {setClearUserSlice} from \"../redux/slices/userSlice\";\r\nimport {setClearTagsSlice} from \"../redux/slices/tagsSlice\";\r\nimport {setClearCommentsSlice} from \"../redux/slices/commentsSlice\";\r\nimport {setClearChatSlice} from \"../redux/slices/chatSlice\";\r\nimport { whiteListGeneralUrlTargets, whiteListTargets } from \"./environment\";\r\nimport { authToken, findFirstVideoInRecommendationList } from \"redux-share\";\r\n\r\nexport const wait = (s: number) => new Promise((resolve) => setTimeout(resolve, s * 1000));\r\n\r\nexport const getRemainingTime = (timestamp: number) => {\r\n    const timePassedInSeconds = Math.floor(Date.now() / 1000 - timestamp);\r\n    const rtf = new Intl.RelativeTimeFormat('fa', {numeric: 'auto'});\r\n    switch (true) {\r\n        case timePassedInSeconds < 60:\r\n            return rtf.format(-timePassedInSeconds, 'second');\r\n        case timePassedInSeconds < 3600:\r\n            return rtf.format(-Math.floor(timePassedInSeconds / 60), 'minute');\r\n        case timePassedInSeconds < 86400:\r\n            return rtf.format(-Math.floor(timePassedInSeconds / 3600), 'hour');\r\n        case timePassedInSeconds < 2592000:\r\n            return rtf.format(-Math.floor(timePassedInSeconds / 86400), 'day');\r\n        case timePassedInSeconds < 31536000:\r\n            return rtf.format(-Math.floor(timePassedInSeconds / 2592000), 'month');\r\n        default:\r\n            return rtf.format(-Math.floor(timePassedInSeconds / 31536000), 'year');\r\n    }\r\n};\r\n\r\n\r\nexport const compare = (a: any, b: any) => {\r\n    if (a.time < b.time) return -1;\r\n    if (a.time > b.time) return 1;\r\n    return 0;\r\n};\r\n\r\nexport const handlePageTitle = (title: string) => {\r\n    if (title && conditions(ConditionName.showModuleTitle)) document.title = title;\r\n}\r\n\r\nexport const getUUID = () => {\r\n    let uuid = localStorage.getItem(\"hamrahiUUID\");\r\n    if (!uuid) {\r\n        uuid = uuidGenerator();\r\n        localStorage.setItem(\"hamrahiUUID\", uuid)\r\n    }\r\n    return uuid.toString();\r\n}\r\n\r\nexport const uuidGenerator = () => {\r\n    let uuid = \"xxxxxxxx-xxxx-Mxxx-Nxxx-x\".replace(/[xMN]/g, (char) => {\r\n        let val: number;\r\n        if (char === \"M\") val = Math.floor(1 + Math.random() * 5);\r\n        else if (char === \"N\") val = Math.floor(8 + Math.random() * 4);\r\n        else val = Math.floor(Math.random() * 16);\r\n        return val.toString(16);\r\n    });\r\n    uuid += Date.now().toString(16);\r\n    return uuid;\r\n}\r\n\r\nexport const isTouchScreen = () => 'ontouchstart' in window || (window as any)['DocumentTouch'] && document instanceof (window as any)['DocumentTouch']\r\nexport const isTouchScreenLandscape = () => {\r\n    const { videoElementSizeInfo } = store.getState().videoData;\r\n    const { isFullScreen } = store.getState().controller;\r\n    if (conditions(ConditionName.isMiniPlayer) && videoElementSizeInfo.width !== 0) {\r\n        return (isTouchScreen() && videoElementSizeInfo.width > videoElementSizeInfo.height);\r\n    }\r\n    return (isTouchScreen() && isFullScreen);\r\n}\r\nexport const isTouchScreenPortrait = () => {\r\n    const {videoElementSizeInfo} = store.getState().videoData;\r\n    const { isFullScreen } = store.getState().controller;\r\n    if (conditions(ConditionName.isMiniPlayer) && videoElementSizeInfo.width !== 0) {\r\n        return (isTouchScreen() && videoElementSizeInfo.width <= videoElementSizeInfo.height);\r\n    }\r\n    return (isTouchScreen() && !isFullScreen);\r\n}\r\nexport const handleIsComplexDesktop = (isPortrait: boolean) => (!isTouchScreen() && !document.fullscreenElement && isPortrait)\r\n\r\nexport const isIOS = () => {\r\n    return [\r\n            'iPad Simulator',\r\n            'iPhone Simulator',\r\n            'iPod Simulator',\r\n            'iPad',\r\n            'iPhone',\r\n            'iPod'\r\n        ].includes(navigator.platform)\r\n        // iPad on iOS 13 detection\r\n        || (navigator.userAgent.includes(\"Mac\") && \"ontouchend\" in document)\r\n}\r\n\r\nexport const addZeroBefore = (n: number) => {\r\n    return (n < 10 ? '0' : '') + n;\r\n}\r\n\r\nexport const secondsToHMS = (seconds: number) => {\r\n    const h = Math.floor(seconds / 3600);\r\n    const m = Math.floor(seconds % 3600 / 60);\r\n    const s = Math.floor(seconds % 3600 % 60);\r\n    return h < 1 ? `${addZeroBefore(m)}:${addZeroBefore(s)}` : `${addZeroBefore(h)}:${addZeroBefore(m)}:${addZeroBefore(s)}`\r\n}\r\n\r\nexport const secondsToPersianHMS = (seconds: number) => {\r\n    const h = Math.floor(seconds / 3600);\r\n    const m = Math.floor(seconds % 3600 / 60);\r\n    const s = Math.floor(seconds % 3600 % 60);\r\n    const second = s ? `${s} ثانیه` : null;\r\n    const minute = m ? `${m} دقیقه` : null;\r\n    const hour = h ? `${h} ساعت` : null;\r\n    return [hour, minute, second].filter(item => item !== null);\r\n}\r\n\r\nexport const efficientSecondsToPersianHMS = (seconds: number) => {\r\n    const h = seconds >= 60 * 60 ? Math.floor(seconds / 3600) : 0;\r\n    const m = seconds >= 60 ? Math.floor(seconds % 3600 / 60) : 0;\r\n    const s = seconds < 60 * 60 ? Math.floor(seconds % 3600 % 60) : 0;\r\n    const second = s ? `${s} ثانیه` : null;\r\n    const minute = m ? `${m} دقیقه` : null;\r\n    const hour = h ? `${h} ساعت` : null;\r\n    return [hour, minute, second].filter(item => item !== null).join(' و ');\r\n}\r\n\r\nexport const staticFormats = (realFormat: string) => {\r\n    if (['mp4', 'mkv', 'mov', 'm4v'].includes(realFormat)) return 'mp4';\r\n    else if (realFormat === 'webm' || realFormat === 'flv') return realFormat;\r\n    else if (['mp3', 'ogg'].includes(realFormat)) return 'mp3'\r\n    else return false;\r\n}\r\n\r\nexport const addUuidToSrc = (src: string) => {\r\n    const urlObject = new URL(src);\r\n    let urlSrc = src;\r\n    if (urlObject.search.length) return urlSrc += `&uuid=${getUUID()}`;\r\n    else return urlSrc += `?uuid=${getUUID()}`;\r\n}\r\n\r\nexport const handleSumVotes = (question: any) => {\r\n    let sumVotes = 0;\r\n    if (question && Object.keys(question).length > 0 && question.options.length > 0) {\r\n        question.options.forEach((option: any) => {\r\n            if (livePoll() && livePoll().polls.filter((poll: any) => poll.qid === question.id && poll.oid === option.id && poll.sumOptionVotes === option.vote + 1).length > 0) sumVotes += 1;\r\n            sumVotes += option.vote\r\n        });\r\n    }\r\n    return sumVotes;\r\n}\r\n\r\nexport const checkParentTarget = (event: any, target: string) => {\r\n    try {\r\n        return [event.target.id, event.target.parentNode.id, event.target.parentNode.parentNode.id, event.target.parentNode.parentNode.parentNode.id].includes(target);\r\n    } catch (error) {\r\n        return false;\r\n    }\r\n}\r\n\r\nexport const unitization = (viewers: number) => {\r\n    if (viewers / 1000 < 1) {\r\n        return {value: viewers, unit: \"\"};\r\n    } else if (viewers / (1000 * 1000) < 1) {\r\n        return {value: Math.ceil((viewers / 1000) * 10) / 10, unit: \"K\"};\r\n    } else if (viewers / (1000 * 1000 * 1000) < 1) {\r\n        return {value: Math.ceil((viewers / (1000 * 1000)) * 10) / 10, unit: \"M\"};\r\n    } else return {value: 0, unit: \"\"};\r\n}\r\n\r\nexport const handleNotActiveText = (errorType: string = \"404\") => {\r\n\r\n    if (errorType === \"liveAndVod\") {\r\n        return {\r\n            title: \"در حال حاضر محتوای ویدیویی در این کانال  برای این پخش‌زنده وجود ندارد.\",\r\n            description: \"شما می‌توانید سایر پخش زنده‌های ما  را مشاهده کنید یا برنامه پخش زنده‌های آینده کانال مورد نظر خود را چک کنید.\"\r\n        }\r\n    } else if (errorType === \"404\" || errorType === undefined) {\r\n        return {\r\n            title: \"404\",\r\n            description: \"آدرس وارد شده صحیح نیست.\"\r\n        }\r\n    }\r\n\r\n}\r\n\r\nexport const isVoted = (qid: number) => livePoll() && livePoll().polls.some((poll: any) => poll.qid === qid);\r\nexport const isSelectedOption = (qid: number, oid: number) => livePoll() && livePoll().polls.some((poll: any) => poll.qid === qid && poll.oid === oid)\r\n\r\nexport const appendQueryParamsToChunks = (link: string) => {\r\n    const dispatch = store.dispatch;\r\n    const {token, params} = store.getState().videoData;\r\n    let queryParams: string = \"\";\r\n    queryParams = link.split('m3u8')[1]\r\n    if (queryParams) queryParams = `${queryParams}&uuid=${getUUID()}`\r\n    else queryParams = `?uuid=${getUUID()}`;\r\n\r\n    if (conditions(ConditionName.isAuth)) {\r\n        if (hasQuestionMark(queryParams)) queryParams = `${queryParams}&token=${token}`;\r\n        else queryParams = `?token=${token}`;\r\n    }\r\n    dispatch(setStreamLinkParams(queryParams));\r\n}\r\n\r\nexport const inViewPort = (element: any) => {\r\n    if (element) {\r\n        const positionLeft = element.offsetLeft;\r\n        const positionRight = window.innerWidth - (element.offsetLeft + element.offsetWidth);\r\n        if (positionLeft >= 0 && positionRight >= 0) return \"inViewport\";\r\n        else if (positionLeft < 0) return \"OutViewPortFromLeft\";\r\n        else if (positionRight < 0) return \"OutViewPortFromRight\";\r\n    }\r\n}\r\n\r\nexport const handleIsComplexPortrait = (params?: any) => {\r\n    return (params.portrait === \"true\" && isTouchScreenPortrait() && params.isGeneral !== \"true\" && params.raw !== \"true\");\r\n}\r\nexport const isFullMobilePortrait = () => {\r\n    const {params, videoElementSizeInfo} = store.getState().videoData;\r\n    return params.portrait !== \"true\" && (+videoElementSizeInfo.width.toFixed(0) === window.screen.width || +videoElementSizeInfo.width.toFixed(0) === window.screen.availWidth) && (window.screen.height > window.screen.width || window.screen.availHeight > window.screen.availWidth)\r\n}\r\n\r\nexport const handleRippleCircle = (event: any, id: string) => {\r\n    const element: any = document.getElementById(id);\r\n    const circle = document.createElement(\"span\");\r\n    circle.style.width = circle.style.height = `50px`;\r\n    circle.style.left = `${event.touches[0].clientX - element.offsetLeft - 25}px`;\r\n    circle.style.top = `${event.touches[0].clientY - element.offsetTop - 25}px`;\r\n    circle.classList.add(\"pl-ripple\");\r\n    const ripple = element.getElementsByClassName(\"pl-ripple\")[0];\r\n    if (ripple) ripple.remove();\r\n    element.appendChild(circle);\r\n}\r\n\r\n\r\nexport const handleRipple = (event: any, id: string, size: number = 50) => {\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    const clientY = event.clientY !== undefined ? event.clientY : event.touches[0].clientY;\r\n    const element: any = document.getElementById(id);\r\n    const circle = document.createElement(\"span\");\r\n    circle.style.width = circle.style.height = `${size}px`;\r\n    circle.style.left = `${clientX - size / 2}px`;\r\n    circle.style.top = `${clientY - element.getBoundingClientRect().top - size / 2}px`;\r\n    circle.classList.add(\"pl-ripple\");\r\n    const ripple = element.getElementsByClassName(\"pl-ripple\")[0];\r\n    if (ripple) ripple.remove();\r\n    element.appendChild(circle);\r\n}\r\n\r\nexport const utf8_to_b64 = (text: string) => {\r\n    return window.btoa(unescape(encodeURIComponent(text)));\r\n}\r\n\r\nexport const changeVideoUrl = (videoType?: string, videoId?: number) => {\r\n    const {params} = store.getState().videoData;\r\n    const recommendationVideo = findFirstVideoInRecommendationList();\r\n    const type = videoType ? videoType : recommendationVideo.type;\r\n    const id = videoId ? videoId : recommendationVideo.id;\r\n    if (conditions(ConditionName.hasSportProvider)) {\r\n        const queryParams = window.location.href.split(\"?\")[1];\r\n        if (!!queryParams) return `${window.location.origin}/ngpplayer/${type}/${id}?${queryParams}`;\r\n        else return `${window.location.origin}/ngpplayer/${type}/${id}`;\r\n    } else return window.location.href.replace(`type=${params.type}`, `type=${type}`).replace(`id=${params.id}`, `id=${id}`);\r\n}\r\n\r\nexport const hasQuestionMark = (text: string) => text.match(/\\?/g) ? true : false;\r\n\r\nexport const responseValidator = (status: number): boolean => status >= 200 && status < 300\r\n\r\nexport const generateNewAccessToken = async () => {\r\n        if (authToken.get()?.refresh) {\r\n        const {data, status} = await apiCaller({\r\n            url: API().auth.refresh,\r\n            method: \"POST\",\r\n            data: {refresh: authToken.get()?.refresh}\r\n        });\r\n        if (responseValidator(status)) {\r\n            const token = {\r\n                access: data.access,\r\n                refresh: authToken.get()?.refresh,\r\n                token_id: data.token_id\r\n            };\r\n            authToken.set(token);\r\n        } else authToken.remove();\r\n    }\r\n}\r\n\r\nexport const convertB64ToFile = (dataUrl: string, filename: string) => {\r\n    let arr = dataUrl.split(','),\r\n        mime = arr[0].match(/:(.*?);/)![1],\r\n        bstr = window.atob(arr[1]),\r\n        n = bstr.length,\r\n        u8arr = new Uint8Array(n);\r\n\r\n    while (n--) {\r\n        u8arr[n] = bstr.charCodeAt(n);\r\n    }\r\n    return new File([u8arr], filename, {type: mime});\r\n}\r\n\r\n// check if video Url is white or not for snapShot\r\nexport const isWhiteListUrl = (url: string) => !!whiteListTargets.find((t:string) => new URL(url).origin.includes(t));\r\n\r\nexport const parseJwt = (token: string) => {\r\n    var base64Url = token.split('.')[1];\r\n    var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n    var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function (c) {\r\n        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n    }).join(''));\r\n    return JSON.parse(jsonPayload);\r\n}\r\n\r\nexport const handlePopoverSizeInMiniPlayer = () => {\r\n    const {videoElementSizeInfo} = store.getState().videoData;\r\n\r\n    return conditions(ConditionName.isMiniPlayer) && !conditions(ConditionName.isFullMobilePortrait) ? {\r\n        top: videoElementSizeInfo.top,\r\n        height: videoElementSizeInfo.height,\r\n        left: videoElementSizeInfo.left\r\n    } : {}\r\n}\r\n\r\nexport const numbersToLetters = ['اول', 'دوم', 'سوم', 'چهارم', 'پنجم', 'ششم', 'هفتم', 'هشتم', 'تهم', 'دهم', 'یازدهم', 'دوازدهم', 'سیزدهم', 'چهاردهم', 'پانزدهم', 'شانزدهم', 'هفدهم', 'هجدهم', 'نوزدهم', 'بیستم']\r\n\r\nexport const handleVideoType = () => {\r\n    const {params} = store.getState().videoData;\r\n    switch (params.type) {\r\n        case \"vod\":\r\n            return VideoNumberTypeEnum.Vod\r\n        case \"archive\":\r\n        case \"live\":\r\n            return VideoNumberTypeEnum.Archive\r\n        case \"clip\":\r\n            return VideoNumberTypeEnum.Clip\r\n        default:\r\n            return VideoNumberTypeEnum.FutureLive\r\n    }\r\n}\r\n\r\nexport const handleHasXTokenParamOrSendXToken = () => conditions(ConditionName.hasXTokenParamOrSendXToken) ? {\"x-token\": store.getState().user.xToken} : undefined\r\n\r\nexport function getWebEnvConfig(key: string): string {\r\n    const webConfigs = store.getState().videoData.webListConfig;\r\n    const config = webConfigs.find((item: any) => item.key === key);\r\n    return config ? config.value : \"\";\r\n}\r\n\r\nexport const getDomainFromUrl = (url: string) => {\r\n    const splitedUrl = url.split(\".\");\r\n    return `${splitedUrl[splitedUrl.length - 2]}.${splitedUrl[splitedUrl.length - 1]}`\r\n}\r\n\r\nexport const clearRedux = () => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setClearVideoDataSlice());\r\n    dispatch(setClearControllerSlice());\r\n    dispatch(setClearUserSlice());\r\n    dispatch(setClearTagsSlice());\r\n    dispatch(setClearPopoversSlice());\r\n    dispatch(setClearCommentsSlice());\r\n    dispatch(setClearChatSlice());\r\n}\r\n\r\nexport const weighted_random = (options: any) => {\r\n    let i;\r\n\r\n    let weights: any[] = [];\r\n\r\n    for (i = 0; i < options.length; i++)\r\n        weights[i] = options[i].weight + (weights[i - 1] || 0);\r\n\r\n    let random = Math.random() * weights[weights.length - 1];\r\n\r\n    for (i = 0; i < weights.length; i++)\r\n        if (weights[i] > random)\r\n            break;\r\n\r\n    return options[i].domain;\r\n}\r\n\r\nexport const convertTimeToSeconds = (time: string) => (Number(time.split(\":\")[0]) * 3600) + (Number(time.split(\":\")[1]) * 60) + (Number(time.split(\":\")[2]))\r\n\r\nexport const imageFormatChecking = (filename:string) => [\"jpg\", \"png\", \"jpeg\"].includes((filename.toLowerCase()).split(\".\")[((filename.toLowerCase()).split(\".\")).length - 1]);\r\n\r\n// ***** Player Core *****\r\n\r\nexport const handlePageLoadTime = (loadingDurationRef: any) => {\r\n    let pageLoadTime = 0;\r\n    if (performance && performance.getEntriesByType(\"navigation\")) pageLoadTime = performance.getEntriesByType(\"navigation\")[0].duration;\r\n    loadingDurationRef.current = pageLoadTime;\r\n}\r\n\r\nexport const highestResolutionSupported = (resolutions: string[], width: number, height: number) => {\r\n    const w = width * window.devicePixelRatio;\r\n    const h = height * window.devicePixelRatio;\r\n    let filteredResolutions: string[] = [];\r\n    if (conditions(ConditionName.isTouchScreenPortrait)) filteredResolutions = resolutions.filter((resolution: string) => Number(resolution.split('x')[0].trim()) <= w);\r\n    else filteredResolutions = resolutions.filter((resolution: string) => Number(resolution.split('x')[0].trim()) <= h || Number(resolution.split('x')[1].trim()) <= w);\r\n    return filteredResolutions.indexOf(filteredResolutions[filteredResolutions.length - 1]);\r\n}\r\n\r\nexport const getSubtitleLabel = (subtitleLanguage: string) => {\r\n    let label;\r\n    switch (subtitleLanguage) {\r\n        case \"fa\":\r\n            label = \"فارسی\"\r\n            break;\r\n        case \"en\":\r\n            label = \"انگلیسی\"\r\n            break;\r\n        case \"ar\":\r\n            label = \"عربی\"\r\n            break;\r\n        case \"tr\":\r\n            label = \"ترکی\"\r\n            break;\r\n        default:\r\n            break;\r\n    }\r\n    return label;\r\n}\r\n\r\nexport const getOS = () => {\r\n    const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\r\n    const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\r\n    const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\r\n    const userAgent = window.navigator.userAgent;\r\n    const platform = window.navigator.platform;\r\n    let os = \"\";\r\n\r\n    if (macosPlatforms.indexOf(platform) !== -1) os = 'mac';\r\n    else if (iosPlatforms.indexOf(platform) !== -1) os = 'ios';\r\n    else if (windowsPlatforms.indexOf(platform) !== -1) os = 'windows';\r\n    else if (/Android/.test(userAgent)) os = 'android';\r\n    else if (/Linux/.test(platform)) os = 'linux';\r\n\r\n    return os;\r\n}\r\n\r\nexport const deleteQueryParamsInUrl = (queryParam:string) => {\r\n    const url = new URL(window.location.href);\r\n    url.searchParams.delete(queryParam);\r\n    history.pushState({}, \"\", url.href);\r\n}\r\n\r\nexport const handleRedirectCards = (id?: string, type?: string) => {\r\n    const url = new URL(window.location.href);\r\n    url.searchParams.set(\"id\", id!);\r\n    url.searchParams.set(\"type\",type!);\r\n    return history.pushState({}, \"\", url.href);\r\n}\r\n\r\nexport const strToObj = (str:string) => {\r\n    var obj = {};\r\n    if(str&&typeof str ==='string'){\r\n        var objStr = str.match(/\\{(.)+\\}/g);\r\n        eval(\"obj =\"+objStr);\r\n    }\r\n    return obj\r\n }\r\n\r\n////////////////////////////////////// start: check XSS attack for isGeneral Url state\r\n\r\nexport const hasPermissionToRedirect = (url:string) => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setIsFetchDetails(true))\r\n   if (!!url) {\r\n    try {\r\n        const redirect:any = escapeInput(url); \r\n        const redirectUrl = new URL(redirect);\r\n        const redirectOriginUrl = new URL(url);        \r\n        if (!isWhiteListGeneralUrl(redirectOriginUrl.hostname, whiteListGeneralUrlTargets)) {\r\n            dispatch(setErrorType(\"404\"))\r\n            dispatch(setIsValidAddress(false));\r\n        }\r\n        else dispatch(setIsValidAddress(true));\r\n    } catch (error) {\r\n        dispatch(setErrorType(\"404\"))\r\n        dispatch(setIsValidAddress(false));\r\n    }\r\n   }\r\n}\r\n\r\nfunction escapeInput(toOutput:string | null){\r\n    if (toOutput === null) return null\r\n    return toOutput.replace(/\\&/g, '&amp;')\r\n        .replace(/\\</g, '&lt;')\r\n        .replace(/\\>/g, '&gt;')\r\n        .replace(/\\\"/g, '&quot;')\r\n        .replace(/\\'/g, '&#x27;');\r\n}\r\n\r\nfunction isWhiteListGeneralUrl(str:string, arrayOfStrings:string[]) {\r\n    for (let i = 0; i < arrayOfStrings.length; i++) {\r\n        if (str.startsWith(arrayOfStrings[i])) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\n\r\n////////////////////////////////////// end: check XSS attack for isGeneral Url state\r\n\r\nexport const flattenObject = (input: any, keyName?: string) => {\r\n    let result: any = {};\r\n    for (const key in input) {\r\n        const newKey = keyName ? `${keyName}_${key}` : key;\r\n        if (typeof input[key] === \"object\" && !Array.isArray(input[key])) result = { ...result, ...flattenObject(input[key], newKey) }\r\n        else result[newKey] = input[key];\r\n    }\r\n    return result;\r\n};\r\n\r\n","import store from \"../redux/store\";\r\nimport {conditions} from \"./conditions/conditions\";\r\nimport {ConditionName} from \"../interfaces/enums\";\r\nimport { footerPadding } from \"./environment\";\r\n\r\nexport const LiveDelay = 6; // --> Delay between manifest live point and live point of user's view (for better loading and buffering)\r\nexport const LiveWindow = 12; // --> distance between live point and cursor to determine live red button\r\n\r\nexport const videoTag = () => document.getElementById(conditions(ConditionName.isPlayingAd) ? 'ad-player-tag' : 'player-tag') as HTMLVideoElement;\r\nexport const multiLiveVideo = () => document.getElementById(`multilive-player`) as HTMLVideoElement;\r\nexport const progressBar = () => document.getElementById(\"time-progress-bar\") as any;\r\nexport const progressBarWidth = () => store.getState().videoData.videoElementSizeInfo.width - 2 * footerPadding();\r\n\r\nexport const seenPoll = () => JSON.parse(localStorage.getItem(\"seen-poll\")!);\r\nexport const livePoll = () => JSON.parse(localStorage.getItem(\"live-poll\")!);\r\nexport const popoverHeader = () => document.getElementById(\"popover-header\");\r\n\r\n\r\n","import axios from 'axios'\r\nimport { generateNewAccessToken, wait } from '../helpers/helpers'\r\nimport { getAccessToken } from './baseUrl'\r\nimport { IApiCaller, IAxiosConfig, IRetryPolicy, IStatusMessageError, IStringKeyValue } from '../interfaces/interfaces'\r\nimport store from 'redux-share/store'\r\n\r\nconst getLimit = () => 100\r\n\r\nexport const apiCaller: any = async ({ url, method = 'GET', data, headers, retryCount = 1, maxRetryCount = 0, errorMessage, retryPolicy }: IApiCaller) => {\r\n  let axiosConfig: IAxiosConfig = {\r\n    url: url,\r\n    method: method,\r\n    headers: {\r\n      ...headers,\r\n      'Content-Type': 'application/json',\r\n    },\r\n  }\r\n  if (data) {\r\n    if (method === 'GET') axiosConfig = { ...axiosConfig, params: {uuid: store.getState().videoData.params.uuid, provider: store.getState().videoData.params.provider === \"unknown\" ? undefined : store.getState().videoData.params.provider, ...data } }\r\n    else axiosConfig = { ...axiosConfig, data: {uuid: store.getState().videoData.params.uuid, provider: store.getState().videoData.params.provider === \"unknown\" ? undefined : store.getState().videoData.params.provider, ...data } }\r\n  } else {\r\n    if (method === 'GET') axiosConfig = { ...axiosConfig, params: {uuid: store.getState().videoData.params.uuid, provider: store.getState().videoData.params.provider === \"unknown\" ? undefined : store.getState().videoData.params.provider } }\r\n    else axiosConfig = { ...axiosConfig, data: {uuid: store.getState().videoData.params.uuid, provider: store.getState().videoData.params.provider === \"unknown\" ? undefined : store.getState().videoData.params.provider } }\r\n  }\r\n  try {\r\n    return await axios(axiosConfig)\r\n  } catch (error: any) {\r\n    if (error && error.response && error.response.status === 401) {\r\n      await generateNewAccessToken()\r\n      const newHeader = {\r\n        ...headers,\r\n        authorization: `Bearer ${getAccessToken()}`,\r\n      }\r\n      let newRetryCount = retryCount + 1\r\n      await wait(newRetryCount)\r\n      return apiCaller({\r\n        url,\r\n        method,\r\n        data,\r\n        headers: newHeader,\r\n        retryCount: newRetryCount,\r\n        maxRetryCount,\r\n        errorMessage,\r\n        retryPolicy\r\n      })\r\n\r\n    } else {\r\n        let newRetryDelay = 0, newMaxRetryCount = 0;\r\n        if (retryPolicy !== undefined) {\r\n          for (let i = 0; i < retryPolicy.length; i++) {\r\n            if ((((retryPolicy[i].codeAbove && error.response.status >= retryPolicy[i].codeAbove!) || (retryPolicy[i].codeBelow && error.response.status <= retryPolicy[i].codeBelow!)) && (retryPolicy[i].excludeCodes.length === 0 || !retryPolicy[i].excludeCodes.includes(error.response.status))) || (retryPolicy[i].includeCodes.length === 0 || retryPolicy[i].includeCodes.includes(error.response.status))) {\r\n              newMaxRetryCount = retryPolicy[i].count;\r\n              newRetryDelay = retryPolicy[i].delay;\r\n              break;\r\n            }\r\n           }\r\n        } else {\r\n          newMaxRetryCount = maxRetryCount;\r\n          newRetryDelay = retryCount + 1;\r\n        }\r\n        if (retryCount < newMaxRetryCount) {\r\n          await wait(newRetryDelay);\r\n          return apiCaller({ url, method, data, headers, retryCount: retryCount + 1, newMaxRetryCount, errorMessage, retryPolicy });\r\n        } else if(error.response) return { data: [], status: error.response.status };\r\n    }\r\n  }\r\n}\r\n\r\nexport function get(event: (response: any, status: number) => void, url: string, params: { [k: string]: any } = {}, lang = 'fa', auth = true) {\r\n  const generatedUrl = new URL(url);\r\n  const newParams:any = {...params, uuid: store.getState().videoData.params.uuid, provider: store.getState().videoData.params.provider === \"unknown\" ? undefined : store.getState().videoData.params.provider }\r\n  Object.keys(newParams).forEach((key) => {\r\n    if (newParams[key] !== undefined) {\r\n      generatedUrl.searchParams.append(key, newParams[key])\r\n    }\r\n  })\r\n  let status: number\r\n  fetch(generatedUrl.href, {\r\n    method: 'GET',\r\n    headers: { 'Content-Type': 'application/json' },\r\n  }).then(function(response) {\r\n    status = response.status\r\n    if (status === 429) {\r\n      setTimeout(() => {\r\n        get(event, url, params, lang, auth)\r\n      }, getLimit())\r\n    }\r\n    return response.json()\r\n  }).then(function(data) {\r\n    event(data, status)\r\n  }).catch((err) => {\r\n    event(err, status)\r\n  })\r\n}\r\n\r\nexport function getAll(path: string, retryPolicy?: IRetryPolicy[], params?: any, retryCount: number = 1, maxRetryCount: number = 0) {\r\n  return new Promise(async (resolve, reject) => {  // Added reject to the Promise executor function.\r\n    try {\r\n      const url = new URL(path);\r\n      const limit = 1000;\r\n      if (params) {\r\n        Object.keys(params).forEach((key) => {\r\n          if (params[key]) {\r\n            url.searchParams.set(key, params[key]);\r\n          }\r\n        });\r\n      }\r\n      url.searchParams.set('limit', limit.toString());\r\n      const response = await fetch(url.href);\r\n      if (!response.ok) {  // Check if the response was not ok (status not in the range 200-299).\r\n        throw response;\r\n      }\r\n      const data = await response.json();\r\n      const count = data.count;\r\n      const requestCount = Math.ceil(count / limit) - 1;\r\n      const promises: Array<Promise<any>> = [];\r\n      for (let i = 0; i < requestCount; i++) {\r\n        const offset = i * limit;  // Fixed the offset calculation.\r\n        url.searchParams.set('offset', offset.toString());\r\n        const promise:Promise<any> = fetch(url.href)\r\n          .then(res => {\r\n            if (res.ok) {\r\n              return res.json();\r\n            }\r\n            return res.json().then(err => Promise.reject(err));\r\n          });\r\n        promises.push(promise);\r\n      }\r\n      Promise.all(promises).then((res) => {\r\n        const results = res.flatMap((item) => item.results);\r\n        resolve([...data.results, ...results]);\r\n      }).catch(reject);  // Added catch to handle any errors in the Promise.all.\r\n    } catch (error:any) {\r\n          let newRetryDelay = 0, newMaxRetryCount = 0;\r\n          if (retryPolicy !== undefined) {\r\n            for (let i = 0; i < retryPolicy.length; i++) {\r\n              if (((retryPolicy[i].codeAbove && error.status >= retryPolicy[i].codeAbove!) || (retryPolicy[i].codeBelow && error.status <= retryPolicy[i].codeBelow!)) && (retryPolicy[i].excludeCodes.length === 0 || !retryPolicy[i].excludeCodes.includes(error.status)) && (retryPolicy[i].includeCodes.length === 0 || retryPolicy[i].includeCodes.includes(error.status))) {\r\n                newMaxRetryCount = retryPolicy[i].count;\r\n                newRetryDelay = retryPolicy[i].delay;\r\n                break;\r\n              }\r\n            }\r\n            if (retryCount < newMaxRetryCount) {\r\n              await wait(newRetryDelay);\r\n              getAll(path, retryPolicy, params, retryCount + 1, newMaxRetryCount)\r\n            }\r\n          }\r\n    }\r\n  });\r\n}\r\n\r\nclass ApiCallError extends Error {\r\n  status: number = 0\r\n  retryQty: number = 0\r\n\r\n  constructor(message?: string, status: number = 0, retryQty: number = 0) {\r\n    super(message)\r\n    this.status = status\r\n    this.retryQty = retryQty\r\n  }\r\n}\r\n\r\nconst getProjectError: (errorKey: string) => IStatusMessageError = (errorKey: string) => {\r\n  const projectErrors: { [key: string]: IStatusMessageError } = {\r\n    timeout: {\r\n      status: -1,\r\n      message: 'timeout',\r\n    },\r\n    notFound: {\r\n      status: 404,\r\n      message: 'not found',\r\n    },\r\n    conflict: {\r\n      status: 409,\r\n      message: 'conflict',\r\n    },\r\n    frequentlyRequest: {\r\n      status: 429,\r\n      message: 'frequently request',\r\n    },\r\n    internalServerError: {\r\n      status: 500,\r\n      message: 'internal server error',\r\n    },\r\n    serviceUnavailable: {\r\n      status: 503,\r\n      message: 'service unavailable',\r\n    },\r\n  }\r\n  return projectErrors[errorKey]\r\n}\r\n\r\nconst getAnonValue: (key: string) => string = (key: string) => {\r\n  return getAnonConfig()[key]\r\n}\r\n\r\nconst anonConfigGenerator = (newAnonConfig: IStringKeyValue = {}) => {\r\n  const anonConfig: IStringKeyValue = {\r\n    ANON_FAILURE_RETRY_DELAY_THROTTLE: '5',\r\n    ANON_FAILURE_RETRY_COUNT_THROTTLE: '3',\r\n    FAILURE_RETRY_DELAY_INTERNAL_SERVER_ERROR: '5',\r\n    FAILURE_RETRY_COUNT_INTERNAL_SERVER_ERROR: '3',\r\n    FAILURE_RETRY_DELAY_TIMEOUT: '5',\r\n    FAILURE_RETRY_COUNT_TIMEOUT: '3',\r\n    LANG: 'fa',\r\n    DIR: 'rtl',\r\n  }\r\n  const updateAnonConfig = { ...anonConfig, ...newAnonConfig }\r\n  return () => updateAnonConfig\r\n}\r\n\r\nlet getAnonConfig: () => IStringKeyValue = anonConfigGenerator()\r\n\r\nexport {\r\n  getProjectError,\r\n  ApiCallError,\r\n  getAnonValue,\r\n  getLimit,\r\n}\r\n","import { conditions } from \"../helpers/conditions/conditions\";\r\nimport { handleVideoType } from \"../helpers/helpers\";\r\nimport { ConditionName } from \"../interfaces/enums\";\r\nimport store from \"../redux/store\";\r\nimport {\r\n    ekrnAPIUrl,\r\n    getChatAPIUrl,\r\n    getChatBaseUrl,\r\n    getEmojiUrl,\r\n    getFluentdUrl,\r\n    getGetAggregatorApiLiveUrl,\r\n    getLoginBaseUrl,\r\n    getMagnix,\r\n    getRestApiCommentUrl,\r\n    getRestApiLiveUrl,\r\n    getRestApiUrl,\r\n    getSetAggregatorUrl,\r\n    uesrTracker,\r\n    voucherAPI,\r\n} from './baseUrl'\r\n\r\nexport const API = () => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { bookmarkId } = store.getState().user;\r\n    return {\r\n        Ad: {\r\n            getVast: `https://vfetch.yektanet.com/api/v1/load/16e31ffa-10ac-40c3-b380-fa378f8ecbb8`\r\n        },\r\n        live: {\r\n            anonListConfigs: ``,\r\n            getLiveUrl: `${getRestApiLiveUrl()}/v1/live/details/live/`,\r\n            generalData: `${getGetAggregatorApiLiveUrl()}live/api/v1/get-aggregated/live/${params.id}/${details.id}`,\r\n            postData: `${getSetAggregatorUrl()}live/api/v1/set-emoji-poll`,\r\n            online_viewer: `${getSetAggregatorUrl()}live/api/v1/online-viewer/live/${details.id}/`,\r\n            getArchiveUrl: `${getRestApiLiveUrl()}/v1/live/details/archive/`,\r\n            getLiveMarkers: `${getRestApiLiveUrl()}/v1/live/list-event/live/`,\r\n            multiLives: `${getRestApiLiveUrl()}/v1/live/viewers/live-archive-list/live/`,\r\n            gifLinks: `${getEmojiUrl()}/gifs/gifConfig.json`,\r\n            tempLink: `${getRestApiLiveUrl()}/v1/storage/temp_link/`,\r\n            quiz: `${getSetAggregatorUrl()}live/api/v1/set-quiz`,\r\n            quizUserRecoreds: (quizType: number, quizId: number) => `${getSetAggregatorUrl()}live/api/v1/get-user-quiz-record/${quizType}/${quizId}/`,\r\n            liveChat: {\r\n                getMessageList: (roomId: number) => `${getChatAPIUrl()}v1/chat/anon-list-messages/${roomId}/`,\r\n                chat: (roomId: number) => `${getChatBaseUrl()}room/${roomId}/`,\r\n                sendChatMessage: `${getChatAPIUrl()}v1/chat/send-message/`,\r\n                getRoomId: (roomId: number) => `${getChatAPIUrl()}v1/chat/get-active-room/${roomId}/`\r\n            }\r\n        },\r\n        vod: {\r\n            getVodUrl: `${getRestApiLiveUrl()}/v1/live/details/vod/`,\r\n            getVodMarkers: `${getRestApiLiveUrl()}/v1/live/list-event/vod/`,\r\n        },\r\n        archive: {\r\n            getArchiveUrl: `${getRestApiLiveUrl()}/v1/live/details/archive/`,\r\n            getArchiveMarkers: `${getRestApiLiveUrl()}/v1/live/list-event/live/`,\r\n        },\r\n        clip: {\r\n            getClipUrl: `${getRestApiLiveUrl()}/v1/live/details/clip/`,\r\n            getClipMarkers: `${getRestApiLiveUrl()}/v1/live/list-event/clip/`,\r\n        },\r\n\r\n        searchViewers: `${getRestApiLiveUrl()}/v2/live/viewers/search/`,\r\n        viewersTagList: (videoType: string) => `${getRestApiLiveUrl()}/v1/live/viewers-tag-list/${videoType}/`,\r\n        viewCount: (content_id: number) => `${getRestApiLiveUrl()}/v1/viewed/content/${content_id}`,\r\n        like: `${getRestApiLiveUrl()}/v1/like/content/${details.content_id}`,\r\n        dislike: `${getRestApiLiveUrl()}/v1/dislike/content/${details.content_id}`,\r\n        unlike: `${getRestApiLiveUrl()}/v1/unlike/content/${details.content_id}`,\r\n        undislike: `${getRestApiLiveUrl()}/v1/undislike/content/${details.content_id}`,\r\n        recommendationList: () => {\r\n            let urlData = `${params.type}/${conditions(ConditionName.isLiveParam) ? details.id! : +params.id!}`;\r\n            if (conditions(ConditionName.hasUserIds)) return `${getRestApiLiveUrl()}/v1/live/recommend/${urlData}/?user_ids=${params.user_ids}`;\r\n            return `${getRestApiLiveUrl()}/v1/live/recommend/${urlData}/`;\r\n        },\r\n        auth: {\r\n            refresh: `${getRestApiUrl()}/v2/profile/auth/token-refresh/`,\r\n            login: (v = 'v5') => `${getLoginBaseUrl()}/${v}/profile/auth/login/`,\r\n            code: (v = 'v2') => `${getLoginBaseUrl()}/${v}/profile/auth/generate-code/`,\r\n            validateCode: (v = 'v2') => `${getLoginBaseUrl()}/${v}/profile/auth/validate-otp/`,\r\n            captcha: (v = 'v1') => `${getLoginBaseUrl()}/${v}/captcha/get-captcha/`,\r\n        },\r\n        playList: `${getRestApiLiveUrl()}/v1/live/playlist/viewers-list-videos-playlists/${params.type}/${conditions(ConditionName.isLiveParam) ? +details.id! : +params.id!}/`,\r\n        playListVideos: (id: number) => `${getRestApiLiveUrl()}/v2/live/list-viewers-playlist-videos/${id}/`,\r\n        comment: {\r\n            create: `${getRestApiCommentUrl()}/v1/comment/create/`,\r\n            commentList: (id: number) => `${getRestApiCommentUrl()}/v1/comment/list-content-comments/${id}/`,\r\n            replyList: (id: number) => `${getRestApiCommentUrl()}/v1/comment/list-comment-replies/${id}/`,\r\n            canAddComment: (id: number) => `${getRestApiCommentUrl()}/v1/content-get-update-delete/${id}/`,\r\n            like: (commentId: number) => `${getRestApiLiveUrl()}/v1/like/comment/${commentId}`,\r\n            unlike: (commentId: number) => `${getRestApiLiveUrl()}/v1/unlike/comment/${commentId}`,\r\n        },\r\n        serverTime: `${getRestApiUrl()}/v1/configuration/server-time/`,\r\n        user: {\r\n            profile: `${getMagnix()}/profiles/get_profiles`,\r\n            profileWithXToken: `${getMagnix()}/profiles/userprofile`,\r\n            settings: `${uesrTracker()}/v1/detail-setting/`,\r\n            createSettings: `${uesrTracker()}/v1/create-setting/`,\r\n            createPersonalMarker: `${uesrTracker()}/v1/create-marker/`,\r\n            getPersonalMarker: `${uesrTracker()}/v1/list-markers/${handleVideoType()}/${conditions(ConditionName.isLiveParam) ? +details.id! : +params.id!}/`,\r\n            updatePersonalMarker: (markerId: number) => `${uesrTracker()}/v1/get-update-delete-marker/${markerId}/`,\r\n            deletePersonalMarker: (markerId: number) => `${uesrTracker()}/v1/get-update-delete-marker/${markerId}/`,\r\n            getVideoMetaData: `${uesrTracker()}/v1/get-video-metadata/${handleVideoType()}/${conditions(ConditionName.isLiveParam) ? +details.id! : +params.id!}/`,\r\n            createVideoMetaData: `${uesrTracker()}/v1/video-metadata/`,\r\n            bookmarks: `${uesrTracker()}/v1/list-create-bookmark/`,\r\n            deleteBookmark: (id?: number) => `${uesrTracker()}/v1/retrieve-update-delete-bookmark/${id ?? bookmarkId}/`,\r\n        },\r\n        trailer: {\r\n            getList: `${getRestApiLiveUrl()}/v1/live/detail-trailer/${params.type}/${conditions(ConditionName.isLiveParam) ? +details.id! : +params.id!}/`,\r\n        },\r\n        videoTimelineLog: `${getFluentdUrl()}/video-timeline.log`,\r\n        logs: `${getFluentdUrl()}/drive-endpoint.log`,\r\n        getViewersWindow: `${getRestApiLiveUrl()}/v1/vod/get-viewer-window/${params.type}/${params.id}/`,\r\n        web_list_config: (v = 'v1') => `${getRestApiUrl()}/${v}/configuration/list-web-configs/`,\r\n        voucherDetail: (v = 'v1') => `${voucherAPI()}/${v}/voucher/details/${params.user_id}/${params.id}/`,\r\n        cinemahamrah: {\r\n            checkFreeContent: (v = 'v1') => `${voucherAPI()}/${v}/voucher/check-free-content/${params.uid}/${conditions(ConditionName.isLiveParam) ? +details.id! : +params.id!}/`,\r\n            mciVoucherToken: (v = 'v1') => `${ekrnAPIUrl()}/${v}/voucher/mci-voucher-token/${params.uid}/`,\r\n            userValidVouchersList: (v = 'v1') => `${voucherAPI()}/${v}/voucher/user-valid-vouchers-list/`,\r\n            pubVoucherToken: (voucherId: string, v = 'v1') => `${voucherAPI()}/${v}/voucher/pub-voucher-token/${voucherId}`,\r\n            voucherPackages: (v = 'v1') => `${voucherAPI()}/${v}/voucher/viewers-list-voucher-packages/`,\r\n            paymentRequest: (vpId: number, uid: number, v = 'v1') => `${voucherAPI()}/${v}/voucher/payment-request/${vpId}/${uid}/`,\r\n            confirmPayment: (v = 'v1') => `${voucherAPI()}/${v}/voucher/confirm-payment/`,\r\n            getProfile: (v = 'v2') => `${getLoginBaseUrl()}/${v}/profile/auth/get-profile/`,\r\n        }\r\n    }\r\n}\r\n\r\nexport const getApiUrls = () => {\r\n    let apiUrl = \"\";\r\n    let apiMarkerUrl = \"\";\r\n    const { type } = store.getState().videoData.params;\r\n    switch (type) {\r\n        case \"live\":\r\n            apiUrl = API().live.getLiveUrl;\r\n            apiMarkerUrl = API().live.getLiveMarkers;\r\n            break;\r\n        case \"vod\":\r\n            apiUrl = API().vod.getVodUrl;\r\n            apiMarkerUrl = API().vod.getVodMarkers;\r\n            break;\r\n        case \"archive\":\r\n            apiUrl = API().archive.getArchiveUrl;\r\n            apiMarkerUrl = API().archive.getArchiveMarkers;\r\n            break;\r\n        case \"clip\":\r\n            apiUrl = API().clip.getClipUrl;\r\n            apiMarkerUrl = API().clip.getClipMarkers;\r\n            break;\r\n        default:\r\n            break;\r\n    }\r\n    return {\r\n        apiUrl,\r\n        apiMarkerUrl\r\n    }\r\n}","export * from \"./store\";\r\nexport * from \"./hooks\";\r\nexport * from \"./actions\";","export * from \"./chat.actions\";\r\nexport * from \"./cinemahamrah.actions\";\r\nexport * from \"./comment.action\";\r\nexport * from \"./controller.actions\";\r\nexport * from \"./progressbar.actions\";\r\nexport * from \"./tags.actions\";\r\nexport * from \"./user.actions\";\r\nexport * from \"./videoData.actions\";\r\nexport * from \"./playerCore.actions\";","import { responseValidator } from '../../helpers/helpers'\r\nimport { IChatMessage } from '../../interfaces/interfaces'\r\nimport { apiCaller } from '../../services/apiCaller'\r\nimport { API } from '../../services/services'\r\nimport { setMessageCount, setMessages, setSocket, setUsersInfoInChat } from '../slices/chatSlice'\r\nimport store from '../store'\r\nimport { ChatType } from 'interfaces'\r\nimport { toast } from \"mobin-toast\"\r\nimport { getAllChatMessages, submitChatComment } from './videoData.actions'\r\nimport io from \"socket.io-client\";\r\n\r\nexport const handleGetUsersInChat = async (user_ids: string[]) => {\r\n  const { data, status } = await apiCaller({ url: API().user.profile, method: 'POST', data: { user_ids: user_ids } })\r\n  if (responseValidator(status)) return data.data\r\n  else return []\r\n}\r\n\r\nexport const submitCommentInChat = async (message: string, setInputValue: (value: string) => void) => {\r\n  const { roomId, chatType } = store.getState().chats\r\n  const { userId } = store.getState().user\r\n  const _data = {\r\n    room: roomId,\r\n    text: message,\r\n  }\r\n  const { data, status } = await submitChatComment(_data);\r\n  if (responseValidator(status)) {\r\n    if (chatType !== ChatType.public) toast({\r\n      title: 'پیام شما با موفقیت ثبت شد و پس از تایید، نمایش داده خواهد شد.',\r\n      type: 'success',\r\n    })\r\n  } else toast({ title: 'ارتباط با سرور دچار مشکل شده است.', type: 'error' })\r\n  setInputValue('')\r\n}\r\n\r\nexport const fetchChatMessage = async (offset: number, setScrollEnd: any) => {\r\n  const { roomId, messages, messageCount } = store.getState().chats\r\n  const dispatch = store.dispatch\r\n  const { data, status } = await getAllChatMessages(roomId, offset);\r\n  if (responseValidator(status)) {\r\n    setScrollEnd(false);\r\n    let messChat:any[] = [];\r\n    if (messageCount !== 0) {\r\n      if (messages) {\r\n        messChat = [...messages, ...data.results]; \r\n      } else {\r\n        messChat = [...data.results];\r\n      }\r\n    }\r\n    else messChat = [...data.results];\r\n    dispatch(setMessageCount(data.count))\r\n    handleFirstTimeChatRoomMessage(messChat)\r\n  }\r\n}\r\n\r\nexport const handleConnectSocket = (setScrollEnd: any) => {\r\n  const dispatch = store.dispatch\r\n  const { roomId } = store.getState().chats\r\n  let socket: any\r\n  socket = io(API().live.liveChat.chat(roomId))\r\n  socket.on('connect', async () => {\r\n    dispatch(setSocket(socket))\r\n    fetchChatMessage(0, setScrollEnd)\r\n    socket.on('message', async (data: IChatMessage[] | IChatMessage) => handleChatRoomMessage(data))\r\n  })\r\n}\r\n\r\nexport const handleChatRoomMessage = async (data: IChatMessage[] | IChatMessage) => {\r\n  const dispatch = store.dispatch\r\n  const { messages } = store.getState().chats\r\n  if (!Array.isArray(data)) {\r\n    const { usersInfoInChat } = store.getState().chats\r\n    if (messages && messages.length) dispatch(setMessages([data, ...messages]))\r\n    else dispatch(setMessages([data]))\r\n    if (!usersInfoInChat.find((user: any) => user.user_id === data.author)) {\r\n      const userInfoData = await handleGetUsersInChat([data.author])\r\n      if (userInfoData.length) dispatch(setUsersInfoInChat([...usersInfoInChat, ...userInfoData]))\r\n    }\r\n  }\r\n}\r\n\r\nexport const handleFirstTimeChatRoomMessage = async (data: IChatMessage[]) => {\r\n  const dispatch = store.dispatch\r\n  if (data.length) {\r\n    dispatch(setMessages(data))\r\n    let user_ids: string[] = []\r\n    data.map((item: IChatMessage) => user_ids.push(item.author))\r\n    user_ids = [...new Set(user_ids)]\r\n    const userInfoData = await handleGetUsersInChat(user_ids)\r\n    if (userInfoData.length) dispatch(setUsersInfoInChat(userInfoData))\r\n  } else dispatch(setMessages([]))\r\n}","import { LiveDelay, livePoll, videoTag } from '../../helpers/constants'\r\nimport {\r\n  addUuidToSrc,\r\n  appendQueryParamsToChunks,\r\n  compare,\r\n  handleRipple,\r\n  responseValidator,\r\n  handlePageTitle, handleHasXTokenParamOrSendXToken, weighted_random, getUUID,\r\n} from '../../helpers/helpers'\r\nimport { apiCaller, getAll } from '../../services/apiCaller'\r\nimport { API, getApiUrls } from '../../services/services'\r\nimport { setIsLive } from '../slices/controllerSlice'\r\nimport {\r\n  setAlternative_Lives,\r\n  setChartPoints,\r\n  setConfig, setEmojiList1, setEmojiList2,\r\n  setEmojis, setErrorType, setGif,\r\n  setInfo,\r\n  setIsFetchDetails,\r\n  setIsLiveError,\r\n  setIsValidAddress,\r\n  setLiveId,\r\n  setMarkers,\r\n  setOnlineViewers, setQuestion, setSelectedOptionId, setSelectedSubtitle, setSubtitleText,\r\n} from '../slices/videoDataSlice'\r\nimport { detailErrorLog, playListClickLog, recommendationListLog, subtitleLog, videoOfPlaylistClickLog } from '../../logs/logs'\r\nimport { RetryCountGeneralDataFetch, RetryTimeDelayGeneralDataFetch } from '../../helpers/environment'\r\nimport store from '../store'\r\nimport {conditions} from \"../../helpers/conditions/conditions\";\r\nimport {ConditionName, ContentTypesString} from \"../../interfaces/enums\";\r\nimport {IDetails, IMarker} from \"../../interfaces/interfaces\";\r\nimport {handleVideoTimeline} from \"./controller.actions\";\r\nimport { setChatEnabled, setChatType, setMessages, setRoomId } from '../slices/chatSlice'\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\nimport Cookies from \"js-cookie\";\r\nimport { handleSendVoucher } from \"./user.actions\";\r\nimport { setShowVoucherPopup } from \"../slices/userSlice\";\r\nimport { setQuiz } from \"../slices/quizSlice\";\r\nimport { handleDetailsConfig } from '../../configs/getDetailsConfigs'\r\nimport { setChatPopover, setPlayListPopover } from '../slices/popoversSlice'\r\nimport { MouseEventHandler } from 'react'\r\n\r\nconst videoViewCount = (contentId: number) => apiCaller({ url: API().viewCount(contentId), data: {\"uuid\": getUUID()} });\r\n\r\nconst handleDetailsInLive = (details:IDetails) => {\r\n  const dispatch = store.dispatch;\r\n  dispatch(setLiveId(details.id!));\r\n  dispatch(setIsLive(true));\r\n  dispatch(setIsLiveError(false));\r\n  if (!conditions(ConditionName.isEnded)) detailSetter(details)\r\n  else setTimeout(() => detailSetter(details), LiveDelay * 1000)\r\n}\r\n\r\nexport const getLiveAndVodDetails = async (userId?:number) => {  \r\n  try {\r\n    const { data: details, status } = await apiCaller(handleDetailsConfig(userId));\r\n    if(responseValidator(status)) {\r\n      if (!conditions(ConditionName.hasVoucherToken) && !conditions(ConditionName.isCinemaHamrahEnvironment)) {\r\n        appendQueryParamsToChunks(details.stream_link);\r\n        await apiCaller({ url: \"https://\" + weighted_random(details.hls_links) + details.path, method: \"head\" });\r\n      }\r\n      if (userId) return details;\r\n      videoViewCount(details.content_id!);\r\n      if (conditions(ConditionName.isLiveParam)) handleDetailsInLive(details);\r\n      else detailSetter(details);\r\n    } else throw new Error(status)\r\n  } catch (error:any) {\r\n    if(userId) return;\r\n    const dispatch = store.dispatch;\r\n    const { params } = store.getState().videoData;\r\n    if (error.message !== \"404\") sendFluentLog(detailErrorLog(error));\r\n    handlePageTitle(String(params.id));\r\n    dispatch(setIsFetchDetails(true));\r\n    dispatch(setErrorType('liveAndVod'));\r\n    if (conditions(ConditionName.isLiveParam)) dispatch(setIsLiveError(true));\r\n    if (conditions(ConditionName.hasVoucherToken)) {\r\n      Cookies.remove('voucher-token')\r\n      if (conditions(ConditionName.hasVoucherCodeParams)) handleSendVoucher(params.voucherCode!)\r\n      else dispatch(setShowVoucherPopup(true))\r\n    } else dispatch(setIsValidAddress(false))\r\n  }\r\n}\r\n\r\nexport const detailSetter = (data: any) => {\r\n  const dispatch = store.dispatch\r\n  const { params } = store.getState().videoData\r\n\r\n  if (data.title) handlePageTitle(data.title)\r\n  else handlePageTitle(String(params.id))\r\n  dispatch(setInfo({\r\n    ...data,\r\n    stream_link: !!data.stream_link && addUuidToSrc('https://' + weighted_random(data.hls_links) + data.path),\r\n  }))\r\n  dispatch(setIsFetchDetails(true))\r\n  dispatch(setIsValidAddress(true))\r\n}\r\n\r\nexport const getMarkers = async (id: Number) => await getAll(getApiUrls().apiMarkerUrl + id + '/', [\r\n    {\r\n      codeAbove: 400,\r\n      codeBelow: null,\r\n      excludeCodes: [],\r\n      includeCodes: [],\r\n      delay: 2,\r\n      count: 3\r\n    }\r\n  ])\r\n\r\nexport const getPersonalMarkers = async () => apiCaller({\r\n  url: API().user.getPersonalMarker,\r\n  headers: handleHasXTokenParamOrSendXToken(),\r\n})\r\n\r\nconst manualGeneralErrorResponseHandler = (retryCount: any, dispatch: any, setRetryCount: any, intervalIds: any, setIntervalIds: any, errorDetail: any, requestType: string) => {\r\n  if (requestType === 'getData' && retryCount !== RetryCountGeneralDataFetch && retryCount !== 1) {\r\n    // dispatch(setConfig({\r\n    //     ...config,\r\n    //     empoji_poll_interval: RetryTimeDelayGeneralDataFetch\r\n    // }));\r\n    setRetryCount(retryCount - 1)\r\n  } else if (retryCount === 1 && intervalIds.length > 0) {\r\n    intervalIds.forEach((id: any) => clearInterval(id))\r\n    setIntervalIds([])\r\n  }\r\n  console.error(`get aggregat error: ${errorDetail.detail}`)\r\n}\r\n\r\nexport const firstGetDataIntervalAPI = async (retryCount: any, setRetryCount: any, dispatch: any, setIntervalTime: any, setOnlineViewerIntervalTime: any, setPostDataIntervalTime: any) => {\r\n  const { params } = store.getState().videoData\r\n  const { roomId, chatEnabled, socket, showChat } = store.getState().chats\r\n  const { data, status } = await apiCaller({ url: API().live.generalData })\r\n  if (responseValidator(status) && data.config) {\r\n    if (!!data.backup) window.location.href = (window.location.href.replace(`id=${params.id}`, `id=${data.backup}`).replace(`&t=${params.t}`, ``))\r\n    setRetryCount(RetryCountGeneralDataFetch)\r\n    dispatch(setConfig(data.config))\r\n    setIntervalTime(data.config.get_interval)\r\n    setOnlineViewerIntervalTime(data.config.viewers_interval)\r\n    setPostDataIntervalTime(data.config.empoji_poll_interval)\r\n    dispatch(setEmojis(data.emojis))\r\n    dispatch(setOnlineViewers(data.online_viewers))\r\n    dispatch(setQuestion(data.question))\r\n    dispatch(setAlternative_Lives(data.alternative_lives))\r\n    dispatch(setMarkers(data.markers.sort(compare)))\r\n    dispatch(setGif(data.gif))\r\n    let roomIdTemp: number | undefined = undefined\r\n    if (data.chat_enabled) {\r\n      let { data: _data, status: _status } = await apiCaller({ url: API().live.liveChat.getRoomId(+String(params.id)) })\r\n      if (responseValidator(_status)) {\r\n        if (roomId !== _data.id && socket) {\r\n          dispatch(setMessages([]));\r\n          dispatch(setChatEnabled(false));\r\n        }\r\n        dispatch(setRoomId(_data.id));\r\n        dispatch(setChatType(_data.type));\r\n        roomIdTemp = _data.id;\r\n      }\r\n    } else if (chatEnabled && socket) {\r\n      dispatch(setMessages([]));\r\n      dispatch(setChatEnabled(false));\r\n    }\r\n    \r\n    if (chatEnabled !== !!roomIdTemp) {\r\n      setTimeout(()=>{\r\n        if (showChat) dispatch(setChatPopover(true));\r\n        dispatch(setChatEnabled(!!roomIdTemp));\r\n      }, 0)  \r\n    }\r\n    \r\n    dispatch(setQuiz(data.quiz))\r\n    if (data.timeline.windows.length) {\r\n      const points: number[] = []\r\n      data.timeline.windows.map((window: { window_number: number, viewers: number }) => points.push(window.viewers))\r\n      dispatch(setChartPoints(points))\r\n    }\r\n    if (!data && !data.question && !data.question.active) {\r\n      // state 1\r\n      if ((!!livePoll() && livePoll().liveId !== params.id) || !livePoll()) {\r\n        localStorage.setItem('live-poll', JSON.stringify({\r\n          liveId: params.id,\r\n          polls: [],\r\n        }))\r\n      }\r\n    }\r\n  } else {\r\n    setIntervalTime(RetryTimeDelayGeneralDataFetch)\r\n    // dispatch(setConfig({...config, get_interval: RetryTimeDelayGeneralDataFetch}));\r\n    setRetryCount(retryCount - 1)\r\n    console.error(`get aggregat error: ${data.detail}`)\r\n  }\r\n}\r\n\r\nexport const manualGetDataIntervalAPI = async (retryCount: any, intervalIds: any, intervalTime: any, setRetryCount: any, dispatch: any, setIntervalIds: any, setIntervalTime: any, setOnlineViewerIntervalTime: any, setPostDataIntervalTime: any) => {\r\n  const { params } = store.getState().videoData\r\n  const { roomId, chatEnabled, socket, showChat } = store.getState().chats\r\n  const { data, status } = await apiCaller({ url: API().live.generalData })\r\n  if (responseValidator(status) && data.config) {\r\n    if (!!data.backup) window.location.href = (window.location.href.replace(`id=${params.id}`, `id=${data.backup}`).replace(`&t=${params.t}`, ``))\r\n    setRetryCount(RetryCountGeneralDataFetch)\r\n    dispatch(setConfig(data.config))\r\n    if (data.config.get_interval !== intervalTime) {\r\n      await intervalIds.forEach((id: any) => {\r\n        clearInterval(id)\r\n      })\r\n      setIntervalIds([])\r\n      setIntervalTime(data.config.get_interval)\r\n    }\r\n    setOnlineViewerIntervalTime(data.config.viewers_interval)\r\n    setPostDataIntervalTime(data.config.empoji_poll_interval)\r\n    dispatch(setEmojis(data.emojis))\r\n    dispatch(setOnlineViewers(data.online_viewers))\r\n    dispatch(setQuestion(data.question))\r\n    dispatch(setAlternative_Lives(data.alternative_lives))\r\n    dispatch(setMarkers(data.markers.sort(compare)))\r\n    dispatch(setGif(data.gif))\r\n    let roomIdTemp: number | undefined = undefined\r\n  if (data.chat_enabled) {\r\n      let { data: _data, status: _status } = await apiCaller({ url: API().live.liveChat.getRoomId(+String(params.id)) });\r\n      if (responseValidator(_status)) {\r\n        if (roomId !== _data.id && socket) {\r\n          dispatch(setMessages([]));\r\n          dispatch(setChatEnabled(false));\r\n        }\r\n        dispatch(setRoomId(_data.id));\r\n        dispatch(setChatType(_data.type));\r\n        roomIdTemp = _data.id\r\n      }\r\n    } else if (chatEnabled && socket) {\r\n      dispatch(setMessages([]));\r\n      dispatch(setChatEnabled(false));\r\n    }\r\n    \r\n    if (chatEnabled !== !!roomIdTemp) {\r\n      setTimeout(()=> {\r\n        if (showChat) dispatch(setChatPopover(true));\r\n        dispatch(setChatEnabled(!!roomIdTemp));\r\n      }, 0)  \r\n    }\r\n\r\n    dispatch(setQuiz(data.quiz))\r\n    if (data.timeline.windows.length) {\r\n      const points: number[] = []\r\n      data.timeline.windows.map((window: { window_number: number, viewers: number }) => points.push(window.viewers))\r\n      dispatch(setChartPoints(points))\r\n    }\r\n    if (!data.question && (data.question && !data.question.active)) {\r\n      // state 1\r\n      if ((!!livePoll() && livePoll().liveId !== params.id) || !livePoll()) {\r\n        localStorage.setItem('live-poll', JSON.stringify({\r\n          liveId: params.id,\r\n          polls: [],\r\n        }))\r\n      }\r\n    }\r\n  } else manualGeneralErrorResponseHandler(retryCount, dispatch, setRetryCount, intervalIds, setIntervalIds, data, 'getData')\r\n}\r\n\r\nexport const manualPostAPI = async () => {\r\n  const dispatch = store.dispatch\r\n  const { selectedOptionId, emojiList1, emojiList2, params, details } = store.getState().videoData\r\n\r\n  if (conditions(ConditionName.manaulPostAPI)) {\r\n    const manualPostData = {\r\n      'poll': {\r\n        'option_id': selectedOptionId,\r\n      },\r\n      'emoji_list_1': emojiList1,\r\n      'emoji_list_2': emojiList2,\r\n      'type': params.type,\r\n      'id': details.id,\r\n      'user_id': params.id,\r\n    }\r\n    const { status } = await postEmojiPoll(manualPostData);\r\n    if (responseValidator(status)) {\r\n      dispatch(setEmojiList1([]))\r\n      dispatch(setEmojiList2([]))\r\n      dispatch(setSelectedOptionId(null))\r\n    }\r\n  }\r\n}\r\n\r\nexport const manualGetOnlineViewerIntervalAPI = async () => await apiCaller({ url: API().live.online_viewer })\r\n\r\nexport const handleSubtitle = () => {\r\n  const dispatch = store.dispatch\r\n  const { subtitles, selectedSubtitle } = store.getState().videoData\r\n\r\n  const faSubtitle: any = subtitles.find((subtitle: any) => subtitle.language === 'fa')\r\n  if (selectedSubtitle) {\r\n    Object.values(videoTag().textTracks).find((textTrack: any) => textTrack.mode === 'showing')!.mode = 'disabled'\r\n    dispatch(setSubtitleText(''))\r\n    dispatch(setSelectedSubtitle(undefined))\r\n    sendFluentLog(subtitleLog('empty'))\r\n  } else {\r\n    if (faSubtitle) {\r\n      faSubtitle.mode = 'showing'\r\n      dispatch(setSelectedSubtitle(faSubtitle))\r\n      sendFluentLog(subtitleLog(faSubtitle.language))\r\n    } else {\r\n      videoTag().textTracks[0].mode = 'showing'\r\n      dispatch(setSelectedSubtitle(videoTag().textTracks[0]))\r\n      sendFluentLog(subtitleLog(videoTag().textTracks[0].language))\r\n    }\r\n  }\r\n}\r\n\r\nexport const handleClickRecommendationCard = (event?: any, videoId?: number, userId?: number, videoType?: string, listIndex?: number) => {\r\n  if (event) handleRipple(event, `recommendationList-${videoId}`, 150)\r\n  const { recommendationList } = store.getState().videoData\r\n  handleVideoTimeline(videoTag().currentTime)\r\n  sendFluentLog(recommendationListLog(videoId ?? recommendationList[0].id, userId ?? recommendationList[0].user_id, videoType ?? recommendationList[0].type, listIndex ?? 1))\r\n}\r\n\r\nexport const combinedMarkers = (personalMarkers: any[], publicMarkers: IMarker[]) => {\r\n    const tempMarker: any[] = [];\r\n    if (personalMarkers) personalMarkers.map((m) => {\r\n        tempMarker.push({\r\n            banner: \"\",\r\n            id: !!m.id ? m.id : m.time,\r\n            live_id: conditions(ConditionName.isLiveParam) ? m.video_id : 0,\r\n            sticker: m.sticker,\r\n            time: m.time,\r\n            title: m.name,\r\n            video_type: m.video_type,\r\n            video_id: m.video_id,\r\n            description: m.description,\r\n            isPersonal: !!m.id ? m.id : m.time,\r\n        })\r\n    })\r\n    store.dispatch(setMarkers([...publicMarkers, ...tempMarker].sort(compare)))\r\n}\r\n\r\nexport const handlePlayListTabClick = () => {\r\n  const dispatch = store.dispatch;\r\n  const {playList} = store.getState().videoData;\r\n  dispatch(setPlayListPopover(true));\r\n  sendFluentLog(playListClickLog(playList![0].id));\r\n}\r\n\r\nexport const handleVideoOfPlaylistClick = (event: MouseEventHandler<HTMLDivElement>, playlistId:number, videoId:number, videoType:number, videoIndex:number) => {\r\n  handleRipple(event, `playList-${videoId}`, 150);\r\n  sendFluentLog(videoOfPlaylistClickLog(playlistId, videoId, videoType, videoIndex))\r\n}\r\n\r\nexport const handleContentType = () => {\r\n  const { isMovieFilter, isSeriesFilter } = store.getState().tags;\r\n  let contentType: undefined | ContentTypesString.PlayList | ContentTypesString.Vod | `${ContentTypesString.Vod},${ContentTypesString.PlayList}` = undefined;\r\n  if (isMovieFilter && isSeriesFilter) contentType = `${ContentTypesString.Vod},${ContentTypesString.PlayList}`;\r\n  else if (isMovieFilter) contentType = ContentTypesString.Vod;\r\n  else if (isSeriesFilter) contentType = ContentTypesString.PlayList;\r\n  return contentType;\r\n}\r\n\r\nexport const findFirstVideoInRecommendationList = () => {\r\n  const { recommendationList } = store.getState().videoData;\r\n  const recommendationVideo = recommendationList.find((item:any) => item.type !== \"playlist\");\r\n  return {\r\n    id: recommendationVideo.id,\r\n    type: recommendationVideo.type,\r\n    banner: recommendationVideo.banner,\r\n    title: recommendationVideo.title\r\n  }\r\n}\r\n\r\nexport const postEmojiPoll = async (manualPostData:any) => {\r\n  const { status } = await apiCaller({ url: API().live.postData, method: 'POST', data: manualPostData, retryPolicy: [\r\n    {\r\n      codeAbove: null,\r\n      codeBelow: 500,\r\n      excludeCodes: [500,408,407,406,405,404,403,402,401,400],\r\n      includeCodes: [409],\r\n      delay: 3,\r\n      count: 3\r\n    }\r\n  ] })\r\n  return { status }\r\n} \r\n\r\nexport const getPlaylistVideos = async(selectedPlaylist:number, offset:number) => {\r\n  const { data, status } = await apiCaller({ url: API().playListVideos(selectedPlaylist), method: 'GET', data: {\r\n      offset: offset,\r\n      limit: 10\r\n  }, retryPolicy: [\r\n      {\r\n        codeAbove: 400,\r\n        codeBelow: null,\r\n        excludeCodes: [],\r\n        includeCodes: [],\r\n        delay: 2,\r\n        count: 3\r\n      }\r\n    ]})\r\n    return { data, status }\r\n}\r\n\r\nexport const getAllGeneralMarker = async (url:string) => {\r\n  const response:any = await getAll(url, [\r\n      {\r\n          codeAbove: 400,\r\n          codeBelow: null,\r\n          excludeCodes: [],\r\n          includeCodes: [],\r\n          delay: 2,\r\n          count: 3\r\n      }\r\n  ]);\r\n  return response\r\n}\r\n\r\nexport const getAllPersonalMarkers = async (url:string) => {\r\n  const { data, status } = await apiCaller({\r\n      url: url,\r\n      headers: handleHasXTokenParamOrSendXToken(),\r\n      retryPolicy: [\r\n          {\r\n              codeAbove: 400,\r\n              codeBelow: null,\r\n              excludeCodes: [],\r\n              includeCodes: [],\r\n              delay: 2,\r\n              count: 3\r\n          }\r\n      ]\r\n  });\r\n  return { data, status }\r\n}\r\n\r\nexport const submitChatComment = async (_data:any) => {\r\n  const { data, status } = await apiCaller({\r\n    url: API().live.liveChat.sendChatMessage,\r\n    method: 'post',\r\n    data: _data,\r\n    headers: handleHasXTokenParamOrSendXToken(),\r\n    retryPolicy: [\r\n      {\r\n        codeAbove: 400,\r\n        codeBelow: null,\r\n        excludeCodes: [],\r\n        includeCodes: [],\r\n        delay: 2,\r\n        count: 3\r\n      }\r\n    ]\r\n  })\r\n  return { data, status }\r\n}\r\n\r\nexport const getAllChatMessages = async (roomId: number, offset: number) => {\r\n  const { data, status } = await apiCaller({\r\n    url: API().live.liveChat.getMessageList(roomId), method: \"GET\", data: {\r\n      offset: offset,\r\n      limit: 10,\r\n      ordering: \"-created_at\"\r\n    },\r\n    retryPolicy: [\r\n      {\r\n        codeAbove: 400,\r\n        codeBelow: null,\r\n        excludeCodes: [],\r\n        includeCodes: [],\r\n        delay: 2,\r\n        count: 3\r\n      }\r\n    ]\r\n  })\r\n  return { data, status }\r\n}\r\n\r\nexport const getCommentList = async (url:string, offset:number) => {\r\n  const { data, status } = await apiCaller({ url: url, data: {\r\n      limit: 10,\r\n      offset: offset\r\n  },\r\n      retryPolicy: [\r\n          {\r\n              codeAbove: 400,\r\n              codeBelow: null,\r\n              excludeCodes: [],\r\n              includeCodes: [],\r\n              delay: 2,\r\n              count: 3\r\n          }\r\n      ] });\r\n      return { data, status }\r\n}\r\n\r\nexport const submitComment = async (url:string, _data:any) => {\r\n  const { data, status } = await apiCaller({ url: url, method: \"POST\", data: _data, headers: handleHasXTokenParamOrSendXToken(), retryPolicy: [\r\n      {\r\n          codeAbove: 400,\r\n          codeBelow: null,\r\n          excludeCodes: [],\r\n          includeCodes: [],\r\n          delay: 2,\r\n          count: 3\r\n      }\r\n  ] });\r\n  return { data, status }\r\n}\r\n\r\nexport const getPlayListCards = async (url:string) => {\r\n  const { data, status } = await apiCaller({ url: url, retryPolicy: [\r\n      {\r\n          codeAbove: 400,\r\n          codeBelow: null,\r\n          excludeCodes: [],\r\n          includeCodes: [],\r\n          delay: 2,\r\n          count: 3\r\n      }\r\n  ] });\r\n  return { data, status }\r\n}\r\n\r\nexport const getPlaylistHeader = async (url:string) => {\r\n  const { data, status } = await apiCaller({ url: url, retryPolicy: [\r\n      {\r\n          codeAbove: 400,\r\n          codeBelow: null,\r\n          excludeCodes: [],\r\n          includeCodes: [],\r\n          delay: 2,\r\n          count: 3\r\n      }\r\n  ]});\r\n  return { data, status }\r\n}","import { conditions } from \"../helpers/conditions/conditions\";\r\nimport { flattenObject, getUUID } from \"../helpers/helpers\";\r\nimport { ConditionName, ContentTypesString } from \"../interfaces/enums\";\r\nimport { IDetails, IParams } from \"../interfaces/interfaces\"\r\nimport store from \"../redux/store\";\r\nimport {videoTag} from \"../helpers/constants\";\r\nimport { handleContentType } from \"redux-share/actions\";\r\n\r\nexport const feedbackLog = (starNum: Number, reasons: string[], customText: string | undefined) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"feedback\",\r\n        id: Number(params.id),\r\n        stars: starNum ? starNum : starNum,\r\n        text: reasons,\r\n        customText: customText,\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const eventMarkerClickLog = (markerId: Number, markerTime: Number, markerTitle: String, markerDescription: String, markerSticker: String) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"eventMarkerClick\",\r\n        video_id: conditions(ConditionName.isLiveParam) ? details.id : Number(params.id),\r\n        markerId: markerId,\r\n        markerTime: markerTime,\r\n        markerTitle: markerTitle,\r\n        markerDescription: markerDescription,\r\n        markerSticker: markerSticker,\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const speedChangeLog = (selectedSpeed: Number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { settings } = store.getState().user;\r\n    return {\r\n        category: \"speedChange\",\r\n        previousSelectedSpeed: settings.speed,\r\n        selectedSpeed: selectedSpeed,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const qualityChangeRequestLog = (selectedQuality: String) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { qualityLevels, manualQuality, autoQuality } = store.getState().controller;\r\n    return {\r\n        category: \"qualityChangeRequest\",\r\n        currentPlayingQuality: `${qualityLevels[conditions(ConditionName.isAutoQuality) ? (autoQuality??manualQuality!) : manualQuality!]}P`,\r\n        previousSelectedQuality: conditions(ConditionName.isAutoQuality) ? \"auto\" : `${qualityLevels[manualQuality!]}P`,\r\n        selectedQuality: selectedQuality,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const catchUpLoadingLog = (duration: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { hlsLiveSyncPosition, qualityLevels, autoQuality } = store.getState().controller;\r\n    const { settings } = store.getState().user;\r\n\r\n    return {\r\n        category: \"catchUpLoading\",\r\n        previousVideoTime: Number(sessionStorage.getItem(\"previousVideoTime\")),\r\n        currentVideoTime: hlsLiveSyncPosition,\r\n        duration: duration,\r\n        quality: `${conditions(ConditionName.isAutoQuality) ? qualityLevels[autoQuality!] : qualityLevels[settings.quality]}P`,\r\n        isAutoQuality: conditions(ConditionName.isAutoQuality),\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const shareDialogLog = (videoTime: number, isJump: boolean, jumpTime: number | undefined, eventMarkerId?: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"shareDialog\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        videoTime: videoTime,\r\n        eventMarkerId: eventMarkerId,\r\n        provider: params.provider,\r\n        jump: isJump ? \"true\" : \"false\",\r\n        jumpTime: isJump ? jumpTime : undefined,\r\n    }\r\n}\r\n\r\nexport const shareCopyLog = (videoTime: number, isJump: boolean, jumpTime:number | undefined, EventMarker?: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"shareCopy\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        videoTime: videoTime,\r\n        eventMarkerId: EventMarker,\r\n        jump: isJump ? \"true\" : \"false\",\r\n        jumpTime: isJump ? jumpTime : undefined,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const alternativeLiveLog = (alternativeLiveUserId: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"alternativeLiveClick\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        alternativeLiveUserId: alternativeLiveUserId,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const deActiveSettingLog = () => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { settings } = store.getState().user;\r\n    let data_base = {\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    };\r\n    if (!settings.poll_emoji) {\r\n        return {\r\n            ...data_base,\r\n            category: \"deactiveSetting\",\r\n            hasOtherLive: conditions(ConditionName.hasAlternativeLives) ? \"true\" : \"false\",\r\n            hasPoll: conditions(ConditionName.hasPoll) ? \"true\" : \"false\",\r\n            hasEmoji: conditions(ConditionName.hasEmojiList1Or2) ? \"true\" : \"false\"\r\n        };\r\n    } else return {\r\n        ...data_base,\r\n        category: \"activeSetting\",\r\n    };\r\n\r\n}\r\n\r\nexport const backwardForwardLog = (type: string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: type === \"backward\" ? \"backward\" : \"forward\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: details.stream_link ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const pollModalCloseLog = (params: IParams, details: IDetails, pollId: number) => {\r\n    return {\r\n        category: \"pollModalClose\",\r\n        pollId: pollId,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: details.stream_link ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const tagClickLog = (tagText:string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"tagClick\",\r\n        tagText: tagText,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const likeDislikeLog = (category:string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: category,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const fullscreenLog = (category:string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: category,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const brightnessLog = (source: number, target:number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"brightnessChange\",\r\n        source: source,\r\n        target: target,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const volumeLog = (source: number, target: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"volumeChange\",\r\n        source: source,\r\n        target: target,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const subtitleLog = (language:string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"subtitle\",\r\n        language: language,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const lockLog = (category: string) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: category,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const recommendationListLog = (targetVideoId: number, targetUserId:number, targetType:string, listIndex:number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"recommend\",\r\n        sourcevideoId: conditions(ConditionName.isLiveParam) ? details.id : +params.id!,\r\n        targetVideoId: targetVideoId,\r\n        sourceUserId: details.user_id,\r\n        targetUserId: targetUserId,\r\n        sourceType: params.type,\r\n        targetType: targetType,\r\n        listIndex: listIndex,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const detailErrorLog = (error: any) => {\r\n    const { params } = store.getState().videoData;\r\n    return {\r\n        category: \"detailError\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        errorMessage: (error && error.message) ? error.message : null,\r\n        errorCode: (error && error.response) ? error.response.status : null,\r\n    }\r\n}\r\n\r\nexport const manifestLoadErrorLog = () => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"manifestLoadError\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const videoTimelineLog = (start:number, end:number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { duration } = store.getState().controller;\r\n    return {\r\n        category: \"video-timeline\",\r\n        video_id: conditions(ConditionName.isLiveParam) ? details.id : +params.id!,\r\n        video_type: params.type === \"archive\" ? \"live\" : params.type,\r\n        start: start,\r\n        end: end,\r\n        watchedDuration: end - start,\r\n        video_duration: conditions(ConditionName.isLiveParam) ? null : Math.floor(duration),\r\n        clientUUID: getUUID(),\r\n        user_id: conditions(ConditionName.isLiveParam) ? params.id : details.user_id\r\n    }\r\n}\r\n\r\nexport const bookmarkLog = (category: \"bookmark\" | \"unBookmark\") => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: category,\r\n        id: conditions(ConditionName.isLiveParam) ? details.id : +params.id!,\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n    }\r\n}\r\n\r\nexport const autoQualityChangeLog = (sourceQuality: String, targetQuality: String, diffQuality: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"autoQualityChange\",\r\n        sourceQuality: sourceQuality,\r\n        targetQuality: targetQuality,\r\n        diffQuality: diffQuality,\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const pingpongLog = (startTimer: number, qualityHistory: number[]) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"pingpong\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        PingPongDuration: Number((new Date().getTime() - startTimer).toFixed(2)),\r\n        PingPongSourceQuality: `${qualityHistory[0]}P`, // A     A->B && B->A\r\n        PingPongTargetQuality: `${qualityHistory[1]}P`, // B,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const pausePlayLog = (isPlay: boolean) => {\r\n    const { params, details } = store.getState().videoData\r\n    return {\r\n        category: isPlay ? \"playVideo\" : \"pauseVideo\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: details.stream_link ? details.stream_link : params.src,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const initLog = (loadingTime: number, waitingTime: number, bannerLoadingTime: number, firstChunkPlayingTime: number, timerRef: any) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const totalTime = (Date.now() - timerRef.current) + loadingTime + waitingTime;\r\n    const memory = (window.performance as any).memory;\r\n    const timing = JSON.parse(JSON.stringify((window.performance as any).timing));\r\n    return {\r\n        category: \"initLog\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        origin: new URL(conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src!).origin,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        loading: loadingTime,\r\n        bannerLoading: (!conditions(ConditionName.hasBanner) || bannerLoadingTime < 0) ? 0 : bannerLoadingTime,\r\n        waiting: waitingTime,\r\n        firstChunkPlaying: firstChunkPlayingTime < 0 ? 0 : firstChunkPlayingTime,\r\n        totalTime: totalTime,\r\n        provider: params.provider,\r\n        performance: flattenObject({ memory, timing }, \"performance\"),\r\n        userAgent: window.navigator.userAgent\r\n    }\r\n}\r\n\r\nexport const loadingLog = (waitingDuration: number, qualityLevel: number, timerRef: any, loadingCounterRef: any, videoEntranceTime: number) => {\r\n    const { params, details, hlsLiveSyncPosition } = store.getState().videoData;\r\n    const { settings } = store.getState().user;\r\n    const videoTime = conditions(ConditionName.isLiveParam) ? hlsLiveSyncPosition : videoTag().currentTime;\r\n    const previousLoaderDiff = Date.now() - timerRef.current;\r\n    return {\r\n        category: \"loading\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        duration: waitingDuration,\r\n        quality: `${qualityLevel}P`,\r\n        isAutoQuality: conditions(ConditionName.isAutoQuality),\r\n        previousLoaderDiff: previousLoaderDiff,\r\n        counter: loadingCounterRef.current,\r\n        loadingPercentile: Number((waitingDuration / previousLoaderDiff).toFixed(2)),\r\n        videoTime: videoTime,\r\n        videoEntranceTime: videoEntranceTime,\r\n        speed: settings.speed,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const errorLog = (error?: any) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"error\",\r\n        id: Number(params.id),\r\n        type: params.type,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src,\r\n        status: (error && error.response) ? error.response.status : null,\r\n        api: (error && error.config) ? error.config.url : null,\r\n        message: (error && error.message) ? error.message : null,\r\n        method: (error && error.config) ? error.config.method : null,\r\n        provider: params.provider\r\n    }\r\n}\r\n\r\nexport const watchedTimeLog = (watchedSeconds: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    const { duration } = store.getState().controller;\r\n    return {\r\n        category: conditions(ConditionName.isStaticFormat) ? \"videoWatchedStatic\" : \"videoWatched\",\r\n        watchedSeconds: watchedSeconds,\r\n        id: Number(params.id),\r\n        duration: Math.floor(duration),\r\n        type: params.type,\r\n        user_id: conditions(ConditionName.isStaticFormat) ? undefined : conditions(ConditionName.isLiveParam) ? +params.id! : details.user_id,\r\n        src: conditions(ConditionName.hasStreamLink) ? details.stream_link : params.src\r\n    }\r\n}\r\n\r\nexport const playListClickLog = (playlistId: number) => {\r\n    const { params, details } = store.getState().videoData;\r\n    return {\r\n        category: \"playListClick\",\r\n        playlistId: playlistId,\r\n        id: conditions(ConditionName.isLiveParam) ? details.id : +params.id!,\r\n        type: params.type,\r\n    }\r\n}\r\n\r\nexport const videoOfPlaylistClickLog = (playlistId: number, videoId:number, videoType:number, videoIndex:number) => {\r\n    return {\r\n        category: \"videoOfPlaylistClick\",\r\n        tag: playlistId,\r\n        indexNumber: videoIndex,\r\n        videoId: videoId,\r\n        videoType: videoType,\r\n    }\r\n}\r\n\r\nexport const searchLog = (contentType: undefined | ContentTypesString.PlayList | ContentTypesString.Vod | `${ContentTypesString.Vod},${ContentTypesString.PlayList}` ) => {\r\n    const { selectedTags, inputTagSearch } = store.getState().tags;\r\n    const { params } = store.getState().videoData;\r\n    return {\r\n        category: \"search\",\r\n        tag: selectedTags.join(\",\"),\r\n        q: conditions(ConditionName.hasInputTagSearch) ? inputTagSearch : undefined,\r\n        user_ids: params.user_ids,\r\n        video_type: contentType\r\n    }\r\n}\r\n\r\nexport const searchResultClickLog = (videoId:number, videoType:string, videoIndex:number) => {\r\n    const { selectedTags, inputTagSearch } = store.getState().tags;\r\n    const { params } = store.getState().videoData;\r\n    const contentType = handleContentType();\r\n    return {\r\n        category: \"searchResultClick\",\r\n        tag: selectedTags.join(\",\"),\r\n        q: conditions(ConditionName.hasInputTagSearch) ? inputTagSearch : undefined,\r\n        user_ids: params.user_ids,\r\n        video_type: contentType,\r\n        clickedId: videoId,\r\n        clickedIndex: videoIndex,\r\n        clickedType: videoType,\r\n    }\r\n}\r\n","import {\r\n    setCurrentTime,\r\n    setIsClickInnerCard,\r\n    setIsFullScreen,\r\n    setIsLive,\r\n    setLock,\r\n    setPlay,\r\n} from '../slices/controllerSlice';\r\nimport { progressBar, videoTag } from '../../helpers/constants';\r\nimport { backwardForwardLog, catchUpLoadingLog, fullscreenLog, lockLog, videoTimelineLog, watchedTimeLog } from '../../logs/logs';\r\nimport store from \"../store\";\r\nimport { setIsComplexPortrait, setPlayerParams, setVideoElementSizeInfo, setVideoTimelines } from '../slices/videoDataSlice';\r\nimport { conditions } from '../../helpers/conditions/conditions';\r\nimport { ConditionName } from '../../interfaces/enums';\r\nimport { apiCaller } from '../../services/apiCaller';\r\nimport { API } from '../../services/services';\r\nimport { setUserSettings, setXToken } from '../slices/userSlice';\r\nimport { sendFluentLog } from '../../logs/fluentdLogger';\r\nimport { clearRedux, convertB64ToFile, responseValidator, utf8_to_b64 } from '../../helpers/helpers';\r\nimport axios from 'axios';\r\nimport { setClearPopoversSlice } from '../slices/popoversSlice';\r\nimport { handleContinuousPlayback } from 'ui/src/playerComponents/continuousPlayback/continuousePlayback';\r\nimport { findFirstVideoInRecommendationList } from './videoData.actions';\r\n\r\nexport const handlePlayPause = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    if (event === null || event.target.nodeName !== \"INPUT\") {\r\n        if(event !== null) {\r\n            event.stopPropagation();\r\n            event.preventDefault();\r\n        }\r\n        videoTag().paused ? videoTag().play() : videoTag().pause();\r\n        dispatch(setPlay(!videoTag().paused));\r\n    }\r\n}\r\n\r\nexport const handlePlayPauseInDOM = (type: boolean) => {\r\n    const dispatch = store.dispatch;\r\n    if (type) {\r\n        videoTag().play();\r\n        dispatch(setPlay(true));\r\n        return true;\r\n    } else {\r\n        videoTag().pause();\r\n        dispatch(setPlay(false));\r\n        return false;\r\n    }\r\n}\r\n\r\nexport const handleChangeSoundVolume = (volume: number) => {\r\n    const dispatch = store.dispatch;\r\n    const { settings } = store.getState().user;\r\n    dispatch(setUserSettings({ ...settings, volume }))\r\n    if (conditions(ConditionName.isIOS)) videoTag().muted = !videoTag().muted;\r\n    else videoTag().volume = volume / 100;\r\n}\r\n\r\nexport const handleIsLive = () => {\r\n    const dispatch = store.dispatch;\r\n    const { hlsLiveSyncPosition } = store.getState().controller;\r\n    handleVideoTimeline(videoTag().currentTime, hlsLiveSyncPosition);\r\n    videoTag().currentTime = hlsLiveSyncPosition;\r\n    dispatch(setCurrentTime(hlsLiveSyncPosition));\r\n    if (progressBar()) progressBar().style.width = \"100%\"\r\n    dispatch(setIsLive(true));\r\n    const timer = Date.now();\r\n    videoTag().play().then(() => sendFluentLog(catchUpLoadingLog(Date.now() - timer)));\r\n}\r\n\r\nexport const handleBackwardForward = (type: string, forwardBackwardCount: number = 15, event?: any) => {\r\n    if (event && event.target.nodeName === \"INPUT\") return;\r\n    const dispatch = store.dispatch;\r\n    if (type === \"touchBackward\") type = \"backward\";\r\n    else if (type === \"touchForward\") type = \"forward\";\r\n    sendFluentLog(backwardForwardLog(type));\r\n    let currentTime = 0;\r\n    if (type === \"backward\") {\r\n        if (forwardBackwardCount === 0) currentTime = 0;\r\n        else currentTime = videoTag().currentTime - forwardBackwardCount;\r\n    } else if (type === \"forward\") {\r\n        if (forwardBackwardCount === videoTag().duration) currentTime = forwardBackwardCount;\r\n        else currentTime = videoTag().currentTime + forwardBackwardCount;\r\n    }\r\n    if (conditions(ConditionName.isLiveParam)) dispatch(setCurrentTime(currentTime));\r\n    if (!conditions(ConditionName.isStaticFormat)) handleVideoTimeline(videoTag().currentTime, videoTag().currentTime + forwardBackwardCount);\r\n    videoTag().currentTime = currentTime;\r\n}\r\n\r\nexport const handleFullScreen = () => {\r\n    const dispatch = store.dispatch;\r\n    const isFullScreen = document.fullscreenElement;\r\n    if (conditions(ConditionName.isIOS)) {\r\n        if ((videoTag() as any).webkitEnterFullScreen) {\r\n            dispatch(setPlay(false));\r\n            // Toggle fullscreen in Safari for iPad\r\n            (videoTag() as any).webkitEnterFullScreen();\r\n        } else {\r\n            dispatch(setClearPopoversSlice());\r\n            sendFluentLog(fullscreenLog(\"fullScreen\"))\r\n        }\r\n    } else {\r\n        if (isFullScreen) {\r\n            dispatch(setIsFullScreen(false));\r\n            document.exitFullscreen();\r\n            if (conditions(ConditionName.isTouchScreen) && conditions(ConditionName.isParamsPortrait)) dispatch(setIsComplexPortrait(true));\r\n        } else {\r\n            dispatch(setClearPopoversSlice())\r\n            document.documentElement.requestFullscreen();\r\n            dispatch(setIsFullScreen(true));\r\n            sendFluentLog(fullscreenLog(\"fullScreen\"));\r\n            if (conditions(ConditionName.isTouchScreen) && conditions(ConditionName.isParamsPortrait)) dispatch(setIsComplexPortrait(false));\r\n        }\r\n    }\r\n}\r\n\r\nexport const handleLockOrientation = () => {\r\n    if (conditions(ConditionName.isTouchScreen) && !conditions(ConditionName.isIOS)) {\r\n        if (conditions(ConditionName.isLandscape) && !conditions(ConditionName.isFullScreen)) (window.screen.orientation as any).lock(\"portrait\")\r\n        else (window.screen.orientation as any).lock(\"landscape\");\r\n    }\r\n};\r\n\r\nexport const handleLock = (type: string) => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setLock(type === \"lock\"));\r\n    sendFluentLog(lockLog(type));\r\n};\r\n\r\nexport const handleVideoTimeline = (currentTimeValue: number, movedTimeValue?: number) => {\r\n    if (conditions(ConditionName.isSendTimelineLog)) {\r\n        const dispatch = store.dispatch;\r\n        const { videoTimelines } = store.getState().videoData;\r\n        let currentTime = Math.floor(currentTimeValue);\r\n        let movedTime = Math.floor(movedTimeValue!);\r\n        if (videoTimelines.length === 0) {\r\n            dispatch(setVideoTimelines([(currentTime >= videoTag().duration && !conditions(ConditionName.isLive)) ? movedTime! : currentTime]));\r\n        } else {\r\n            if (videoTimelines[0] < currentTime) apiCaller({ url: API().videoTimelineLog, method: \"post\", data: videoTimelineLog(videoTimelines[0], currentTime) });\r\n            if (movedTime && movedTime >= videoTag().duration) dispatch(setVideoTimelines([]));\r\n            else dispatch(setVideoTimelines([movedTime!]));\r\n        }\r\n    }\r\n}\r\n\r\nexport const handleSnapShot = async (setLoading: (loading: boolean) => void) => {\r\n    let canvas: any = document.getElementById(\"snapshot-canvas\");\r\n    let video: any = document.querySelector(\"#player-tag\");\r\n    if (canvas) {\r\n        canvas.width = video.videoWidth;\r\n        canvas.height = video.videoHeight;\r\n        canvas\r\n            .getContext(\"2d\")\r\n            .drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\r\n        const imgData = canvas.toDataURL('image/JPEG');\r\n        const { data, status } = await apiCaller({ url: API().live.tempLink });\r\n        if (responseValidator(status)) {\r\n            let file = convertB64ToFile(imgData, 'snapshot.jpeg');\r\n            const response = await axios({\r\n                url: data.url,\r\n                method: \"put\",\r\n                headers: { \"Content-Type\": \"\" },\r\n                data: file\r\n            });\r\n\r\n            if (response.status >= 200 && response.status < 300) {\r\n                if (conditions(ConditionName.hasOnSnapshotParams)) store.getState().videoData.params.onSnapshot!(utf8_to_b64(data.image_name));\r\n                setLoading(false);\r\n            }\r\n        }\r\n    };\r\n}\r\n\r\nexport const handleVideoElementSizeInfo = () => {\r\n    const dispatch = store.dispatch;\r\n    const element: any = document.getElementById(\"video-area\")?.getBoundingClientRect();\r\n    element.height = element.width * 9 / 16;\r\n    if (element) dispatch(setVideoElementSizeInfo(element));\r\n}\r\n\r\nexport const handleClickVideoCard = (videoId?:string | null, videoType?:string | null, isBackButtonClick?:boolean) => {\r\n    const dispatch = store.dispatch;\r\n    const { watchedTime, params } = store.getState().videoData;\r\n    const { xToken } = store.getState().user;\r\n    const recommendationVideo = findFirstVideoInRecommendationList();\r\n    const id = videoId ? videoId : recommendationVideo.id;\r\n    const type = videoType ? videoType : recommendationVideo.type;\r\n    if(videoTag()) {\r\n        sendFluentLog(watchedTimeLog(watchedTime))\r\n        handleVideoTimeline(videoTag().currentTime)\r\n        if (!conditions(ConditionName.isEnded)) handleContinuousPlayback();\r\n        if (params.handleRedirectCards && !isBackButtonClick) params.handleRedirectCards(id, type);\r\n    }\r\n    clearRedux();\r\n    dispatch(setPlayerParams({ ...params, id, type }));\r\n    dispatch(setXToken(xToken));\r\n    dispatch(setIsClickInnerCard(true));\r\n}","import { getUUID } from \"../helpers/helpers\";\r\nimport store from \"../redux/store\";\r\nimport { conditions } from \"../helpers/conditions/conditions\";\r\nimport { ConditionName } from \"../interfaces/enums\";\r\nimport { apiCaller } from \"../services/apiCaller\";\r\nimport { API } from \"../services/services\";\r\nimport { featureToggle } from \"../helpers\";\r\n\r\nexport const sendFluentLog = (data:any) => {\r\n    const { poll_emoji } = store.getState().user.settings;\r\n    const { params, details } = store.getState().videoData;\r\n    let _data = {\r\n        ...data,\r\n        timestamp: Date.now(),\r\n        clientUUID: getUUID(),\r\n        uuid: getUUID(),\r\n        link: window.location.href,\r\n        user_id: conditions(ConditionName.isLiveParam) ? Number(params.id) : details.user_id,\r\n        live_id: conditions(ConditionName.isLiveParam) ? details.id : null,\r\n        format: data.category === \"feedback\" ? (conditions(ConditionName.isStaticFormat) ? \"static\" : \"hls\") : undefined\r\n    };\r\n    if (conditions(ConditionName.isLiveParam)) _data[featureToggle] = poll_emoji;\r\n    apiCaller({ url: API().logs, method: \"post\", data: _data });\r\n}\r\n","export * from \"./helpers\";\r\nexport * from \"./environment\";\r\nexport * from \"./constants\";\r\nexport * from \"./conditions/conditions\";\r\nexport * from \"./hooks\";","export * from \"./useActiveInActive\";\r\nexport * from \"./useBackButton\";\r\nexport * from \"./useBeforeUnload\";\r\nexport * from \"./useFullScreen\";\r\nexport * from \"./useHandleKeyPress\";\r\nexport * from \"./useHandleParams\";\r\nexport * from \"./useHandleScroll\";\r\nexport * from \"./useIntersect\";\r\nexport * from \"./useKeyPress\";\r\nexport * from \"./useOnClickOutside\";\r\nexport * from \"./useGetData/useGetData\";\r\nexport * from \"./usePingPong\";\r\nexport * from \"./useRouteChange\";\r\nexport * from \"./useWatchingDuration\";","import { useEffect, useRef } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../redux/hooks\";\r\nimport store from \"../../redux/store\";\r\nimport { setActiveElements } from \"../../redux/slices/controllerSlice\";\r\nimport { checkParentTarget, isTouchScreen } from \"../helpers\";\r\nimport { activeElementsTime } from \"../environment\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useActiveInActive = (isRightDoubleTouched:boolean, isLeftDoubleTouched:boolean) => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    const { activeElements } = useAppSelector(({ controller: { activeElements } }) => ({ activeElements }), shallowEqual);\r\n\r\n    const timeoutRef = useRef<any>(null);\r\n    const isRightDoubleTouchedRef = useRef<boolean>(isRightDoubleTouched);\r\n    const isLeftDoubleTouchedRef = useRef<boolean>(isLeftDoubleTouched);\r\n\r\n    useEffect(() => {\r\n        isRightDoubleTouchedRef.current = isRightDoubleTouched\r\n    }, [isRightDoubleTouched])\r\n\r\n    useEffect(() => {\r\n        isLeftDoubleTouchedRef.current = isLeftDoubleTouched\r\n    }, [isLeftDoubleTouched])\r\n\r\n    useEffect(() => {\r\n        let shouldInActiveElements = false;\r\n\r\n        const handlePointerMove = (event: any) => {\r\n            const { activeElements, isEnded } = store.getState().controller;\r\n            if (isEnded) dispatch(setActiveElements(true));\r\n            else if (event.pointerType === \"mouse\") {\r\n                clearTimeout(timeoutRef.current);\r\n                if (!activeElements) dispatch(setActiveElements(true));\r\n                else if ([\"player-tag\", \"main-content\", \"player-controllbar\", \"player-gif\", \"video-opacity\", \"playerElements\"].includes(event.target.id)) shouldInActiveElements = true;\r\n                timeoutRef.current = setTimeout(() => {\r\n                    const { settingPopover, markersListPopover, speedPopover } = store.getState().popovers;\r\n                    const { play } = store.getState().controller;\r\n                    if (!settingPopover && !markersListPopover && !speedPopover && play && shouldInActiveElements) dispatch(setActiveElements(false));\r\n                }, activeElementsTime);\r\n            }\r\n        }\r\n\r\n        const handleTouchStart = (event: any) => {\r\n            setTimeout(() => {\r\n                const { activeElements, isEnded, firstPlay } = store.getState().controller;\r\n                clearTimeout(timeoutRef.current);\r\n                if (isEnded) return dispatch(setActiveElements(true));\r\n                if (isTouchScreen() && !firstPlay && !isRightDoubleTouchedRef.current && !isLeftDoubleTouchedRef.current) {\r\n                    if ([\"player-tag\", \"main-content\", \"video-opacity\", \"touchBackward\", \"touchForward\"].includes(event.target.id) || checkParentTarget(event, \"just-audio\") || checkParentTarget(event, \"player-gif\") || checkParentTarget(event, \"playerElements\")) {\r\n                        dispatch(setActiveElements(!activeElements));\r\n                        timeoutRef.current = setTimeout(() => {\r\n                            const { settingPopover, markersListPopover, speedPopover } = store.getState().popovers;\r\n                            if (!settingPopover && !markersListPopover && !speedPopover) dispatch(setActiveElements(false));\r\n                        }, activeElementsTime);\r\n                    } else {\r\n                        timeoutRef.current = setTimeout(() => {\r\n                            const { settingPopover, markersListPopover, speedPopover } = store.getState().popovers;\r\n                            if (!settingPopover && !markersListPopover && !speedPopover) dispatch(setActiveElements(false));\r\n                        }, activeElementsTime);\r\n                    }\r\n                }\r\n            }, 200)\r\n        }\r\n\r\n        const handleTouchMove = () => {\r\n            clearTimeout(timeoutRef.current);\r\n            timeoutRef.current = setTimeout(() => {\r\n                const { activeElements, isEnded } = store.getState().controller;\r\n                const { settingPopover, markersListPopover, speedPopover } = store.getState().popovers;\r\n                if (isEnded) dispatch(setActiveElements(true));\r\n                else if (!settingPopover && !markersListPopover && !speedPopover && activeElements && !isEnded) dispatch(setActiveElements(!activeElements));\r\n            }, activeElementsTime);\r\n        }\r\n\r\n        document.getElementById(\"video-area\")!.addEventListener(\"touchstart\", handleTouchStart);\r\n        document.getElementById(\"video-area\")!.addEventListener(\"touchmove\", handleTouchMove);\r\n        document.getElementById(\"video-area\")!.addEventListener(\"pointermove\", handlePointerMove);\r\n\r\n        return () => {\r\n            const videoArea = document.getElementById(\"video-area\")!;\r\n            if(videoArea) {\r\n                videoArea.removeEventListener(\"touchstart\", handleTouchStart);\r\n                videoArea.removeEventListener(\"touchmove\", handleTouchMove);\r\n                videoArea.removeEventListener(\"pointermove\", handlePointerMove);\r\n            }\r\n        }\r\n\r\n    }, [activeElements, isRightDoubleTouched, isLeftDoubleTouched]);\r\n}\r\n\r\nexport default useActiveInActive;","import { useEffect } from 'react'\r\nimport { handleClickVideoCard } from 'redux-share/actions';\r\nimport { useAppSelector } from 'redux-share/hooks';\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useBackButton = () => {\r\n    useAppSelector(({ popovers: { markersListPopover, settingPopover, sharePopover, feedbackPopover, multiLivesPopover, pollPopover, autoPlayPopover, recommendListPopover, tagsPopover, speedPopover, playListPopover, playListCardPopover, commentPopover, personalMarkersPopover, bookmarksPopover, chatPopover, chatEmojisPopover, trailerPopover, loginPopover, preFactorPopover } }) => ({ markersListPopover, settingPopover, sharePopover, feedbackPopover, multiLivesPopover, pollPopover, autoPlayPopover, recommendListPopover, tagsPopover, speedPopover, playListPopover, playListCardPopover, commentPopover, personalMarkersPopover, bookmarksPopover, chatPopover, chatEmojisPopover, trailerPopover, loginPopover, preFactorPopover }), shallowEqual);\r\n    useEffect(() => {\r\n        const handleClickButton = () => {\r\n            const searchParams = new URLSearchParams(window.location.search);\r\n            const type = searchParams.get(\"type\");\r\n            const id = searchParams.get(\"id\");\r\n            handleClickVideoCard(id, type, true);\r\n        }\r\n\r\n        window.addEventListener('popstate', handleClickButton);\r\n        return () => window.removeEventListener('popstate', handleClickButton);\r\n    }, [])\r\n}\r\n\r\nexport default useBackButton","import { useEffect } from 'react'\r\nimport { videoTag } from '../constants'\r\nimport { handleVideoTimeline } from '../../redux/actions/controller.actions'\r\nimport store from '../../redux/store'\r\nimport { useAppSelector } from 'redux-share'\r\nimport { shallowEqual } from \"react-redux\";\r\nimport { sendFluentLog, watchedTimeLog } from 'logs'\r\nimport { handleContinuousPlayback } from 'ui/src/playerComponents/continuousPlayback/continuousePlayback'\r\n\r\nconst useBeforeUnload = () => {\r\n\r\n  useAppSelector(({ user: { isLogin } }) => ({ isLogin }), shallowEqual);\r\n\r\n  useEffect(() => {\r\n    const handleBeforeUnload = () => {\r\n      const { watchedTime } = store.getState().videoData\r\n      sendFluentLog(watchedTimeLog(watchedTime))\r\n      handleVideoTimeline(videoTag().currentTime)\r\n      handleContinuousPlayback();\r\n    }\r\n\r\n    window.addEventListener('beforeunload', handleBeforeUnload)\r\n    return () => window.removeEventListener('beforeunload', handleBeforeUnload)\r\n  }, [])\r\n}\r\n\r\nexport default useBeforeUnload","export * from \"./fluentdLogger\";\r\nexport * from \"./logs\";","import { conditions, handleVideoType, videoTag } from \"helpers\";\r\nimport { ConditionName, IViewedVideo } from \"interfaces\";\r\nimport { createVideoSettings, handlePlayPause, handleVideoTimeline } from \"redux-share/actions\";\r\nimport { setShowContinuousePlayback, setVideoSettings } from \"redux-share/slices/userSlice\";\r\nimport store from \"redux-share/store\";\r\n\r\nexport const enum useContinuousePlaybackEnums {\r\n    timer = \"timer\"\r\n}\r\n\r\nexport interface IUseContinuousePlayback {\r\n    type: useContinuousePlaybackEnums.timer\r\n}\r\n\r\nexport const handleContinuousPlayback = () => {\r\n    const { videoSettings } = store.getState().user;\r\n    const { params } = store.getState().videoData\r\n    const type: string = params.type!.toString();\r\n    const isLogin = conditions(ConditionName.isLogin);\r\n    if (type !== 'live') {\r\n        const currentTime = videoTag().currentTime;\r\n        const duration = videoTag().duration;\r\n        const viewedVideo: IViewedVideo = {\r\n            video_id: +params.id!,\r\n            video_type: handleVideoType(),\r\n            time: currentTime === duration ? 0 : Math.floor(videoTag().currentTime),\r\n            is_like: videoSettings.is_like,\r\n        }\r\n        let viewedVideosInLocalStorage = localStorage.getItem(\"viewedVideos\");\r\n        if (viewedVideosInLocalStorage) {\r\n            let viewedVideos: IViewedVideo[] = JSON.parse(viewedVideosInLocalStorage);\r\n            viewedVideos = viewedVideos.filter((video: IViewedVideo) => (video.video_id !== viewedVideo.video_id || video.video_type !== viewedVideo.video_type));\r\n            if (viewedVideos.length < 10) viewedVideos.push(viewedVideo);\r\n            else {\r\n                viewedVideos.shift();\r\n                viewedVideos.push(viewedVideo);\r\n            }\r\n            localStorage.setItem(\"viewedVideos\", JSON.stringify(viewedVideos));\r\n        } else localStorage.setItem(\"viewedVideos\", JSON.stringify([viewedVideo]));\r\n        if (isLogin) createVideoSettings(viewedVideo);\r\n    }\r\n}\r\n\r\nexport const handleApplyContinuousPlayback = () => {\r\n    const dispatch = store.dispatch;\r\n    const { params } = store.getState().videoData\r\n    let viewedVideosInLocalStorage = localStorage.getItem(\"viewedVideos\");\r\n    if (viewedVideosInLocalStorage) {\r\n        const viewedVideos: IViewedVideo[] = JSON.parse(viewedVideosInLocalStorage);\r\n        const viewedVideo = viewedVideos.find((video: IViewedVideo) => video.video_id === Number(params.id) && video.video_type === handleVideoType());\r\n        if (viewedVideo) dispatch(setVideoSettings({ is_like: viewedVideo.is_like, time: viewedVideo.time }));\r\n    }\r\n}\r\n\r\nexport const handleShowContinuousVideo = (event:any) => {\r\n    const dispatch = store.dispatch;\r\n    const { videoSettings } = store.getState().user;\r\n    handlePlayPause(event);\r\n    handleVideoTimeline(videoSettings.time);\r\n    dispatch(setShowContinuousePlayback(false));\r\n}\r\n\r\nexport const handleGoToFirstVideo = (event:any) => {\r\n    const dispatch = store.dispatch;\r\n    const { videoSettings } = store.getState().user;\r\n    dispatch(setVideoSettings({ ...videoSettings, time: 0 }));\r\n    dispatch(setShowContinuousePlayback(false));\r\n    handlePlayPause(event);\r\n}","import { useEffect } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../redux/hooks\";\r\nimport { setIsFullScreen } from \"../../redux/slices/controllerSlice\";\r\nimport { handleIsComplexDesktop } from \"../helpers\";\r\nimport { conditions } from \"../conditions/conditions\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\nimport { setIsComplexDesktop } from \"../../redux/slices/videoDataSlice\";\r\nimport { fullscreenLog } from \"../../logs/logs\";\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\nimport { handleVideoElementSizeInfo } from \"../../redux/actions/controller.actions\";\r\nimport { shallowEqual } from \"react-redux\";\r\n\r\nconst useFullScreen = () => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    useAppSelector(({ videoData: { params } }) => ({ params }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n\r\n        const handleChangeFullScreen = () => {\r\n            const isFullScreen = document.fullscreenElement;\r\n\r\n            if (isFullScreen) dispatch(setIsFullScreen(true));\r\n            else {\r\n                dispatch(setIsFullScreen(false));\r\n                handleVideoElementSizeInfo();\r\n                sendFluentLog(fullscreenLog(\"exitFullScreen\"));\r\n            }\r\n            if (handleIsComplexDesktop(conditions(ConditionName.isParamsPortrait)) && !conditions(ConditionName.isStaticFormat)) dispatch(setIsComplexDesktop(true));\r\n        }\r\n\r\n        if (document.addEventListener) {\r\n            document.addEventListener('webkitfullscreenchange', handleChangeFullScreen, false);\r\n            document.addEventListener('mozfullscreenchange', handleChangeFullScreen, false);\r\n            document.addEventListener('fullscreenchange', handleChangeFullScreen, false);\r\n            document.addEventListener('MSFullscreenChange', handleChangeFullScreen, false);\r\n        }\r\n\r\n        () => {\r\n            document.removeEventListener('webkitfullscreenchange', handleChangeFullScreen, false);\r\n            document.removeEventListener('mozfullscreenchange', handleChangeFullScreen, false);\r\n            document.removeEventListener('fullscreenchange', handleChangeFullScreen, false);\r\n            document.removeEventListener('MSFullscreenChange', handleChangeFullScreen, false);\r\n        }\r\n\r\n    }, [])\r\n}\r\n\r\nexport default useFullScreen;","import { ConditionName } from \"../../interfaces/enums\";\r\nimport { handleBackwardForward, handleChangeSoundVolume, handleClickVideoCard, handleFullScreen, handleLock, handlePlayPause } from \"../../redux/actions/controller.actions\";\r\nimport { handleClickRecommendationCard, handleSubtitle } from \"../../redux/actions/videoData.actions\";\r\nimport { useAppDispatch } from \"../../redux/hooks\";\r\nimport { setActiveElements } from \"../../redux/slices/controllerSlice\";\r\nimport { setClearPopoversSlice, setMarkersListPopover, setMultiLivesPopovers, setSpeedPopover } from \"../../redux/slices/popoversSlice\";\r\nimport store from \"../../redux/store\";\r\nimport { conditions } from \"../conditions/conditions\";\r\nimport { videoTag } from \"../constants\";\r\nimport useKeyPress from \"./useKeyPress\";\r\n\r\nconst useHandleKeyPress = () => {\r\n    const dispatch = useAppDispatch();\r\n\r\n    useKeyPress(\"Space\", (event: any) => {\r\n        if (conditions(ConditionName.isPressKeySpace)) handlePlayPause(event)\r\n    });\r\n    useKeyPress(\"KeyK\", (event: any) => {\r\n        if (conditions(ConditionName.isPressKeyK)) handlePlayPause(event)\r\n    });\r\n    useKeyPress(\"ArrowRight\", (event: any) => {\r\n        if (conditions(ConditionName.isPressKeyArrowRight)) handleBackwardForward(\"forward\", 15, event);\r\n    });\r\n    useKeyPress(\"ArrowLeft\", (event: any) => {\r\n        if (conditions(ConditionName.isPressKeyArrowLeft)) handleBackwardForward(\"backward\", 15, event);\r\n    });\r\n    useKeyPress(\"KeyI\", () => {\r\n        if (conditions(ConditionName.isPressKeyI)) videoTag().requestPictureInPicture()\r\n    });\r\n    useKeyPress(\"KeyF\", () => {\r\n        if (conditions(ConditionName.isPressKeyF)) handleFullScreen()\r\n    });\r\n    useKeyPress(\"KeyL\", () => {\r\n        if (conditions(ConditionName.isPressKeyL)) {\r\n            handleLock(conditions(ConditionName.isLock) ? \"unlock\" : \"lock\")\r\n        }\r\n    });\r\n    useKeyPress(\"KeyC\", () => {\r\n        if (conditions(ConditionName.isPressKeyC)) handleSubtitle();\r\n    });\r\n    useKeyPress(\"KeyN\", () => {\r\n        if (conditions(ConditionName.isPressKeyN)) {\r\n            handleClickRecommendationCard();\r\n            handleClickVideoCard();\r\n        }\r\n    });\r\n    useKeyPress(\"KeyQ\", () => {\r\n        if (conditions(ConditionName.isPressKeyQ)) {\r\n            const { multiLivesPopover } = store.getState().popovers;\r\n            dispatch(setMultiLivesPopovers(!multiLivesPopover));\r\n        }\r\n    });\r\n    useKeyPress(\"KeyE\", () => {\r\n        if (conditions(ConditionName.isPressKeyE)) {\r\n            const { markersListPopover } = store.getState().popovers;\r\n            dispatch(setClearPopoversSlice());\r\n            dispatch(setMarkersListPopover(!markersListPopover));\r\n            if (!conditions(ConditionName.isActiveElements)) dispatch(setActiveElements(true));\r\n            else if (!conditions(ConditionName.showMarkerListPopover)) dispatch(setActiveElements(false));\r\n        }\r\n    });\r\n    useKeyPress(\"KeyS\", () => {\r\n        const { speedPopover } = store.getState().popovers;\r\n        dispatch(setClearPopoversSlice());\r\n        if (conditions(ConditionName.isPressKeyS)) {\r\n            dispatch(setSpeedPopover(!speedPopover));\r\n            if (!conditions(ConditionName.isActiveElements)) dispatch(setActiveElements(true));\r\n            else if (!conditions(ConditionName.showSpeedPopover)) dispatch(setActiveElements(false));\r\n        }\r\n    });\r\n    useKeyPress(\"KeyM\", () => {\r\n        if (conditions(ConditionName.isPressKeyM)) {\r\n            const { settings } = store.getState().user\r\n            handleChangeSoundVolume(settings.volume ? 0 : 50);\r\n        }\r\n    });\r\n}\r\n\r\nexport default useHandleKeyPress;","import { useEffect, useRef } from \"react\";\r\nimport { conditions } from \"../conditions/conditions\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\n\r\nconst useKeyPress = (key:string, cb:any) => {\r\n\r\n    const callbackRef = useRef(cb);\r\n\r\n    useEffect(() => {\r\n      callbackRef.current = cb;\r\n    },[])\r\n\r\n    useEffect(() => {\r\n      const handleKeyPress = (event:any) => {\r\n        if (event.code === key && ![\"INPUT\", \"TEXTAREA\"].includes(event.target.nodeName) && !event.target.isContentEditable && !conditions(ConditionName.showTagsPopover) && !conditions(ConditionName.showPersonalMarkerPopover) && !conditions(ConditionName.showFeedbackPopover)) callbackRef.current(event);\r\n      }\r\n\r\n      document.addEventListener(\"keydown\", handleKeyPress);\r\n\r\n      return () => document.removeEventListener(\"keydown\", handleKeyPress);\r\n\r\n    }, [key])\r\n\r\n}\r\nexport default useKeyPress;","import { useTheme } from \"next-themes\";\r\nimport { useLayoutEffect } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../redux/hooks\";\r\nimport { setIsComplexDesktop, setIsComplexPortrait, setIsReady, setPlayerParams } from \"../../redux/slices/videoDataSlice\";\r\nimport { conditions } from \"../conditions/conditions\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\nimport { getUUID, handleIsComplexPortrait, staticFormats, strToObj } from \"../helpers\";\r\nimport { handleVoucherInParams } from \"../../redux/actions/user.actions\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useHandleParams = (query: any) => {\r\n    const { token, params } = useAppSelector(({ videoData: { token, params } }) => ({ token, params }), shallowEqual);\r\n    const { isClickInnerCard } = useAppSelector(({ controller: { isClickInnerCard } }) => ({ isClickInnerCard }), shallowEqual);\r\n    const { setTheme } = useTheme();\r\n    const dispatch = useAppDispatch();\r\n\r\n    const handleTokenParams = async () => {\r\n\r\n        if (query.isAuth === \"true\") {\r\n            if (token) dispatch(setIsReady(true));\r\n        } else if (query.voucher === \"true\") {\r\n            handleVoucherInParams(query.voucherCode!);\r\n            dispatch(setIsReady(true));\r\n        } else {\r\n            dispatch(setIsReady(true));\r\n        }\r\n    }\r\n\r\n    const handleTheme = (queryParams:any) => {\r\n        if (query.theme) {\r\n            const theme = query.theme === \"light\" ? \"light\" : \"dark\"\r\n            setTheme(theme);\r\n            dispatch(setPlayerParams({ ...queryParams, theme: theme }))\r\n        }\r\n        else {\r\n            if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\r\n                setTheme(\"dark\");\r\n                dispatch(setPlayerParams({ ...queryParams, theme: \"dark\" }))\r\n            }\r\n            else {\r\n                setTheme(\"light\");\r\n                dispatch(setPlayerParams({ ...queryParams, theme: \"light\" }));\r\n            }\r\n        }\r\n    }\r\n\r\n    const handleFeatureSet = (queryParams:any) => {\r\n        let featureSet = queryParams.featureSet;\r\n        if(typeof queryParams.featureSet === \"string\") featureSet = strToObj(queryParams.featureSet);\r\n        queryParams.featureSet = featureSet;\r\n        return queryParams;\r\n    }\r\n\r\n    const handleAddUUID = (queryParams:any) => {\r\n        if (!!query.uuid) {\r\n            localStorage.setItem(\"hamrahiUUID\", query.uuid!);\r\n            queryParams.uuid = query.uuid;\r\n        }\r\n        return queryParams;\r\n    }\r\n\r\n    const handleLiveAndVodParams = (queryParams: any) => {\r\n        queryParams = {\r\n            portrait: (conditions(ConditionName.isTouchScreen) && !conditions(ConditionName.isSplusEnvironment) && query.isGeneral !== \"true\") ? \"true\" : \"false\",\r\n            provider: \"unknown\",\r\n            chart: \"true\",\r\n            authentication: \"true\",\r\n            ...query\r\n        }\r\n        dispatch(setIsComplexDesktop(queryParams.portrait === \"true\" && !conditions(ConditionName.isTouchScreen)));\r\n        dispatch(setIsComplexPortrait(handleIsComplexPortrait({ portrait: queryParams.portrait, ...query })));\r\n        return queryParams;\r\n    }\r\n\r\n    const handleStaticParams = (queryParams: any) => {\r\n\r\n        const eUrl = String(query[\"e-url\"]);\r\n        const eCover = String(query[\"e-cover\"]);\r\n        queryParams = {\r\n            src: eUrl.endsWith(\"/\") ? window.atob(eUrl.slice(0, -1)) : window.atob(eUrl),\r\n            type: query.type,\r\n            fullscreen: query.fullscreen,\r\n            autoplay: query.autoplay,\r\n            snapshot: query.snapshot,\r\n            portrait: false,\r\n            ad: query.ad,\r\n            fullrate: query.fullrate,\r\n            width: query.width,\r\n            height: query.height,\r\n            cover: (!!eCover && eCover !== \"undefined\") ? window.atob(eCover) : undefined,\r\n            onFinished: query.onFinished,\r\n            onSnapshot: query.onSnapshot,\r\n            uuid: getUUID()\r\n        }\r\n        return queryParams;\r\n    }\r\n\r\n    useLayoutEffect(() => {\r\n        if (params.id && query.quiz !== \"true\" && isClickInnerCard) query = { ...params, homeButtonClickFlag: query.homeButtonClickFlag };\r\n        (async () => {\r\n            let queryParams;\r\n            if (Object.keys(query).includes(\"type\")) {\r\n                if ([\"live\", \"vod\", \"archive\", \"clip\"].includes(String(query.type))) queryParams = handleLiveAndVodParams(queryParams);\r\n                else if (staticFormats(String(query.type))) queryParams = handleStaticParams(queryParams);\r\n                handleAddUUID(queryParams);\r\n                handleFeatureSet(queryParams);\r\n                handleTheme(queryParams);\r\n                handleTokenParams();\r\n            }\r\n        })()\r\n    }, [query, token, params.id, isClickInnerCard])\r\n}\r\n\r\nexport default useHandleParams;","import { conditions } from \"../../helpers/conditions/conditions\";\r\nimport { handleVideoType, responseValidator } from \"../../helpers/helpers\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\nimport { apiCaller } from \"../../services/apiCaller\"\r\nimport { API } from \"../../services/services\"\r\nimport store from \"../store\"\r\nimport {handleHasXTokenParamOrSendXToken} from \"../../helpers/helpers\";\r\nimport { setBookamrks, setBookmarkId, setShowVoucherPopup, setVoucherToken } from \"../slices/userSlice\";\r\nimport { IBookmark, ITokens } from \"../../interfaces/interfaces\";\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\nimport { bookmarkLog } from \"../../logs/logs\";\r\nimport Cookies from \"js-cookie\";\r\nimport { setGetDetailsFromVoucher } from \"../slices/videoDataSlice\";\r\nimport { getLiveAndVodDetails } from \"./videoData.actions\";\r\nimport { toast } from \"mobin-toast\";\r\n\r\nexport const createSettings = async (settings: any) => {\r\n    settings = { ...settings, quality: conditions(ConditionName.isAutoQuality) ? null : settings.quality};\r\n    if(conditions(ConditionName.isLogin)) await apiCaller({ url: API().user.createSettings, method: \"POST\", data: settings, headers: handleHasXTokenParamOrSendXToken() });\r\n}\r\n\r\nexport const createVideoSettings = async (videoSettings: any) => {\r\n    const {params, details} = store.getState().videoData;\r\n    if (conditions(ConditionName.isLogin)) await apiCaller({ url: API().user.createVideoMetaData, method: \"POST\", data: { video_id: videoSettings.video_id ?? conditions(ConditionName.isLiveParam) ? details.id : +params.id!, video_type: videoSettings.video_type ?? handleVideoType(), ...videoSettings }, headers: handleHasXTokenParamOrSendXToken() });\r\n}\r\n\r\nexport const handleBookmark = async (event:any, id?:number, type?:string) => {\r\n    event.stopPropagation();\r\n    if(conditions(ConditionName.isLogin)) {\r\n        const dispatch = store.dispatch;\r\n        const { bookmarks, bookmarkId } = store.getState().user;\r\n        if (conditions(ConditionName.isBookmark) || type === \"delete\") {\r\n            const { status } = await apiCaller({ url: API().user.deleteBookmark(id), method: \"DELETE\", headers: handleHasXTokenParamOrSendXToken() });\r\n            if(responseValidator(status)) {\r\n                dispatch(setBookamrks(bookmarks.filter((bookmark: IBookmark) => id ? bookmark.id !== id : bookmark.id !== bookmarkId)));\r\n                dispatch(setBookmarkId(undefined));\r\n                sendFluentLog(bookmarkLog(\"unBookmark\"));\r\n            }\r\n        } else {\r\n            const { details } = store.getState().videoData;\r\n            const bookmarkData = {\r\n                object_link: window.location.href,\r\n                cover_url: details.banner,\r\n                title: details.title,\r\n            }\r\n            const { data, status } = await apiCaller({ url: API().user.bookmarks, method: \"POST\", data: bookmarkData, headers: handleHasXTokenParamOrSendXToken() });\r\n            if(responseValidator(status)) {\r\n                dispatch(setBookamrks([data, ...bookmarks]));\r\n                dispatch(setBookmarkId(data.id));\r\n                sendFluentLog(bookmarkLog(\"bookmark\"));\r\n            }\r\n        }\r\n    } else toast({title: \"لطفا ابتدا وارد شوید.\", type: \"error\"})\r\n}\r\n\r\nexport const handleVoucherInParams = (voucherCode: string) => {\r\n    const dispatch = store.dispatch;\r\n    const voucherTokenInCookie = Cookies.get(\"voucher-token\");\r\n    if (voucherTokenInCookie) dispatch(setVoucherToken(voucherTokenInCookie));\r\n    else if (conditions(ConditionName.hasVoucherCodeParams)) {\r\n        dispatch(setGetDetailsFromVoucher(true));\r\n        handleSendVoucher(voucherCode);\r\n    } else {\r\n        dispatch(setGetDetailsFromVoucher(true));\r\n        dispatch(setShowVoucherPopup(true));\r\n    }\r\n}\r\n\r\nexport const handleSendVoucher = async (voucherCode: string, event?: any) => {\r\n    if (event) event.preventDefault();\r\n    const dispatch = store.dispatch;\r\n    const { data, status } = await apiCaller({ url: API().cinemahamrah.pubVoucherToken(voucherCode) });\r\n    if (responseValidator(status)) {\r\n        dispatch(setVoucherToken(data.jwt));\r\n        dispatch(setShowVoucherPopup(false));\r\n        dispatch(setGetDetailsFromVoucher(false));\r\n        getLiveAndVodDetails();\r\n        Cookies.set(\"voucher-token\", data.jwt, { expires: 1 });\r\n    } else {\r\n        toast({ type: \"error\", title: \"کد وارد شده نامعتبر است لطفا دوباره تلاش کنید\" });\r\n        dispatch(setShowVoucherPopup(true));\r\n    }\r\n}\r\n\r\nexport const authToken = {\r\n    key: \"HAMRAHI_CLOUD_AUTH_TOKEN\",\r\n    get: (): ITokens | null => {\r\n        const data = Cookies.get(authToken.key);\r\n        if (data) return JSON.parse(data);\r\n        return null;\r\n    },\r\n    set: (value: ITokens) => Cookies.set(authToken.key, JSON.stringify(value), { expires: 1095 }),\r\n    remove: () => Cookies.remove(authToken.key)\r\n};\r\n\r\nexport const captchaStorageLogin = {\r\n    key: \"HAMRAHI_CLOUD_LANDING_AUTH_CAPTCHA\",\r\n    get: function (): string | null {\r\n        const data = localStorage.getItem(captchaStorageLogin.key);\r\n        if (data) {\r\n            return JSON.parse(data);\r\n        }\r\n        return null;\r\n    },\r\n    set: (value: string) => {\r\n        localStorage.setItem(captchaStorageLogin.key, JSON.stringify(value));\r\n    },\r\n    remove: () => {\r\n        localStorage.removeItem(captchaStorageLogin.key);\r\n    },\r\n};\r\n\r\nexport const captchaStorageCode = {\r\n    key: \"HAMRAHI_CLOUD_LANDING_CODE_CAPTCHA\",\r\n    get: function (): string | null {\r\n        const data = localStorage.getItem(captchaStorageCode.key);\r\n        if (data) {\r\n            return JSON.parse(data);\r\n        }\r\n        return null;\r\n    },\r\n    set: (value: string) => {\r\n        localStorage.setItem(captchaStorageCode.key, JSON.stringify(value));\r\n    },\r\n    remove: () => {\r\n        localStorage.removeItem(captchaStorageCode.key);\r\n    },\r\n};","import { useEffect } from \"react\";\r\nimport store from \"../../redux/store\";\r\nimport { setShowMiniPlayer } from \"../../redux/slices/controllerSlice\";\r\nimport { conditions } from \"../conditions/conditions\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\nimport { useAppSelector } from \"redux-share\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useHandleScroll = () => {\r\n\r\n    useAppSelector(({ videoData: { params } }) => ({ params }), shallowEqual);\r\n    useAppSelector(({ controller: { showMiniPlayer } }) => ({ showMiniPlayer }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        const { params } = store.getState().videoData;\r\n        const handleScroll = () => {\r\n            if(conditions(ConditionName.hasScrollElementId)) {\r\n                const dispatch = store.dispatch;\r\n                const videoAreaTopPosition = document.getElementById(conditions(ConditionName.showMiniPlayer) ? \"black-video-area\" : \"video-area\")!.getBoundingClientRect().top;\r\n                if (videoAreaTopPosition < 0) dispatch(setShowMiniPlayer(true));\r\n                else dispatch(setShowMiniPlayer(false));\r\n            }\r\n        }\r\n        let scrollElement:any;\r\n        if(conditions(ConditionName.hasScrollElementId)) {\r\n            scrollElement = document.getElementById(params.scrollElementId!);\r\n            if (scrollElement) scrollElement.addEventListener(\"scroll\", handleScroll);\r\n        }\r\n        return () => conditions(ConditionName.hasScrollElementId) && scrollElement && scrollElement.removeEventListener(\"scroll\", handleScroll);\r\n    }, [])\r\n}\r\n\r\nexport default useHandleScroll;","import { ChangeEvent, RefObject, useEffect } from \"react\";\r\n\r\nconst useOnClickOutside = (ref: RefObject<HTMLInputElement>, handler: (event: ChangeEvent<HTMLInputElement>) => void) => {\r\n\r\n    useEffect(\r\n      () => {\r\n        const listener = (event: any) => {\r\n          // Do nothing if clicking ref's element or descendent elements\r\n          if (!ref.current || ref.current.contains(event.target)) return;\r\n          handler(event);\r\n        };\r\n        document.addEventListener(\"mousedown\", listener);\r\n        document.addEventListener(\"touchstart\", listener);\r\n        return () => {\r\n          document.removeEventListener(\"mousedown\", listener);\r\n          document.removeEventListener(\"touchstart\", listener);\r\n        };\r\n      },\r\n      [ref, handler]\r\n    );\r\n}\r\n\r\nexport default useOnClickOutside;\r\n","import useGetAggregat from \"./useGetAggregat\";\r\nimport useGetDetails from \"./useGetDetails\";\r\nimport useGetMarkers from \"./useGetMarkers\";\r\nimport useGetPlayList from \"./useGetPlayList\";\r\nimport useGetProfile from \"./useGetProfile\";\r\nimport useGetRecommendationList from \"./useGetRecommendationList\";\r\nimport useUserSettings from \"./useUserSettings\";\r\nimport useVideoSettings from \"./useVideoSettings\";\r\nimport useWebListConfig from \"./useWebListConfig\";\r\n\r\nconst useGetData = () => {\r\n    useGetDetails(); \r\n    useGetProfile();\r\n    useGetAggregat(); \r\n    useGetMarkers();\r\n    useGetPlayList();  \r\n    useGetRecommendationList(); \r\n    useUserSettings();\r\n    useVideoSettings();\r\n    useWebListConfig();\r\n}\r\n\r\nexport default useGetData;","import { useEffect, useState } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { firstGetDataIntervalAPI, manualGetDataIntervalAPI, manualGetOnlineViewerIntervalAPI, manualPostAPI } from \"../../../redux/actions/videoData.actions\";\r\nimport { conditions } from \"../../conditions/conditions\";\r\nimport { ConditionName } from \"../../../interfaces/enums\";\r\nimport { RetryCountGeneralDataFetch, RetryTimeDelayGeneralDataFetch } from \"../../environment\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useGetAggregat = () => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    const { isLiveError } = useAppSelector(({ videoData: { params, isLiveError } }) => ({ params, isLiveError }), shallowEqual);\r\n    const {loadedFragmentsCount} = useAppSelector(({ controller: { loadedFragmentsCount } }) => ({ loadedFragmentsCount }), shallowEqual);\r\n\r\n    const getGeneralData = (intervalIds: any, intervalTime: any, setActiveApiRequest: any, setIntervalIds: any) => {\r\n        const intervalIdTemp: any = intervalIds;\r\n        const intervalId = setInterval(() => {\r\n            setActiveApiRequest((prev: any) => !prev);\r\n        }, intervalTime * 1000);\r\n        intervalIdTemp.push(intervalId);\r\n        setIntervalIds(intervalIdTemp);\r\n    }\r\n\r\n    /// Online_Viewer interval\r\n    const [onlineViewerActiveApiRequest, setOnlineViewerActiveApiRequest] = useState<boolean | undefined>(undefined);\r\n    const [onlineViewerIntervalIds, setOnlineViewerIntervalIds] = useState<any[]>([]);\r\n    const [onlineViewerIntervalTime, setOnlineViewerIntervalTime] = useState<number>(0);\r\n\r\n    /// GET_DATA interval\r\n    const [getDataActiveApiRequest, setGetDataActiveApiRequest] = useState<boolean | undefined>(undefined);\r\n    const [getDataIntervalIds, setGetDataIntervalIds] = useState<any[]>([]);\r\n    const [getDataRetryCount, setGetDataRetryCount] = useState<number>(RetryCountGeneralDataFetch);\r\n    const [getDataIntervalTime, setGetDataIntervalTime] = useState<number>(0);\r\n\r\n    /// POST_DATA interval\r\n    const [postDataActiveApiRequest, setPostDataActiveApiRequest] = useState<boolean | undefined>(undefined);\r\n    const [postDataIntervalIds, setPostDataIntervalIds] = useState<any[]>([]);\r\n    const [postDataIntervalTime, setPostDataIntervalTime] = useState<number>(0);\r\n\r\n    useEffect(() => {\r\n        if (postDataActiveApiRequest !== undefined) manualPostAPI()\r\n    }, [postDataActiveApiRequest]);\r\n\r\n    useEffect(() => {\r\n        if (onlineViewerActiveApiRequest !== undefined) manualGetOnlineViewerIntervalAPI()\r\n    }, [onlineViewerActiveApiRequest]);\r\n\r\n    useEffect(() => {\r\n        if (getDataActiveApiRequest !== undefined) manualGetDataIntervalAPI(getDataRetryCount, getDataIntervalIds, getDataIntervalTime, setGetDataRetryCount, dispatch, setGetDataIntervalIds, setGetDataIntervalTime, setOnlineViewerIntervalTime, setPostDataIntervalTime)\r\n    }, [getDataActiveApiRequest]);\r\n\r\n    useEffect(() => {\r\n        clearIntervalIdsHandler(postDataIntervalIds, setPostDataIntervalIds);\r\n        if (postDataIntervalTime !== 0) getGeneralData(postDataIntervalIds, postDataIntervalTime, setPostDataActiveApiRequest, setPostDataIntervalIds);\r\n    }, [postDataIntervalTime]);\r\n\r\n    useEffect(() => {\r\n        clearIntervalIdsHandler(onlineViewerIntervalIds, setOnlineViewerIntervalIds);\r\n        if (onlineViewerIntervalTime !== 0) getGeneralData(onlineViewerIntervalIds, onlineViewerIntervalTime, setOnlineViewerActiveApiRequest, setOnlineViewerIntervalIds);\r\n    }, [onlineViewerIntervalTime]);\r\n\r\n    useEffect(() => {\r\n        clearIntervalIdsHandler(getDataIntervalIds, setGetDataIntervalIds);\r\n        if (getDataIntervalTime !== 0 && !(getDataRetryCount === 1 && getDataIntervalTime === RetryTimeDelayGeneralDataFetch)) getGeneralData(getDataIntervalIds, getDataIntervalTime, setGetDataActiveApiRequest, setGetDataIntervalIds);\r\n    }, [getDataIntervalTime]);\r\n\r\n    const clearIntervalIdsHandler = (ids: any, setIds: any) => {\r\n        ids.forEach((id: any) => clearInterval(id));\r\n        setIds([]);\r\n    }\r\n\r\n    useEffect(() => {\r\n        if (conditions(ConditionName.firstGetDataIntervalAPI) && conditions(ConditionName.hasPermittedLoadedFragment)) {\r\n            if (!conditions(ConditionName.isLiveError)) firstGetDataIntervalAPI(getDataRetryCount, setGetDataRetryCount, dispatch, setGetDataIntervalTime, setOnlineViewerIntervalTime, setPostDataIntervalTime)\r\n            else clearIntervalIdsHandler(getDataIntervalIds, setGetDataIntervalIds);\r\n        }\r\n\r\n    }, [isLiveError, loadedFragmentsCount.length]);\r\n\r\n}\r\n\r\nexport default useGetAggregat;","import { useEffect } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { getLiveAndVodDetails } from \"../../../redux/actions/videoData.actions\";\r\nimport { conditions } from \"../../conditions/conditions\";\r\nimport { CinemaHamrahState, ConditionName } from \"../../../interfaces/enums\";\r\nimport { livePlayRetryDuration } from \"../../environment\";\r\nimport { shallowEqual } from 'react-redux'\r\nimport { checkIsFreeContent, handleCinemaHamrahStates } from \"redux-share/actions\";\r\nimport { setCinemaHamrahState, setGetDetailsFromVoucher } from \"redux-share/slices/videoDataSlice\";\r\n\r\nconst useGetDetails = () => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    const { params, token, isLiveError } = useAppSelector(({ videoData: { params, token, isLiveError, getDetailsFromVoucher } }) => ({ params, token, isLiveError, getDetailsFromVoucher }), shallowEqual);\r\n    useAppSelector(({ controller: { isEnded } }) => ({ isEnded }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n\r\n        if (conditions(ConditionName.getDetails)) {\r\n            if (conditions(ConditionName.isCinemaHamrahEnvironment)) {\r\n                (async () => {\r\n                    const isFreeContent = await checkIsFreeContent();\r\n                    if(isFreeContent) dispatch(setCinemaHamrahState(CinemaHamrahState.fullrate)); \r\n                    else {\r\n                        dispatch(setGetDetailsFromVoucher(true));\r\n                        handleCinemaHamrahStates();\r\n                    }\r\n                    getLiveAndVodDetails();\r\n                })()\r\n            } else getLiveAndVodDetails();\r\n        }\r\n    }, [params.id, params.type]);\r\n\r\n    useEffect(() => {\r\n        let interval: any;\r\n        if (conditions(ConditionName.getLiveDetailsInIntervals) && !conditions(ConditionName.isEnded)) interval = setInterval(() => getLiveAndVodDetails(), livePlayRetryDuration);\r\n        else clearInterval(interval);\r\n\r\n        return () => clearInterval(interval);\r\n    }, [isLiveError, token])\r\n\r\n}\r\n\r\nexport default useGetDetails;","import { useEffect } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { conditions } from \"../../conditions/conditions\";\r\nimport { ConditionName } from \"../../../interfaces/enums\";\r\nimport { API, getApiUrls } from \"../../../services/services\";\r\nimport { combinedMarkers, getAllGeneralMarker, getAllPersonalMarkers } from '../../../redux/actions/videoData.actions'\r\nimport { compare, responseValidator } from \"../../helpers\";\r\nimport { setMarkers } from \"../../../redux/slices/videoDataSlice\";\r\nimport { IMarker } from \"interfaces\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useGetMarkers = () => {\r\n    const dispatch = useAppDispatch();\r\n    const { params, isFetchDetails } = useAppSelector(({ videoData: { params, isFetchDetails } }) => ({ params, isFetchDetails }), shallowEqual);\r\n    const { isLogin } = useAppSelector(({ user: { isLogin } }) => ({ isLogin }), shallowEqual);\r\n    const {loadedFragmentsCount} = useAppSelector(({ controller: { loadedFragmentsCount } }) => ({ loadedFragmentsCount }), shallowEqual)\r\n    \r\n    useEffect(() => {\r\n        if (conditions(ConditionName.getMarkers) && conditions(ConditionName.hasPermittedLoadedFragment)) {\r\n            if (conditions(ConditionName.isLogin)) {\r\n                (async()=>{\r\n                    try {\r\n                        const response:any = await getAllGeneralMarker(getApiUrls().apiMarkerUrl + Number(params.id) + \"/\");\r\n                        const { data, status } = await getAllPersonalMarkers(API().user.getPersonalMarker); \r\n                        if (responseValidator(status)) {\r\n                            combinedMarkers(data, (response).map((m: IMarker) => {\r\n                                return { ...m, isPersonal: null }\r\n                            }))\r\n                        } else dispatch(setMarkers((response).map((m: IMarker) => {\r\n                            return { ...m, isPersonal: null }\r\n                        })))\r\n                    } catch (error) {\r\n                        const { data, status } = await getAllPersonalMarkers(API().user.getPersonalMarker);\r\n                        if (responseValidator(status)) {\r\n                            combinedMarkers(data, [])\r\n                        }\r\n                    }\r\n                })()\r\n            } else {\r\n                (async()=>{\r\n                    const response:any = await getAllGeneralMarker(getApiUrls().apiMarkerUrl + Number(params.id) + \"/\");\r\n                    dispatch(setMarkers((response).sort(compare)))\r\n                })()\r\n            }\r\n        }\r\n    }, [!!params.isMarkersChange, isFetchDetails, isLogin, loadedFragmentsCount.length])\r\n\r\n}\r\n\r\nexport default useGetMarkers;","import { useEffect } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { API } from \"../../../services/services\";\r\nimport { responseValidator } from \"../../helpers\";\r\nimport { setPlayList } from \"../../../redux/slices/videoDataSlice\";\r\nimport { conditions } from \"../../conditions/conditions\";\r\nimport { ConditionName } from \"../../../interfaces/enums\";\r\nimport { shallowEqual } from 'react-redux'\r\nimport { getPlaylistHeader } from \"redux-share/actions\";\r\n\r\nconst useGetPlayList = () => {\r\n    const dispatch = useAppDispatch();\r\n\r\n    const { isFetchDetails } = useAppSelector(({ videoData: { isFetchDetails } }) => ({ isFetchDetails }), shallowEqual);\r\n    const {loadedFragmentsCount} = useAppSelector(({ controller: { loadedFragmentsCount } }) => ({ loadedFragmentsCount }), shallowEqual);\r\n    useEffect(() => {\r\n        if (conditions(ConditionName.getPlayList) && conditions(ConditionName.hasPermittedLoadedFragment)) {\r\n            const handleGetPlayList = async () => {\r\n                const { data, status } = await getPlaylistHeader(API().playList);\r\n                if (responseValidator(status)) {\r\n                    const playListVideos: any = [];\r\n                    for await (const result of data.results) {\r\n                        const singlePlayList: any = { title: result.title, id: result.id, count: result.count };\r\n                        playListVideos.push(singlePlayList)\r\n                    }\r\n                    dispatch(setPlayList(playListVideos))\r\n                } else dispatch(setPlayList([]))\r\n            }\r\n            handleGetPlayList()\r\n        }\r\n\r\n    }, [isFetchDetails, loadedFragmentsCount.length])\r\n\r\n}\r\n\r\nexport default useGetPlayList;","import { apiCaller } from \"../../../services/apiCaller\"\r\nimport { API } from \"../../../services/services\"\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\"\r\nimport { responseValidator } from \"../../helpers\"\r\nimport { useEffect } from \"react\"\r\nimport { setUserInfo } from \"../../../redux/slices/userSlice\"\r\nimport { conditions } from \"../../conditions/conditions\"\r\nimport { ConditionName, UserQuizStatus } from \"../../../interfaces/enums\"\r\nimport { setUserStatus } from \"redux-share/slices/quizSlice\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useGetProfile = () => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    const { xToken } = useAppSelector(({ user: { xToken } }) => ({ xToken }), shallowEqual);\r\n    const { isFetchDetails } = useAppSelector(({ videoData: { isFetchDetails } }) => ({ isFetchDetails }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        (async() => {\r\n            if(conditions(ConditionName.getUserProfile)) {\r\n                const { data, status } = await apiCaller({ url: API().user.profileWithXToken, method: \"POST\", data: { token: xToken } });\r\n                if (responseValidator(status)) {\r\n                    dispatch(setUserInfo(data.data));\r\n                    if (conditions(ConditionName.hasQuizParams)) dispatch(setUserStatus(UserQuizStatus.participant));\r\n                }\r\n            }\r\n        })()\r\n    }, [isFetchDetails, xToken])\r\n    \r\n}\r\n\r\nexport default useGetProfile;","import { useEffect } from \"react\";\r\nimport { conditions } from \"../../conditions/conditions\";\r\nimport { ConditionName } from \"../../../interfaces/enums\";\r\nimport { apiCaller } from \"../../../services/apiCaller\";\r\nimport { API } from \"../../../services/services\";\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\";\r\nimport { setRecommendationList } from \"../../../redux/slices/videoDataSlice\";\r\nimport { responseValidator } from \"../../helpers\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useGetRecommendationList = () => {\r\n\r\n    const dispatch = useAppDispatch();\r\n    const { isFetchDetails } = useAppSelector(({ videoData: { isFetchDetails, params } }) => ({ isFetchDetails, params }), shallowEqual);\r\n    const {loadedFragmentsCount} = useAppSelector(({ controller: { loadedFragmentsCount } }) => ({ loadedFragmentsCount }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        if (conditions(ConditionName.getRecommendationList) && conditions(ConditionName.hasPermittedLoadedFragment)) {\r\n            (async () => {\r\n                const { data, status } = await apiCaller({ url: API().recommendationList() });\r\n                if (responseValidator(status)) dispatch(setRecommendationList(data));\r\n            })()\r\n        }\r\n    }, [isFetchDetails, loadedFragmentsCount.length])\r\n}\r\n\r\nexport default useGetRecommendationList;","import { useEffect } from \"react\"\r\nimport { apiCaller } from \"../../../services/apiCaller\"\r\nimport { API } from \"../../../services/services\"\r\nimport {handleHasXTokenParamOrSendXToken, responseValidator} from \"../../helpers\"\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\"\r\nimport { setUserSettings } from \"../../../redux/slices/userSlice\"\r\nimport { conditions } from \"../../conditions/conditions\"\r\nimport { ConditionName } from \"../../../interfaces/enums\"\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useUserSettings = () => {\r\n\r\n    const disptach = useAppDispatch();\r\n    const { isLogin } = useAppSelector(({ user: { isLogin } }) => ({ isLogin }), shallowEqual);\r\n    const { isFetchDetails } = useAppSelector(({ videoData: { isFetchDetails } }) => ({ isFetchDetails }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        (async() => {\r\n            if (conditions(ConditionName.getUserSetting)) {\r\n                const { data, status } = await apiCaller({ url: API().user.settings, headers: handleHasXTokenParamOrSendXToken() });\r\n                if (responseValidator(status)) disptach(setUserSettings({ ...data, quality: data.quality === null ? -1 : data.quality }));\r\n            }\r\n        })()\r\n    }, [isLogin, isFetchDetails])\r\n}\r\n\r\nexport default useUserSettings","import { useEffect } from \"react\"\r\nimport { apiCaller } from \"../../../services/apiCaller\"\r\nimport { API } from \"../../../services/services\"\r\nimport { handleHasXTokenParamOrSendXToken, responseValidator } from \"../../helpers\"\r\nimport { useAppDispatch, useAppSelector } from \"../../../redux/hooks\"\r\nimport { setBookamrks, setBookmarkId, setVideoSettings } from \"../../../redux/slices/userSlice\"\r\nimport { conditions } from \"../../conditions/conditions\"\r\nimport { ConditionName } from \"../../../interfaces/enums\"\r\nimport { IBookmark } from \"../../../interfaces/interfaces\"\r\nimport { shallowEqual } from 'react-redux'\r\nimport { handleApplyContinuousPlayback } from \"ui/src/playerComponents/continuousPlayback/continuousePlayback\"\r\n\r\nconst useVideoSettings = () => {\r\n    const dispatch = useAppDispatch();\r\n    const { params, isFetchDetails } = useAppSelector(({ videoData: { params, isFetchDetails } }) => ({ params, isFetchDetails }), shallowEqual);\r\n    const { isLogin } = useAppSelector(({ user: { isLogin } }) => ({ isLogin }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        if(conditions(ConditionName.getVideoMetaData)) {\r\n            (async () => {\r\n                const { data, status } = await apiCaller({ url: API().user.getVideoMetaData, headers: handleHasXTokenParamOrSendXToken() });\r\n                if (responseValidator(status)) dispatch(setVideoSettings({ is_like: data.is_like, time: data.time }));\r\n                else handleApplyContinuousPlayback();\r\n\r\n                const { data:bookamrkData, status: bookmarkStatus } = await apiCaller({ url: API().user.bookmarks, headers: handleHasXTokenParamOrSendXToken() });\r\n                if (responseValidator(bookmarkStatus) && bookamrkData.length) {\r\n                    dispatch(setBookamrks(bookamrkData));\r\n                    bookamrkData.find((item:IBookmark) => {\r\n                        const queryParams = new URL(item.object_link).searchParams;\r\n                        if (queryParams.get(\"type\") === params.type && queryParams.get(\"id\") === params.id) dispatch(setBookmarkId(item.id));\r\n                    })\r\n                }\r\n                \r\n            })()\r\n        } else handleApplyContinuousPlayback();\r\n    }, [isLogin, isFetchDetails])\r\n}\r\n\r\nexport default useVideoSettings;","import {useEffect} from \"react\";\r\nimport store from \"../../../redux/store\";\r\nimport {setWebListConfig} from \"../../../redux/slices/videoDataSlice\";\r\nimport {responseValidator} from \"../../helpers\";\r\nimport {get} from \"../../../services/apiCaller\";\r\nimport {API} from \"../../../services/services\";\r\nimport {useAppSelector} from \"../../../redux/hooks\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst useWebListConfig = () => {\r\n    const { params, token, isLiveError } = useAppSelector(({ videoData: { params, token, isLiveError } }) => ({ params, token, isLiveError }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        get(async (response: any, status) => {\r\n            if (responseValidator(status)) store.dispatch(setWebListConfig(response.results))\r\n        }, API().web_list_config(), {\r\n            limit: 1000,\r\n            offset: 0\r\n        })\r\n    }, [isLiveError, token, params.id])\r\n\r\n}\r\n\r\nexport default useWebListConfig;","import { useEffect, useState } from \"react\";\r\nimport { autoQualityChangeLog, pingpongLog, sendFluentLog } from \"../../logs\";\r\nimport { useAppSelector } from \"../../redux/hooks\";\r\nimport { shallowEqual } from 'react-redux'\r\n\r\nconst usePingPong = (qualityLevel?:number) => {\r\n\r\n    const [qualityHistory, setQualityHistory] = useState<number[]>([]);\r\n    const [startTimer, setStartTimer] = useState<number>(0);\r\n\r\n    const { qualityLevels } = useAppSelector(({ controller: { qualityLevels } }) => ({ qualityLevels }), shallowEqual);\r\n\r\n    useEffect(() => {\r\n        if (qualityLevel) {\r\n            let newQualityArray:number[] = [];\r\n            switch (qualityHistory.length) {\r\n                case 0:\r\n                    newQualityArray = [qualityLevel];\r\n                    break;\r\n                case 1:\r\n                    newQualityArray = [qualityLevel, ...qualityHistory];\r\n                    break;\r\n                case 2:\r\n                    newQualityArray = [qualityLevel, ...qualityHistory];\r\n                    sendFluentLog(autoQualityChangeLog(`${newQualityArray[0]}P`, `${newQualityArray[1]}P`, qualityLevels.indexOf(newQualityArray[0]) - qualityLevels.indexOf(newQualityArray[1])))\r\n                    break;\r\n                default:\r\n                    newQualityArray = [qualityLevel, qualityHistory[0], qualityHistory[1]];\r\n                    if (newQualityArray[1] !== newQualityArray[2]) sendFluentLog(autoQualityChangeLog(`${newQualityArray[1]}P`, `${newQualityArray[2]}P`, qualityLevels.indexOf(newQualityArray[1]) - qualityLevels.indexOf(newQualityArray[2])))\r\n                    break;\r\n            }\r\n            setQualityHistory(newQualityArray);\r\n        }\r\n    }, [qualityLevel])\r\n\r\n    useEffect(() => {\r\n        if (qualityHistory.length === 3 && qualityHistory[0] === qualityHistory[2]) {\r\n            sendFluentLog(pingpongLog(startTimer, qualityHistory))\r\n            setQualityHistory([]);\r\n            setStartTimer(0);\r\n        } else {\r\n            setStartTimer(new Date().getTime());\r\n        }\r\n    }, [qualityHistory])\r\n\r\n}\r\nexport default usePingPong;","import { useEffect } from \"react\";\r\nimport { videoTag } from \"../constants\";\r\nimport { handleClickVideoCard } from \"redux-share/actions\";\r\nimport { useRouter } from \"next/router\";\r\nimport store from \"redux-share/store\";\r\n\r\nconst useRouteChange = () => {\r\n    const router = useRouter();\r\n    useEffect(() => {\r\n        const handleRouteChange = () => {\r\n            if (store.getState().videoData.params.homeButtonClickFlag && videoTag()) {\r\n                const searchParams = new URLSearchParams(window.location.search);\r\n                const type = searchParams.get(\"type\");\r\n                const id = searchParams.get(\"id\");\r\n                handleClickVideoCard(id, type, true);\r\n            }\r\n        }\r\n        router.events.on(\"routeChangeStart\",handleRouteChange);\r\n\r\n        return () => router.events.off(\"routeChangeStart\", handleRouteChange);\r\n        \r\n    }, [])\r\n}\r\n\r\nexport default useRouteChange;","import { useEffect, useRef } from \"react\";\r\nimport { useAppDispatch, useAppSelector } from \"redux-share\";\r\nimport { shallowEqual } from \"react-redux\";\r\nimport { setWatchedTime } from \"redux-share/slices/videoDataSlice\";\r\n\r\nconst useWatchingDuration = () => {\r\n\r\n    const watchedDurationRef = useRef<null | number[]>(null);\r\n    const dispatch = useAppDispatch();\r\n    const { duration, currentTime } = useAppSelector(({ controller: { duration, currentTime } }) => ({ duration, currentTime }), shallowEqual);\r\n    const counter = useRef(0);\r\n\r\n    useEffect(() => {\r\n        if (duration) {\r\n            watchedDurationRef.current = new Array(Math.floor(duration)).fill(0);\r\n        }\r\n    }, [duration]);\r\n\r\n    useEffect(() => {\r\n        handleUpdateWatchedDuration(Math.floor(currentTime));\r\n    }, [currentTime]);\r\n    \r\n    const handleUpdateWatchedDuration = (index: number) => {\r\n        if (watchedDurationRef.current) {\r\n            const item = watchedDurationRef.current[index];\r\n            if (!item) {\r\n                watchedDurationRef.current[index] = 1;\r\n                counter.current = counter.current + 1;\r\n                dispatch(setWatchedTime(counter.current));\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nexport default useWatchingDuration;","import store from \"redux-share/store\"\r\nimport { API, getAccessToken, getApiUrls } from \"../services\";\r\nimport { conditions, hasQuestionMark } from \"helpers\";\r\nimport { ConditionName, IDetailsConfig } from \"interfaces\";\r\n\r\nexport const detailAPI = (id?:number) => {\r\n    const { getDetailsFromVoucher, params } = store.getState().videoData;\r\n    return getDetailsFromVoucher ? API().voucherDetail() : getApiUrls().apiUrl + (id ? id : params.id);\r\n  }\r\n\r\nconst detailsConfig:IDetailsConfig = {\r\n    url: \"\",\r\n    maxRetryCount: 0,\r\n    headers: {},\r\n    retryPolicy: []\r\n}\r\n\r\nconst liveDetailsConfig = (userId?:number) => {\r\n    detailsConfig.url = detailAPI(userId);\r\n    let org: string = window.location.origin;\r\n    org = org.replace(\"https://\", \"\");\r\n    org = org.replace(\"http://\", \"\");\r\n    detailsConfig.url += \"?from=\" + org;\r\n}\r\n\r\nconst nonLiveDetailsConfig = () => {\r\n    detailsConfig.url = detailAPI();\r\n    detailsConfig.maxRetryCount = 3;\r\n    detailsConfig.retryPolicy = [\r\n        {\r\n            codeAbove: 500,\r\n            codeBelow: null,\r\n            excludeCodes: [],\r\n            includeCodes: [409],\r\n            delay: 1,\r\n            count: 3\r\n        },\r\n        {\r\n            codeAbove: null,\r\n            codeBelow: 404,\r\n            excludeCodes: [403, 402, 401, 400],\r\n            includeCodes: [],\r\n            delay: 10,\r\n            count: 6\r\n        }\r\n    ];\r\n    return detailsConfig;\r\n}\r\n\r\nconst hasIsAuthInParams = () => {\r\n    const { token } = store.getState().videoData;\r\n    if (hasQuestionMark(detailsConfig.url)) detailsConfig.url += `&token=${token}`;\r\n    else detailsConfig.url += `?token=${token}`;\r\n}\r\n\r\nconst hasHInParams = () => {\r\n    detailsConfig.headers = {\r\n        \"authorization\": `Bearer ${getAccessToken()}`\r\n    }\r\n}\r\n\r\nconst hasVoucherToken = () => {\r\n    const { voucherToken } = store.getState().user;\r\n    if(hasQuestionMark(detailsConfig.url)) detailsConfig.url += `&jwt=${voucherToken}`;\r\n    else detailsConfig.url += `?jwt=${voucherToken}`;\r\n}\r\n\r\nconst isCinemaHamrahEnvironment = () => {\r\n    const { voucherToken } = store.getState().user;\r\n    if(voucherToken) {\r\n        if(hasQuestionMark(detailsConfig.url)) detailsConfig.url += `&jwt=${voucherToken}`;\r\n        else detailsConfig.url += `?jwt=${voucherToken}`;\r\n    }\r\n}\r\n\r\nexport const handleDetailsConfig = (userId?:number) => {\r\n\r\n    if(conditions(ConditionName.isLiveParam)) liveDetailsConfig(userId)\r\n    else nonLiveDetailsConfig();\r\n\r\n    if(conditions(ConditionName.isAuth)) hasIsAuthInParams();\r\n\r\n    if (conditions(ConditionName.hasHParam)) hasHInParams();\r\n\r\n    if(conditions(ConditionName.hasVoucherToken)) hasVoucherToken();\r\n\r\n    if(conditions(ConditionName.isCinemaHamrahEnvironment)) isCinemaHamrahEnvironment();\r\n\r\n    return detailsConfig;\r\n} ","export * from \"./apiCaller\";\r\nexport * from \"./baseUrl\";\r\nexport * from \"./services\";","import { deleteQueryParamsInUrl, responseValidator } from \"helpers\";\r\nimport { API, apiCaller } from \"../../services\";\r\nimport store from \"../store\";\r\nimport { authToken } from \"./user.actions\";\r\nimport { setFactor, setUserInfo, setVoucherToken } from \"../slices/userSlice\";\r\nimport { getLiveAndVodDetails } from \"./videoData.actions\";\r\nimport { setLoginPopover, setPreFactorPopover } from \"../slices/popoversSlice\";\r\nimport { setCinemaHamrahState, setGetDetailsFromVoucher, setPlayerParams } from \"../slices/videoDataSlice\";\r\nimport { CinemaHamrahState } from \"interfaces\";\r\nimport { toast } from \"mobin-toast\";\r\n\r\nexport const checkIsFreeContent = async () => {\r\n    const { status } = await apiCaller({url: API().cinemahamrah.checkFreeContent()});\r\n    if(responseValidator(status)) return true;\r\n    else return false;\r\n}\r\n\r\nexport const checkMciVoucherToken = async () => {\r\n    const dispatch = store.dispatch;\r\n    const { data, status } = await apiCaller({url: API().cinemahamrah.mciVoucherToken()});\r\n    if(responseValidator(status)) {\r\n        dispatch(setVoucherToken(data.jwt));\r\n        return \"hasPlan\";\r\n    } else if(status === 403) {\r\n        return \"NoMCI\";\r\n    } else {\r\n        return \"hasNoPlan\"\r\n    }\r\n}\r\n\r\nexport const handleCinemaHamrahStates = async () => {\r\n    const dispatch = store.dispatch;\r\n    const result = await checkMciVoucherToken();\r\n    if(result === \"hasPlan\") {\r\n      dispatch(setCinemaHamrahState(CinemaHamrahState.hasPlan));\r\n      dispatch(setGetDetailsFromVoucher(false));\r\n      getLiveAndVodDetails();\r\n    } else if (result === \"hasNoPlan\") {\r\n      dispatch(setCinemaHamrahState(CinemaHamrahState.hasNoPlan));\r\n    } else {\r\n      handleNonMCILogin();\r\n    }\r\n}\r\n\r\nexport const handleNonMCILogin = async () => {\r\n    const dispatch = store.dispatch;\r\n    const authTokenValue = authToken.get();\r\n    if (authTokenValue?.access) {\r\n      const response = await apiCaller({ url: API().cinemahamrah.getProfile(), headers: { \"authorization\": `Bearer ${authTokenValue.access}` } });\r\n      if (response && responseValidator(response.status)) {\r\n        const userInfo = {\r\n            avatar_url: response.data.picture_url,\r\n            name: response.data.name,\r\n            phone_number: response.data.phone,\r\n            userId: response.data.id,\r\n            isLogin: true,\r\n        }\r\n        dispatch(setUserInfo(userInfo));\r\n        handleUserValidVouchersList();\r\n      } else {\r\n        dispatch(setLoginPopover(true));\r\n      }\r\n    } else dispatch(setLoginPopover(true));\r\n}\r\n\r\nexport const handleUserValidVouchersList = async () => {\r\n    const dispatch = store.dispatch;\r\n    let { data, status } = await apiCaller({ url: API().cinemahamrah.userValidVouchersList(), headers: {\"authorization\": `Bearer ${authToken.get()?.access}`} });\r\n    if(responseValidator(status) && data.results.length) handlePubVoucherToken(data.results[0].voucher_id);\r\n    else dispatch(setPreFactorPopover(true));\r\n}\r\n\r\nexport const handlePubVoucherToken = async (voucherId: string) => {\r\n    const dispatch = store.dispatch;\r\n    const { data, status } = await apiCaller({url: API().cinemahamrah.pubVoucherToken(voucherId)});\r\n    if(responseValidator(status)) {\r\n      dispatch(setGetDetailsFromVoucher(false));\r\n      dispatch(setVoucherToken(data.jwt));\r\n      getLiveAndVodDetails();\r\n    } else dispatch(setPreFactorPopover(true));\r\n}\r\n\r\nexport const handlePaymentRequest = async (vpId:number, setIsLoading: (isLoading: boolean) => void) => {\r\n    const { params } = store.getState().videoData;\r\n    setIsLoading(true);\r\n    const { data, status } = await apiCaller({ url: API().cinemahamrah.paymentRequest(vpId, +String(params.uid)), headers:{\"authorization\":`Bearer ${authToken.get()?.access}`}});\r\n    if (responseValidator(status)) window.location.href = data.ipg_url;\r\n    else toast({title: \"اتصال به درگاه پرداخت با خطا مواجه شد. لطفا دوباره تلاش کنید.\", type: \"error\"});\r\n    setIsLoading(false);\r\n}\r\n\r\nexport const handleConfirmPayment = async () => {\r\n    const dispatch = store.dispatch;\r\n    const { params } = store.getState().videoData;\r\n    const { data, status } = await apiCaller({ url: API().cinemahamrah.confirmPayment(), data: {tid: params.transaction_id}, headers: { \"authorization\": `Bearer ${authToken.get()?.access}` } });\r\n    if(responseValidator(status)) dispatch(setFactor(data));\r\n}\r\n\r\nexport const handlePlayVideoInFactor = () => {\r\n    const dispatch = store.dispatch;\r\n    const { params } = store.getState().videoData\r\n    const { factor } = store.getState().user;\r\n    deleteQueryParamsInUrl(\"transaction_id\");\r\n    handlePubVoucherToken(factor?.voucher_id!);\r\n    dispatch(setPlayerParams({ ...params, transaction_id: undefined }))\r\n}\r\n\r\nexport const handleRetryPayment = () => {\r\n    const dispatch = store.dispatch;\r\n    const {params} = store.getState().videoData\r\n    deleteQueryParamsInUrl(\"transaction_id\");\r\n    dispatch(setPlayerParams({ ...params, transaction_id: undefined }))\r\n    handleNonMCILogin();\r\n}","import { conditions } from \"../../helpers/conditions/conditions\";\r\nimport {getUUID, responseValidator} from \"../../helpers/helpers\";\r\nimport { ConditionName } from \"../../interfaces/enums\";\r\nimport { IComments } from \"../../interfaces/interfaces\";\r\nimport { apiCaller, get } from \"../../services/apiCaller\";\r\nimport { API } from \"../../services/services\";\r\nimport { setCanAddComment, setCanShowSubmittedComment, setComments, setCommentsCount, setCommentsCountPagination, setRealTimeReply, setReplyToAuthor, setUsersCommentsProfiles } from \"../slices/commentsSlice\";\r\nimport store from \"../store\";\r\nimport { setCommentPopover } from \"../slices/popoversSlice\";\r\nimport { toast } from \"mobin-toast\";\r\nimport { getCommentList, submitComment } from './videoData.actions'\r\n\r\nexport const checkCanComment = async () => {\r\n    const dispatch = store.dispatch;\r\n    const { details } = store.getState().videoData;\r\n    const { data, status } = await apiCaller({ url: API().comment.canAddComment(details.content_id!) });\r\n    if (responseValidator(status)) {\r\n        dispatch(setCanAddComment(data.can_comment));\r\n        dispatch(setCanShowSubmittedComment(data.comment_hidden_default === 0));\r\n        dispatch(setCommentsCount(data.comments_count - data.hidden_comments_count));\r\n        dispatch(setCommentsCountPagination(data.first_level_comments_count - data.first_level_hidden_comments_count));\r\n    }\r\n}\r\n\r\nexport const handleGetComments = async (offset: number, setScrollEnd: (value: boolean) => void) => {\r\n    const dispatch = store.dispatch;\r\n    const { comments, usersCommentsProfiles } = store.getState().comments;\r\n    const { details } = store.getState().videoData;\r\n    const { data, status } = await getCommentList(API().comment.commentList(details.content_id!), offset);\r\n    if (responseValidator(status) && data.results && data.results.length) {\r\n        if (comments.length) dispatch(setComments([...comments, ...data.results]));\r\n        else dispatch(setComments((data.results)));\r\n        setScrollEnd(false);\r\n        dispatch(setUsersCommentsProfiles(await handleGetUsersComments(data.results, usersCommentsProfiles)));\r\n    }\r\n}\r\n\r\nexport const handleGetReplies = async (commentId: number, replies: IComments[], setReplies: (value: IComments[]) => void, usersRepliesProfiles: any[], setUsersRepliesProfiles: (values: any[]) => void, realTimeReply?: undefined | IComments) => {\r\n    get(async (data: any, status) => {\r\n        if (responseValidator(status)) {\r\n            if (replies.length) setReplies([...replies, ...data.results]);\r\n            else setReplies(data.results);\r\n            setUsersRepliesProfiles(await handleGetUsersComments(data.results, usersRepliesProfiles))\r\n        }\r\n    }, API().comment.replyList(commentId), {\r\n        limit: 10,\r\n        offset: replies.length - (realTimeReply ? 1 : 0)\r\n    })\r\n}\r\n\r\nexport const handleSubmitComment = async (inputValue: string, setInputValue: (value: string) => void, selectedEmoji: string, setSelectedEmoji: (value: string) => void, type: string, setShowReplyBox: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { details } = store.getState().videoData;\r\n    const { replyToAuthor, comments } = store.getState().comments;\r\n    const { xToken } = store.getState().user;\r\n\r\n    await checkCanComment();\r\n    if (conditions(ConditionName.canAddComment) && (inputValue || selectedEmoji)) {\r\n        const commentData = {\r\n            text: inputValue,\r\n            content: type === \"reply\" ? undefined : details.content_id,\r\n            reply_to: type === \"reply\" ? replyToAuthor.id : undefined\r\n        }\r\n        const { data, status } = await submitComment(API().comment.create, commentData);\r\n        if (responseValidator(status)) {\r\n            setInputValue(\"\");\r\n            setSelectedEmoji(\"\");\r\n            if (conditions(ConditionName.canShowSubmittedComment)) {\r\n                if (type === \"reply\") dispatch(setRealTimeReply(data));\r\n                else dispatch(setComments([data, ...comments]));\r\n            } else toast({ title: `${type === \"reply\" ? \"پاسخ\" : \"نظر\"} شما با موفقیت ثبت شد و پس از تایید نمایش داده می شود.`, type: \"success\" })\r\n            if (type === \"reply\") {\r\n                dispatch(setReplyToAuthor({}));\r\n                if (setShowReplyBox) setShowReplyBox(false);\r\n            }\r\n        } else toast({ title: \"خطا در ثبت دیدگاه\", type: \"error\" })\r\n    } else if (!conditions(ConditionName.canAddComment)) toast({ title: \"در حال حاضر امکان ثبت دیدگاه وجود ندارد\", type: \"error\" })\r\n}\r\n\r\nexport const handleGetUsersComments = async (comments: IComments[], usersProfiles: any[]) => {\r\n    const usersCommentsIds: string[] = [];\r\n    comments.map((comment: IComments) => comment.author !== \"AnonymousUser\" && usersCommentsIds.push(comment.author));\r\n    const { data, status } = await apiCaller({ url: API().user.profile, method: \"POST\", data: { user_ids: usersCommentsIds } });\r\n    if (responseValidator(status)) return [...usersProfiles, ...data.data];\r\n    else return []\r\n}\r\n\r\nexport const handleCommentsIdsInLocalStorage = () => {\r\n    const commentsLikeUnlike = localStorage.getItem(\"commentsLikeUnlike\");\r\n    if(commentsLikeUnlike) {\r\n        const { params } = store.getState().videoData;\r\n        const currentVideo = JSON.parse(commentsLikeUnlike).find((comment: any) => (comment.videoId === params.id && comment.videoType === params.type));\r\n        if(currentVideo) return currentVideo.comments;\r\n    }\r\n}\r\n\r\nexport const handleLikeUnlikeComment = async (commentId: number, likeStatus: boolean, setLikeStatus: (value: boolean) => void, likeCount:number, setLikeCount: (value:number) => void) => {\r\n    const { params } = store.getState().videoData;\r\n    const { status } = await apiCaller({ url: likeStatus ? API().comment.like(commentId) : API().comment.unlike(commentId), data: {\"uuid\": getUUID()} });\r\n    if(responseValidator(status)) {\r\n        setLikeCount(likeStatus ? likeCount + 1 : likeCount - 1);\r\n        setLikeStatus(likeStatus);\r\n        const commentsLikeUnlike = localStorage.getItem(\"commentsLikeUnlike\");\r\n        if(commentsLikeUnlike) {\r\n            const filteredVideos = JSON.parse(commentsLikeUnlike).filter((comment: any) => (comment.videoId !== params.id || (comment.videoId === params.id && comment.videoType !== params.type)));\r\n            const currentVideo = JSON.parse(commentsLikeUnlike).find((comment: any) => (comment.videoId === params.id && comment.videoType === params.type));\r\n            if(filteredVideos) {\r\n                if(currentVideo) {\r\n                    const filteredComments = currentVideo.comments.filter((comment: number) => comment !== commentId);\r\n                    if (likeStatus) localStorage.setItem(\"commentsLikeUnlike\", JSON.stringify([...filteredVideos, { videoId: params.id, videoType: params.type, comments: [...filteredComments, commentId] }]));\r\n                    else localStorage.setItem(\"commentsLikeUnlike\", JSON.stringify([...filteredVideos, { videoId: params.id, videoType: params.type, comments:filteredComments}]));\r\n                } else {\r\n                    localStorage.setItem(\"commentsLikeUnlike\", JSON.stringify([...filteredVideos, { videoId: params.id, videoType: params.type, comments: [commentId] }]))\r\n                }\r\n            }\r\n        } else localStorage.setItem(\"commentsLikeUnlike\",JSON.stringify([{videoId: params.id, videoType: params.type, comments: [commentId]}]))\r\n    }\r\n}\r\n\r\nexport const handleCloseCommentPopover = () => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setCommentPopover(false));\r\n    dispatch(setComments([]));\r\n}","import store from \"../../redux/store\";\r\nimport {catchUpLoadingLog} from \"../../logs/logs\";\r\nimport {ConditionName, zIndex} from \"../../interfaces/enums\";\r\nimport {conditions} from \"../../helpers/conditions/conditions\";\r\nimport {progressBar, progressBarWidth, videoTag} from \"../../helpers/constants\";\r\nimport { activeElementsTime, footerPadding } from \"../../helpers/environment\";\r\nimport {\r\n    setActiveElements,\r\n    setActivePointerProgressBar,\r\n    setDelayTurnOffControlbar,\r\n    setTooltipTime\r\n} from \"../slices/controllerSlice\";\r\nimport { secondsToHMS } from \"../../helpers/helpers\";\r\nimport { handleVideoTimeline } from \"./controller.actions\";\r\nimport {setInfo} from \"../slices/videoDataSlice\";\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\n\r\nexport const getPointerTime = (event: any, type: string = \"\") => {\r\n    const {videoElementSizeInfo} = store.getState().videoData;\r\n    const {duration, hlsLiveSyncPosition} = store.getState().controller;\r\n    const durationValue = conditions(ConditionName.isLiveParam) ? hlsLiveSyncPosition : duration;\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    if (clientX <= videoElementSizeInfo.right - footerPadding() && clientX > footerPadding()) {\r\n        let positionX = clientX - footerPadding() - videoElementSizeInfo.left;\r\n        let timePositionX = (positionX / (videoElementSizeInfo.width - 2 * footerPadding())) * durationValue;\r\n        if (type === \"tooltipTime-live\") timePositionX = durationValue - timePositionX;\r\n        return timePositionX\r\n    }\r\n\r\n}\r\n\r\nexport const getPointerPosition = (event: any) => {\r\n    const {videoElementSizeInfo} = store.getState().videoData;\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    if (clientX <= videoElementSizeInfo.right - footerPadding() && clientX > footerPadding()) {\r\n        return clientX - footerPadding() - videoElementSizeInfo.left;\r\n    }\r\n}\r\n\r\nexport const getMarkerPosition = (markerTime: number) => {\r\n    const {duration, hlsLiveSyncPosition} = store.getState().controller;\r\n    const durationValue = conditions(ConditionName.isLiveParam) ? hlsLiveSyncPosition : duration;\r\n    return (markerTime * progressBarWidth()) / durationValue;\r\n}\r\n\r\nexport const hideProgressTooltip = (progressTooltip: any) => {\r\n    if (progressTooltip) {\r\n        progressTooltip.style.opacity = \"0.0\";\r\n        progressTooltip.style.pointerEvents = \"none\";\r\n        progressTooltip.style.zIndex = zIndex.vttDisable;\r\n    }\r\n}\r\n\r\nconst generalStyleTooltipHandler = (progressTooltip: any) => {\r\n    progressTooltip.style.display = \"block\";\r\n    progressTooltip.style.zIndex = zIndex.vtt;\r\n    progressTooltip.style.opacity = !!store.getState().videoData.details.vtt ? \"1.0\" : \"0.6\";\r\n    progressTooltip.style.pointerEvents = \"auto\";\r\n    progressTooltip.style.transition = \"opacity 1s ease-out\";\r\n}\r\n\r\nconst vttTooltipStyleHandler = (event: any, progressTooltip: any) => {\r\n    const element: any = document.getElementsByClassName(\"pl-progressTooltip\")[0];\r\n    const parentPlayer: any = document.getElementById(\"parent-player\");\r\n    if (element && parentPlayer) {\r\n        if (getPointerPosition(event)! >= (parentPlayer.offsetLeft === 0 ? element.offsetWidth : parentPlayer.offsetLeft) && (getPointerPosition(event)! + element.offsetWidth) <= (videoTag().offsetLeft + videoTag().offsetWidth)) {\r\n            progressTooltip.style.left = `${getPointerPosition(event)! - (element.offsetWidth / 2)}px`;\r\n        } else if (getPointerPosition(event)! < (parentPlayer.offsetLeft === 0 ? element.offsetWidth : parentPlayer.offsetLeft)) {\r\n            progressTooltip.style.left = `${0}px`;\r\n        } else if ((videoTag().offsetLeft + videoTag().offsetWidth) < (getPointerPosition(event)! + element.offsetWidth)) {\r\n            progressTooltip.style.left = `${videoTag().offsetWidth - element.offsetWidth}px`;\r\n        }\r\n    }\r\n}\r\n\r\nexport const showProgressTooltip = (event: any, progressTooltip: any, progressBarTooltip: any) => {\r\n    if (progressTooltip) generalStyleTooltipHandler(progressTooltip);\r\n    if (store.getState().videoData.details.vtt) vttTooltipStyleHandler(event, progressTooltip);  // have vtt\r\n    else progressTooltip.style.left = `${getPointerPosition(event)! - 30}px`;            // not vtt\r\n    store.dispatch(setTooltipTime(Number(getPointerTime(event)!)));\r\n    progressBarTooltip.textContent = conditions(ConditionName.isLiveParam) ? `-${secondsToHMS(getPointerTime(event, \"tooltipTime-live\")!)}` : `${secondsToHMS(getPointerTime(event)!)}`;\r\n}\r\n\r\nexport const handleTimeTooltip = (event: any, isTimer: boolean = false) => {\r\n    const {videoElementSizeInfo} = store.getState().videoData;\r\n    const progressTooltip: any = document.querySelector(\".pl-progressTooltip\");\r\n    const progressBarTooltip: any = document.querySelector(\".pl-progressTimeTooltip\");\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    if (progressTooltip && progressBarTooltip && clientX <= videoElementSizeInfo.right - footerPadding() && clientX > videoElementSizeInfo.left + footerPadding()) {\r\n        showProgressTooltip(event, progressTooltip, progressBarTooltip);\r\n        if (isTimer) setTimeout(() => hideProgressTooltip(progressTooltip), 2000);\r\n    } else hideProgressTooltip(progressTooltip);\r\n}\r\n\r\nexport const handleProgressTime = (event: any) => {\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    if (progressBar()) {\r\n        if (clientX <= event.view.innerWidth - footerPadding() && clientX > footerPadding()) progressBar().style.width = `${getPointerPosition(event)}px`;\r\n        else if (clientX <= event.view.innerWidth - footerPadding()) progressBar().style.width = 0;\r\n        else if (clientX > footerPadding()) progressBar().style.width = `100%`;\r\n    }\r\n}\r\n\r\nexport const handlePointerDown = (event: any, timeoutIds: any, setIsPointerDown: (value:boolean) => void) => {\r\n    setIsPointerDown(true);\r\n    const dispatch = store.dispatch;\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    if (clientX <= event.view.innerWidth - footerPadding() && clientX > footerPadding()) {\r\n        dispatch(setActivePointerProgressBar(true));\r\n        dispatch(setDelayTurnOffControlbar(true));\r\n        sessionStorage.setItem(\"previousVideoTime\", String(videoTag().currentTime))\r\n        event.target.setPointerCapture(event.pointerId);\r\n        if (timeoutIds.length > 0) timeoutIds.map((id: any) => clearTimeout(id));\r\n    }\r\n}\r\n\r\nexport const handlePointerMove = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    const {activePointerProgressBar} = store.getState().controller;\r\n    const {left} = store.getState().videoData.videoElementSizeInfo;\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    const progressTooltip: any = document.querySelector(\".pl-progressTooltip\");\r\n    if (clientX > left + footerPadding()) {\r\n        if (progressTooltip) {\r\n            progressTooltip.style.display = \"block !important\";\r\n            progressTooltip.style.pointerEvents = \"auto\";\r\n        }\r\n        if (activePointerProgressBar) {\r\n            dispatch(setDelayTurnOffControlbar(true));\r\n            handleTimeTooltip(event);\r\n            handleProgressTime(event);\r\n            videoTag().pause();\r\n        }\r\n    } else if (progressTooltip) {\r\n        progressTooltip.style.display = \"none !important\";\r\n        progressTooltip.style.pointerEvents = \"none\";\r\n    }\r\n}\r\n\r\nexport const handlePointerUp = (event: any, setTimeoutIds: (timeoutIds: any[]) => void, timeoutIds: any, setIsPointerDown: (value: boolean) => void) => {\r\n    setIsPointerDown(false);\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    const dispatch = store.dispatch;\r\n    const { duration, hlsLiveSyncPosition } = store.getState().controller;\r\n    const { left, right } = store.getState().videoData.videoElementSizeInfo;\r\n    const durationValue = conditions(ConditionName.isLiveParam) ? hlsLiveSyncPosition : duration;\r\n    event.target.removeEventListener(\"pointermove\", handlePointerMove);\r\n    const clientX = event.clientX !== undefined ? event.clientX : event.touches[0].clientX;\r\n    let currentTime = 0;\r\n    if (clientX > left + footerPadding() && clientX < right + footerPadding()) currentTime = getPointerTime(event)!;\r\n    else if (clientX < left + footerPadding()) currentTime = 0;\r\n    else if (clientX > footerPadding()) currentTime = durationValue;\r\n    if (!conditions(ConditionName.isStaticFormat)) handleVideoTimeline(videoTag().currentTime, currentTime);\r\n    videoTag().currentTime = currentTime;\r\n    if (store.getState().controller.activePointerProgressBar) {\r\n        dispatch(setActivePointerProgressBar(false));\r\n        dispatch(setDelayTurnOffControlbar(false));\r\n        videoTag().play();\r\n        handleTimeTooltip(event, true);\r\n        sessionStorage.setItem(\"current-time\", String(currentTime));\r\n        handleProgressTime(event);\r\n        handleTimeout(event, dispatch, setTimeoutIds, timeoutIds);\r\n    }\r\n}\r\n\r\nconst handleTimeout = (event: any, dispatch: any, setTimeoutIds: (timeoutIds: any[]) => void, timeoutIds: any) => {\r\n    const ids = timeoutIds;\r\n    let timeoutIdTemp = setTimeout(() => {\r\n        const { settingPopover, markersListPopover } = store.getState().popovers;\r\n        const { delayTurnOffControlbar } = store.getState().controller;\r\n        if (event.pointerType === \"touch\" && !settingPopover && !markersListPopover && delayTurnOffControlbar) dispatch(setActiveElements(false));\r\n    }, activeElementsTime);\r\n    ids.push(timeoutIdTemp);\r\n    setTimeoutIds(ids);\r\n}\r\n\r\nexport const handleCatchUpLoadingLog = () => {\r\n    const timer = Date.now();\r\n    videoTag().play().then(() => sendFluentLog(catchUpLoadingLog(Date.now() - timer)));\r\n}\r\n\r\nexport const handleMouseMove = (event: any) => handleTimeTooltip(event);\r\n\r\nexport const handleMouseOut = () => {\r\n    const progressBarTooltip: any = document.querySelector(\".pl-progressTooltip\");\r\n    hideProgressTooltip(progressBarTooltip);\r\n}\r\n\r\n/////// vtt tooltip\r\nconst deconstructTimestamp = (timestamp: string) => {\r\n    const splitStampMilliseconds = timestamp.split(\".\");\r\n    const timeParts = splitStampMilliseconds[0];\r\n    const timePartsSplit = timeParts.split(\":\");\r\n\r\n    return {\r\n        milliseconds: parseInt(splitStampMilliseconds[1], 10) || 0,\r\n        seconds: parseInt(timePartsSplit.pop()!, 10) || 0,\r\n        minutes: parseInt(timePartsSplit.pop()!, 10) || 0,\r\n        hours: parseInt(timePartsSplit.pop()!, 10) || 0,\r\n    };\r\n\r\n}\r\n\r\nconst getSecondsFromTimestamp = (timestamp: string) => {\r\n    const timestampParts: any = deconstructTimestamp(timestamp);\r\n\r\n    return parseInt((timestampParts.hours * (60 * 60)) +\r\n        (timestampParts.minutes * 60) +\r\n        timestampParts.seconds +\r\n        (timestampParts.milliseconds / 1000), 10);\r\n}\r\n\r\nconst getPropsFromDef = (def: string) => {\r\n    const imageDefSplit = def.split(/#xywh=/i);\r\n    const imageUrl = imageDefSplit[0];\r\n    const imageCoords = imageDefSplit[1];\r\n    const splitCoords: any = imageCoords.match(/[0-9]+/gi);\r\n\r\n    return {\r\n        x: splitCoords[0],\r\n        y: splitCoords[1],\r\n        w: splitCoords[2],\r\n        h: splitCoords[3],\r\n        image: imageUrl,\r\n    };\r\n}\r\n\r\nconst getFullyQualifiedUrl = (path: string, base: string) => {\r\n    if (path.indexOf(\"//\") >= 0) {\r\n        // We have a fully qualified path.\r\n        return path;\r\n    }\r\n\r\n    if (base.indexOf(\"//\") === 0) {\r\n        // We don't have a fully qualified path, but need to\r\n        // be careful with trimming.\r\n        return [\r\n            base.replace(/\\/$/gi, \"\"),\r\n            path.trim(),\r\n        ].join(\"/\");\r\n    }\r\n\r\n    if (base.indexOf(\"//\") > 0) {\r\n        // We don't have a fully qualified path, and should\r\n        // trim both sides of base and path.\r\n        return [\r\n            base.trim(),\r\n            path.trim(),\r\n        ].join(\"/\");\r\n    }\r\n\r\n    // If all else fails.\r\n    return path;\r\n}\r\n\r\nconst getVttCss = (vttImageDef: string, vttUrl: string) => {\r\n    const cssObj: any = {};\r\n    // If there isn't a protocol, use the VTT source URL.\r\n    let baseSplit: string = (vttUrl)!.split(/\\/\\w+\\.vtt\\s?/)[0];\r\n\r\n    /// offset : (vttUrl)!.split(/\\/\\w+\\.vtt\\s?/)[1]\r\n\r\n    vttImageDef = getFullyQualifiedUrl(vttImageDef, baseSplit);\r\n\r\n    if (!vttImageDef.match(/#xywh=/i)) {\r\n        cssObj.background = \"url(\\\"\" + vttImageDef + (vttUrl)!.split(/\\/\\w+\\.vtt\\s?/)[1] + \"\\\")\";\r\n        return cssObj;\r\n    }\r\n\r\n    const imageProps = getPropsFromDef(vttImageDef);\r\n\r\n    cssObj.background = \"url(\\\"\" + imageProps.image + (vttUrl)!.split(/\\/\\w+\\.vtt\\s?/)[1] + \"\\\") no-repeat -\" + imageProps.x + \"px -\" + imageProps.y + \"px\";\r\n    cssObj.width = imageProps.w + \"px\";\r\n    cssObj.height = imageProps.h + \"px\";\r\n    cssObj.url = imageProps.image;\r\n\r\n    return cssObj;\r\n}\r\n\r\nexport const fetchFile = (url: string, setVttPool: any) => {\r\n    fetch(url)\r\n        .then(response => {\r\n            if (!response.ok) {\r\n                store.dispatch(setInfo({\r\n                    ...store.getState().videoData.details,\r\n                    vtt: undefined,\r\n                    vtt_mobile: undefined\r\n                }));\r\n                throw new Error(\"Network response was not ok\");\r\n            }\r\n            return response.text();\r\n        })\r\n        .then(data => {\r\n            const processedVtts: any[] = [];\r\n            const vttDefinitions = data.split(/[\\r\\n][\\r\\n]/i);\r\n            vttDefinitions.forEach((vttDef) => {\r\n                if (vttDef.match(/([0-9]{2}:)?([0-9]{2}:)?[0-9]{2}(.[0-9]{3})?( ?--> ?)([0-9]{2}:)?([0-9]{2}:)?[0-9]{2}(.[0-9]{3}).*/gi)) {\r\n                    const vttDefSplit = vttDef.split(/[\\r\\n]/i);\r\n                    const vttTiming = vttDefSplit[0];\r\n                    const vttTimingSplit = vttTiming.split(/ ?--> ?/i);\r\n                    const vttTimeStart = vttTimingSplit[0];\r\n                    const vttTimeEnd = vttTimingSplit[1];\r\n                    const vttImageDef = vttDefSplit[1];\r\n                    const vttCssDef = getVttCss(vttImageDef, url);\r\n\r\n                    processedVtts.push({\r\n                        start: getSecondsFromTimestamp(vttTimeStart),\r\n                        end: getSecondsFromTimestamp(vttTimeEnd),\r\n                        css: vttCssDef,\r\n                    });\r\n\r\n                }\r\n            });\r\n            setVttPool(processedVtts);\r\n        })\r\n        .catch(error => {\r\n            console.error(\"Error fetching file:\", error);\r\n        });\r\n}\r\n\r\nexport const getStyleForTime = (time: number, vttPool:any, cache: any) => {\r\n    for (let i = 0; i < vttPool.length; ++i) {\r\n        const item = vttPool[i];\r\n        if (time >= item.start && time < item.end) {\r\n            // Cache miss\r\n            if (item.css.url && !cache[item.css.url]) {\r\n                const objectVtt: any = {\r\n                    background: item.css.background,\r\n                    width: item.css.width,\r\n                    height: item.css.height,\r\n                }\r\n                cache[item.css.url] = objectVtt;\r\n                return objectVtt;\r\n            } else if (item.css.url) return cache[item.css.url]\r\n        }\r\n    }\r\n}","import { conditions } from \"../../helpers/conditions/conditions\";\r\nimport { handleRipple, responseValidator } from \"../../helpers/helpers\";\r\nimport { ConditionName, ContentTypesString } from \"../../interfaces/enums\";\r\nimport { get, getAll } from \"../../services/apiCaller\";\r\nimport { API } from \"../../services/services\";\r\nimport { setPlayListCardPopover, setTagsPopover } from \"../slices/popoversSlice\";\r\nimport store from \"../store\";\r\nimport { searchLog, searchResultClickLog, tagClickLog } from '../../logs/logs';\r\nimport { setInputFilterTagSearch, setInputTagSearch, setIsMovieFilter, setIsSeriesFilter, setSelectedTags, setViewersTagsList } from \"../slices/tagsSlice\";\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\nimport { handleContentType } from \"./videoData.actions\";\r\n\r\nexport const getFitMaxNumberCard = () => Math.ceil((window.innerWidth * window.innerHeight) / (265 * 149))\r\n\r\nexport const handleGetTags = (scrollEnd: boolean, setScrollEnd: (scrollEnd: boolean) => void, listScrolled: any[], setListScrolled: (listScrolled: any[]) => void) => {\r\n    const { details, params } = store.getState().videoData;\r\n    const { selectedTags, inputTagSearch } = store.getState().tags;\r\n    if (scrollEnd && listScrolled.length) {\r\n        get((response: any, status:any) => {\r\n            if (responseValidator(status)) {\r\n                if (response.results.length > 0) setListScrolled(listScrolled.concat(response.results));\r\n                setScrollEnd(false);\r\n            }\r\n        }, API().searchViewers, {\r\n            tag: selectedTags.join(\",\"),\r\n            q: conditions(ConditionName.hasInputTagSearch) ? inputTagSearch : undefined,\r\n            user_ids: conditions(ConditionName.isUserIdsParamsEqualAll) ? undefined : conditions(ConditionName.hasUserIds) ? params.user_ids : details.user_id,\r\n            limit: conditions(ConditionName.isComplexPortrait) ? 10 : getFitMaxNumberCard(),\r\n            offset: listScrolled.length,\r\n        })\r\n    }\r\n}\r\n\r\nexport const handleClickTag = (setVideoCount: (videoCount: number) => void, listScrolled: any[], setListScrolled: (listScrolled: any[]) => void, setLoadingGetTags?: (value: boolean) => void) => {\r\n\r\n    const dispatch = store.dispatch;\r\n    const { details, params } = store.getState().videoData;\r\n    const { selectedTags, inputTagSearch } = store.getState().tags;\r\n    const contentType = handleContentType();\r\n    sendFluentLog(searchLog(contentType));\r\n    if (setLoadingGetTags) setLoadingGetTags(true);\r\n    get((response: any, status:any) => {\r\n        if (responseValidator(status)) {\r\n            setVideoCount(response.count);\r\n            if (response.results.length > 0) {\r\n                dispatch(setTagsPopover(true));\r\n                setListScrolled(response.results);\r\n            } else setListScrolled([]);\r\n        }\r\n        if (setLoadingGetTags) setLoadingGetTags(false);\r\n    }, API().searchViewers, {\r\n        tag: selectedTags.join(\",\"),\r\n        q: conditions(ConditionName.hasInputTagSearch) ? inputTagSearch : undefined,\r\n        user_ids: conditions(ConditionName.isUserIdsParamsEqualAll) ? undefined : conditions(ConditionName.hasUserIds) ? params.user_ids : details.user_id,\r\n        limit: (listScrolled.length + (conditions(ConditionName.isComplexPortrait) ? 10 : getFitMaxNumberCard())),\r\n        offset: 0,\r\n        video_type: contentType\r\n    })\r\n}\r\n\r\nexport const handleClickPlayerCardTag = (event: any, tag: string) => {\r\n    const dispatch = store.dispatch;\r\n    const { selectedTags } = store.getState().tags;\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    if (!selectedTags.includes(tag)) {\r\n        dispatch(setPlayListCardPopover(false));\r\n        dispatch(setTagsPopover(true));\r\n        dispatch(setSelectedTags([...selectedTags, tag]));\r\n        sendFluentLog(tagClickLog(tag.trim()));\r\n    }\r\n}\r\n\r\nexport const getAllViewersTagList = async () => {\r\n    const { details, params } = store.getState().videoData;\r\n    const { selectedTags } = store.getState().tags;\r\n    return new Promise(async(resolve)=>{\r\n        try {\r\n            const data = await getAll(API().viewersTagList(params.type!), [], { user_ids: conditions(ConditionName.isUserIdsParamsEqualAll) ? undefined : conditions(ConditionName.hasUserIds) ? params.user_ids : details.user_id, tag: selectedTags.join(\",\") })\r\n            resolve(data)\r\n        } catch (error) {}\r\n    })\r\n}\r\n\r\nexport const handleViewersTagList = async () => {\r\n\r\n    const dispatch = store.dispatch\r\n    const { selectedTags } = store.getState().tags;\r\n\r\n    const results: any = await getAllViewersTagList();\r\n    if (results) {\r\n        let viewersTagList: string[] = []\r\n        results.map((result: any) => viewersTagList.push(result.tag.trim()));\r\n        viewersTagList = [...new Set(viewersTagList)];\r\n        dispatch(setViewersTagsList(viewersTagList.filter((tag: string) => tag !== selectedTags[0])));\r\n    }\r\n}\r\n\r\nexport const handleCloseTagPopover = () => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setTagsPopover(false));\r\n    dispatch(setSelectedTags([]));\r\n    dispatch(setInputTagSearch(\"\"));\r\n    dispatch(setIsMovieFilter(false));\r\n    dispatch(setIsSeriesFilter(false));\r\n    dispatch(setInputFilterTagSearch(\"\"));\r\n}\r\n\r\nexport const handleTagInput = (inputValue: string, setTagInputLoading: (tagInputLoading: boolean) => void, tagInputTimeoutRef: any, setVideoCount: (videoCount: number) => void, listScrolled: any[], setListScrolled: (listScrolled: any[]) => void, setLoadingGetTags: (value:boolean) => void) => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setInputTagSearch(inputValue));\r\n    setTagInputLoading(true);\r\n    clearTimeout(tagInputTimeoutRef.current);\r\n    tagInputTimeoutRef.current = setTimeout(() => {\r\n        handleClickTag(setVideoCount, listScrolled, setListScrolled, setLoadingGetTags);\r\n        setTagInputLoading(false);\r\n    }, 500);\r\n}\r\n\r\nexport const handleCloseSelectedTags = (tag: string) => {\r\n    const dispatch = store.dispatch;\r\n    const { selectedTags, viewersTagsList } = store.getState().tags;\r\n\r\n    dispatch(setSelectedTags(selectedTags.filter((selectedTag: string) => selectedTag !== tag)));\r\n    dispatch(setViewersTagsList([tag, ...viewersTagsList]))\r\n}\r\n\r\nexport const handleClickViewersTagList = (tag: string) => {\r\n    const dispatch = store.dispatch;\r\n    const { selectedTags, viewersTagsList } = store.getState().tags;\r\n    dispatch(setSelectedTags([...selectedTags, tag]));\r\n    dispatch(setViewersTagsList(viewersTagsList.filter((viewerTag: string) => viewerTag !== tag)))\r\n}\r\n\r\nexport const handleClearTagInput = (setVideoCount: (videoCount: number) => void, listScrolled: any[], setListScrolled: (listScrolled: any[]) => void) => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setInputTagSearch(\"\"));\r\n    handleClickTag(setVideoCount, listScrolled, setListScrolled);\r\n}\r\n\r\nexport const handleNextTag = (e: any, tagsContainerRef: any) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    tagsContainerRef.current.scrollLeft -= tagsContainerRef.current.clientWidth;\r\n}\r\n\r\nexport const handlePrevTag = (e: any, tagsContainerRef: any) => {\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    tagsContainerRef.current.scrollLeft += tagsContainerRef.current.clientWidth;\r\n}\r\n\r\nexport const handleScrollLeft = (event: any, tagId: string) => {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    const element = document.getElementById(tagId);\r\n    if (element) element.scrollLeft -= 50;\r\n}\r\n\r\nexport const handleScrollRight = (event: any, tagId: string) => {\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    const element = document.getElementById(tagId);\r\n    if (element) element.scrollLeft += 50;\r\n}\r\n\r\nexport const handleSearchResultClick = (event: any, video: any, playListCardInfoRef:any, videoId:number, videoType: string, videoIndex:number) => {\r\n    const dispatch = store.dispatch;\r\n    handleRipple(event, `tagVideoList-${videoId}`, 150);\r\n    if (videoType === ContentTypesString.PlayList) {\r\n        dispatch(setPlayListCardPopover(true));\r\n        playListCardInfoRef.current = video\r\n    } else sendFluentLog(searchResultClickLog(videoId, videoType, videoIndex));\r\n}","import { getInitialLoadedFragmentCount } from \"services\";\r\nimport { LiveDelay, conditions, getUUID, highestResolutionSupported, justAudio, videoTag } from \"../../helpers\";\r\nimport { ConditionName } from \"../../interfaces\";\r\nimport { sendFluentLog } from \"../../logs/fluentdLogger\";\r\nimport { errorLog, initLog, loadingLog, pausePlayLog, watchedTimeLog } from \"../../logs/logs\";\r\nimport { setActiveElements, setAutoQuality, setBufferedTimeWidth, setCanPlayVideo, setCurrentTime, setDuration, setFirstPlay, setHlsLivePosition, setIsEnded, setIsFullScreen, setIsLoading, setLoadedFragmentsCount, setManualQuality, setPlay, setQualityBitrates, setQualityLevels } from \"../slices/controllerSlice\";\r\nimport { setClearPopoversSlice } from \"../slices/popoversSlice\";\r\nimport { setUserSettings } from \"../slices/userSlice\";\r\nimport { setIsComplexDesktop, setIsComplexPortrait, setIsLiveError, setIsManifestError, setMultiAudio, setSubtitleText, setSubtitles, setVideoTimelines } from \"../slices/videoDataSlice\";\r\nimport store from \"../store\";\r\nimport { handleLockOrientation, handleVideoTimeline } from \"./controller.actions\";\r\nimport { createSettings } from \"./user.actions\";\r\nimport { getLiveAndVodDetails } from \"./videoData.actions\";\r\n\r\nexport const handleAutoFullScreen = () => {\r\n    const dispatch = store.dispatch;\r\n    const { params } = store.getState().videoData;\r\n    const launchFullScreen = (element: any) => {\r\n        if (element.requestFullScreen) element.requestFullScreen();\r\n        else if (element.mozRequestFullScreen) element.mozRequestFullScreen();\r\n        else if (element.webkitRequestFullScreen) element.webkitRequestFullScreen();\r\n    }\r\n    dispatch(setClearPopoversSlice())\r\n    launchFullScreen(document.documentElement);\r\n    dispatch(setIsFullScreen(params.fullscreen === \"true\"))\r\n    if (conditions(ConditionName.isComplexDesktop)) dispatch(setIsComplexDesktop(false));\r\n    if (conditions(ConditionName.isTouchScreen) && conditions(ConditionName.isParamsPortrait)) dispatch(setIsComplexPortrait(params.fullscreen !== \"true\"));\r\n}\r\n\r\nexport const appendQueryParamsToChunksIOS = () => {\r\n    let fragmentExtension = '.ts';\r\n    let originalOpen = XMLHttpRequest.prototype.open;\r\n    XMLHttpRequest.prototype.open = function () {\r\n        if (arguments[1].endsWith(fragmentExtension)) arguments[1] = arguments[1] + '?uuid=' + getUUID!();\r\n        originalOpen.apply(this, arguments as any);\r\n    }\r\n}\r\n\r\nexport const handleBufferedTime = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    setInterval(() => {\r\n        const bufferedTime = event.target.buffered.end(0);\r\n        const bufferedTimeWidth = (bufferedTime / videoTag().duration) * 100;\r\n        dispatch(setBufferedTimeWidth(bufferedTimeWidth));\r\n    }, 500)\r\n}\r\n\r\n// ************* Hls Config Handlers ************* //\r\nexport const handleHlsConfig = () => {\r\n    const { params, streamLinkParams } = store.getState().videoData;\r\n    return {\r\n        xhrSetup: (xhr: any, url: any) => {\r\n            if (!url.split('m3u8')[1]) url = `${url}${streamLinkParams}`;\r\n            xhr.open('GET', url, true);\r\n        },\r\n        startLevel: (params.type === \"live\") ? 1 : -1,\r\n        debug: false,\r\n        maxMaxBufferLength: conditions(ConditionName.hasQuizParams) ? 4 : 60,\r\n        liveSyncDurationCount: conditions(ConditionName.hasQuizParams) ? 0 : LiveDelay,\r\n        liveMaxLatencyDurationCount: conditions(ConditionName.hasQuizParams) ? 1 : Infinity,\r\n        manifestLoadPolicy: {\r\n            default: {\r\n                maxTimeToFirstByteMs: Infinity,\r\n                maxLoadTimeMs: 20000,\r\n                timeoutRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n                errorRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n            },\r\n        },\r\n        fragLoadPolicy: {\r\n            default: {\r\n                maxTimeToFirstByteMs: 10000,\r\n                maxLoadTimeMs: 120000,\r\n                timeoutRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n                errorRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n            },\r\n        },\r\n        playlistLoadPolicy: {\r\n            default: {\r\n                maxTimeToFirstByteMs: 10000,\r\n                maxLoadTimeMs: 20000,\r\n                timeoutRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n                errorRetry: {\r\n                    maxNumRetry: 10,\r\n                    retryDelayMs: 5000,\r\n                    maxRetryDelayMs: 10000,\r\n                },\r\n            },\r\n        },\r\n    }\r\n}\r\n\r\nexport const handleMultiLiveHlsConfig = () => {\r\n    const { streamLinkParams } = store.getState().videoData;\r\n    return {\r\n        xhrSetup: (xhr: any, url: any) => {\r\n            url = `${url}${streamLinkParams}`\r\n            xhr.open('GET', url, true);\r\n        },\r\n        startLevel: 1,\r\n        debug: false,\r\n        liveSyncDuration: LiveDelay,\r\n        maxMaxBufferLength: 60,\r\n        playlistLoadPolicy: {\r\n            default: {\r\n                maxTimeToFirstByteMs: 10000,\r\n                maxLoadTimeMs: 20000,\r\n                timeoutRetry: {\r\n                    maxNumRetry: 1000,\r\n                    retryDelayMs: 0,\r\n                    maxRetryDelayMs: 0,\r\n                },\r\n                errorRetry: {\r\n                    maxNumRetry: 1000,\r\n                    retryDelayMs: 1000,\r\n                    maxRetryDelayMs: 1000,\r\n                },\r\n            },\r\n        },\r\n    }\r\n}\r\n\r\n// ************* Manifest Handlers ************* //\r\n\r\nexport const handleManifestParsed = (hls: any, data: any) => {\r\n    const dispatch = store.dispatch;\r\n    let qualityLevels: any[] = [];\r\n    let qualityBitrates: string[] = [];\r\n    let resolutions: any[] = [];\r\n    hls.levels.map((level: any) => {\r\n        qualityLevels.push(level.attrs.RESOLUTION!.split('x')[1].trim())\r\n        qualityBitrates.push(`${(level.bitrate / 1000).toFixed(0)}kbps`);\r\n        resolutions.push(level.attrs.RESOLUTION!);\r\n    });\r\n    hls.autoLevelCapping = highestResolutionSupported(resolutions, window.innerWidth, window.innerHeight);\r\n    qualityLevels.push(-1);\r\n    if (sessionStorage.getItem(\"remove-just-audio\") === \"true\" || (conditions(ConditionName.isLiveParam) && +qualityLevels[0] === justAudio)) {\r\n        hls.removeLevel(0);\r\n        qualityLevels.shift();\r\n    }\r\n    dispatch(setQualityLevels(qualityLevels));\r\n    dispatch(setQualityBitrates(qualityBitrates));\r\n    [\"fullscreenchange\", \"webkitfullscreenchange\", \"mozfullscreenchange\", \"msfullscreenchange\"].forEach(\r\n        eventType => document.addEventListener(eventType, (event: any) => {\r\n            if (conditions(ConditionName.isAutoQuality)) {\r\n                hls.autoLevelCapping = highestResolutionSupported(resolutions, window.innerWidth, window.innerHeight);\r\n                hls.nextLevel = -1;\r\n            }\r\n        }, false)\r\n    );\r\n    if (data.audioTracks.length > 0) {\r\n        const sortedAudioTracks = data.audioTracks.sort((a: any) => a.default === true ? -1 : 1);\r\n        dispatch(setMultiAudio(sortedAudioTracks));\r\n    }\r\n}\r\n\r\nexport const handleManifestLoaded = (hls: any) => hls.audioTrack = 0;\r\n\r\nexport const handleMediaAttached = (Hls: any, hls: any) => {\r\n    const { params, details, ads } = store.getState().videoData;\r\n    let streamLink = conditions(ConditionName.isPlayingAd) ? ads.adStreamLink : conditions(ConditionName.isGeneral) ? params.src! : details.stream_link;\r\n    hls.loadSource(streamLink);\r\n    hls.on(Hls.Events.MANIFEST_PARSED, (event: any, data: any) => handleManifestParsed(hls, data));\r\n    hls.on(Hls.Events.MANIFEST_LOADED, () => handleManifestLoaded(hls));\r\n}\r\n\r\n// ************* Level Handlers ************* //\r\n\r\nexport const handleLevels = (hls: any, data: any, setQualityLevel: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { settings } = store.getState().user;\r\n    const { qualityLevels, manualQuality, autoQuality } = store.getState().controller;\r\n    if (!conditions(ConditionName.isAutoQuality)) {\r\n        if (data.frag.level !== manualQuality) hls.nextLevel = qualityLevels[settings.quality!] ? settings.quality : -1;\r\n        if (qualityLevels[settings.quality!]) {\r\n            dispatch(setManualQuality(settings.quality!));\r\n            dispatch(setAutoQuality(undefined));\r\n        } else {\r\n            setQualityLevel(qualityLevels[data.frag.level]);\r\n            dispatch(setAutoQuality(data.frag.level));\r\n            dispatch(setUserSettings({ ...settings, quality: -1 }));\r\n            createSettings({ ...settings, quality: null });\r\n        }\r\n    } else if (conditions(ConditionName.isAutoQuality) && autoQuality === undefined) {\r\n        hls.nextLevel = -1;\r\n        setQualityLevel(qualityLevels[data.frag.level]);\r\n        dispatch(setAutoQuality(data.frag.level));\r\n    } else if (conditions(ConditionName.isAutoQuality)) {\r\n        setQualityLevel(qualityLevels[data.frag.level]);\r\n        if (autoQuality !== data.frag.level) dispatch(setAutoQuality(data.frag.level));\r\n    }\r\n}\r\n\r\n// ************* Fragment Handlers ************* //\r\n\r\nexport const handleFragBuffered = (hls: any) => {\r\n    const dispatch = store.dispatch;\r\n    if(store.getState().controller.loadedFragmentsCount.length < Number(getInitialLoadedFragmentCount())) dispatch(setLoadedFragmentsCount([... new Set([...store.getState().controller.loadedFragmentsCount, hls.abrController.fragCurrent.sn])]))\r\n    const bufferedTime = hls.mainForwardBufferInfo?.end;\r\n    const bufferedTimeWidth = (bufferedTime! / videoTag().duration) * 100;\r\n    dispatch(setBufferedTimeWidth(bufferedTimeWidth));\r\n}\r\n\r\nexport const handleFragLoading = (hls: any) => {\r\n    const dispatch = store.dispatch;\r\n    if (conditions(ConditionName.isLiveParam)) dispatch(setHlsLivePosition(hls.liveSyncPosition))\r\n}\r\n\r\nexport const handleFragChanged = (Hls: any, hls: any, data: any, setQualityLevel: any) => {\r\n    const { params, multiAudio, selectedAudioId } = store.getState().videoData;\r\n\r\n    if (multiAudio && selectedAudioId !== undefined && selectedAudioId !== hls.audioTrack) {\r\n        hls.audioTrack = selectedAudioId;\r\n        hls.trigger(Hls.Events.AUDIO_TRACK_LOADING, multiAudio[selectedAudioId])\r\n    }\r\n    if (params.type || !conditions(ConditionName.isLiveParam)) handleLevels(hls, data, setQualityLevel);\r\n}\r\n\r\nexport const handleFragParsed = (hls: any, data: any, setQualityLevel: any) => {\r\n    const { type } = store.getState().videoData.params;\r\n    if (type || type === \"live\") handleLevels(hls, data, setQualityLevel);\r\n}\r\n\r\n// ************* HLS Error Handlers ************* //\r\n\r\nexport const handleHlsErrors = (Hls: any, data: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { qualityLevels, manualQuality } = store.getState().controller;\r\n\r\n    switch (data.type) {\r\n        case Hls.ErrorTypes.MEDIA_ERROR:\r\n            if (+qualityLevels[manualQuality!] === justAudio) {\r\n                sessionStorage.setItem(\"remove-just-audio\", \"true\");\r\n                location.reload();\r\n            }\r\n            break;\r\n        case \"networkError\":\r\n            dispatch(setIsManifestError(true));\r\n        default:\r\n            break;\r\n    }\r\n\r\n}\r\n\r\nexport const handlePreview = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { params, details } = store.getState().videoData;\r\n    const previewStart = conditions(ConditionName.hasPreviewStart) ? details.preview_start : 0;\r\n    const previewEnd = conditions(ConditionName.hasPreviewEnd) ? details.preview_end : videoTag() ? videoTag().duration : 0;\r\n    if (params.preview === \"true\" && event.target.currentTime >= previewEnd!) {\r\n        videoTag().currentTime = previewStart!;\r\n        dispatch(setCurrentTime(previewStart!))\r\n    }\r\n}\r\n\r\n// ************* Video Tag Handlers ************* //\r\n\r\nexport const handleVideoWaiting = (event: any, waitingTimerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    waitingTimerRef.current = Date.now();\r\n    dispatch(setIsLoading(true));\r\n}\r\n\r\nexport const handleVideoSeeking = (event: any, waitingTimerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    waitingTimerRef.current = 0;\r\n    dispatch(setIsLoading(true));\r\n}\r\n\r\nexport const handleVideoPlay = (event: any, timerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { details, params } = store.getState().videoData;\r\n    const { videoSettings } = store.getState().user;\r\n    event.preventDefault();\r\n    timerRef.current = Date.now();\r\n    dispatch(setPlay(true));\r\n    if (conditions(ConditionName.isFirstPlay)) {\r\n        if(!conditions(ConditionName.isLiveParam)) {\r\n            videoTag().currentTime = params.t ? +params.t : videoSettings.time;\r\n            dispatch(setCurrentTime(params.t ? +params.t : videoSettings.time));\r\n        }\r\n        if (conditions(ConditionName.hasFullScreenParams)) handleAutoFullScreen();\r\n        if (conditions(ConditionName.isFullScreen)) handleLockOrientation();\r\n        if (conditions(ConditionName.hasPreviewParams)) {\r\n            const previewStart = details.preview_start ? details.preview_start : 0;\r\n            videoTag().currentTime = previewStart;\r\n            dispatch(setCurrentTime(previewStart))\r\n        }\r\n        dispatch(setVideoTimelines([Math.floor(videoTag().currentTime)]));\r\n    }\r\n    sendFluentLog(pausePlayLog(true));\r\n    dispatch(setSubtitleText(\"\"));\r\n}\r\n\r\nexport const handleVideoPlaying = (loadingCounterRef: any, loadingDurationRef: any, initialWaitingDurationRef: any, bannerLoadingDurationRef: any, timerRef: any, waitingDurationRef: any, waitingTimerRef: any, videoEntranceTimeRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { autoQuality, canPlayVideo, firstPlay, qualityLevels } = store.getState().controller;\r\n    const { settings } = store.getState().user;\r\n    const qualityLevel = (settings.quality === -1 && autoQuality) ? qualityLevels[autoQuality] : qualityLevels[settings.quality!]\r\n    let waitingDuration = 0;\r\n    if (!!waitingTimerRef.current) waitingDuration = Date.now() - waitingTimerRef.current;\r\n    if (firstPlay && !!videoTag().played) sendFluentLog(initLog(loadingDurationRef.current, Date.now() - initialWaitingDurationRef.current, bannerLoadingDurationRef.current - initialWaitingDurationRef.current, Date.now() - timerRef.current, timerRef))\r\n    dispatch(setFirstPlay(false));\r\n    if (canPlayVideo && waitingDuration > 0 && qualityLevel !== undefined) {\r\n        waitingDurationRef.current = waitingDuration;\r\n        waitingTimerRef.current = 0;\r\n        sendFluentLog(loadingLog(waitingDuration, qualityLevel, timerRef, loadingCounterRef, videoEntranceTimeRef.current));\r\n        loadingCounterRef.current = loadingCounterRef.current + 1;\r\n        timerRef.current = Date.now();\r\n    }\r\n}\r\n\r\nexport const handleVideoPause = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    sendFluentLog(pausePlayLog(false));\r\n    dispatch(setPlay(false));\r\n}\r\n\r\nexport const handleVideoTimeUpdate = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { selectedSubtitle } = store.getState().videoData;\r\n    event.preventDefault();\r\n    handlePreview(event);\r\n    dispatch(setCurrentTime(event.target.currentTime));\r\n    if (selectedSubtitle && selectedSubtitle.activeCues && selectedSubtitle.activeCues.length > 0) dispatch(setSubtitleText(selectedSubtitle.activeCues[0].text));\r\n}\r\n\r\nexport const handleVideoCanPlay = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { settings } = store.getState().user;\r\n    event.preventDefault();\r\n    dispatch(setIsLoading(false));\r\n    dispatch(setCanPlayVideo(true));\r\n    videoTag().volume = settings.volume / 100\r\n    if (!conditions(ConditionName.isIOSLive)) dispatch(setDuration(event.target.duration));\r\n    if (conditions(ConditionName.isIOS)) {\r\n        const subtitle: any = Object.values(event.target.textTracks);\r\n        if(!!subtitle && subtitle.length) dispatch(setSubtitles(!!Object.values(subtitle[0]).length ? subtitle : []));\r\n    } else dispatch(setSubtitles(Object.values(event.target.textTracks)));\r\n    \r\n}\r\n\r\nexport const handleVideoEnded = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { params, watchedTime } = store.getState().videoData;\r\n    event.preventDefault();\r\n    dispatch(setIsLiveError(true));\r\n    dispatch(setIsEnded(true));\r\n    dispatch(setActiveElements(true));\r\n    sendFluentLog(watchedTimeLog(watchedTime));\r\n    handleVideoTimeline(videoTag().duration);\r\n    if (conditions(ConditionName.hasOnFinishedParams)) params.onFinished!()\r\n}\r\n\r\nexport const handleVideoError = (event: any) => {\r\n    event.preventDefault();\r\n    sendFluentLog(errorLog())\r\n}\r\n\r\n// ************* IOS Video Tag Handlers ************* //\r\n\r\nexport const handleIosVideoPlay = (event: any, timerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    timerRef.current = Date.now();\r\n    dispatch(setFirstPlay(false));\r\n}\r\n\r\nexport const handleIosVideoPlaying = () => {\r\n    const dispatch = store.dispatch;\r\n    dispatch(setIsLoading(false));\r\n};\r\n\r\nexport const handleIosVideoTimeUpdate = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setCurrentTime(event.target.currentTime));\r\n    handlePreview(event);\r\n}\r\n\r\nexport const handleIosVideoEnded = () => {\r\n    const { params } = store.getState().videoData;\r\n    if (conditions(ConditionName.hasOnFinishedParams)) params.onFinished!();\r\n}\r\n\r\n// ************* Static Video Tag Handlers ************* //\r\n\r\nexport const handleStaticVideoPause = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setPlay(false));\r\n}\r\n\r\nexport const handleStaticVideoPlay = (event: any, timerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setPlay(true));\r\n    timerRef.current = Date.now();\r\n    if (conditions(ConditionName.isFirstPlay) && conditions(ConditionName.hasFullScreenParams)) handleAutoFullScreen();\r\n    if (conditions(ConditionName.isFullScreen)) handleLockOrientation();\r\n}\r\n\r\nexport const handleStaticVideoPlaying = (loadingDurationRef: any, initialWaitingDurationRef: any, timerRef: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { firstPlay } = store.getState().controller;\r\n    dispatch(setIsLoading(false));\r\n    if (firstPlay && !!videoTag().played) sendFluentLog(initLog(Math.round(loadingDurationRef.current), Date.now() - initialWaitingDurationRef.current, 0, Date.now() - timerRef.current, timerRef));\r\n    dispatch(setFirstPlay(false));\r\n};\r\n\r\nexport const handleStaticVideoTimeUpdate = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setCurrentTime(event.target.currentTime));\r\n    dispatch(setDuration(event.target.duration));\r\n}\r\n\r\nexport const handleStaticVideoCanPlay = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setIsLoading(false));\r\n    dispatch(setCanPlayVideo(true));\r\n}\r\n\r\nexport const handleStaticVideoLoadedData = (event: any) => {\r\n    event.preventDefault();\r\n    handleBufferedTime(event);\r\n}\r\n\r\nexport const handleStaticVideoEnded = (event: any) => {\r\n    const { params, watchedTime } = store.getState().videoData;\r\n    if (conditions(ConditionName.hasOnFinishedParams)) params.onFinished!();\r\n    event.preventDefault();\r\n    sendFluentLog(watchedTimeLog(watchedTime))\r\n}\r\n\r\n// ************* Quiz Video Tag Handlers ************* //\r\nexport const handleQuizVideoTimeUpdate = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setCurrentTime(event.target.currentTime));\r\n}\r\n\r\nexport const handleQuizVideoPlaying = (event: any) => {\r\n    const dispatch = store.dispatch;\r\n    event.preventDefault();\r\n    dispatch(setFirstPlay(false))\r\n}\r\n\r\n// ************* MultiLive Video Tag Handlers ************* //\r\nexport const handleMultiLiveManifestParsed = (hls: any) => hls.nextLevel = hls.levels.findIndex((level: any) => level.attrs.RESOLUTION!.split('x')[1].trim() === \"144\")\r\n\r\nexport const handleMultiLiveMediaAttached = async (Hls: any, hls: any) => {\r\n    const { multiLives } = store.getState().videoData;\r\n    const { stream_link } = await getLiveAndVodDetails(multiLives[0].user_id);\r\n    hls.loadSource(stream_link);\r\n    hls.on(Hls.Events.MANIFEST_PARSED, () => handleMultiLiveManifestParsed(hls));\r\n}\r\n\r\nexport const handleMultiLiveFragLoading = async (hls: any) => {\r\n    const dispatch = store.dispatch;\r\n    if (conditions(ConditionName.isLiveParam)) dispatch(setHlsLivePosition(hls.liveSyncPosition));\r\n}\r\n\r\n\r\n\r\nexport const handleVideoVisibilityChange = (hls:any) => {\r\n    if (conditions(ConditionName.isLiveParam)) {\r\n        if (document.hidden) hls.stopLoad();\r\n        else hls.startLoad();\r\n    }\r\n}\r\n","import { conditions } from \"../../helpers/conditions/conditions\";\r\nimport {handleHasXTokenParamOrSendXToken, responseValidator} from \"../../helpers/helpers\";\r\nimport { ConditionName, UserQuizStatus } from \"../../interfaces/enums\";\r\nimport { IQuizQuestions, IUserQuestions, IQuizUserRecords, QuizType, IQuizChoice } from \"../../interfaces/interfaces\";\r\nimport { apiCaller } from \"../../services/apiCaller\";\r\nimport { API } from \"../../services/services\";\r\nimport store from \"../store\";\r\nimport { setChances, setMaxChances, setUserAnswerId, setUserQuestionId, setUserQuestions, setUserStatus } from \"../slices/quizSlice\";\r\nimport { toast } from \"mobin-toast\";\r\n\r\nexport const handleHashInLocalStorage = (hash:string) => localStorage.setItem(\"quiz-hash\",hash);\r\n\r\nexport const handleSelectedAnswer = async (answerId:number, setShowSpinner: (value:undefined | number) => void) => {\r\n    setShowSpinner(answerId);\r\n    const dispatch = store.dispatch;\r\n    const { quiz } = store.getState().quiz;\r\n    let quizHash: any = localStorage.getItem(\"quiz-hash\");\r\n    const answer = {\r\n        quiz: {\r\n            id: quiz.id,\r\n            questions: [{ id: lastQuizQuestionId(quiz), choices: [{ id: answerId }] }],\r\n        },\r\n        encrypted_quiz: quiz.encrypted_quiz,\r\n        hash: quizHash ?? undefined\r\n    }\r\n    const { data, status } = await apiCaller({ url: API().live.quiz, method: \"POST\", data: answer, headers: handleHasXTokenParamOrSendXToken() });\r\n    if(responseValidator(status)) {\r\n        handleHashInLocalStorage(data.hash);\r\n        dispatch(setUserAnswerId(answerId));\r\n    } else if (data) toast({ type: \"error\", title: \"درخواست منقضی شده است.\" });\r\n    setShowSpinner(undefined);\r\n}\r\nexport const firstQuizQuestion = (quiz: QuizType) => quiz.questions[0];\r\nexport const firstQuizQuestionId = (quiz:QuizType) => firstQuizQuestion(quiz).id;\r\n\r\nexport const lastQuizQuestion = (quiz: QuizType, general?: boolean) => (!!general ? quiz.questions[quiz.number_of_questions - 1] : quiz.questions[quiz.questions.length - 1]);\r\nexport const lastQuizQuestionId = (quiz:QuizType, general?: boolean) => {\r\n    const result = lastQuizQuestion(quiz, general);\r\n    if(result) return result.id;\r\n    else return 0\r\n};\r\nexport const lastQuizQuestionStatus = (quiz: QuizType) => quiz.questions.length ? lastQuizQuestion(quiz).status : undefined;\r\nexport const lastQuizQuestionChoices = (quiz:QuizType) => lastQuizQuestion(quiz).choices;\r\nexport const lastQuizQuestionOrder = (quiz:QuizType) => lastQuizQuestion(quiz).order;\r\nexport const lastQuizQuestionText = (quiz:QuizType) => lastQuizQuestion(quiz).text;\r\nexport const findParticipantsInEliminationQuiz = (quiz: QuizType) => firstQuizQuestion(quiz).choices.find((choice: any) => choice.is_correct === true)!.participants;\r\nexport const findCorrectQuizAnswer = (quiz: QuizType) => lastQuizQuestion(quiz).choices.find((choice: any) => choice.is_correct === true)!;\r\n\r\nexport const handleUserStatus = (chance?: number) => {\r\n    if(!conditions(ConditionName.isLogin)) return UserQuizStatus.viewer;\r\n    else if(conditions(ConditionName.isPointsQuiz)) return UserQuizStatus.participant;\r\n    else return chance !== undefined && chance > 0 ? UserQuizStatus.participant : UserQuizStatus.loser;\r\n}\r\nexport const handleCurrentQuestion = (data: IQuizUserRecords) => {\r\n    const dispatch = store.dispatch;\r\n    const { quiz } = store.getState().quiz; \r\n    const currentQuestionIdInAggregate = handleCurrentQuestionInAggregate(quiz).id;\r\n    const currentUserQuestion = data.question.find((item: IUserQuestions) => +item.id === currentQuestionIdInAggregate);\r\n    dispatch(setUserQuestionId(currentUserQuestion ? +currentUserQuestion.id : 0));\r\n    return currentUserQuestion ?? {}\r\n}\r\n\r\nexport const handleCurrentQuestionInAggregate = (quiz: QuizType) => quiz.questions[quiz.questions.length - 1];\r\n\r\nexport const handleUserAnswerId = (data: IQuizUserRecords) => {\r\n    const question: any = data.question ? handleCurrentQuestion(data) : {};\r\n    if(Object.keys(question).length) return +question.choice.id;\r\n    else return 0;\r\n}\r\n\r\nexport const handleCorrectAnswer = () => {\r\n    const {quiz} = store.getState().quiz;\r\n    return handleCurrentQuestionInAggregate(quiz).choices.find((choice: any) => choice.is_correct === true)!;\r\n}\r\n\r\nexport const handleUserAnswersCount = () => {\r\n    const { userQuestions } = store.getState().quiz;\r\n    return userQuestions.length;\r\n}\r\n\r\nexport const handleUserCorrectAnswersCount = (userQuestions:IUserQuestions[]) => {\r\n    const { quiz } = store.getState().quiz;\r\n    let userCorrectAnswerCounts = 0;\r\n    if(userQuestions.length) {\r\n        quiz.questions.map((question: IQuizQuestions) => {\r\n            const correctChoice = question.choices.find((choice:IQuizChoice) => choice.is_correct === true);\r\n            if(correctChoice && userQuestions.find((question:IUserQuestions) => +question.choice.id === correctChoice.id)) userCorrectAnswerCounts +=1;\r\n        });\r\n    }\r\n    return userCorrectAnswerCounts;\r\n}\r\n\r\nexport const isUserAnswerFirstQuestion = () => {\r\n    const { quiz, userQuestions } = store.getState().quiz;\r\n    const isUserAnswerFirstQuestion = userQuestions.find((question: IUserQuestions) => +question.id === quiz.questions[0].id);\r\n    return !!isUserAnswerFirstQuestion;\r\n}\r\n\r\nexport const isUserAnswerLastQuestion = () => {\r\n    const { quiz, userQuestions } = store.getState().quiz;\r\n    const isUserAnswerLastQuestion = !!quiz.questions[quiz.number_of_questions - 1] && userQuestions.find((question: IUserQuestions) => +question.id === quiz.questions[quiz.number_of_questions - 1].id);\r\n    return !!isUserAnswerLastQuestion;\r\n}\r\n\r\nexport const handleUserChancesCount = (userQuestions: IUserQuestions[]) => {\r\n    const dispatch = store.dispatch;\r\n    const { quiz, maxChances } = store.getState().quiz;\r\n    const quizQuestionsCount = quiz.questions.length;\r\n    let chancesCount = maxChances + 1;\r\n    if (quizQuestionsCount === 1 && lastQuizQuestionStatus(quiz) !== 1) {\r\n        if (!userQuestions || (userQuestions && handleUserCorrectAnswersCount(userQuestions) === 0)) chancesCount = chancesCount - 1; \r\n    }\r\n    else {\r\n        if (lastQuizQuestionStatus(quiz) === 1) {\r\n            if (userQuestions) chancesCount = chancesCount - ((quizQuestionsCount - 1) - handleUserCorrectAnswersCount(userQuestions));\r\n            else chancesCount = chancesCount - (quizQuestionsCount - 1)\r\n        } else {\r\n            if (userQuestions) chancesCount = chancesCount - (quizQuestionsCount - handleUserCorrectAnswersCount(userQuestions));\r\n            else chancesCount = chancesCount - quizQuestionsCount\r\n        }\r\n    }\r\n    dispatch(setChances(chancesCount));\r\n    return chancesCount;\r\n}\r\n\r\nexport const handleUserRecordesEliminationQuiz = async (quiz:any) => {\r\n    const dispatch = store.dispatch;\r\n    const { data, status } = await apiCaller({ url: API().live.quizUserRecoreds(quiz.type, quiz.id), data: { encrypted_quiz: quiz.encrypted_quiz }, headers: handleHasXTokenParamOrSendXToken() });\r\n    if (responseValidator(status) && data && Object.keys(data).length) {\r\n        dispatch(setUserAnswerId(handleUserAnswerId(data)));\r\n        dispatch(setMaxChances(data.max_chance));\r\n        dispatch(setUserStatus(handleUserStatus(handleUserChancesCount(data.question))));\r\n    }\r\n}\r\n\r\nexport const handleUserRecordesPointsQuiz = async (quiz: any) => {\r\n    const dispatch = store.dispatch;\r\n    const { data, status } = await apiCaller({ url: API().live.quizUserRecoreds(quiz.type, quiz.id), data: { encrypted_quiz: quiz.encrypted_quiz }, headers: handleHasXTokenParamOrSendXToken() });\r\n    if (responseValidator(status) && data && Object.keys(data).length) {\r\n        dispatch(setUserAnswerId(handleUserAnswerId(data)));\r\n        dispatch(setUserStatus(handleUserStatus()));\r\n        if (data.question) dispatch(setUserQuestions(data.question));\r\n    }\r\n}\r\n\r\nexport const handleQuizParticipantsPerQuestion = () => {\r\n    const { quiz } = store.getState().quiz;\r\n    let participantsCount = 0;\r\n    lastQuizQuestionChoices(quiz).map((choice:IQuizChoice) => participantsCount += choice.participants);\r\n    return participantsCount;\r\n}"],"mappings":"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","names":["require_next_config","__commonJSMin","exports","module","init_esm_shims","npmPackage_exports","__export","isNpmPackage","init_npmPackage","__esmMin","init_esm_shims","init_esm_shims","Cookies","envs","isNpmPackage","getStatus","getGetAggregatorApiLiveUrl","getSetAggregatorUrl","getRestApiLiveUrl","getRestApiUrl","getRestApiCommentUrl","getFluentdUrl","getEmojiUrl","getLoginZarebinUrl","getMagnix","getChatBaseUrl","uesrTracker","voucherAPI","getChatAPIUrl","ekrnAPIUrl","getLoginBaseUrl","getWhiteListTargets","getWhiteListGeneralUrlTargets","getIsCinemaHamrah","getIsSendToken","getInitialLoadedFragmentCount","getAccessToken","cookieKey","getCookieKey","cookieValue","Cookies","isNpmPackage","envs","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","LiveDelay","LiveWindow","videoTag","conditions","multiLiveVideo","progressBar","progressBarWidth","store_default","footerPadding","seenPoll","livePoll","init_esm_shims","axios","getLimit","apiCaller","url","method","data","headers","retryCount","maxRetryCount","errorMessage","retryPolicy","axiosConfig","store_default","axios","error","generateNewAccessToken","newHeader","getAccessToken","newRetryCount","wait","newRetryDelay","newMaxRetryCount","i","get","event","params","lang","auth","generatedUrl","newParams","key","status","response","err","getAll","path","resolve","reject","limit","count","requestCount","promises","offset","promise","res","results","item","anonConfigGenerator","newAnonConfig","updateAnonConfig","getAnonConfig","init_esm_shims","API","params","details","store_default","bookmarkId","getRestApiLiveUrl","getGetAggregatorApiLiveUrl","getSetAggregatorUrl","getEmojiUrl","quizType","quizId","roomId","getChatAPIUrl","getChatBaseUrl","videoType","content_id","urlData","conditions","getRestApiUrl","v","getLoginBaseUrl","id","getRestApiCommentUrl","commentId","getMagnix","uesrTracker","handleVideoType","markerId","getFluentdUrl","voucherAPI","ekrnAPIUrl","voucherId","vpId","uid","getApiUrls","apiUrl","apiMarkerUrl","type","init_esm_shims","init_esm_shims","init_esm_shims","toast","init_esm_shims","init_esm_shims","feedbackLog","starNum","reasons","customText","params","details","store_default","conditions","eventMarkerClickLog","markerId","markerTime","markerTitle","markerDescription","markerSticker","speedChangeLog","selectedSpeed","settings","qualityChangeRequestLog","selectedQuality","qualityLevels","manualQuality","autoQuality","catchUpLoadingLog","duration","hlsLiveSyncPosition","shareDialogLog","videoTime","isJump","jumpTime","eventMarkerId","shareCopyLog","EventMarker","alternativeLiveLog","alternativeLiveUserId","deActiveSettingLog","data_base","backwardForwardLog","type","pollModalCloseLog","pollId","tagClickLog","tagText","likeDislikeLog","category","fullscreenLog","brightnessLog","source","target","volumeLog","subtitleLog","language","lockLog","recommendationListLog","targetVideoId","targetUserId","targetType","listIndex","detailErrorLog","error","videoTimelineLog","start","end","params","details","store_default","duration","conditions","getUUID","bookmarkLog","category","autoQualityChangeLog","sourceQuality","targetQuality","diffQuality","pingpongLog","startTimer","qualityHistory","pausePlayLog","isPlay","initLog","loadingTime","waitingTime","bannerLoadingTime","firstChunkPlayingTime","timerRef","totalTime","memory","timing","flattenObject","loadingLog","waitingDuration","qualityLevel","loadingCounterRef","videoEntranceTime","hlsLiveSyncPosition","settings","videoTime","videoTag","previousLoaderDiff","errorLog","error","watchedTimeLog","watchedSeconds","playListClickLog","playlistId","videoOfPlaylistClickLog","videoId","videoType","videoIndex","searchLog","contentType","selectedTags","inputTagSearch","searchResultClickLog","handleContentType","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","init_esm_shims","useEffect","useRef","shallowEqual","useActiveInActive","isRightDoubleTouched","isLeftDoubleTouched","dispatch","useAppDispatch","activeElements","useAppSelector","timeoutRef","useRef","isRightDoubleTouchedRef","isLeftDoubleTouchedRef","useEffect","shouldInActiveElements","handlePointerMove","event","isEnded","store_default","setActiveElements","settingPopover","markersListPopover","speedPopover","play","activeElementsTime","handleTouchStart","firstPlay","isTouchScreen","checkParentTarget","handleTouchMove","videoArea","useActiveInActive_default","init_esm_shims","useEffect","shallowEqual","useBackButton","useAppSelector","markersListPopover","settingPopover","sharePopover","feedbackPopover","multiLivesPopover","pollPopover","autoPlayPopover","recommendListPopover","tagsPopover","speedPopover","playListPopover","playListCardPopover","commentPopover","personalMarkersPopover","bookmarksPopover","chatPopover","chatEmojisPopover","trailerPopover","loginPopover","preFactorPopover","useEffect","handleClickButton","searchParams","type","id","handleClickVideoCard","useBackButton_default","init_esm_shims","useEffect","shallowEqual","init_esm_shims","init_esm_shims","handleContinuousPlayback","videoSettings","store_default","params","type","isLogin","conditions","currentTime","videoTag","duration","viewedVideo","handleVideoType","viewedVideosInLocalStorage","viewedVideos","video","createVideoSettings","handleApplyContinuousPlayback","dispatch","setVideoSettings","handleShowContinuousVideo","event","handlePlayPause","handleVideoTimeline","setShowContinuousePlayback","handleGoToFirstVideo","useBeforeUnload","useAppSelector","isLogin","shallowEqual","useEffect","handleBeforeUnload","watchedTime","store_default","sendFluentLog","watchedTimeLog","handleVideoTimeline","videoTag","handleContinuousPlayback","useBeforeUnload_default","init_esm_shims","useEffect","shallowEqual","useFullScreen","dispatch","useAppDispatch","useAppSelector","params","useEffect","handleChangeFullScreen","setIsFullScreen","handleVideoElementSizeInfo","sendFluentLog","fullscreenLog","handleIsComplexDesktop","conditions","setIsComplexDesktop","useFullScreen_default","init_esm_shims","init_esm_shims","useEffect","useRef","useKeyPress","key","cb","callbackRef","useRef","useEffect","handleKeyPress","event","conditions","useKeyPress_default","useHandleKeyPress","dispatch","useAppDispatch","useKeyPress_default","event","conditions","handlePlayPause","handleBackwardForward","videoTag","handleFullScreen","handleLock","handleSubtitle","handleClickRecommendationCard","handleClickVideoCard","multiLivesPopover","store_default","setMultiLivesPopovers","markersListPopover","setClearPopoversSlice","setMarkersListPopover","setActiveElements","speedPopover","setSpeedPopover","settings","handleChangeSoundVolume","useHandleKeyPress_default","init_esm_shims","useTheme","useLayoutEffect","init_esm_shims","Cookies","toast","createSettings","settings","conditions","apiCaller","API","handleHasXTokenParamOrSendXToken","createVideoSettings","videoSettings","params","details","store_default","handleVideoType","handleBookmark","event","id","type","dispatch","bookmarks","bookmarkId","status","responseValidator","setBookamrks","bookmark","setBookmarkId","sendFluentLog","bookmarkLog","bookmarkData","data","handleVoucherInParams","voucherCode","voucherTokenInCookie","Cookies","setVoucherToken","setGetDetailsFromVoucher","handleSendVoucher","setShowVoucherPopup","getLiveAndVodDetails","authToken","value","captchaStorageLogin","captchaStorageCode","shallowEqual","useHandleParams","query","token","params","useAppSelector","isClickInnerCard","setTheme","useTheme","dispatch","useAppDispatch","handleTokenParams","setIsReady","handleVoucherInParams","handleTheme","queryParams","theme","setPlayerParams","handleFeatureSet","featureSet","strToObj","handleAddUUID","handleLiveAndVodParams","conditions","setIsComplexDesktop","setIsComplexPortrait","handleIsComplexPortrait","handleStaticParams","eUrl","eCover","getUUID","useLayoutEffect","staticFormats","useHandleParams_default","init_esm_shims","useEffect","shallowEqual","useHandleScroll","useAppSelector","params","showMiniPlayer","useEffect","store_default","handleScroll","conditions","dispatch","setShowMiniPlayer","scrollElement","useHandleScroll_default","init_esm_shims","useEffect","useOnClickOutside","ref","handler","listener","event","useOnClickOutside_default","init_esm_shims","init_esm_shims","useEffect","useState","shallowEqual","useGetAggregat","dispatch","useAppDispatch","isLiveError","useAppSelector","params","loadedFragmentsCount","getGeneralData","intervalIds","intervalTime","setActiveApiRequest","setIntervalIds","intervalIdTemp","intervalId","prev","onlineViewerActiveApiRequest","setOnlineViewerActiveApiRequest","useState","onlineViewerIntervalIds","setOnlineViewerIntervalIds","onlineViewerIntervalTime","setOnlineViewerIntervalTime","getDataActiveApiRequest","setGetDataActiveApiRequest","getDataIntervalIds","setGetDataIntervalIds","getDataRetryCount","setGetDataRetryCount","RetryCountGeneralDataFetch","getDataIntervalTime","setGetDataIntervalTime","postDataActiveApiRequest","setPostDataActiveApiRequest","postDataIntervalIds","setPostDataIntervalIds","postDataIntervalTime","setPostDataIntervalTime","useEffect","manualPostAPI","manualGetOnlineViewerIntervalAPI","manualGetDataIntervalAPI","clearIntervalIdsHandler","RetryTimeDelayGeneralDataFetch","ids","setIds","id","conditions","firstGetDataIntervalAPI","useGetAggregat_default","init_esm_shims","useEffect","shallowEqual","useGetDetails","dispatch","useAppDispatch","params","token","isLiveError","useAppSelector","getDetailsFromVoucher","shallowEqual","isEnded","useEffect","conditions","checkIsFreeContent","setCinemaHamrahState","setGetDetailsFromVoucher","handleCinemaHamrahStates","getLiveAndVodDetails","interval","livePlayRetryDuration","useGetDetails_default","init_esm_shims","useEffect","shallowEqual","useGetMarkers","dispatch","useAppDispatch","params","isFetchDetails","useAppSelector","isLogin","loadedFragmentsCount","useEffect","conditions","response","getAllGeneralMarker","getApiUrls","data","status","getAllPersonalMarkers","API","responseValidator","combinedMarkers","m","setMarkers","compare","useGetMarkers_default","init_esm_shims","useEffect","shallowEqual","useGetPlayList","dispatch","useAppDispatch","isFetchDetails","useAppSelector","shallowEqual","loadedFragmentsCount","useEffect","conditions","data","status","getPlaylistHeader","API","responseValidator","playListVideos","result","singlePlayList","setPlayList","useGetPlayList_default","init_esm_shims","useEffect","shallowEqual","useGetProfile","dispatch","useAppDispatch","xToken","useAppSelector","isFetchDetails","useEffect","conditions","data","status","apiCaller","API","responseValidator","setUserInfo","setUserStatus","useGetProfile_default","init_esm_shims","useEffect","shallowEqual","useGetRecommendationList","dispatch","useAppDispatch","isFetchDetails","useAppSelector","params","loadedFragmentsCount","useEffect","conditions","data","status","apiCaller","API","responseValidator","setRecommendationList","useGetRecommendationList_default","init_esm_shims","useEffect","shallowEqual","useUserSettings","disptach","useAppDispatch","isLogin","useAppSelector","isFetchDetails","useEffect","conditions","data","status","apiCaller","API","handleHasXTokenParamOrSendXToken","responseValidator","setUserSettings","useUserSettings_default","init_esm_shims","useEffect","shallowEqual","useVideoSettings","dispatch","useAppDispatch","params","isFetchDetails","useAppSelector","shallowEqual","isLogin","useEffect","conditions","data","status","apiCaller","API","handleHasXTokenParamOrSendXToken","responseValidator","setVideoSettings","handleApplyContinuousPlayback","bookamrkData","bookmarkStatus","setBookamrks","item","queryParams","setBookmarkId","useVideoSettings_default","init_esm_shims","useEffect","shallowEqual","useWebListConfig","params","token","isLiveError","useAppSelector","useEffect","get","response","status","responseValidator","store_default","setWebListConfig","API","useWebListConfig_default","useGetData","useGetDetails_default","useGetProfile_default","useGetAggregat_default","useGetMarkers_default","useGetPlayList_default","useGetRecommendationList_default","useUserSettings_default","useVideoSettings_default","useWebListConfig_default","useGetData_default","init_esm_shims","useEffect","useState","shallowEqual","usePingPong","qualityLevel","qualityHistory","setQualityHistory","useState","startTimer","setStartTimer","qualityLevels","useAppSelector","useEffect","newQualityArray","sendFluentLog","autoQualityChangeLog","pingpongLog","usePingPong_default","init_esm_shims","useEffect","useRouter","useRouteChange","router","useRouter","useEffect","handleRouteChange","store_default","videoTag","searchParams","type","id","handleClickVideoCard","useRouteChange_default","init_esm_shims","useEffect","useRef","shallowEqual","useWatchingDuration","watchedDurationRef","useRef","dispatch","useAppDispatch","duration","currentTime","useAppSelector","shallowEqual","counter","useEffect","handleUpdateWatchedDuration","index","setWatchedTime","useWatchingDuration_default","sendFluentLog","data","poll_emoji","store_default","params","details","_data","getUUID","conditions","featureToggle","apiCaller","API","axios","handlePlayPause","event","dispatch","store_default","videoTag","setPlay","handlePlayPauseInDOM","type","handleChangeSoundVolume","volume","settings","setUserSettings","conditions","handleIsLive","hlsLiveSyncPosition","handleVideoTimeline","setCurrentTime","progressBar","setIsLive","timer","sendFluentLog","catchUpLoadingLog","handleBackwardForward","forwardBackwardCount","backwardForwardLog","currentTime","handleFullScreen","isFullScreen","setClearPopoversSlice","fullscreenLog","setIsFullScreen","setIsComplexPortrait","handleLockOrientation","handleLock","setLock","lockLog","currentTimeValue","movedTimeValue","videoTimelines","movedTime","setVideoTimelines","apiCaller","API","videoTimelineLog","handleSnapShot","setLoading","canvas","video","imgData","data","status","responseValidator","file","convertB64ToFile","response","axios","utf8_to_b64","handleVideoElementSizeInfo","element","setVideoElementSizeInfo","handleClickVideoCard","videoId","videoType","isBackButtonClick","watchedTime","params","xToken","recommendationVideo","findFirstVideoInRecommendationList","id","watchedTimeLog","handleContinuousPlayback","clearRedux","setPlayerParams","setXToken","setIsClickInnerCard","Cookies","init_esm_shims","init_esm_shims","detailAPI","id","getDetailsFromVoucher","params","store_default","API","getApiUrls","detailsConfig","liveDetailsConfig","userId","org","nonLiveDetailsConfig","hasIsAuthInParams","token","hasQuestionMark","hasHInParams","getAccessToken","hasVoucherToken","voucherToken","isCinemaHamrahEnvironment","handleDetailsConfig","conditions","videoViewCount","contentId","apiCaller","API","getUUID","handleDetailsInLive","details","dispatch","store_default","setLiveId","setIsLive","setIsLiveError","conditions","detailSetter","LiveDelay","getLiveAndVodDetails","userId","status","handleDetailsConfig","responseValidator","appendQueryParamsToChunks","weighted_random","error","params","sendFluentLog","detailErrorLog","handlePageTitle","setIsFetchDetails","setErrorType","Cookies","handleSendVoucher","setShowVoucherPopup","setIsValidAddress","data","setInfo","addUuidToSrc","manualGeneralErrorResponseHandler","retryCount","dispatch","setRetryCount","intervalIds","setIntervalIds","errorDetail","requestType","RetryCountGeneralDataFetch","id","firstGetDataIntervalAPI","setIntervalTime","setOnlineViewerIntervalTime","setPostDataIntervalTime","params","store_default","roomId","chatEnabled","socket","showChat","data","status","apiCaller","API","responseValidator","setConfig","setEmojis","setOnlineViewers","setQuestion","setAlternative_Lives","setMarkers","compare","setGif","roomIdTemp","_data","_status","setMessages","setChatEnabled","setRoomId","setChatType","setChatPopover","setQuiz","points","window","setChartPoints","livePoll","RetryTimeDelayGeneralDataFetch","manualGetDataIntervalAPI","intervalTime","manualPostAPI","selectedOptionId","emojiList1","emojiList2","details","conditions","manualPostData","postEmojiPoll","setEmojiList1","setEmojiList2","setSelectedOptionId","manualGetOnlineViewerIntervalAPI","handleSubtitle","subtitles","selectedSubtitle","faSubtitle","subtitle","videoTag","textTrack","setSubtitleText","setSelectedSubtitle","sendFluentLog","subtitleLog","handleClickRecommendationCard","event","videoId","userId","videoType","listIndex","handleRipple","recommendationList","handleVideoTimeline","recommendationListLog","combinedMarkers","personalMarkers","publicMarkers","tempMarker","m","handlePlayListTabClick","playList","setPlayListPopover","playListClickLog","handleVideoOfPlaylistClick","playlistId","videoIndex","videoOfPlaylistClickLog","handleContentType","isMovieFilter","isSeriesFilter","contentType","findFirstVideoInRecommendationList","recommendationVideo","item","getPlaylistVideos","selectedPlaylist","offset","getAllGeneralMarker","url","getAll","getAllPersonalMarkers","handleHasXTokenParamOrSendXToken","submitChatComment","getAllChatMessages","getCommentList","submitComment","getPlayListCards","getPlaylistHeader","io","handleGetUsersInChat","user_ids","data","status","apiCaller","API","responseValidator","submitCommentInChat","message","setInputValue","roomId","chatType","store_default","userId","_data","submitChatComment","toast","fetchChatMessage","offset","setScrollEnd","messages","messageCount","dispatch","getAllChatMessages","messChat","setMessageCount","handleFirstTimeChatRoomMessage","handleConnectSocket","socket","setSocket","handleChatRoomMessage","usersInfoInChat","setMessages","user","userInfoData","setUsersInfoInChat","item","init_esm_shims","toast","checkIsFreeContent","status","apiCaller","API","responseValidator","checkMciVoucherToken","dispatch","store_default","data","setVoucherToken","handleCinemaHamrahStates","result","setCinemaHamrahState","setGetDetailsFromVoucher","getLiveAndVodDetails","handleNonMCILogin","authTokenValue","authToken","response","userInfo","setUserInfo","handleUserValidVouchersList","setLoginPopover","handlePubVoucherToken","setPreFactorPopover","voucherId","handlePaymentRequest","vpId","setIsLoading","params","handleConfirmPayment","setFactor","handlePlayVideoInFactor","factor","deleteQueryParamsInUrl","setPlayerParams","handleRetryPayment","init_esm_shims","toast","checkCanComment","dispatch","store_default","details","data","status","apiCaller","API","responseValidator","setCanAddComment","setCanShowSubmittedComment","setCommentsCount","setCommentsCountPagination","handleGetComments","offset","setScrollEnd","comments","usersCommentsProfiles","getCommentList","setComments","setUsersCommentsProfiles","handleGetUsersComments","handleGetReplies","commentId","replies","setReplies","usersRepliesProfiles","setUsersRepliesProfiles","realTimeReply","get","handleSubmitComment","inputValue","setInputValue","selectedEmoji","setSelectedEmoji","type","setShowReplyBox","replyToAuthor","xToken","conditions","commentData","submitComment","setRealTimeReply","toast","setReplyToAuthor","usersProfiles","usersCommentsIds","comment","handleCommentsIdsInLocalStorage","commentsLikeUnlike","params","currentVideo","handleLikeUnlikeComment","likeStatus","setLikeStatus","likeCount","setLikeCount","getUUID","filteredVideos","filteredComments","handleCloseCommentPopover","setCommentPopover","init_esm_shims","getPointerTime","event","type","videoElementSizeInfo","store_default","duration","hlsLiveSyncPosition","durationValue","conditions","clientX","footerPadding","timePositionX","getPointerPosition","getMarkerPosition","markerTime","progressBarWidth","hideProgressTooltip","progressTooltip","generalStyleTooltipHandler","vttTooltipStyleHandler","element","parentPlayer","videoTag","showProgressTooltip","progressBarTooltip","setTooltipTime","secondsToHMS","handleTimeTooltip","isTimer","handleProgressTime","progressBar","handlePointerDown","timeoutIds","setIsPointerDown","dispatch","setActivePointerProgressBar","setDelayTurnOffControlbar","id","handlePointerMove","activePointerProgressBar","left","handlePointerUp","setTimeoutIds","right","currentTime","handleVideoTimeline","handleTimeout","ids","timeoutIdTemp","settingPopover","markersListPopover","delayTurnOffControlbar","setActiveElements","activeElementsTime","handleCatchUpLoadingLog","timer","sendFluentLog","catchUpLoadingLog","handleMouseMove","handleMouseOut","deconstructTimestamp","timestamp","splitStampMilliseconds","timePartsSplit","getSecondsFromTimestamp","timestampParts","getPropsFromDef","def","imageDefSplit","imageUrl","splitCoords","getFullyQualifiedUrl","path","base","getVttCss","vttImageDef","vttUrl","cssObj","baseSplit","imageProps","fetchFile","url","setVttPool","response","setInfo","data","processedVtts","vttDef","vttDefSplit","vttTimingSplit","vttTimeStart","vttTimeEnd","vttCssDef","error","getStyleForTime","time","vttPool","cache","i","item","objectVtt","init_esm_shims","getFitMaxNumberCard","handleGetTags","scrollEnd","setScrollEnd","listScrolled","setListScrolled","details","params","store_default","selectedTags","inputTagSearch","get","response","status","responseValidator","API","conditions","handleClickTag","setVideoCount","setLoadingGetTags","dispatch","contentType","handleContentType","sendFluentLog","searchLog","setTagsPopover","handleClickPlayerCardTag","event","tag","setPlayListCardPopover","setSelectedTags","tagClickLog","getAllViewersTagList","resolve","data","getAll","handleViewersTagList","results","viewersTagList","result","setViewersTagsList","handleCloseTagPopover","setInputTagSearch","setIsMovieFilter","setIsSeriesFilter","setInputFilterTagSearch","handleTagInput","inputValue","setTagInputLoading","tagInputTimeoutRef","handleCloseSelectedTags","viewersTagsList","selectedTag","handleClickViewersTagList","viewerTag","handleClearTagInput","handleNextTag","tagsContainerRef","handlePrevTag","handleScrollLeft","tagId","element","handleScrollRight","handleSearchResultClick","video","playListCardInfoRef","videoId","videoType","videoIndex","handleRipple","searchResultClickLog","init_esm_shims","handleAutoFullScreen","dispatch","store_default","params","launchFullScreen","element","setClearPopoversSlice","setIsFullScreen","conditions","setIsComplexDesktop","setIsComplexPortrait","appendQueryParamsToChunksIOS","fragmentExtension","originalOpen","getUUID","handleBufferedTime","event","bufferedTimeWidth","videoTag","setBufferedTimeWidth","handleHlsConfig","streamLinkParams","xhr","url","LiveDelay","handleMultiLiveHlsConfig","handleManifestParsed","hls","data","qualityLevels","qualityBitrates","resolutions","level","highestResolutionSupported","justAudio","setQualityLevels","setQualityBitrates","eventType","sortedAudioTracks","a","setMultiAudio","handleManifestLoaded","handleMediaAttached","Hls","details","ads","streamLink","handleLevels","setQualityLevel","settings","manualQuality","autoQuality","setAutoQuality","setManualQuality","setUserSettings","createSettings","handleFragBuffered","getInitialLoadedFragmentCount","setLoadedFragmentsCount","handleFragLoading","setHlsLivePosition","handleFragChanged","multiAudio","selectedAudioId","handleFragParsed","type","handleHlsErrors","setIsManifestError","handlePreview","previewStart","previewEnd","setCurrentTime","handleVideoWaiting","waitingTimerRef","setIsLoading","handleVideoSeeking","handleVideoPlay","timerRef","videoSettings","setPlay","handleLockOrientation","setVideoTimelines","sendFluentLog","pausePlayLog","setSubtitleText","handleVideoPlaying","loadingCounterRef","loadingDurationRef","initialWaitingDurationRef","bannerLoadingDurationRef","waitingDurationRef","videoEntranceTimeRef","canPlayVideo","firstPlay","qualityLevel","waitingDuration","initLog","setFirstPlay","loadingLog","handleVideoPause","handleVideoTimeUpdate","selectedSubtitle","handleVideoCanPlay","setCanPlayVideo","setDuration","subtitle","setSubtitles","handleVideoEnded","watchedTime","setIsLiveError","setIsEnded","setActiveElements","watchedTimeLog","handleVideoTimeline","handleVideoError","errorLog","handleIosVideoPlay","handleIosVideoPlaying","handleIosVideoTimeUpdate","handleIosVideoEnded","handleStaticVideoPause","handleStaticVideoPlay","handleStaticVideoPlaying","handleStaticVideoTimeUpdate","handleStaticVideoCanPlay","handleStaticVideoLoadedData","handleStaticVideoEnded","handleMultiLiveManifestParsed","hls","level","handleMultiLiveMediaAttached","Hls","multiLives","store_default","stream_link","getLiveAndVodDetails","handleMultiLiveFragLoading","dispatch","conditions","setHlsLivePosition","handleVideoVisibilityChange","wait","s","resolve","getRemainingTime","timestamp","timePassedInSeconds","rtf","compare","a","b","handlePageTitle","title","conditions","getUUID","uuid","uuidGenerator","char","val","isTouchScreen","isTouchScreenLandscape","videoElementSizeInfo","store_default","isFullScreen","isTouchScreenPortrait","handleIsComplexDesktop","isPortrait","isIOS","addZeroBefore","n","secondsToHMS","seconds","h","m","secondsToPersianHMS","second","minute","item","efficientSecondsToPersianHMS","staticFormats","realFormat","addUuidToSrc","src","urlObject","urlSrc","handleSumVotes","question","sumVotes","option","livePoll","poll","checkParentTarget","event","target","unitization","viewers","handleNotActiveText","errorType","isVoted","qid","isSelectedOption","oid","appendQueryParamsToChunks","link","dispatch","token","params","queryParams","hasQuestionMark","setStreamLinkParams","inViewPort","element","positionLeft","positionRight","handleIsComplexPortrait","isFullMobilePortrait","handleRippleCircle","id","circle","ripple","handleRipple","size","clientX","clientY","utf8_to_b64","text","changeVideoUrl","videoType","videoId","recommendationVideo","findFirstVideoInRecommendationList","type","responseValidator","status","generateNewAccessToken","authToken","data","apiCaller","API","convertB64ToFile","dataUrl","filename","arr","mime","bstr","u8arr","isWhiteListUrl","url","whiteListTargets","parseJwt","base64Url","base64","jsonPayload","c","handlePopoverSizeInMiniPlayer","numbersToLetters","handleVideoType","handleHasXTokenParamOrSendXToken","getWebEnvConfig","key","config","getDomainFromUrl","splitedUrl","clearRedux","setClearVideoDataSlice","setClearControllerSlice","setClearUserSlice","setClearTagsSlice","setClearPopoversSlice","setClearCommentsSlice","setClearChatSlice","weighted_random","options","i","weights","random","convertTimeToSeconds","time","imageFormatChecking","handlePageLoadTime","loadingDurationRef","pageLoadTime","highestResolutionSupported","resolutions","width","height","w","filteredResolutions","resolution","getSubtitleLabel","subtitleLanguage","label","getOS","macosPlatforms","windowsPlatforms","iosPlatforms","userAgent","platform","os","deleteQueryParamsInUrl","queryParam","handleRedirectCards","strToObj","hasPermissionToRedirect","setIsFetchDetails","redirect","escapeInput","redirectUrl","redirectOriginUrl","isWhiteListGeneralUrl","whiteListGeneralUrlTargets","setIsValidAddress","setErrorType","toOutput","str","arrayOfStrings","flattenObject","input","keyName","result","newKey","Cookies","init_esm_shims","toast","firstQuizQuestion","quiz","lastQuizQuestion","quiz","general","lastQuizQuestionStatus","quiz","lastQuizQuestion","conditions","type","trailer","ads","params","details","getDetailsFromVoucher","gif","isComplexPortrait","isComplexDesktop","markers","subtitles","question","emojis","onlineViewers","alternative_Lives","recommendationList","multiAudio","isLiveError","isValidAddress","isFetchDetails","token","selectedOptionId","emojiList1","emojiList2","selectedSubtitle","playList","isManifestError","videoElementSizeInfo","chartPoints","isReady","cinemaHamrahState","isAdBlockerActivate","store_default","firstPlay","lock","canPlayVideo","qualityLevels","manualQuality","activeElements","isLoading","isLive","isEnded","isAutoPlay","play","isFullScreen","autoQuality","showMiniPlayer","loadedFragmentsCount","trailerPopover","settingPopover","markersListPopover","sharePopover","feedbackPopover","multiLivesPopover","fullRatePopover","autoPlayPopover","recommendListPopover","speedPopover","tagsPopover","personalMarkersPopover","bookmarksPopover","chatPopover","loginPopover","preFactorPopover","chatEmojisPopover","commentPopover","playListCardPopover","playListPopover","pollPopover","canAddComment","canShowSubmittedComment","commentsCount","selectedTags","inputTagSearch","isLogin","settings","bookmarkId","avatar_url","name","phone_number","showVoucherPopup","voucherToken","videoSettings","showContinuousePlayback","xToken","chatEnabled","showChat","quiz","chances","isFullMobilePortrait","staticFormats","isIOS","isTouchScreenPortrait","justAudio","isTouchScreenLandscape","isTouchScreen","isWhiteListUrl","getStatus","getIsCinemaHamrah","popover","xTokenParams","getIsSendToken","container","Cookies","getInitialLoadedFragmentCount","getAccessToken","firstQuizQuestion","lastQuizQuestionStatus","whiteListTargets","getWhiteListTargets","whiteListGeneralUrlTargets","getWhiteListGeneralUrlTargets","sportBackBtnArea","activeElementsTime","showLoaderTime","livePlayRetryDuration","RetryCountGeneralDataFetch","RetryTimeDelayGeneralDataFetch","justAudio","footerPadding","conditions","featureToggle","sidebarWidth"]}