{"version":3,"sources":["context/CollectionContext.js","context/VideoContext.js","components/Suspense/Suspense.jsx","context/LayoutContext.js","utils/tracker.js","components/Loading/Loading.jsx","clientAPI.js","utils/const.js","context/UserContext.js","utils/common.js","utils/sentry.js","themes/default.js","themes/index.js","components/ScrollToTop.js","components/PageTabID.js","components/PlatformInfo.js","components/UserInfo.js","components/ReleaseQuota.js","components/Track.js","components/App.js","serviceWorker.js","context/WatchHistoryContext.js","context/TempContext.js","context/OtherContext.js","index.js","axios.js"],"names":["CollectionStateContext","React","createContext","CollectionDispatchContext","initialState","creatingDialogFromVideoColDialog","createdColID","selected","videoSelected","collections","collectionReducer","state","action","type","payload","newCollectionId","cid","vid","name","videos","console","log","origin","get","newId","isEmpty","maxBy","id","created_date","format","Date","filter","collection","indexOf","map","uniq","e","isArray","Error","CollectionProvider","children","useReducer","dispatch","Provider","value","useCollectionState","context","useContext","undefined","useCollectionDispatch","VideoStateContext","VideoDispatchContext","videoReducer","url","src","trackIndex","hasQuota","playId","resetting","error","showControl","VideoProvider","videoType","forceUrl","play","useVideoState","useVideoDispatch","handlePlayMovie","isLogin","isTrailer","videoId","history","reserveQuota","setOpenLoginDialog","setOpenQuotaDialog","player","trackEvent","then","data","msg","token","has_quota","push","tracker","recordNoQuota","quotaCnt","quota_cnt","catch","err","handlePlayTrailer","VMSuspense","fallback","LayoutStateContext","LayoutDispatchContext","layoutReducer","isSidebarOpened","LayoutProvider","useLayoutState","useLayoutDispatch","toggleSidebar","GA","instance","a","isDev","GA4React","isInitialized","getGA4React","ga4react","GAID","initialize","trackPageView","pageview","setUserID","userId","gtag","user_id","login","pushInstruction","method","isPartner","category","customDimensions","resetSession","create","createInstance","urlBase","trackUrl","siteId","disabled","heartBeat","active","seconds","linkTracking","configurations","setSecureCookie","partnerLogin","setUserDetail","userName","userType","viewedVideoPage","tabId","watchedVideo","spent","currentTime","duration","playedVideo","pausedVideo","resumedVideo","seekedVideo","useStyles","makeStyles","theme","loading","position","left","right","top","margin","height","width","bottom","Loading","props","classes","className","getOption","getToken","timeout","headers","Authorization","fetcher","axios","res","fetcherWithToken","posterWithToken","post","getPlatformInfo","resetPassword","newPassword","new_password","recoveryPassword","email","createUserWatchHistory","video_id","video_type","Promise","resolve","getVideoInfo","option","apiUrl","getBaseUrl","createCollection","updateCollection","copyCollection","deleteCollection","bulkDeleteCollection","ids","updateCollectionVideos","collection_id","expected_ids","add_ids","delete_ids","updateVideoCollections","reject","getTabID","params","tid","releaseQuota","releaseQuotaByBeacon","text","JSON","stringify","navigator","sendBeacon","sendQuotaHeartBeat","checkUserValid","createUser","renewSubscribe","planId","getUserInfo","updateUserInfo","real_name","org_name","mobile","tel","birthday","downloadAttachment","responseType","contentDisposition","filenamePart","decodeURI","split","pattern1","pattern2","filename","test","replaceAll","blob","Blob","encoding","link","document","createElement","href","window","URL","createObjectURL","setAttribute","click","revokeObjectURL","location","replace","staticUrl","serviceLink","privacyLink","HCaptchaSiteKey","videoSaveTimeIntervalSec","videoHeartBeatSec","UserStateContext","UserDispatchContext","userReducer","enableFirstEnterIPAutoLogin","isAuthenticated","loginError","loginErrorCnt","inactive","invalidIP","IPGroups","notFound","planTitle","newOld","userInfo","loginUrl","platform","UserProvider","localStorage","getItem","parse","useUserState","useUserDispatch","getLoginErrMsg","response","detail","includes","exec","resetUser","resetToken","removeItem","signOut","resetPreferQuality","disableFirstEnterIPAutoLogin","redirect","path","getPreviousPage","loginUser","password","setIsLoading","URLSearchParams","append","access_token","setToken","setItem","user_type","loginParterUser","authToken","login_url","alert","loginAgentUser","username","loginIPUser","setIPLoginError","loginSSOUser","getVideoUrl","videoInfoState","Cookies","set","expires","remove","setPreviousPage","pathname","search","match","getDefaultAPIBase","hostname","getAPIURL","setAPIURL","setHostname","getPreferQuality","setPreferQuality","quality","secure","isFirstEnterIPAutoLogin","coolDownDuration","getTime","formatDate","dt","sep","short","fmt","isDate","isValidDate","dateStr","parts","year","parseInt","month","day","monthLength","getUnixTs","defineTabID","sessionStorage","pageTabID","length","result","characters","charactersLength","i","charAt","Math","floor","random","makeID","getMovieTime","Number","saveMovieTime","time","deleteMovieTime","getThumbnailUrl","sizes","ext","size","assetUrl","encodeURI","getOptimizedImgUrl","elementReady","selector","el","querySelector","MutationObserver","mutationRecords","observer","Array","from","querySelectorAll","forEach","element","disconnect","observe","documentElement","childList","subtree","tracesSampleRate","Sentry","dsn","integrations","Integrations","BrowserTracing","breakpoints","values","xs","sm","md","lg","xl","tablet","laptop","desktop","palette","primary","main","light","dark","secondary","tinycolor","lighten","toHexString","darken","contrastText","warning","success","info","hint","background","default","common","grey","special","customShadows","widget","widgetDark","widgetWide","overrides","MuiBackdrop","root","backgroundColor","MuiMenu","paper","boxShadow","MuiSelect","icon","color","MuiListItem","button","MuiTouchRipple","child","MuiTableRow","MuiTableCell","borderBottom","head","fontSize","body","defaultTheme","createMuiTheme","defaultThemeConfig","typography","fontFamily","join","h1","fontWeight","fontWeightMedium","lineHeight","down","h2","letterSpacing","fontWeightBold","h3","h4","h5","fontWeightRegular","h6","h7","tags","subtitle1","subtitle2","description","lineHeifht","body2","caption","smallCaption","font24","inputLabel","inputcBox","transform","ScrollToTop","useLocation","useEffect","scrollTo","PageTabID","onUnload","_hasUnloaded","addEventListener","PlatformInfo","useHistory","userDispatch","useMatomo","useState","setDummyState","api_url","setBaseUrl","setDefaultBaseUrl","login_option_ip","getElementById","favicon","title","cleaned_nickname","nickname","UserInfo","ReleaseQuota","lastLocation","useLastLocation","preLocation","setPrevLocation","isMoviePage","Location","Fragment","Layout","lazy","MovieLayout","PartnerLogin","PartnerIPAutoLogin","PartnerSSOLogin","App","preconnectHosts","hosts","Track","Suspense","exact","render","to","component","PrivateRoute","PublicRoute","rest","redirectPath","Boolean","WatchHistoryStateContext","WatchHistoryDispatchContext","watchHistoryReducer","key","date","created_at","WatchHistoryProvider","TempStateContext","TempDispatchContext","tempReducer","TempProvider","menus","topics","banners","OtherStateContext","OtherDispatchContext","otherReducer","isFullscreenActive","OtherProvider","sentry","container","ReactDOM","MatomoProvider","ThemeProvider","Themes","maxSnack","CssBaseline","serviceWorker","ready","registration","unregister","axiosInstance","withCredentials","defaults","interceptors","request","use","config","queryString","force_platform","baseURL","status"],"mappings":"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","file":"static/js/main.4d4f95d1.chunk.js","sourcesContent":["import React from \"react\";\nimport { format } from \"date-fns\";\nimport get from \"lodash/get\";\nimport uniq from \"lodash/uniq\";\nimport isArray from \"lodash/isArray\";\nimport indexOf from \"lodash/indexOf\";\nimport isEmpty from \"lodash/isEmpty\";\nimport maxBy from \"lodash/maxBy\";\n\nvar CollectionStateContext = React.createContext();\nvar CollectionDispatchContext = React.createContext();\n\nconst initialState = {\n creatingDialogFromVideoColDialog: false,\n createdColID: false,\n selected: [], // used for collection\n videoSelected: {},\n collections: [\n // {\n // id: 0,\n // name: \"一年級國文課\",\n // created_date: \"2020-07-01\",\n // videos: [0, 1, 2],\n // },\n // {\n // id: 1,\n // name: \"二年級國文課\",\n // created_date: \"2020-08-01\",\n // videos: [],\n // },\n // {\n // id: 2,\n // name: \"三年級國文課\",\n // created_date: \"2020-09-01\",\n // videos: [1, 2, 3],\n // },\n // {\n // id: 3,\n // name: \"一年級國文課2\",\n // created_date: \"2020-07-01\",\n // videos: [3, 4, 5],\n // },\n // {\n // id: 4,\n // name: \"二年級國文課2\",\n // created_date: \"2020-08-01\",\n // videos: [],\n // },\n // {\n // id: 5,\n // name: \"三年級國文課2\",\n // created_date: \"2020-09-01\",\n // videos: [0, 4],\n // },\n // {\n // id: 6,\n // name: \"一年級國文課3\",\n // created_date: \"2020-07-01\",\n // videos: [0, 1, 5],\n // },\n // {\n // id: 7,\n // name: \"二年級國文課3\",\n // created_date: \"2020-08-01\",\n // videos: [5, 1, 2],\n // },\n // {\n // id: 8,\n // name: \"三年級國文課3\",\n // created_date: \"2020-09-01\",\n // videos: [2, 3],\n // },\n ],\n};\n\nfunction collectionReducer (state, action) {\n const { type, payload = {} } = action;\n const {\n selected,\n videoSelected,\n collections,\n creatingDialogFromVideoColDialog,\n newCollectionId,\n } = state;\n\n const { cid, vid, name, videos } = payload;\n console.log(\"payload: \", payload);\n const origin = get(videoSelected, cid, []);\n\n switch (type) {\n case \"ADD_COLLECTION\":\n const newId = isEmpty(collections) ? 0 : maxBy(collections, \"id\").id + 1;\n return {\n ...state,\n createdColID: creatingDialogFromVideoColDialog ? newId : false,\n collections: [\n ...state.collections,\n {\n id: newId,\n name,\n videos: [],\n created_date: format(new Date(), \"yyyy-MM-dd\"),\n },\n ],\n };\n case \"REMOVE_COLLECTION\":\n return {\n ...state,\n collections: state.collections.filter(\n collection => collection.id !== cid,\n ),\n };\n case \"BULK_REMOVE_COLLECTION\":\n return {\n selected: [],\n collections: collections.filter(\n collection => selected.indexOf(collection.id) === -1,\n ),\n };\n\n case \"COPY_COLLECTION\":\n return {\n ...state,\n collections: [\n ...collections,\n {\n id: isEmpty(collections) ? 0 : maxBy(collections, \"id\").id + 1,\n name,\n videos,\n created_date: format(new Date(), \"yyyy-MM-dd\"),\n },\n ],\n };\n\n case \"RENAME_COLLECTION\":\n return {\n ...state,\n collections: collections.map(collection =>\n collection.id === cid ? { ...collection, name } : collection,\n ),\n };\n case \"SELECT_COLLECTION\":\n return {\n ...state,\n selected: [...state.selected, payload.id],\n };\n case \"UNSELECT_COLLECTION\":\n return {\n ...state,\n selected: state.selected.filter(id => id !== payload.id),\n };\n case \"UNSELECT_ALL_COLLECTION\":\n return {\n ...state,\n selected: [],\n };\n\n case \"SELECT_COLLECTION_VIDEO\":\n return {\n ...state,\n videoSelected: {\n ...videoSelected,\n [cid]: uniq([...origin, vid]),\n },\n };\n case \"UNSELECT_COLLECTION_VIDEO\":\n return {\n ...state,\n videoSelected: {\n ...videoSelected,\n [cid]: origin.filter(e => e !== vid),\n },\n };\n\n case \"SAVE_VIDEO_COLLECTIONS\":\n console.log(collections, cid);\n return {\n ...state,\n collections: collections.map(collection =>\n isArray(cid) && indexOf(cid, collection.id) !== -1\n ? {\n ...collection,\n videos: uniq([...collection.videos, vid]),\n }\n : {\n ...collection,\n videos: collection.videos.filter(e => e !== vid),\n },\n ),\n };\n\n case \"REMOVE_COLLECTION_VIDEO\":\n return {\n ...state,\n collections: collections.map(collection =>\n collection.id === cid\n ? {\n ...collection,\n videos: collection.videos.filter(e => e !== vid),\n }\n : collection,\n ),\n };\n\n case \"BULK_REMOVE_COLLECTION_VIDEO\":\n return {\n ...state,\n videoSelected: {\n ...videoSelected,\n [cid]: [],\n },\n collections: collections.map(collection =>\n collection.id === cid\n ? {\n ...collection,\n videos: collection.videos.filter(\n e => indexOf(videoSelected[cid], e) === -1,\n ),\n }\n : collection,\n ),\n };\n\n case \"CREATE_COLLECTION_DOING\":\n return {\n ...state,\n creatingDialogFromVideoColDialog: true,\n };\n\n case \"CREATE_COLLECTION_DONE\":\n return {\n ...state,\n creatingDialogFromVideoColDialog: false,\n };\n\n case \"SET_NEW_CREATED_COLLECTION_ID\":\n return {\n ...state,\n createdColID: creatingDialogFromVideoColDialog\n ? newCollectionId\n : false,\n };\n case \"RESET_DIALOG_COLLECTION_ID\":\n return {\n ...state,\n createdColID: false,\n };\n\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction CollectionProvider ({ children }) {\n // https://medium.com/@walkccc/build-a-todo-list-app-with-react-hooks-and-context-a7f8e9f158af\n var [state, dispatch] = React.useReducer(collectionReducer, initialState);\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useCollectionState () {\n const context = React.useContext(CollectionStateContext);\n if (context === undefined) {\n throw new Error(\n \"useCollectionState must be used within a CollectionProvider\",\n );\n }\n return context;\n}\n\nfunction useCollectionDispatch () {\n const context = React.useContext(CollectionDispatchContext);\n if (context === undefined) {\n throw new Error(\n \"useCollectionDispatch must be used within a CollectionProvider\",\n );\n }\n return context;\n}\n\nexport { CollectionProvider, useCollectionState, useCollectionDispatch };\n","import React from \"react\";\n\nimport tracker from \"../utils/tracker\";\n\nvar VideoStateContext = React.createContext();\nvar VideoDispatchContext = React.createContext();\n\nfunction videoReducer (state, action) {\n switch (action.type) {\n case \"UPDATE_VOICE_TRACK_SUCCESS\":\n return {\n ...state,\n url: action.payload.src,\n trackIndex: action.payload.trackIndex,\n };\n case \"PLAY_MOVIE_FAILURE\":\n return { ...state, hasQuota: false };\n case \"PLAYER_RELOAD\":\n return { ...state, playId: state.playId + 1, resetting: true };\n case \"PLAYER_RELOAD_SUCCESS\":\n return { ...state, resetting: false };\n case \"SET_QUOTA_EXCEED\":\n return { ...state, hasQuota: false };\n case \"SET_QUOTA_ENOUGH\":\n return { ...state, hasQuota: true };\n case \"SET_UNKNOWN_ERROR\":\n return { ...state, error: true };\n case \"SET_CONTROL_SHOW\":\n return { ...state, showControl: true };\n case \"SET_CONTROL_HIDDEN\":\n return { ...state, showControl: false };\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction VideoProvider ({ children }) {\n var [state, dispatch] = React.useReducer(videoReducer, {\n videoType: \"trailer\",\n url: \"\",\n forceUrl: null,\n playId: 0,\n resetting: false,\n hasQuota: true,\n error: true,\n showControl: false,\n play: [],\n trackIndex: 0,\n });\n\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useVideoState () {\n var context = React.useContext(VideoStateContext);\n if (context === undefined) {\n throw new Error(\"useVideoState must be used within a VideoProvider\");\n }\n return context;\n}\n\nfunction useVideoDispatch () {\n var context = React.useContext(VideoDispatchContext);\n if (context === undefined) {\n throw new Error(\"useVideoDispatch must be used within a VideoProvider\");\n }\n return context;\n}\n\nexport {\n VideoProvider,\n useVideoState,\n useVideoDispatch,\n handleMaskTopButton,\n handleMaskBottomButton,\n handlePlayMovie,\n handlePlayTrailer,\n};\n\n// ###########################################################\n\nfunction handleMaskTopButton (\n dispatch,\n player,\n isMovie,\n reserveQuota,\n setOpenDialog,\n videoId,\n isEnd,\n history,\n noTrailer,\n trackEvent,\n) {\n try {\n if (isMovie) {\n reserveQuota(videoId).then(data => {\n if ((data.msg === \"ok\" && data.token) || data.has_quota === true) {\n player.play();\n } else {\n setOpenDialog(true);\n tracker.recordNoQuota({\n trackEvent,\n videoId,\n videoType: isMovie ? \"movie\" : \"trailer\",\n quotaCnt: data.quota_cnt,\n });\n return;\n }\n });\n } else {\n if (isEnd || noTrailer) {\n reserveQuota(videoId).then(data => {\n if ((data.msg === \"ok\" && data.token) || data.has_quota === true) {\n history.push(`/video/detail/movie/${videoId}`);\n } else {\n setOpenDialog(true);\n tracker.recordNoQuota({\n trackEvent,\n videoId,\n videoType: isMovie ? \"movie\" : \"trailer\",\n quotaCnt: data.quota_cnt,\n });\n return;\n }\n });\n } else {\n player.play();\n }\n }\n } catch (e) {\n console.log(\"play error\", e);\n }\n}\n\nasync function handleMaskBottomButton (\n dispatch,\n isLogin,\n videoId,\n isTrailer,\n history,\n reserveQuota,\n setOpenDialog,\n isEnd,\n player,\n trackEvent,\n) {\n if (isLogin) {\n if (isTrailer) {\n if (isEnd) {\n player.play();\n } else {\n reserveQuota(videoId)\n .then(data => {\n if ((data.msg === \"ok\" && data.token) || data.has_quota === true) {\n history.push(`/video/detail/movie/${videoId}`);\n } else {\n setOpenDialog(true);\n tracker.recordNoQuota({\n trackEvent,\n videoId,\n videoType: !isTrailer ? \"movie\" : \"trailer\",\n quotaCnt: data.quota_cnt,\n });\n }\n })\n .catch(err => console.log(err));\n }\n } else {\n history.push(`/video/detail/trailer/${videoId}`);\n }\n }\n}\n\nfunction handlePlayMovie ({\n isLogin,\n isTrailer,\n videoId,\n history,\n reserveQuota,\n setOpenLoginDialog,\n setOpenQuotaDialog,\n player,\n trackEvent,\n}) {\n if (!isLogin) {\n setOpenLoginDialog(true);\n return;\n }\n\n reserveQuota(videoId)\n .then(data => {\n if ((data.msg === \"ok\" && data.token) || data.has_quota === true) {\n if (isTrailer) {\n history.push(`/video/detail/movie/${videoId}`);\n } else {\n player && player.play();\n }\n } else {\n setOpenQuotaDialog(true);\n tracker.recordNoQuota({\n trackEvent,\n videoId,\n videoType: isTrailer ? \"trailer\" : \"movie\",\n quotaCnt: data.quota_cnt,\n });\n }\n })\n .catch(err => console.log(err));\n}\n\nfunction handlePlayTrailer ({\n isLogin,\n isTrailer,\n videoId,\n history,\n reserveQuota,\n setOpenLoginDialog,\n setOpenQuotaDialog,\n player,\n trackEvent,\n}) {\n if (!isLogin) {\n player && player.play();\n return;\n }\n\n reserveQuota(videoId)\n .then(data => {\n if ((data.msg === \"ok\" && data.token) || data.has_quota === true) {\n if (!isTrailer) {\n history.push(`/video/detail/trailer/${videoId}`);\n } else {\n player && player.play();\n }\n } else {\n setOpenQuotaDialog(true);\n tracker.recordNoQuota({\n trackEvent,\n videoId,\n videoType: isTrailer ? \"trailer\" : \"movie\",\n quotaCnt: data.quota_cnt,\n });\n }\n })\n .catch(err => console.log(err));\n}\n","import React, { Suspense } from \"react\";\nimport Loading from \"../Loading/Loading\";\n\nconst VMSuspense = ({ children }) => {\n return }>{children};\n};\n\nexport default VMSuspense;\n","import React from \"react\";\n\nvar LayoutStateContext = React.createContext();\nvar LayoutDispatchContext = React.createContext();\n\nfunction layoutReducer (state, action) {\n switch (action.type) {\n case \"TOGGLE_SIDEBAR\":\n return { ...state, isSidebarOpened: !state.isSidebarOpened };\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction LayoutProvider ({ children }) {\n var [state, dispatch] = React.useReducer(layoutReducer, {\n isSidebarOpened: true,\n });\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useLayoutState () {\n var context = React.useContext(LayoutStateContext);\n if (context === undefined) {\n throw new Error(\"useLayoutState must be used within a LayoutProvider\");\n }\n return context;\n}\n\nfunction useLayoutDispatch () {\n var context = React.useContext(LayoutDispatchContext);\n if (context === undefined) {\n throw new Error(\"useLayoutDispatch must be used within a LayoutProvider\");\n }\n return context;\n}\n\nexport { LayoutProvider, useLayoutState, useLayoutDispatch, toggleSidebar };\n\n// ###########################################################\nfunction toggleSidebar (dispatch) {\n dispatch({\n type: \"TOGGLE_SIDEBAR\",\n });\n}\n","import GA4React from \"ga-4-react\";\nimport { createInstance } from \"@datapunt/matomo-tracker-react\";\nimport { isDev, trackUrl, GAID } from \"./const\";\n\nconst create = () => {\n const instance = createInstance({\n urlBase: trackUrl,\n siteId: 1,\n disabled: false, // optional, false by default. Makes all tracking calls no-ops if set to true.\n heartBeat: {\n // optional, enabled by default\n active: true, // optional, default value: true\n seconds: 10, // optional, default value: `15\n },\n linkTracking: true, // optional, default value: true\n configurations: {\n // optional, default value: {}\n // any valid matomo configuration, all below are optional\n setSecureCookie: true,\n },\n });\n return instance;\n};\n\nconst GA = {\n instance: async () => {\n if (isDev) return;\n if (GA4React.isInitialized()) return GA4React.getGA4React();\n const ga4react = new GA4React(GAID);\n await ga4react.initialize();\n return GA4React.getGA4React();\n },\n trackPageView: async () => {\n const ga4react = await GA.instance();\n if (ga4react) {\n ga4react.pageview();\n }\n },\n setUserID: async userId => {\n const ga4react = await GA.instance();\n if (ga4react) {\n ga4react.gtag(\"config\", \"MEASUREMENT_ID\", {\n user_id: userId,\n });\n }\n },\n};\n\nconst login = ({\n trackEvent,\n pushInstruction,\n method = \"password\",\n isPartner = false,\n userId = null,\n} = {}) => {\n if (userId) {\n pushInstruction(\"setUserId\", userId);\n }\n trackEvent({\n category: \"user\",\n action: \"login\",\n name: userId,\n value: 1,\n customDimensions: [\n {\n id: 1,\n value: method,\n },\n ],\n });\n};\n\n// Partner login means different users would use the same device login.\n// So we design the session reset mechanisan to identify them.\nconst partnerLogin = ({ method, userId, trackEvent, pushInstruction }) => {\n resetSession(pushInstruction);\n login({ trackEvent, pushInstruction, method, isPartner: true, userId });\n};\n\nconst setUserDetail = ({\n pushInstruction,\n userId,\n userName,\n userType,\n // platformId,\n // platformName,\n}) => {\n pushInstruction(\"setUserId\", userId);\n};\n\nconst resetSession = pushInstruction => {\n pushInstruction(\"resetUserId\");\n pushInstruction(\"appendToTrackingUrl\", \"new_visit=1\");\n pushInstruction(\"trackPageView\");\n pushInstruction(\"appendToTrackingUrl\", \"\");\n};\n\nconst viewedVideoPage = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n}) => {\n trackEvent({\n category: \"user\",\n action: \"viewed_video_page\",\n name: videoId,\n value: 1,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n ],\n });\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nconst recordNoQuota = ({ trackEvent, videoId, videoType, quotaCnt }) => {\n trackEvent({\n category: \"user\",\n action: \"no_quota\",\n name: videoId,\n value: quotaCnt,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n ],\n });\n};\n\nconst watchedVideo = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n spent = 5,\n currentTime,\n duration,\n}) => {\n trackEvent({\n category: \"video\",\n action: \"watched\",\n name: videoId,\n value: spent,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n {\n id: 2,\n value: currentTime,\n },\n {\n id: 4,\n value: duration,\n },\n ],\n });\n\n pushInstruction(\"deleteCustomDimension\", 2);\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 4);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nconst playedVideo = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n}) => {\n trackEvent({\n category: \"video\",\n action: \"played\",\n name: videoId,\n value: 1,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n ],\n });\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nconst pausedVideo = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n currentTime,\n}) => {\n trackEvent({\n category: \"video\",\n action: \"paused\",\n name: videoId,\n value: currentTime,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n ],\n });\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nconst resumedVideo = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n currentTime,\n}) => {\n trackEvent({\n category: \"video\",\n action: \"resumed\",\n name: videoId,\n value: currentTime,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n ],\n });\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nconst seekedVideo = ({\n trackEvent,\n pushInstruction,\n videoType,\n videoId,\n tabId,\n currentTime,\n}) => {\n trackEvent({\n category: \"video\",\n action: \"seeked\",\n name: videoId,\n value: currentTime,\n customDimensions: [\n {\n id: 5,\n value: videoType,\n },\n {\n id: 3,\n value: tabId,\n },\n ],\n });\n pushInstruction(\"deleteCustomDimension\", 3);\n pushInstruction(\"deleteCustomDimension\", 5);\n};\n\nexport default {\n create,\n login,\n partnerLogin,\n resetSession,\n setUserDetail,\n viewedVideoPage,\n watchedVideo,\n playedVideo,\n pausedVideo,\n resumedVideo,\n seekedVideo,\n recordNoQuota,\n GA,\n};\n","import React from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport LinearProgress from '@material-ui/core/LinearProgress'\n\nconst useStyles = makeStyles((theme) => ({\n loading: {\n position: 'fixed',\n left: 0,\n right: 0,\n top: 'calc(50% - 20px)',\n margin: 'auto',\n height: '40px',\n width: '40px',\n '& img': {\n position: 'absolute',\n height: '25px',\n width: 'auto',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n margin: 'auto',\n },\n },\n}))\n\nconst Loading = (props) => {\n const classes = useStyles()\n\n return (\n
\n \n
\n )\n}\n\nexport default Loading\n","import axios from \"./axios\";\n\nimport { apiUrl, staticUrl } from \"./utils/const\";\nimport { getTabID, getToken } from \"./utils/common\";\nimport { getBaseUrl } from \"./axios\";\n\nconst timeout = 15000;\n\nconst getOption = () => {\n const token = getToken() || \"\";\n return {\n timeout: timeout,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n };\n};\n\nconst fetcher = url => axios.get(url).then(res => res.data);\nconst fetcherWithToken = url =>\n axios.get(url, getOption()).then(res => res.data);\nconst posterWithToken = url =>\n axios.post(url, getOption()).then(res => res.data);\n\nconst getPlatformInfo = () => {\n return axios({\n method: \"get\",\n url: `/api/v1/platforms/`,\n }).then(res => res.data);\n};\n\nconst resetPassword = ({ token, newPassword }) => {\n return axios.post(`/api/v1/reset-password`, {\n token,\n new_password: newPassword,\n });\n};\n\nconst recoveryPassword = email => {\n const token = getToken();\n if (token) {\n return axios({\n method: \"post\",\n url: `/api/v1/users/password-recovery/${email}`,\n });\n }\n return axios({\n method: \"post\",\n url: `/api/v1/password-recovery/${email}`,\n });\n};\n\nconst createUserWatchHistory = (videoId, videoType) => {\n const token = getToken();\n if (!token) {\n return Promise.resolve();\n }\n return axios({\n method: \"post\",\n url: `/api/v1/users/watched`,\n data: {\n video_id: videoId,\n video_type: videoType,\n },\n }).then(res => res.data);\n};\n\nconst getVideoInfo = videoId => {\n // must keep this header or got 401 error\n const option = getOption();\n const apiUrl = getBaseUrl();\n return axios({\n ...option,\n method: \"get\",\n url: `${apiUrl}/api/v1/videos/detail/${videoId}`,\n }).then(res => res.data);\n};\n\nconst createCollection = name => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/collection`,\n data: {\n name,\n },\n }).then(res => res.data);\n};\n\nconst updateCollection = (id, name, videoIds = []) => {\n return axios({\n method: \"put\",\n url: `/api/v1/users/collection/${id}`,\n data: {\n name,\n },\n }).then(res => res.data);\n};\n\nconst copyCollection = (id, name) => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/copy_collection`,\n data: {\n id,\n name,\n },\n }).then(res => res.data);\n};\n\nconst deleteCollection = id => {\n return axios({\n method: \"delete\",\n url: `/api/v1/users/collection/${id}`,\n }).then(res => res.data);\n};\n\nconst bulkDeleteCollection = ids => {\n return axios({\n method: \"delete\",\n url: `/api/v1/users/bulk/collection`,\n data: {\n ids,\n },\n }).then(res => res.data);\n};\n\nconst updateCollectionVideos = ({\n collection_id,\n expected_ids,\n add_ids,\n delete_ids,\n}) => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/collection/videos`,\n data: {\n collection_id,\n expected_ids,\n add_ids,\n delete_ids,\n },\n }).then(res => res.data);\n};\n\nconst updateVideoCollections = ({\n video_id,\n expected_ids,\n add_ids,\n delete_ids,\n}) => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/video/collections`,\n data: {\n video_id,\n expected_ids,\n add_ids,\n delete_ids,\n },\n }).then(res => res.data);\n};\n\nconst reserveQuota = videoId => {\n if (!getToken()) {\n return Promise.reject(\"empty token\");\n }\n const tabId = getTabID();\n return axios({\n method: \"post\",\n url: `/api/v1/videos/quota`,\n params: {\n vid: videoId,\n tid: tabId,\n },\n }).then(res => res.data);\n};\n\nconst releaseQuota = () => {\n if (!getToken()) {\n return;\n }\n const tabId = getTabID();\n return axios({\n method: \"post\",\n url: `/api/v1/videos/release_quota`,\n params: {\n tid: tabId,\n },\n }).then(res => res.data);\n};\n\nconst releaseQuotaByBeacon = tabId => {\n const token = getToken();\n if (!token) {\n return;\n }\n var data = { tid: tabId, token };\n var text = JSON.stringify(data);\n\n navigator.sendBeacon(`/api/v1/videos/beacon/realese-quota`, text);\n};\n\nconst sendQuotaHeartBeat = videoId => {\n const tabId = getTabID();\n return axios({\n method: \"post\",\n url: `/api/v1/videos/heartbeat`,\n params: {\n vid: videoId,\n tid: tabId,\n },\n }).then(res => res.data);\n};\n\nconst checkUserValid = name => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/validate`,\n data: { name },\n }).then(res => res.data);\n};\n\nconst createUser = payload => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/`,\n data: payload,\n });\n};\n\nconst renewSubscribe = planId => {\n return axios({\n method: \"post\",\n url: `/api/v1/users/user/renew/${planId}`,\n });\n};\n\nconst getUserInfo = () => {\n const option = getOption();\n if (option.headers.Authorization) {\n return axios.get(`/api/v1/users/me`).then(res => res.data);\n } else {\n throw new Error(\"without valid token\");\n }\n};\n\nconst updateUserInfo = ({\n real_name,\n org_name,\n email,\n mobile,\n tel,\n birthday,\n}) => {\n return axios({\n method: \"put\",\n url: `/api/v1/users/me`,\n data: {\n real_name,\n org_name,\n email,\n mobile,\n tel,\n birthday,\n },\n }).then(res => res.data);\n};\n\nconst downloadAttachment = id => {\n return axios({\n method: \"get\",\n url: `/api/v1/videos/attachment/${id}`,\n responseType: \"blob\",\n }).then(res => {\n const type = res.headers[\"content-type\"];\n const contentDisposition = res.headers[\"content-disposition\"] || \"filename\";\n\n const filenamePart = decodeURI(contentDisposition.split(\"filename\")[1]);\n const pattern1 = /^\\*=utf-8''/g;\n const pattern2 = /^=\"/g;\n let filename = \"未命名附件\";\n if (pattern1.test(filenamePart)) {\n filename = filenamePart.replaceAll(pattern1, \"\");\n } else if (pattern2.test(filenamePart)) {\n filename = filenamePart.replaceAll(pattern2, \"\").replaceAll(/\\\"/g, \"\");\n }\n const blob = new Blob([res.data], {\n type: type,\n encoding: \"UTF-8\",\n });\n const link = document.createElement(\"a\");\n link.href = window.URL.createObjectURL(blob);\n link.setAttribute(\"download\", filename);\n link.click();\n window.URL.revokeObjectURL(link);\n });\n};\n\nexport {\n apiUrl,\n staticUrl,\n timeout,\n axios,\n fetcher,\n fetcherWithToken,\n posterWithToken,\n getPlatformInfo,\n resetPassword,\n recoveryPassword,\n createUserWatchHistory,\n getVideoInfo,\n createCollection,\n updateCollection,\n deleteCollection,\n copyCollection,\n bulkDeleteCollection,\n updateCollectionVideos,\n updateVideoCollections,\n reserveQuota,\n releaseQuota,\n releaseQuotaByBeacon,\n sendQuotaHeartBeat,\n checkUserValid,\n createUser,\n renewSubscribe,\n getUserInfo,\n updateUserInfo,\n downloadAttachment,\n};\n","// Amplify deploy manually cannot setup custom env vars\nconst isDev = /dev\\.|dev-|localhost|https:\\/\\/hyerm.ntl.edu.tw:3465/.test(window.location.href);\n// TODO: FIXME\n// Handle HyProxy replacement behavior\nconst apiUrl = `https://${isDev ? \"dev-\" : \"\"}back|end.visionmedia.com.tw`.replace('|', '');\nconst staticUrl = `https://${isDev ? \"dev-\" : \"\"}static.visionmedia.com.tw`;\nconst trackUrl = `https://${isDev ? \"dev-\" : \"\"}track.visionmedia.com.tw`;\nconst serviceLink = `${staticUrl}/html/service.html`;\nconst privacyLink = `${staticUrl}/html/privacy.html`;\n\nconst HCaptchaSiteKeyTest = \"10000000-ffff-ffff-ffff-000000000001\";\nconst HCaptchaSiteKey = \"e433ad83-d531-4c1c-b048-07189a697a8f\";\n\nconst GAID = \"G-Q0JYQW2GR9\";\n\nconst videoSaveTimeIntervalSec = 1;\nconst videoHeartBeatSec = 10;\n\nexport {\n isDev,\n apiUrl,\n staticUrl,\n trackUrl,\n serviceLink,\n privacyLink,\n HCaptchaSiteKeyTest,\n HCaptchaSiteKey,\n GAID,\n videoSaveTimeIntervalSec,\n videoHeartBeatSec,\n};\n","import React from \"react\";\n\nimport {\n getToken,\n setToken,\n resetToken,\n resetPreferQuality,\n getPreviousPage,\n enableFirstEnterIPAutoLogin,\n disableFirstEnterIPAutoLogin,\n} from \"../utils/common\";\nimport tracker from \"../utils/tracker\";\nimport { axios, getUserInfo } from \"../clientAPI\";\nimport { getBaseUrl } from \"../axios\";\n\n// async: https://kentcdodds.com/blog/how-to-use-react-context-effectively\n\nvar UserStateContext = React.createContext();\nvar UserDispatchContext = React.createContext();\n\nfunction userReducer (state, action) {\n const { type, payload = {} } = action;\n switch (type) {\n case \"LOGIN_SUCCESS\":\n enableFirstEnterIPAutoLogin();\n return {\n ...state,\n isAuthenticated: true,\n loginError: false,\n loginErrorCnt: 0,\n };\n case \"SIGN_OUT_SUCCESS\":\n return { ...state, isAuthenticated: false, loginError: false };\n case \"LOGIN_FAILURE\":\n return {\n ...state,\n isAuthenticated: false,\n loginError: true,\n loginErrorCnt: state.loginErrorCnt + 1,\n inactive: payload.inactive === true,\n invalidIP: payload.invalidIP === true,\n IPGroups: payload.IPGroups,\n notFound: payload.notFound === true,\n };\n case \"SELECT_SUBSCRIBE_PLAN\":\n return {\n ...state,\n planId: payload.planId,\n planTitle: payload.planTitle,\n newOld: payload.newOld,\n };\n case \"SET_USER_INFO\":\n return { ...state, userInfo: payload };\n case \"REMOVE_USER_INFO\":\n return { ...state, userInfo: {} };\n case \"SET_LOGIN_URL\":\n return { ...state, loginUrl: payload.loginUrl };\n case \"SET_PLATFORM_INFO\":\n return { ...state, platform: payload };\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction UserProvider ({ children }) {\n var [state, dispatch] = React.useReducer(userReducer, {\n isAuthenticated: !!getToken(),\n token: getToken() || \"\",\n loginError: false,\n loginErrorCnt: 0,\n inactive: false,\n invalidIP: false,\n notFound: false,\n planId: 0,\n planTitle: \"\",\n newOld: \"new\",\n loginUrl: \"\",\n userInfo: localStorage.getItem(\"user_info\")\n ? JSON.parse(localStorage.getItem(\"user_info\"))\n : {},\n platform: {},\n });\n\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useUserState () {\n var context = React.useContext(UserStateContext);\n if (context === undefined) {\n throw new Error(\"useUserState must be used within a UserProvider\");\n }\n return context;\n}\n\nfunction useUserDispatch () {\n var context = React.useContext(UserDispatchContext);\n if (context === undefined) {\n throw new Error(\"useUserDispatch must be used within a UserProvider\");\n }\n return context;\n}\n\nexport {\n UserProvider,\n useUserState,\n useUserDispatch,\n loginUser,\n loginParterUser,\n loginAgentUser,\n loginIPUser,\n loginSSOUser,\n signOut,\n resetUser,\n};\n\n// ###########################################################\n\nconst getLoginErrMsg = error => ({\n inactive: error?.response?.data?.detail === \"Inactive user\",\n invalidIP: error?.response?.data?.detail.includes(\"Invalid IP\"),\n IPGroups: /\\d+\\.\\d+\\.\\d+\\.\\d+/.exec(error?.response?.data?.detail) || [],\n notFound: error?.response?.data?.detail.includes(\n \"Incorrect account name or password\",\n ),\n});\n\nfunction resetUser (dispatch, pushInstruction) {\n resetToken();\n localStorage.removeItem(\"user_info\");\n dispatch({ type: \"SIGN_OUT_SUCCESS\" });\n dispatch({ type: \"REMOVE_USER_INFO\" });\n tracker.resetSession(pushInstruction);\n}\n\nfunction signOut (dispatch, history, pushInstruction) {\n resetUser(dispatch, pushInstruction);\n resetPreferQuality(\"preferQuality\");\n disableFirstEnterIPAutoLogin();\n history.push(\"/\");\n}\n\nfunction redirect (history) {\n const path = getPreviousPage() || \"/\";\n history.push(path);\n}\n\nfunction loginUser (\n dispatch,\n login,\n password,\n history,\n setIsLoading,\n trackEvent,\n pushInstruction,\n) {\n setIsLoading(true);\n\n const params = new URLSearchParams();\n params.append(\"username\", login);\n params.append(\"password\", password);\n\n return axios\n .post(`/api/v1/login/access-token`, params)\n .then(function (response) {\n setIsLoading(false);\n const token = response.data.access_token;\n if (token) {\n setToken(token);\n dispatch({ type: \"LOGIN_SUCCESS\" });\n return axios\n .get(`/api/v1/users/me`)\n .then(response => {\n const data = response.data;\n localStorage.setItem(\"user_info\", JSON.stringify(data));\n dispatch({ type: \"SET_USER_INFO\", payload: data });\n tracker.setUserDetail({\n pushInstruction,\n userId: data.id,\n userName: data.name,\n userType: data.user_type,\n });\n tracker.login({ userId: data.id, trackEvent, pushInstruction });\n redirect(history);\n return Promise.resolve(true);\n })\n .catch(error => {\n console.log(error);\n });\n } else {\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n }\n })\n .catch(function (error) {\n dispatch({\n type: \"LOGIN_FAILURE\",\n payload: getLoginErrMsg(error),\n });\n setIsLoading(false);\n });\n}\n\nfunction loginParterUser (\n dispatch,\n authToken,\n history,\n trackEvent,\n pushInstruction,\n) {\n if (authToken) {\n setToken(authToken);\n getUserInfo()\n .then(data => {\n dispatch({ type: \"LOGIN_SUCCESS\" });\n dispatch({\n type: \"SET_LOGIN_URL\",\n payload: { loginUrl: data?.platform?.login_url },\n });\n dispatch({ type: \"SET_USER_INFO\", payload: data });\n tracker.setUserDetail({\n pushInstruction,\n userId: data.id,\n userName: data.name,\n userType: data.user_type,\n });\n tracker.partnerLogin({\n trackEvent,\n pushInstruction,\n method: \"token\",\n userId: data.id,\n });\n redirect(history);\n })\n .catch(error => {\n setToken(null);\n dispatch({ type: \"LOGIN_FAILURE\" });\n console.log(error);\n alert(\"驗證失敗\");\n });\n } else {\n dispatch({ type: \"LOGIN_FAILURE\" });\n }\n}\n\nfunction loginAgentUser (dispatch, username, password, history, setIsLoading) {\n setIsLoading(true);\n\n const params = new URLSearchParams();\n params.append(\"username\", username);\n params.append(\"password\", password);\n\n return axios\n .post(`/api/v1/partner/login/agent`, params)\n .then(function (response) {\n setIsLoading(false);\n const url = response.data.url;\n if (url) {\n history.push(url);\n } else {\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n }\n })\n .catch(function (error) {\n console.log(error);\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n });\n}\n\nfunction loginIPUser ({\n dispatch,\n setIsLoading,\n trackEvent,\n pushInstruction,\n setIPLoginError,\n history,\n}) {\n setIsLoading(true);\n const apiUrl = getBaseUrl();\n return axios\n .post(`${apiUrl}/api/v1/partner/login/ip/access-token`, {\n headers: {\n \"original-origin\": window.location.origin,\n },\n })\n .then(function (response) {\n const token = response.data.access_token;\n if (token) {\n setToken(token);\n dispatch({ type: \"LOGIN_SUCCESS\" });\n return axios\n .get(`/api/v1/users/me`)\n .then(response => {\n const data = response.data;\n localStorage.setItem(\"user_info\", JSON.stringify(data));\n dispatch({ type: \"SET_USER_INFO\", payload: data });\n tracker.setUserDetail({\n pushInstruction,\n userId: data.id,\n userName: data.name,\n userType: data.user_type,\n });\n tracker.partnerLogin({\n userId: data.id,\n trackEvent,\n pushInstruction,\n method: \"ip\",\n });\n redirect(history);\n return Promise.resolve(true);\n })\n .catch(error => {\n console.log(error);\n setIsLoading(false);\n });\n } else {\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n setIPLoginError(true);\n }\n })\n .catch(function (error) {\n dispatch({\n type: \"LOGIN_FAILURE\",\n payload: getLoginErrMsg(error),\n });\n setIsLoading(false);\n setIPLoginError(true);\n });\n}\n\nfunction loginSSOUser ({ dispatch, setIsLoading, url, history }) {\n setIsLoading(true);\n return axios\n .post(`/api/v1/partner/login/sso`, { url })\n .then(function (response) {\n setIsLoading(false);\n const url = response.data.url;\n if (url) {\n history.push(url);\n } else {\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n }\n })\n .catch(function (error) {\n console.log(error);\n dispatch({ type: \"LOGIN_FAILURE\" });\n setIsLoading(false);\n });\n}\n","import { format } from \"date-fns\";\nimport Cookies from \"js-cookie\";\nimport isDate from \"lodash/isDate\";\nimport isEmpty from \"lodash/isEmpty\";\nimport get from \"lodash/get\";\nimport { staticUrl, apiUrl } from \"./const\";\n\nfunction getVideoUrl (videoInfoState, videoType, trackIndex) {\n const videoUrl =\n videoType === \"movie\"\n ? get(videoInfoState, `play.movie.${trackIndex}.url`)\n : get(videoInfoState, `play.trailer.${trackIndex}.url`);\n return videoUrl;\n}\n\nfunction getToken () {\n return localStorage.getItem(\"id_token\") || Cookies.get(\"id_token\");\n}\n\nfunction setToken (token) {\n Cookies.set(\"id_token\", token, {\n expires: 365,\n });\n return localStorage.setItem(\"id_token\", token);\n}\n\nfunction resetToken () {\n localStorage.removeItem(\"id_token\");\n Cookies.remove(\"id_token\");\n}\n\nfunction setPreviousPage () {\n const path = window.location.pathname;\n const search = window.location.search;\n if (!path.match(/login/)) {\n Cookies.set(\"previous_path\", `${path}${search}`, {\n expires: 1,\n });\n }\n}\n\nfunction getPreviousPage () {\n return Cookies.get(\"previous_path\");\n}\n\n// TODO: FIXME\n// if using HyPorxy, dev-backend.visionmedia.com.tw or backend.visionmedia.com.tw would be replaced with proxy url\nfunction getDefaultAPIBase () {\n if (window.location.hostname.match(/visionmedia.com.tw|localhost/)) {\n return apiUrl;\n }\n // keep original hostname to avoid HyProxy replace it.\n return \"\";\n}\n\nfunction getAPIURL () {\n return localStorage.getItem(\"api_url\") || Cookies.get(\"api_url\");\n}\n\n// if hostname doesn't belong to proxy domain then skip setting.\nfunction setAPIURL (url) {\n // EZProxy hardcode\n if (\n window.location.hostname == \"nchu-app-visionmedia-com-tw.ap.lib.nchu.edu.tw\"\n ) {\n console.log(`force api url for ezproxy`);\n url = \"https://nchu-app-visionmedia-com-tw.ap.lib.nchu.edu.tw\";\n }\n\n if (\n window.location.hostname.match(\n /app([0-9]+)?\\.visionmedia\\.com\\.tw$|www\\.visionmedia\\.com\\.tw$/,\n )\n ) {\n console.log(`skip setting api url because it's not a proxy domain.`);\n return;\n }\n\n Cookies.set(\"api_url\", url, {\n expires: 365,\n });\n return localStorage.setItem(\"api_url\", url);\n}\n\nfunction setHostname () {\n Cookies.set(\"hostname\", window.location.hostname, {\n expires: 365,\n });\n return localStorage.setItem(\"hostname\", window.location.hostname);\n}\n\nfunction getPreferQuality () {\n return Cookies.get(\"preferQuality\");\n}\n\nfunction setPreferQuality (quality) {\n return Cookies.set(\"preferQuality\", quality, {\n expires: 365,\n secure: true,\n });\n}\n\nfunction resetPreferQuality () {\n return Cookies.remove(\"preferQuality\");\n}\n\nfunction isFirstEnterIPAutoLogin () {\n return !!Cookies.get(\"disableFirstEnterIPAutoLogin\");\n}\n\nfunction enableFirstEnterIPAutoLogin () {\n Cookies.remove(\"disableFirstEnterIPAutoLogin\");\n}\n\nfunction disableFirstEnterIPAutoLogin () {\n const coolDownDuration = new Date(new Date().getTime() + 10 * 1000);\n return Cookies.set(\"disableFirstEnterIPAutoLogin\", \"true\", {\n expires: coolDownDuration,\n secure: true,\n });\n}\n\nfunction getReleaseQuotaQueue () {\n const releaseQuotaQueue = localStorage.getItem(\"releaseQuotaQueue\") || \"\";\n return releaseQuotaQueue.split(\",\");\n}\n\nfunction delayReleaseQuota () {\n const releaseQuotaQueue = getReleaseQuotaQueue();\n releaseQuotaQueue.push(getTabID());\n return localStorage.setItem(\n \"releaseQuotaQueue\",\n `${releaseQuotaQueue.join(\",\")}`,\n );\n}\n\nfunction formatDate (dt, sep = \"/\", short = true) {\n const fmt = short ? `yyyy${sep}MM${sep}dd` : `yyyy${sep}MM${sep}dd HH:mm:ss`;\n if (isDate(dt)) {\n return format(dt, fmt);\n }\n return dt && format(new Date(dt), fmt);\n}\n\nfunction isValidDate (dateStr) {\n const datePattern = /^[0-9]{4}(-|\\/)[0-9]{2}(-|\\/)[0-9]{2}$/;\n if (!datePattern.test(dateStr)) {\n return false;\n }\n\n dateStr = dateStr.replace(\"/\", \"-\");\n\n // Parse the date parts to integers\n const parts = dateStr.split(\"-\");\n const year = parseInt(parts[0], 10);\n const month = parseInt(parts[1], 10);\n const day = parseInt(parts[2], 10);\n\n // Check the ranges of month and year\n if (year < 1000 || year > 3000 || month === 0 || month > 12) return false;\n\n const monthLength = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n // Adjust for leap years\n if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0))\n monthLength[1] = 29;\n\n // Check the range of the day\n return day > 0 && day <= monthLength[month - 1];\n}\n\nfunction getUnixTs () {\n return new Date().getTime();\n}\n\nfunction makeID (length) {\n var result = \"\";\n var characters =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n var charactersLength = characters.length;\n for (var i = 0; i < length; i++) {\n result += characters.charAt(Math.floor(Math.random() * charactersLength));\n }\n return result;\n}\n\nfunction defineTabID () {\n if (!sessionStorage) return;\n\n let pageTabID = sessionStorage.getItem(\"tabID\");\n if (pageTabID === null) {\n pageTabID = makeID(5);\n sessionStorage.setItem(\"tabID\", pageTabID);\n }\n return pageTabID;\n}\n\nfunction getTabID () {\n const pageTabID = sessionStorage.getItem(\"tabID\");\n if (pageTabID === null) {\n return defineTabID();\n }\n\n return pageTabID;\n}\n\nfunction getMovieTime (videoId) {\n if (!localStorage) return 0;\n return Number.parseInt(localStorage.getItem(`time:vid:${videoId}`)) || 0;\n}\n\nfunction saveMovieTime (videoId, time) {\n if (!localStorage) return;\n return localStorage.setItem(`time:vid:${videoId}`, Number.parseInt(time));\n}\n\nfunction deleteMovieTime (videoId) {\n localStorage.removeItem(`time:vid:${videoId}`);\n}\n\nfunction isIE () {\n return (\n navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n navigator.appVersion.indexOf(\"Trident/\") > -1\n );\n}\n\nfunction isSmallScreen () {\n return window.innerWidth <= 768;\n}\n\nfunction getThumbnailUrl ({ url, ext, size }) {\n let sizes;\n if (size) {\n sizes = `${size}_${size}`;\n } else {\n sizes = \"400_400\";\n }\n const assetUrl = `${staticUrl}/${url\n .replace(/^\\//, \"\")\n .replace(\"raw\", sizes)}`;\n if (ext) {\n return encodeURI(assetUrl.replace(/\\.\\w+$/, `.${ext}`));\n }\n return encodeURI(assetUrl);\n}\n\nfunction getOptimizedImgUrl ({ url, ext }) {\n const sizes = \"raw\";\n const assetUrl = `${staticUrl}/${url\n .replace(/^\\//, \"\")\n .replace(\"raw\", sizes)}`;\n return encodeURI(assetUrl);\n}\n\n// https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e\nfunction elementReady (selector) {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n new MutationObserver((mutationRecords, observer) => {\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach(element => {\n resolve(element);\n //Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n\nexport {\n getVideoUrl,\n getToken,\n setToken,\n resetToken,\n setPreviousPage,\n getPreviousPage,\n getDefaultAPIBase,\n getAPIURL,\n setAPIURL,\n setHostname,\n getPreferQuality,\n setPreferQuality,\n resetPreferQuality,\n formatDate,\n isValidDate,\n getUnixTs,\n defineTabID,\n getTabID,\n getMovieTime,\n saveMovieTime,\n deleteMovieTime,\n isIE,\n delayReleaseQuota,\n getThumbnailUrl,\n getOptimizedImgUrl,\n elementReady,\n isEmpty,\n isFirstEnterIPAutoLogin,\n enableFirstEnterIPAutoLogin,\n disableFirstEnterIPAutoLogin,\n};\n","import * as Sentry from \"@sentry/react\";\nimport { Integrations } from \"@sentry/tracing\";\n\nconst start = () => {\n const tracesSampleRate =\n window.location.href.indexOf(\"debug=1\") === -1 ? 0.001 : 1;\n Sentry.init({\n dsn:\n \"https://de37ab2822df4541be944656153586a2@o187294.ingest.sentry.io/5612949\",\n integrations: [new Integrations.BrowserTracing()],\n\n // We recommend adjusting this value in production, or using tracesSampler\n // for finer control\n tracesSampleRate,\n });\n};\n\nexport default { start };\n","import tinycolor from \"tinycolor2\";\nimport grey from \"@material-ui/core/colors/grey\";\n\nconst primary = \"#FDC829\";\nconst secondary = \"#F44336\"\nconst warning = \"#FFC260\";\nconst success = \"#3CD4A0\";\nconst info = \"#9013FE\";\n\nconst lightenRate = 7.5;\nconst darkenRate = 15;\n\nexport default {\n breakpoints: {\n values: {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n tablet: 640,\n laptop: 1024,\n desktop: 1280,\n },\n },\n palette: {\n primary: {\n main: \"#6d89c0\",\n light: \"#e5eef1\",\n dark: \"#4d69a0\",\n },\n secondary: {\n main: secondary,\n light: tinycolor(secondary)\n .lighten(lightenRate)\n .toHexString(),\n dark: tinycolor(secondary)\n .darken(darkenRate)\n .toHexString(),\n contrastText: \"#FFFFFF\",\n },\n warning: {\n main: warning,\n light: tinycolor(warning)\n .lighten(lightenRate)\n .toHexString(),\n dark: tinycolor(warning)\n .darken(darkenRate)\n .toHexString(),\n },\n success: {\n main: success,\n light: tinycolor(success)\n .lighten(lightenRate)\n .toHexString(),\n dark: tinycolor(success)\n .darken(darkenRate)\n .toHexString(),\n },\n info: {\n main: info,\n light: tinycolor(info)\n .lighten(lightenRate)\n .toHexString(),\n dark: tinycolor(info)\n .darken(darkenRate)\n .toHexString(),\n },\n text: {\n primary: \"#4A4A4A\",\n secondary: \"#6E6E6E\",\n hint: \"#B9B9B9\",\n },\n background: {\n default: \"#FAFAFA\",\n light: \"#F3F5FF\",\n },\n common: {\n grey,\n special: {\n main: \"#5073b8\",\n dark: tinycolor(\"#5073b8\")\n .darken(darkenRate)\n .toHexString(),\n },\n },\n },\n customShadows: {\n widget:\n \"0px 3px 11px 0px #E8EAFC, 0 3px 3px -2px #B2B2B21A, 0 1px 8px 0 #9A9A9A1A\",\n widgetDark:\n \"0px 3px 18px 0px #4558A3B3, 0 3px 3px -2px #B2B2B21A, 0 1px 8px 0 #9A9A9A1A\",\n widgetWide:\n \"0px 12px 33px 0px #E8EAFC, 0 3px 3px -2px #B2B2B21A, 0 1px 8px 0 #9A9A9A1A\",\n },\n overrides: {\n MuiBackdrop: {\n root: {\n backgroundColor: \"#4A4A4A1A\",\n },\n },\n MuiMenu: {\n paper: {\n boxShadow:\n // \"0px 3px 11px 0px #E8EAFC, 0 3px 3px -2px #B2B2B21A, 0 1px 8px 0 #9A9A9A1A\",\n \"0px 0px 0px\", // not work\n },\n },\n MuiSelect: {\n icon: {\n color: \"#B9B9B9\",\n },\n },\n MuiListItem: {\n root: {\n \"&$selected\": {\n backgroundColor: \"#F3F5FF !important\",\n \"&:focus\": {\n backgroundColor: \"#F3F5FF\",\n },\n },\n },\n button: {\n \"&:hover, &:focus\": {\n backgroundColor: \"#F3F5FF\",\n },\n },\n },\n MuiTouchRipple: {\n child: {\n backgroundColor: \"white\",\n },\n },\n MuiTableRow: {\n root: {\n height: 56,\n },\n },\n MuiTableCell: {\n root: {\n borderBottom: \"1px solid rgba(224, 224, 224, .5)\",\n },\n head: {\n fontSize: \"0.95rem\",\n },\n body: {\n fontSize: \"0.95rem\",\n },\n },\n },\n};\n","import defaultThemeConfig from \"./default\";\n\nimport { createMuiTheme } from '@material-ui/core/styles'\n\nconst defaultTheme = createMuiTheme(defaultThemeConfig);\nconst overrides = {\n typography: {\n fontSize: 16,\n fontFamily: [\n '\"Noto Sans TC\"',\n \"sans-serif\",\n \"-apple-system\",\n \"BlinkMacSystemFont\",\n '\"Segoe UI\"',\n \"Roboto\",\n '\"Helvetica Neue\"',\n \"Arial\",\n \"sans-serif\",\n '\"Apple Color Emoji\"',\n '\"Segoe UI Emoji\"',\n '\"Segoe UI Symbol\"',\n ].join(\",\"),\n h1: {\n fontSize: \"2rem\",\n fontWeight: defaultTheme.typography.fontWeightMedium,\n lineHeight: 1.5,\n color: \"#212121\",\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"1.5rem\",\n },\n },\n h2: {\n fontSize: \"1.75rem\",\n lineHeight: 1.14,\n letterSpacing: 2,\n fontWeight: defaultTheme.typography.fontWeightBold,\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"1.125rem\",\n lineHeight: 1.11,\n },\n },\n h3: {\n fontSize: \"1.5rem\",\n fontWeight: defaultTheme.typography.fontWeightBold,\n lineHeight: 1.5,\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"1rem\",\n fontWeight: defaultTheme.typography.fontWeightMedium,\n },\n },\n h4: {\n fontSize: \"1.125rem\",\n fontWeight: defaultTheme.typography.fontWeightMedium,\n lineHeight: 1.33,\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"0.875rem\",\n lineHeight: 1.43,\n },\n },\n h5: {\n fontSize: \"0.875rem\",\n fontWeight: defaultTheme.typography.fontWeightRegular,\n lineHeight: 1.71,\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"0.75rem\",\n lineHeight: 1.5,\n },\n },\n h6: {\n fontSize: \"0.875rem\",\n fontWeight: defaultTheme.typography.fontWeightMedium,\n lineHeight: 1.71,\n [defaultTheme.breakpoints.down(\"xs\")]: {\n fontSize: \"0.75rem\",\n lineHeight: 1.33,\n },\n },\n h7: {\n fontSize: \"0.75rem\",\n fontWeight: defaultTheme.typography.fontWeightRegular,\n lineHeight: 1.33,\n },\n tags: {\n fontSize: \"1.125rem\",\n lineHeight: 1.11,\n letterSpacing: 1,\n [defaultTheme.breakpoints.down(\"sm\")]: {\n fontSize: \"0.8rem\",\n },\n },\n button: {\n fontSize: \"1rem\",\n fontWeight: 500,\n lineHeight: 1.5,\n letterSpacing: 0.15,\n },\n subtitle1: {\n fontSize: \"1rem\",\n fontWeight: 500,\n lineHeight: 1.75,\n letterSpacing: 0.15,\n [defaultTheme.breakpoints.down(\"sm\")]: {\n fontSize: 12,\n },\n },\n subtitle2: {\n fontSize: \"0.875rem\",\n fontWeight: 500,\n lineHeight: 1.71,\n letterSpacing: 0.1,\n [defaultTheme.breakpoints.down(\"sm\")]: {\n fontSize: \"0.75rem\",\n },\n },\n description: {\n fontSize: \"1rem\",\n lineHeifht: 2,\n letterSpacing: 0.15,\n [defaultTheme.breakpoints.down(\"sm\")]: {\n fontSize: \"0.875rem\",\n },\n },\n body2: {\n fontSize: \"0.875rem\",\n lineHeight: 1.71,\n letterSpacing: 0.15,\n },\n caption: {\n fontSize: \"0.75rem\",\n fontWeight: 700,\n },\n smallCaption: {\n fontSize: \"0.75rem\",\n lineHeight: 1.67,\n },\n font24: {\n fontSize: \"1.5rem\",\n lineHeight: 2.33,\n },\n inputLabel: {\n fontSize: \"0.75rem\",\n lineHeight: 1.67,\n },\n inputcBox: {\n fontSize: \"1rem\",\n fontWeight: 500,\n letterSpacing: 0.1,\n // Disable iOS input zoom (CSS only)\n // https://codepen.io/jakob-e/pen/yakBwJ\n transform: \"scale(0.875)\", // 14px\n [defaultTheme.breakpoints.down(\"xs\")]: {\n transform: \"scale(0.75)\", // 12px\n },\n }\n },\n};\n\nconst theme = createMuiTheme({ ...defaultThemeConfig, ...overrides });\nexport default { default: theme };\n","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nfunction ScrollToTop () {\n const { pathname } = useLocation();\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n\nexport default ScrollToTop;\n","import { useEffect } from \"react\";\n\nimport { defineTabID } from \"../utils/common\";\nimport { releaseQuotaByBeacon } from \"../clientAPI\";\n\nfunction PageTabID () {\n useEffect(() => {\n const tabId = defineTabID();\n\n // https://requestmetrics.com/building/using-the-beacon-api\n (function client () {\n if (!navigator.sendBeacon) {\n return;\n }\n\n function onUnload () {\n if (onUnload._hasUnloaded) {\n return;\n }\n onUnload._hasUnloaded = true;\n releaseQuotaByBeacon(tabId);\n }\n\n window.addEventListener(\"unload\", onUnload);\n window.addEventListener(\"pagehide\", onUnload);\n })();\n }, []);\n\n return null;\n}\n\nexport default PageTabID;\n","import { useEffect, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nimport isEmpty from \"lodash/isEmpty\";\nimport {\n useUserDispatch,\n useUserState,\n loginIPUser,\n} from \"../context/UserContext\";\n\nimport { staticUrl } from \"../utils/const\";\nimport { setHostname, isFirstEnterIPAutoLogin } from \"../utils/common\";\nimport { getPlatformInfo } from \"../clientAPI\";\nimport { useMatomo } from \"@datapunt/matomo-tracker-react\";\nimport { setBaseUrl, setDefaultBaseUrl } from \"../axios\";\n\nfunction getFaviconEl () {\n return document.getElementById(\"favicon\");\n}\n\nfunction PlatformInfo () {\n const history = useHistory();\n const userDispatch = useUserDispatch();\n const { platform, isAuthenticated } = useUserState();\n const { trackEvent, pushInstruction } = useMatomo();\n const [dummyState, setDummyState] = useState(false);\n\n useEffect(() => {\n setHostname();\n getPlatformInfo()\n .then(res => {\n userDispatch({\n type: \"SET_LOGIN_URL\",\n payload: { loginUrl: res.login_url || \"\" },\n });\n userDispatch({\n type: \"SET_PLATFORM_INFO\",\n payload: res,\n });\n if (res.api_url) {\n setBaseUrl(res.api_url);\n } else {\n setDefaultBaseUrl();\n }\n return res;\n })\n .then(platform => {\n if (\n window.location.pathname.match(/login/) !== null ||\n isAuthenticated ||\n platform.login_option_ip === false ||\n isFirstEnterIPAutoLogin()\n ) {\n return;\n }\n loginIPUser({\n dispatch: userDispatch,\n setIsLoading: setDummyState,\n trackEvent,\n pushInstruction,\n setIPLoginError: setDummyState,\n history,\n });\n })\n .catch(err => {\n console.log(err);\n });\n }, []);\n\n useEffect(() => {\n if (!isEmpty(platform)) {\n const favicon = getFaviconEl();\n favicon.href = `${staticUrl}/${platform.favicon.replace(/^\\//, \"\")}`;\n document.title = platform.cleaned_nickname || platform.nickname;\n }\n }, [platform]);\n\n return null;\n}\n\nexport default PlatformInfo;\n","import { useEffect } from \"react\";\n\nimport { useHistory } from \"react-router-dom\";\nimport { useMatomo } from \"@datapunt/matomo-tracker-react\";\nimport { useUserDispatch, signOut, resetUser } from \"../context/UserContext\";\n\nimport { getToken } from \"../utils/common\";\nimport { getUserInfo } from \"../clientAPI\";\n\nfunction UserInfo () {\n const history = useHistory();\n const token = getToken();\n const userDispatch = useUserDispatch();\n const { pushInstruction } = useMatomo();\n\n useEffect(() => {\n if (token) {\n getUserInfo()\n .then(res => {\n localStorage.setItem(\"user_info\", JSON.stringify(res));\n userDispatch({ type: \"SET_USER_INFO\", payload: res });\n pushInstruction(\"setUserId\", res.id);\n })\n .catch(err => {\n console.log(err);\n signOut(userDispatch, history, pushInstruction);\n });\n } else {\n resetUser(userDispatch, pushInstruction);\n }\n }, []);\n\n return null;\n}\n\nexport default UserInfo;\n","import { useEffect, useState } from \"react\";\nimport { useLastLocation } from \"react-router-last-location\";\n\nimport { getToken } from \"../utils/common\";\nimport { releaseQuota } from \"../clientAPI\";\n\nconst ReleaseQuota = () => {\n const lastLocation = useLastLocation();\n const [preLocation, setPrevLocation] = useState(lastLocation);\n const isMoviePage = location =>\n location && location.pathname.indexOf(\"/video/detail/movie\") !== -1;\n useEffect(() => {\n if (isMoviePage(window.location)) {\n return;\n }\n if (!getToken()) {\n return;\n }\n if (preLocation === null && lastLocation === null) {\n releaseQuota();\n } else if (!isMoviePage(preLocation) && isMoviePage(lastLocation)) {\n releaseQuota();\n }\n setPrevLocation(lastLocation);\n }, [lastLocation]);\n\n return null;\n};\n\nexport default ReleaseQuota;\n","import React, { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nimport { useMatomo } from \"@datapunt/matomo-tracker-react\";\nimport { useUserState } from \"../context/UserContext\";\nimport { setPreviousPage } from \"../utils/common\";\nimport tracker from \"../utils/tracker\";\n\nconst Location = props => {\n const location = useLocation();\n const { trackPageView, pushInstruction } = useMatomo();\n const { userInfo } = useUserState();\n\n useEffect(() => {\n //You can also check for page redirect logic or going back/forward from the browser logic here\n //Check if pathname is not changing dont track the view\n //So that you dont end up tracking the same view again and again\n if (userInfo.id) {\n pushInstruction(\"setUserId\", userInfo.id);\n tracker.GA.setUserID(userInfo.id);\n }\n setPreviousPage();\n trackPageView();\n tracker.GA.trackPageView();\n }, [location]);\n\n return {props.children};\n};\n\nexport default Location;\n","import React from \"react\";\nimport { BrowserRouter, Route, Switch, Redirect } from \"react-router-dom\";\nimport { lazy } from \"@loadable/component\";\nimport { LastLocationProvider } from \"react-router-last-location\";\nimport Preconnect from \"@shopify/react-preconnect\";\n\n// components\nimport Suspense from \"../components/Suspense/Suspense\";\n\n// context\nimport { useUserState } from \"../context/UserContext\";\n\n// others\nimport ScrollToTop from \"./ScrollToTop\";\nimport PageTabID from \"./PageTabID\";\nimport PlatformInfo from \"./PlatformInfo\";\nimport UserInfo from \"./UserInfo\";\nimport ReleaseQuota from \"./ReleaseQuota\";\nimport Track from \"./Track\";\n\nimport { apiUrl, staticUrl, trackUrl } from \"../utils/const\";\nimport { getPreviousPage } from \"../utils/common\";\n\n// components\nconst Layout = lazy(() => import(\"./Layout\"));\nconst MovieLayout = lazy(() => import(\"./MovieLayout\"));\nconst PartnerLogin = lazy(() => import(\"../pages/partner-login\"));\nconst PartnerIPAutoLogin = lazy(() => import(\"../pages/partner-ip-auto-login\"));\nconst PartnerSSOLogin = lazy(() => import(\"../pages/partner-sso-login\"));\n\nexport default function App () {\n // global\n const { isAuthenticated } = useUserState();\n\n const preconnectHosts = [\n apiUrl.replace(\"https://\", \"\"),\n staticUrl.replace(\"https://\", \"\"),\n trackUrl.replace(\"https://\", \"\"),\n \"storage.googleapis.com\",\n ];\n\n return (\n \n \n \n \n \n \n \n \n } />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n\n // #######################################################################\n\n function PrivateRoute ({ component, ...rest }) {\n return (\n \n isAuthenticated ? (\n React.createElement(component, props)\n ) : (\n \n )\n }\n />\n );\n }\n\n function PublicRoute ({ component, ...rest }) {\n let redirectPath = \"/\";\n try {\n redirectPath = getPreviousPage();\n } catch (e) {}\n\n return (\n \n isAuthenticated ? (\n \n ) : (\n React.createElement(component, props)\n )\n }\n />\n );\n }\n}\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from \"react\";\nimport { format } from \"date-fns\";\nimport isEmpty from \"lodash/isEmpty\";\nimport maxBy from \"lodash/maxBy\";\n\nvar WatchHistoryStateContext = React.createContext();\nvar WatchHistoryDispatchContext = React.createContext();\n\nconst initialState = [];\n\nfunction watchHistoryReducer (state, action) {\n const { type, payload = {} } = action;\n const { id } = payload;\n const dt = new Date()\n\n switch (type) {\n case \"ADD_WATCH_VIDEO\":\n return [\n ...state,\n {\n id: isEmpty(state) ? 0 : maxBy(state, \"id\") + 1,\n key: `${id}_${format(dt, \"yyyy-MM-dd\")}`,\n vid: id,\n date: format(dt, \"yyyy-MM-dd\"),\n created_at: format(dt, \"yyyy-MM-dd HH:MM:SS\"),\n },\n ];\n\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction WatchHistoryProvider ({ children }) {\n // https://medium.com/@walkccc/build-a-todo-list-app-with-react-hooks-and-context-a7f8e9f158af\n var [state, dispatch] = React.useReducer(watchHistoryReducer, initialState);\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useWatchHistoryState () {\n const context = React.useContext(WatchHistoryStateContext);\n if (context === undefined) {\n throw new Error(\n \"useWatchHistoryState must be used within a WatchHistoryProvider\",\n );\n }\n return context;\n}\n\nfunction useWatchHistoryDispatch () {\n const context = React.useContext(WatchHistoryDispatchContext);\n if (context === undefined) {\n throw new Error(\n \"useWatchHistoryDispatch must be used within a WatchHistoryProvider\",\n );\n }\n return context;\n}\n\nexport { WatchHistoryProvider, useWatchHistoryState, useWatchHistoryDispatch };\n","import React from \"react\";\n\nvar TempStateContext = React.createContext();\nvar TempDispatchContext = React.createContext();\n\nfunction tempReducer (state, action) {\n const { payload = {} } = action;\n switch (action.type) {\n case \"SET_HOMEPAGE_PAYLOAD\":\n return { ...state, ...payload };\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction TempProvider ({ children }) {\n var [state, dispatch] = React.useReducer(tempReducer, {\n menus: [],\n topics: [],\n banners: [],\n });\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useTempState () {\n var context = React.useContext(TempStateContext);\n if (context === undefined) {\n throw new Error(\"useTempState must be used within a TempProvider\");\n }\n return context;\n}\n\nfunction useTempDispatch () {\n var context = React.useContext(TempDispatchContext);\n if (context === undefined) {\n throw new Error(\"useTempDispatch must be used within a TempProvider\");\n }\n return context;\n}\n\nexport { TempProvider, useTempState, useTempDispatch };\n","import React from \"react\";\n\nvar OtherStateContext = React.createContext();\nvar OtherDispatchContext = React.createContext();\n\nfunction otherReducer (state, action) {\n switch (action.type) {\n case \"SET_CONTROL_SHOW\":\n return { ...state, showControl: true };\n case \"SET_CONTROL_HIDDEN\":\n return { ...state, showControl: false };\n case \"SET_FULLSCREEN_ACTIVE\":\n return { ...state, isFullscreenActive: true };\n case \"SET_FULLSCREEN_INACTIVE\":\n return { ...state, isFullscreenActive: false };\n default: {\n throw new Error(`Unhandled action type: ${action.type}`);\n }\n }\n}\n\nfunction OtherProvider ({ children }) {\n var [state, dispatch] = React.useReducer(otherReducer, {\n showControl: false,\n isFullscreenActive: false,\n });\n\n return (\n \n \n {children}\n \n \n );\n}\n\nfunction useOtherState () {\n var context = React.useContext(OtherStateContext);\n if (context === undefined) {\n throw new Error(\"useOtherState must be used within a OtherProvider\");\n }\n return context;\n}\n\nfunction useOtherDispatch () {\n var context = React.useContext(OtherDispatchContext);\n if (context === undefined) {\n throw new Error(\"useOtherDispatch must be used within a OtherProvider\");\n }\n return context;\n}\n\nexport { OtherProvider, useOtherState, useOtherDispatch };\n\n// ###########################################################\n","import \"react-app-polyfill/ie11\";\nimport \"react-app-polyfill/stable\";\n\nimport React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ThemeProvider } from \"@material-ui/styles\";\nimport { CssBaseline } from \"@material-ui/core\";\nimport { MatomoProvider } from \"@datapunt/matomo-tracker-react\";\nimport sentry from \"./utils/sentry\";\nimport tracker from \"./utils/tracker\";\n\nimport Themes from \"./themes\";\nimport App from \"./components/App\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport { SnackbarProvider } from \"notistack\";\nimport { LayoutProvider } from \"./context/LayoutContext\";\nimport { UserProvider } from \"./context/UserContext\";\nimport { VideoProvider } from \"./context/VideoContext\";\nimport { CollectionProvider } from \"./context/CollectionContext\";\nimport { WatchHistoryProvider } from \"./context/WatchHistoryContext\";\nimport { TempProvider } from \"./context/TempContext\";\nimport { OtherProvider } from \"./context/OtherContext\";\n\nsentry.start();\nconst instance = tracker.create();\n\nconst container = document.getElementById(\"root\");\n\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ,\n container,\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","import axios from \"axios\";\nimport Cookies from \"js-cookie\";\nimport queryString from \"query-string\";\nimport {\n getToken,\n resetToken,\n getDefaultAPIBase,\n getAPIURL,\n setAPIURL,\n} from \"./utils/common\";\n\nconst timeout = 12000;\n\nconst axiosInstance = axios.create({\n withCredentials: true,\n timeout: timeout,\n});\naxiosInstance.defaults.withCredentials = true;\n\naxiosInstance.interceptors.request.use(async function (config) {\n const { force_platform } = queryString.parse(window.location.search);\n if (force_platform) {\n config.params = { ...config.params, force_platform };\n }\n\n const token = getToken() || \"\";\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n\n const apiUrl = getBaseUrl();\n axiosInstance.defaults.baseURL = apiUrl;\n\n config.baseURL = apiUrl;\n axiosInstance.defaults.withCredentials = true;\n config.withCredentials = true;\n\n config.headers['original-origin'] = window.location.origin;\n\n return config;\n}, null);\n\n// https://github.com/axios/axios/issues/2315#issuecomment-568679445\naxiosInstance.interceptors.response.use(\n response => {\n return response;\n },\n error => {\n if (\n error.response &&\n (error.response.status === 401 ||\n (error.response.status === 404 &&\n error.response.data.detail === \"User not found\"))\n ) {\n resetToken();\n }\n return Promise.reject(error);\n },\n);\n\nexport const getBaseUrl = () => {\n return getAPIURL() || getDefaultAPIBase();\n};\n\nexport const setDefaultBaseUrl = () => {\n const url = getDefaultAPIBase();\n setAPIURL(url);\n axiosInstance.defaults.baseURL = url;\n return url;\n};\n\nexport const setBaseUrl = url => {\n if (url) {\n setAPIURL(url);\n axiosInstance.defaults.baseURL = url;\n return url;\n }\n};\n\nexport default axiosInstance;\n"],"sourceRoot":""}