{"version":3,"sources":["constants.ts","xr-platform-api.ts","helpers/getFilenameExtension.ts","components/LoadingScreen.tsx","features/account/auth/authStore.ts","features/account/stripe/stripeAPI.ts","features/account/user/userPrefStore.ts","helpers/cookies.ts","features/team/teamAPI.ts","features/account/auth/authAPI.ts","features/xr_experience/experience-store.ts","components/ConfirmationDialog.tsx","components/BouncyShadowCard.tsx","features/account/stripe/stripeHelpers.ts","components/AppIconAvatar.tsx","features/xr_experience/experience-manager.ts","common/helpers.ts","features/account/stripe/useStripeCustomer.ts","resources/img/app_icon.png","components/Pagination.tsx","features/xr_experience/experience-scene-manager-context.ts","features/team/teamHooks.ts","features/asset/assetUtilities.ts","config/BackendApi.ts","components/MoonIcon.tsx","components/SunIcon.tsx","resources/img/Metamask_Dark.svg","resources/img/Metamask_Light.svg","features/tag/tagAPI.ts","features/xr_experience/hooks/assetHooks.ts","features/asset/AssetCard.tsx","features/asset/AssetStore.tsx","features/tag/tagHooks.ts","features/account/stripe/StripeInput.jsx","features/account/stripe/PaymentFormDialog.tsx","helpers/reportServerError.ts","resources/img/loadRing.svg","resources/img/loadSpinner.svg","helpers/setUpExpLoadingScreen.js","features/asset/AssetStorePage.tsx","components/CookieConsent.tsx","components/TemplatesIcon.tsx","components/Navigation.tsx","components/MainLayout.tsx","pages/AppRouter.tsx","config/gtm.ts","config/stripe.ts","App.tsx","serviceWorker.ts","index.tsx"],"names":["USER_ROLE_TYPE","DOMAIN","process","MAX_AR_IMG_QUERY_WIDTH","MEGABYTE","Math","PI","MRK_FILE_SIZE_UL_LIMIT","IMG_FILE_SIZE_UL_LIMIT","VID_FILE_SIZE_UL_LIMIT","MDL_FILE_SIZE_UL_LIMIT","AUD_FILE_SIZE_UL_LIMIT","YEARLY_PLAN_NAME","SEMESTER_PLAN_NAME","MONTHLY_PLAN_NAME","BASIC_PLAN_NAME","isBackendError","reason","response","data","error","getAuthorizationHeader","token","Authorization","POST_CreateTeamInvite","teamID","a","axios","post","API_ROOT","headers","res","invite","reportServerError","getTeamsApi","query","get","params","then","catch","r","swapUserTeamAndRoleApi","id","req","add_props","put","user","DELETE_Subscription","delete","DELETE_SubscriptionUndo","subscription","DELETE_ReleaseSubscriptionSchedule","GET_Coupons","coupons","transferExperiencesApi","payload","GET_ExperienceList","Array","isArray","join","POST_Experience","addPropsQuery","onUploadProgress","POST_ExperienceFromTemplate","uuid","PUT_Experience","deleteExperienceApi","delete_marker","deleteExperiencesApi","GET_ExperienceDeeplink","deeplink","POST_CreateExperiencePreview","img","form","FormData","append","experience_preview_image","duplicateExperienceApi","toString","experience","POST_MarkerUpload","file","blur","name","POST_SwapExperienceMarker","expID","GET_Assets","GET_PresignedAssetPOST","POST_PresignedAssetPOST","type","presigned_post","url","fields","formData","Object","entries","forEach","entry","filename","substring","lastIndexOf","length","fetcher","create","defaults","common","GET_AssetURL","isMarker","POST_PurchaseStoreAsset","GET_FAQPages","LoadingScreen","props","width","height","position","zIndex","display","justifyContent","alignItems","flexDirection","size","thickness","style","margin","variant","authState","atom","key","default","logInAPI","undefined","access_token","Error","authUserIDState","selector","authUserRoleType","email","role_type_id","authTeamIDState","team_id","getCustomerAPI","customer","updatePaymentSourceAPI","tax_exempt","updateSubscriptionAPI","plan_id","quantity","coupon_id","subscription_items","getPlansListAPI","plans","createInvoicePreviewAPI","invoice","deleteSavedPaymentSourceAPI","createTaxExemptProofs","files","tax_exempt_proofs","consented","JSON","parse","cname","ca","decodeURIComponent","document","cookie","split","i","c","charAt","indexOf","getCookie","enableDarkMode","window","localStorage","getItem","language","compact","tutorial","userPrefState","darkModeState","set","newValue","setItem","stringify","prev","DefaultValue","cookieConsentState","cvalue","exdays","d","Date","setTime","getTime","expires","toUTCString","setCookie","getTeamAPI","getTeamMembersAPI","exclude_supers","users","getTeamExperienceCountAPI","exclude_super_users","exclude_deleted_users","updateTeamLogoAPI","credentials","method","domain","remember_duration","logOutAPI","sendVerificationEmailAPI","verifyAccountAPI","sendForgotPasswordEmailAPI","source_email","target_email","template_name_suffix","getForgotPasswordUserAPI","experienceHistory","undoHistory","redoHistory","experienceState","effects_UNSTABLE","setSelf","onSet","oldValue","push","undo","popped","pop","redo","selectedAssetIDState","assetInspectorState","marker","interaction","transform","playback","assetStoreState","open","replaceCurrent","expAssetsState","asset_transform_info","expAssetState","selectorFamily","session_id","find","asset","index","findIndex","filter","slice","ConfirmationDialog","title","message","yesColor","onNoClick","onYesClick","isLoading","onClose","Boolean","color","onClick","disabled","BouncyShadowCard","styles","useBouncyShadowStyles","classes","createStripePlans","rawPlanData","reduce","accum","curr","arr","nickname","yearly","semester","monthly","basic","getCustomerSubscription","subscriptions","getCustomerPlan","plan","getCustomerSeatQuantity","getCustomerPlanName","tier","includes","getCustomerPaymentSource","sources","customerHasPaymentSource","useStyles","makeStyles","theme","createStyles","root","spacing","AppIconAvatar","interactive","styleProps","component","Link","href","target","className","src","appIcon","generateSessionID","random","substr","getToken","exp","initExperienceAsync","markerFile","expName","isVertical","asset_uuids","scene_color","marker_floor_to_center_height","settings","is_vertical","marker_uuid","URL","createObjectURL","loadExperienceAsync","forViewer","experiences","is_public","backup_url","GET_SoundAssetURL","responseType","blobRes","objURL","status","getAssetsURL","map","Promise","all","strPos","values","v","strRot","rotation","x","y","z","w","strScl","scale","addExperienceAssetAsync","replaceWith","imgPromise","resolve","reject","Image","onload","h","onerror","ev","original_width","original_height","vidPromise","vid","createElement","preload","onloadedmetadata","videoWidth","videoHeight","volume","quat","Quaternion","FromEulerAngles","Tools","ToRadians","selectExperienceAsset","sessionID","updateExperienceAsset","update","throwNetworkError","TagManager","dataLayer","event","error_code","error_text","statusText","request_url","config","useStripeCustomer","useSWR","isValidating","mutate","Pagination","page","perPage","totalCount","onPageTurn","path","mdiArrowLeft","ceil","mdiArrowRight","ExperienceSceneManagerContext","React","createContext","experienceSceneManager","useExperienceSceneManagerContext","useContext","useTeam","team","useTeams","queryString","teams","useTeamMembers","members","useTeamExperienceCount","revalidateOnFocus","count_experiences","max_count_experiences","isLoadidng","MoonIcon","styled","mdiMoonWaxingCrescent","backgroundColor","palette","primary","dark","text","secondary","border","main","borderRadius","boxShadow","shadows","SunIcon","mdiWeatherSunny","background","getTagsAPI","useAssetsList","args","keys","assets","total_count","padding","divider","paddingTop","marginBottom","shape","top","outline","AssetCard","assetID","forStore","onPurchase","onImport","useState","mdiPlay","playbackIcon","setPlaybackIcon","handleButton","belongs_to_my_teams","CardMedia","image","thumbnail_asset_url","IconButton","audio","getElementById","paused","play","mdiPause","pause","url_512","preview_image_urls","controls","controlsList","Typography","noWrap","toUpperCase","gutterBottom","price","toFixed","CardActions","Button","fullWidth","categories","label","icon","mdiImage","mdiFilmstrip","mdiMusic","mdiCube","mdiBasket","mdiWallet","content","actions","borderTop","paper","minWidth","minHeight","breakpoints","up","marginLeft","tabs","flexGrow","tab","search","fade","white","searchIcon","pointerEvents","inputRoot","inputInput","paddingLeft","transition","transitions","chips","chip","listBox","confirmation","ntf","metamask","AssetStore","container","dialogProps","useTheme","openCCForm","setOpenCCForm","loading","setLoading","useSnackbar","enqueueSnackbar","closeSnackbar","authUser","useRecoilValue","useRecoilState","editor","setEditor","setTab","searchInput","setSearchInput","toPurchase","setToPurchase","expSceneManager","selectedID","assetReplace","tags","useTags","shouldRetryOnError","mutateCustomer","is_for_store","order_by","per_page","reverse","tag","storeAssetsQuery","setStoreAssetsQuery","prefetchStoreAssetsQuery","useMemo","teamAssetsQuery","setTeamAssetsQuery","prefetchTeamAssetsQuery","storeAssets","storeAssetsPage","totalStoreAssetsCount","teamAssets","teamAssetsPage","totalTeamAssetsCount","mutateUserAssets","handleBuy","assetToBuy","SUPER_CREATOR","persist","handleImport","console","handleBuyConfirmation","toImport","concat","updateSceneWithStateAsync","Fragment","PaymentFormDialog","paymentSource","onSubmit","udpatedCustomer","Dialog","BackdropProps","PaperProps","AppBar","Toolbar","Tabs","value","scrollButtons","onChange","Tab","wrapped","Autocomplete","multiple","options","t","ListboxComponent","Paper","renderInput","ref","InputProps","mdiMagnify","item","Chip","tabIndex","onDelete","tagToDelete","newSearch","InputBase","placeholder","input","inputProps","mdiCloseCircleOutline","DialogContent","Grid","xs","sm","md","lg","align","paragraph","metamaskL","metamaskD","alt","DialogActions","pageOffset","StripeInput","Component","inputRef","textColor","elementRef","useRef","useImperativeHandle","focus","current","onReady","element","showIcon","iconStyle","base","fullname","setFullname","address_zip","zip","setZip","toggleTax","setToggleTax","fileInput","stripe","useStripe","elements","useElements","handleSubmit","preventDefault","cardElement","getElement","CardNumberElement","createToken","exemptTax","createTaxExemptProofsAPI","from","DialogTitle","TextField","required","InputLabelProps","shrink","e","inputComponent","CardExpiryElement","CardCvcElement","FormControlLabel","control","Switch","checked","Collapse","in","CircularProgress","DefaultLoadingScreen","prototype","displayLoadingUI","this","_loadingDiv","opacity","innerHTML","getElementsByTagName","appendChild","box","spinner","logoSpinner","animation","webkitAnimation","transformOrigin","webkitTransformOrigin","ring","logoRing","_resizeLoadingUI","addEventListener","body","AssetStorePage","setOpen","Container","maxWidth","overflowX","CookieConsent","setConsent","handleCloseSnackbar","useCallback","accepted","useEffect","action","TemplatesIcon","SvgIcon","xmlns","viewBox","overflow","subList","borderLeft","nested","grey","nestedItem","toggle","bottom","logout","topProgress","left","bottomProgress","typographyProps","routes","mdiCollage","mdiCodeBracesBox","mdiTheater","mdiAccountGroup","mdiAccountCog","mdiFrequentlyAskedQuestions","Navigation","sidebarCollapsed","openLogout","setOpenLogout","darkMode","setDarkMode","setAuthUser","history","useHistory","handleDarkModeToggle","handleLogOut","getStorageLabel","file_size_h","max_file_size_h","getStoragePercent","file_size","max_file_size","List","aria-label","route","Tooltip","placement","arrow","disableFocusListener","disableHoverListener","disableTouchListener","ListItem","button","RouterLink","selected","location","to","ListItemIcon","ListItemText","primaryTypographyProps","Divider","paddingBottom","Box","right","cursor","fontSize","mdiCloud","LinearProgress","pt","secondaryTypographyProps","FormGroup","row","checkedIcon","mdiLogoutVariant","Header","getHeader","DrawerSidebar","getDrawerSidebar","Content","getContent","SidebarTrigger","getSidebarTrigger","SidebarContent","getSidebarContent","CollapseBtn","getCollapseBtn","Main","scheme","Layout","MainLayout","children","match","useMediaQuery","sidebar","state","elevation","disableGutters","sidebarId","mb","primarySidebar","collapsed","getFullYear","Suspense","fallback","configureHeader","builder","registerConfig","initialHeight","configureEdgeSidebar","anchor","registerTemporaryConfig","registerPermanentConfig","collapsible","collapsedWidth","enableAutoCollapse","AuthenticationPage","lazy","StatisticsPage","AccountPage","MyPresentationsPage","TemplatesPage","TeamPage","FaqPage","ShowcasePage","ManageShowcasesPage","VerifyAccountPage","ForgotPasswordPage","ResetPasswordPage","PresentationEditorPage","PresentationViewerPage","DeleteAccountPage","ProtectedRoute","authUserLoadable","useRecoilValueLoadable","contents","AppRouter","exact","embedded","tagManagerArgs","gtmId","initGTM","initialize","stripeConfig","loadStripe","useSnackbarStyles","anchorOriginBottomCenter","anchorOriginBottomRight","App","baseTheme","createMuiTheme","cyan","lightBlue","pink","deepOrange","MuiTextField","MuiButton","disableElevation","MuiButtonGroup","MuiPaper","MuiCard","MuiTooltip","overrides","MuiContainer","responsiveFontSizes","CssBaseline","dense","autoHideDuration","anchorOrigin","horizontal","vertical","TransitionComponent","Fade","TransitionProps","hostname","ReactDOM","render","StrictMode","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.e1fe23b0.chunk.js","sourcesContent":["export enum USER_ROLE_TYPE {\n SUPER_ADMIN = 1,\n ADMIN,\n SUPER_CREATOR,\n CREATOR,\n SUPER_VIEWER,\n VIEWER,\n}\n\nexport const DOMAIN = process.env.REACT_APP_DOMAIN!;\n\n//Endpoint Defaults\nexport const MAX_MARKER_QUERY_WIDTH = 2500;\nexport const MAX_AR_IMG_QUERY_WIDTH = 500;\nexport const DEFAULT_PER_PAGE = 24;\n\n//Editor Scene\nexport const SCN_CLEAR_COLOR_DARK = \"#4E3A82FF\"; // purple\nexport const SCN_CLEAR_COLOR_LIGHT = \"#5B7EA3FF\"; // blue\nexport const SKY_BOX_SIZE = 20;\nexport const GROUND_SIZE = 8;\n\n// ArcRotateCamera defaults\nexport const DEFAULT_ALPHA = -Math.PI / 2;\nexport const DEFAULT_BETA = Math.PI / 2;\nexport const DEFAULT_RADIUS = 5;\nexport const DEFAULT_LOWER_RADIUS_LIMIT = 0.15;\nexport const DEFAULT_UPPER_RADIUS_LIMIT = 15;\nexport const DEFAULT_PANNING_LIMIT = 10;\nexport const DEFAULT_PANNING_SENSITIVITY = 5000;\nexport const DEFAULT_WHEEL_PRECISION = 200;\nexport const DEFAULT_OFFSET = 0.1; // Recommended by BabylonJS\n\n// Gizmo Manager defaults\nexport const POS_SNAP_DISTANCE = 0.1;\nexport const ROT_SNAP_DISTANCE = Math.PI / 8;\nexport const SCL_SNAP_DISTANCE = 0.25;\nexport const SCL_SENSITIVITY = 4;\nexport const SCL_BOX_SIZE = 0.025;\nexport const ROT_SPHERE_SIZE = 0.025;\n\n// File Upload defaults\nexport const MEGABYTE = 1000000;\nexport const MRK_FILE_SIZE_UL_LIMIT = 4 * MEGABYTE;\nexport const IMG_FILE_SIZE_UL_LIMIT = 4 * MEGABYTE;\nexport const VID_FILE_SIZE_UL_LIMIT = 20 * MEGABYTE;\nexport const MDL_FILE_SIZE_UL_LIMIT = 20 * MEGABYTE;\nexport const AUD_FILE_SIZE_UL_LIMIT = 10 * MEGABYTE;\n\n// Stripe\nexport const YEARLY_PLAN_NAME = \"personal/team every 12 months\";\nexport const SEMESTER_PLAN_NAME = \"personal/team every 4 months\";\nexport const MONTHLY_PLAN_NAME = \"personal/team\";\nexport const BASIC_PLAN_NAME = \"basic\";\n","import axios, { AxiosResponse } from 'axios'\nimport { PageQuery } from 'common/types/xrp'\n\nimport { getFilenameExtension } from './helpers/getFilenameExtension'\nimport reportServerError from './helpers/reportServerError'\nimport {\n Asset,\n AssetType,\n Marker,\n Experience,\n ExperienceSettings\n} from './models/exp-entities'\nimport { StripeCoupon } from './models/stripe'\nimport User from './models/user'\nimport { Team, TeamInvite, TeamInviteFormData } from './types'\nimport { API_ROOT } from './config/BackendApi'\n\nexport interface XRServerResponse {\n error: string | null\n status: string\n}\n\nexport interface Pagination {\n page: number\n total_count: number\n}\n\nconst isBackendError = (\n reason: any\n): reason is { response: AxiosResponse } => {\n return reason.response.data.error\n}\n\nconst getAuthorizationHeader = (token: string | null | undefined) => {\n return token ? { Authorization: `Bearer ${token}` } : {}\n}\n\n//#region Authentication\nexport type LoginAddPropsQuery = 'plan_nickname' | 'settings' | 'taken_slots'\n\nexport interface LoginRequest {\n domain: string\n password: string\n email_or_username: string\n remember?: boolean\n remember_duration?: number\n}\n\nexport interface LoginResponse extends XRServerResponse {\n access_token: string\n refresh_token: string | null\n user: User\n}\n\nexport const GET_VerifyLogin = async (addPropsQuery?: 'settings') => {\n try {\n const res = await axios.get(`${API_ROOT}/api/v2/verify_login`, {\n params: { add_props: addPropsQuery }\n })\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_Login = async (\n req: LoginRequest,\n addPropsQuery?: LoginAddPropsQuery | LoginAddPropsQuery[]\n) => {\n try {\n const res = await axios.post(`${API_ROOT}/api/v2/login`, req, {\n params: { add_props: addPropsQuery }\n })\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\n//#endregion\n\n//#region Team\nexport interface TeamInviteResponse extends XRServerResponse {\n invite: TeamInvite\n}\n\nexport const POST_CreateTeamInvite = async (\n teamID: number,\n data: TeamInviteFormData\n) => {\n try {\n const res = await axios.post(\n `${API_ROOT}/api/v1/team/${teamID}/invite/create`,\n data,\n {\n headers: { 'Content-Type': 'application/json' }\n }\n )\n return res.data.invite\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport type TeamsQuery = {\n add_props?: string\n id?: number\n is_white_labelling?: boolean\n max_count_experience_min?: number\n max_count_experience_max?: number\n max_count_users_min?: number\n max_count_users_max?: number\n name?: string\n teamname?: string\n} & PageQuery\n\nexport type PaginatedTeamsResponse = {\n teams: Team[]\n} & Pagination &\n XRServerResponse\n\nexport const getTeamsApi = (query?: TeamsQuery) =>\n axios\n .get(`${API_ROOT}/api/v1/teams`, {\n params: query\n })\n .then(res => res.data)\n .catch(r => {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n })\n\nexport type UserTeamRoleSwapRequest = {\n team_id: number\n role_name: 'admin' | 'creator' | string\n}\n\n/**\n *\n * @param id User ID\n * @returns\n */\nexport const swapUserTeamAndRoleApi = (\n id: number,\n req: UserTeamRoleSwapRequest,\n add_props?: string\n) =>\n axios\n .put(\n `${API_ROOT}/api/v1/user/${id}/team_role/swap`,\n req,\n { params: { add_props } }\n )\n .then(res => res.data.user)\n .catch(r => {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n })\n\n//#endregion\n\n//#region Stripe - Plan/Subscription\nexport const DELETE_Subscription = async () => {\n try {\n await axios.delete(`${API_ROOT}/api/v1/subscription/delete`)\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const DELETE_SubscriptionUndo = async () => {\n try {\n const res = await axios.delete(\n `${API_ROOT}/api/v1/subscription/delete/undo`\n )\n return res.data.subscription\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const DELETE_ReleaseSubscriptionSchedule = async () => {\n try {\n const response = await axios.delete<\n XRServerResponse & { subscription: any }\n >(`${API_ROOT}/api/v1/release_subscription_schedule`)\n return response.data.subscription\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const GET_Coupons = async () => {\n try {\n const res = await axios.get(\n `${API_ROOT}/api/v1/coupons`\n )\n return res.data.coupons\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const PUT_ApplyCoupon = async (coupon_id: string) => {\n try {\n const res = await axios.put(`${API_ROOT}/api/v1/apply-coupon`, { coupon_id })\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n//#endregion\n\n//#region Experience\nexport type ExperienceAddPropsQuery =\n | 'asset_uuids'\n | 'count_views'\n | 'count_views_h'\n | 'file_size'\n | 'file_size_h'\n | 'user_full_name'\n | 'deeplink'\n | 'has_non_premium_assets'\n | `marker.${keyof Marker}`\n | 'max_views_per_24_hours'\n | 'preview_image_urls'\n | 'view_mocks_rate'\n | 'short_code'\n | 'team_logo_image_url'\n\nexport interface ExperienceListQuery {\n add_props?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[] // adds one or more comma-separated properties to the output object\n author_name?: string // case-insensitive, matches partials\n can_feature?: boolean\n exclude_deleted_users?: boolean\n exclude_super_users?: boolean\n expand?: string // default \"marker\"\n id?: number\n is_public?: boolean\n marker_uuid?: string\n name?: string // case-insensitive, matches partials\n not_tag?: string // inverse of tag, case-insensitive, comma-seperated, AND-logic\n omissions?: string // any experience props to be omitted, comma-separated\n order_by?: string // default created\n page?: number\n per_page?: number // default 20\n reverse?: boolean // default false\n showcase_id?: number\n showcase_uuid?: string\n short_code?: string // 5-char base36(id)\n tag?: string | string[]\n team_id?: number\n user_id?: number\n uuid?: string\n}\n\nexport interface ExperienceResponse extends XRServerResponse {\n experience: Experience\n}\n\nexport interface ExperienceListResponse extends Pagination, XRServerResponse {\n experiences: Experience[]\n}\n\nexport interface ExperienceRequest {\n asset_transform_info: Asset[]\n author_name?: string | null\n asset_uuids: string[]\n delete_old_marker?: boolean\n description?: string | null\n is_from_custom?: boolean\n marker_uuid?: string | null\n meta?: any\n name: string\n product_id?: number\n settings?: Partial\n contact_email?: string\n scene_color?: string\n marker_floor_to_center_height?: number | null\n}\n\nexport type ExperienceTransferPayload = {\n experience_uuids_user_ids: { experience_uuid: string; user_id: number }[]\n}\n\nexport const transferExperiencesApi = (payload: ExperienceTransferPayload) =>\n axios\n .put(`${API_ROOT}/api/v1/experiences/transfer`, payload)\n .then(res => res.data)\n\nexport const GET_ExperienceList = async (query?: ExperienceListQuery) => {\n try {\n const res = await axios.get(`${API_ROOT}/api/v1/experiences`, {\n params: query && {\n ...query,\n add_props: Array.isArray(query.add_props)\n ? query.add_props.join(',')\n : query.add_props\n }\n })\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_Experience = async (\n req: ExperienceRequest,\n addPropsQuery?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[],\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n try {\n const res = await axios.post(\n `${API_ROOT}/api/v1/experience/create`,\n req,\n {\n params: {\n add_props: Array.isArray(addPropsQuery)\n ? addPropsQuery.join(',')\n : addPropsQuery\n },\n onUploadProgress\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_ExperienceFromTemplate = async (\n uuid: string,\n // req: ExperienceRequest,\n addPropsQuery?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[],\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n try {\n const res = await axios.post(\n `${API_ROOT}/api/v1/experience/${uuid}/create_from_template`,\n null,\n {\n params: {\n add_props: Array.isArray(addPropsQuery)\n ? addPropsQuery.join(',')\n : addPropsQuery\n },\n onUploadProgress\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const PUT_Experience = async (\n id: number,\n req: Partial,\n addPropsQuery?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[],\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n try {\n const res = await axios.put(\n `${API_ROOT}/api/v1/experience/${id}`,\n req,\n {\n params: {\n add_props: Array.isArray(addPropsQuery)\n ? addPropsQuery.join(',')\n : addPropsQuery\n },\n onUploadProgress\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const deleteExperienceApi = async (\n uuid: string,\n delete_marker = false\n) => {\n try {\n const res = await axios.delete(\n `${API_ROOT}/api/v1/experience/${uuid}/delete`,\n { params: { delete_marker } }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const deleteExperiencesApi = (req: {\n experience_uuids_marker_deletes: {\n experience_uuid: string\n delete_marker?: boolean\n }[]\n}) =>\n axios\n .delete(`${API_ROOT}/api/v1/experiences/delete`, { data: req })\n .then(res => res.data)\n .catch(r => {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n })\n\nexport const GET_ExperienceQRBlob = async (\n uuid: string,\n token?: string,\n index: number = 1\n) => {\n try {\n const res = await axios.get(\n `${API_ROOT}/api/v1/experience/${uuid}/qrcode/${index}`,\n {\n responseType: 'blob',\n headers: {\n ...getAuthorizationHeader(token)\n }\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const GET_ExperienceDeeplink = async (\n uuid: string,\n token?: string | null\n) => {\n try {\n const response = await axios.get(\n `${API_ROOT}/api/v1/experience/${uuid}/deeplink`,\n {\n headers: {\n ...getAuthorizationHeader(token)\n }\n }\n )\n return response.data.deeplink\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport interface ExperiencePreviewImage {\n created: string\n experience_uuid: string\n file_size: number | null\n modified: string\n name: string | null\n url: string\n uuid: string\n}\n\nexport const POST_CreateExperiencePreview = async (img: Blob, uuid: string) => {\n try {\n const form = new FormData()\n form.append('file', img)\n form.append('experience_uuid', uuid)\n\n const res = await axios.post<\n XRServerResponse & { experience_preview_image: ExperiencePreviewImage }\n >(`${API_ROOT}/api/v1/experience_preview_image/create`, form, {\n headers: { 'Content-Type': 'multipart/form-data' }\n })\n return res.data.experience_preview_image\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const duplicateExperienceApi = (\n uuid: string,\n add_props?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[]\n) =>\n axios\n .post(\n `${API_ROOT}/api/v1/experience/${uuid}/create_copy`,\n null,\n {\n params: {\n add_props: Array.isArray(add_props) ? add_props.toString() : add_props\n }\n }\n )\n .then(res => res.data.experience)\n .catch(error => {\n if (isBackendError(error)) {\n reportServerError(error)\n throw error.response.data.error\n }\n throw error\n })\n\n//#endregion\n\n//#region Marker and Asset\nexport interface MarkerResponse extends XRServerResponse {\n marker: Marker\n}\n\nexport interface MarkerUpdateRequest {\n width?: number\n user_id?: number\n type?: string /** image|geo|multi */\n floor_to_center_height?: number | null\n}\n\nexport interface AssetRequest {\n text?: string\n description?: string\n public?: boolean\n file?: File\n type?: AssetType\n}\n\nexport interface AssetResponse extends XRServerResponse {\n asset: Asset\n}\n\nexport interface AssetURLQuery {\n width?: number\n height?: number\n fit?: string //default cover,\n background?: { r: number; g: number; b: number; alpha: number }\n}\n\nexport interface AssetURLResponse extends XRServerResponse {\n backup_url: string | null\n url: string | null\n}\n\nexport interface PresignedAssetPostResponse extends XRServerResponse {\n presigned_post: {\n fields: {\n AWSAccessKeyId: string\n key: string\n policy: string\n signature: string\n success_action_redirect: string\n 'x-amz-meta-uuid': string\n }\n url: string\n }\n}\n\nexport interface AssetListResponse extends Pagination, XRServerResponse {\n assets: Asset[]\n}\n\nexport interface AssetListQuery {\n add_props?: string\n expand?: string\n experience_id?: number\n file_ext?: string\n id?: number\n is_for_store?: boolean\n is_from_custom?: boolean\n is_preview_image?: boolean\n name?: string // case-insensitive, matches partials\n not_tag?: string // inverse of tag, case-insensitive, comma-seperated, AND-logic\n order_by?: string // default created\n page?: number\n per_page?: number // default 20\n reverse?: boolean // default false\n showcase_id?: number\n tag?: string // case-insensitive, comma-seperated, AND-logic\n team_id?: number\n type?: string\n user_id?: number\n uuid?: number\n}\n\nexport const POST_MarkerUpload = async (\n file: File,\n blur?: boolean,\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n try {\n const data = new FormData()\n data.append('marker_file', file, file.name)\n if (blur) {\n data.append('also_upload_blur', 'true')\n }\n const res = await axios.post(\n `${API_ROOT}/api/v2/marker/upload`,\n data,\n {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const PUT_MarkerUpdate = async (\n uuid: string,\n req: MarkerUpdateRequest,\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n const res = await axios.put(`${API_ROOT}/api/v1/marker/${uuid}`, req, {\n onUploadProgress\n })\n return res.data\n}\n\nexport const POST_SwapExperienceMarker = async (expID: number, file: File) => {\n try {\n const data = new FormData()\n data.append('file', file, file.name)\n data.append('delete_old_marker', 'false')\n data.append('also_upload_blur', 'true')\n const response = await axios.put<\n XRServerResponse & { experience: Experience }\n >(`${API_ROOT}/api/v1/experience/${expID}/marker_swap`, data, {\n headers: { 'Content-Type': 'multipart/form-data' }\n })\n return response.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const GET_Assets = async (query?: AssetListQuery) => {\n const response = await axios.get(`${API_ROOT}/api/v1/assets`, {\n params: query\n })\n return response.data\n}\n\nexport const POST_Asset = async (\n req: AssetRequest,\n onUploadProgress?: (progressEvent: ProgressEvent) => void\n) => {\n const { text, description, public: _public, file, type } = req\n const formData = new FormData()\n if (text && text !== '') {\n formData.append('text', text)\n }\n if (description && description !== '') {\n formData.append('description', description)\n }\n if (_public !== undefined) {\n formData.append('public', _public.toString())\n }\n if (file) {\n formData.append('file', file)\n }\n if (type) formData.append('type', type)\n try {\n const res = await axios.post(\n `${API_ROOT}/api/v1/asset/create`,\n formData,\n {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const GET_PresignedAssetPOST = async () => {\n try {\n const res = await axios.get(\n `${API_ROOT}/api/v1/asset/presigned_post`\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_PresignedAssetPOST = async (\n file: File,\n type: AssetType,\n onUploadProgress?: (progressEvent: any) => void\n) => {\n const { url, fields } = (await GET_PresignedAssetPOST()).presigned_post\n const formData = new FormData()\n Object.entries(fields).forEach(entry => formData.append(entry[0], entry[1]))\n formData.append('Content-Type', file.type)\n // const re = /(?:\\.([^.]+))?$/;\n // const ext = (re.exec(file.name) ?? [])[1];\n // console.log(ext);\n formData.append('x-amz-meta-file_ext', getFilenameExtension(file.name))\n formData.append('x-amz-meta-type', type as string)\n formData.append('file', file)\n\n const fetcher = axios.create()\n fetcher.defaults.headers.common = {}\n\n try {\n const response = await fetcher.post(url, formData, {\n headers: {\n 'Content-Type': 'multipart/form-data'\n },\n onUploadProgress\n })\n return response.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const GET_AssetURL = async (\n uuid: string,\n isMarker?: boolean,\n query?: AssetURLQuery,\n token?: string\n) => {\n try {\n const res = await axios.get(\n `${API_ROOT}/api/v2/${isMarker ? 'marker' : 'asset'}/${uuid}/url`,\n {\n params: query,\n headers: {\n ...getAuthorizationHeader(token)\n }\n }\n )\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_PurchaseStoreAsset = async (uuid: string) => {\n try {\n const response = await axios.post(\n `${API_ROOT}/api/v1/asset/${uuid}/buy`\n )\n return response.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n//#endregion\n\n//#region FAQ\nexport interface FAQPayload {\n name: string\n text: string\n}\n\nexport interface FAQ {\n created?: string\n id?: number\n modified?: string\n category?: string\n name?: string\n text: string\n}\n\nexport interface FAQResponse extends XRServerResponse {\n faq_page: FAQ\n}\n\nexport interface PaginatedFAQResponse extends XRServerResponse, Pagination {\n faq_pages: FAQ[]\n}\n\nexport const GET_FAQPages = async (query?: {\n order_by?: string\n page?: number\n per_page?: number\n reverse?: boolean\n}) => {\n try {\n const res = await axios.get(`${API_ROOT}/api/v1/faq_pages`, {\n params: query\n })\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const POST_CreateFAQPage = async (payload: FAQPayload) => {\n try {\n const res = await axios.post(\n `${API_ROOT}/api/v1/faq_page/create`,\n payload\n )\n return res.data.faq_page\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\nexport const PUT_FAQPageUpdate = async (\n id: number,\n payload: Partial\n) => {\n try {\n const res = await axios.put(`${API_ROOT}/api/v1/faq_page/${id}`, payload)\n return res.data\n } catch (r) {\n if (isBackendError(r)) {\n reportServerError(r)\n throw r.response.data.error\n }\n throw r\n }\n}\n\n//#endregion\n","export const getFilenameExtension = (filename: string) => {\n return (\n filename.substring(filename.lastIndexOf('.') + 1, filename.length) ||\n filename\n );\n};\n","import { Box, CircularProgress, Typography } from \"@material-ui/core\";\nimport React from \"react\";\n\nexport function LoadingScreen(props: {\n width?: number | string;\n height?: number | string;\n position?: string;\n zIndex?: number;\n}) {\n const { width, height, position, zIndex } = props;\n return (\n \n \n Loading\n \n );\n}\n","import { atom, selector } from 'recoil'\n\nimport { User } from '../../../types'\nimport { logInAPI } from './authAPI'\n\nexport const authState = atom({\n key: 'authState',\n default: logInAPI(\n undefined\n // 'file_size,file_size_h,max_file_size,max_file_size_h,count_experience_views_h'\n )\n .then(data => {\n if (data.access_token === null) {\n throw new Error('Account not verified')\n }\n return data.user\n })\n .catch(reason => null)\n})\n\nexport const authUserIDState = selector({\n key: 'authUserIDState',\n get: ({ get }) => get(authState)?.id\n})\nexport const authUserEmailState = selector({\n key: 'authUserEmailState',\n get: ({ get }) => get(authState)?.email\n})\nexport const authUserRoleType = selector({\n key: 'authUserRoleType',\n get: ({ get }) => get(authState)?.role_type_id\n})\nexport const authTeamIDState = selector({\n key: 'authTeamIDState',\n get: ({ get }) => get(authState)?.team_id\n})\n","import { Token } from \"@stripe/stripe-js\";\n// import axios from 'axios';\nimport { ServerResponse } from \"../../../types\";\n// import { axios } from \"../../../helpers/configAxios\";\nimport axios from \"axios\";\nimport reportServerError from \"../../../helpers/reportServerError\";\nimport { API_ROOT } from '../../../config/BackendApi'\n\nexport const getCustomerAPI = async () => {\n try {\n const response = await axios.get(\n `${API_ROOT}/api/v1/customer`\n );\n return response.data.customer;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport const updatePaymentSourceAPI = async (\n token: Token,\n email: string,\n tax_exempt: \"none\" | \"exempt\" | \"reverse\" = \"none\"\n) => {\n try {\n const formData = new FormData();\n formData.append(\"stripeToken\", token.id);\n formData.append(\"stripeEmail\", email);\n formData.append(\"tax_exempt\", tax_exempt as string);\n const response = await axios.put(\n `${API_ROOT}/api/v1/update-payment-source`,\n formData,\n { headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" } }\n );\n return response.data.customer;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport const updateSubscriptionAPI = async (\n plan_id: string,\n quantity?: number,\n coupon_id?: string\n) => {\n try {\n const response = await axios.put(\n `${API_ROOT}/api/v1/subscription`,\n { subscription_items: [{ plan_id, quantity }], coupon_id }\n );\n return response.data.subscription;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport const getPlansListAPI = async () => {\n try {\n const response = await axios.get(\n `${API_ROOT}/api/v1/list-plans`\n );\n return response.data.plans;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport const createInvoicePreviewAPI = async (\n plan_id: string,\n quantity?: number,\n coupon_id?: string\n) => {\n try {\n const response = await axios.post(\n `${API_ROOT}/api/v1/invoice_preview`,\n { subscription_items: [{ plan_id, quantity }], coupon_id }\n );\n return response.data.invoice;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport const deleteSavedPaymentSourceAPI = async (id: string) => {\n try {\n const response = await axios.delete(`${API_ROOT}/api/v1/delete-card/${id}`);\n return response.data;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n\nexport type TaxExemptProof = {\n created: string; // datetime\n modified: string; // datetime\n name: string | null; // derived from file.filename\n url: string;\n user_billing_id: number;\n uuid: string;\n};\n\nexport const createTaxExemptProofs = async (files: File[]) => {\n try {\n const formData = new FormData();\n files.forEach(file => formData.append(file.name, file));\n\n const response = await axios.post<\n ServerResponse & { tax_exempt_proofs: TaxExemptProof[] }\n >(`${API_ROOT}/api/v1/tax_exempt_proofs/create`, formData, {\n headers: { \"Content-Type\": \"multipart/form-data\" },\n });\n return response.data.tax_exempt_proofs;\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw new Error(reason.response.data.error);\n }\n throw reason;\n }\n};\n","import { atom, DefaultValue, selector } from \"recoil\";\nimport { getCookie, setCookie } from \"../../../helpers/cookies\";\n\n// Whether the use has consented to cookies.\nconst consented: boolean = JSON.parse(\n getCookie(\"pr-cookie-consent\") ?? \"false\"\n);\n// User's prefered theme mode.\nconst enableDarkMode: boolean = JSON.parse(\n window.localStorage.getItem(\"dark-mode-enabled\") ?? \"false\"\n);\n// User's default language. Consider making this a cookie item.\nconst language = window.localStorage.getItem(\"language\") ?? \"en\";\n// User's sibebar collapsed state.\nconst compact: boolean = JSON.parse(\n window.localStorage.getItem(\"compact-mode-enabled\") ?? \"false\"\n);\n// Whether to show tutorial everytime.\nconst tutorial: boolean = JSON.parse(\n window.localStorage.getItem(\"tutorial-enabled\") ?? \"true\"\n);\n\nexport const userPrefState = atom({\n key: \"userPrefState\",\n default: { enableDarkMode, language, compact, consented, tutorial },\n});\n\nexport const darkModeState = selector({\n key: \"darkModeState\",\n get: ({ get }) => get(userPrefState).enableDarkMode,\n set: ({ set }, newValue) => {\n // Sync setting to local storage.\n window.localStorage.setItem(\"dark-mode-enabled\", JSON.stringify(newValue));\n set(userPrefState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n return { ...prev, enableDarkMode: newValue };\n });\n },\n});\n\nexport const compactModeState = selector({\n key: \"compactModeState\",\n get: ({ get }) => get(userPrefState).compact,\n set: ({ set }, newValue) => {\n // Sync setting to local storage.\n window.localStorage.setItem(\n \"compact-mode-enabled\",\n JSON.stringify(newValue)\n );\n set(userPrefState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n return { ...prev, compact: newValue };\n });\n },\n});\n\nexport const tutorialModeState = selector({\n key: \"tutorialModeState\",\n get: ({ get }) => get(userPrefState).tutorial,\n set: ({ set }, newValue) => {\n // Sync setting to local storage.\n window.localStorage.setItem(\"tutorial-enabled\", JSON.stringify(newValue));\n set(userPrefState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n return { ...prev, tutorial: newValue };\n });\n },\n});\n\nexport const cookieConsentState = selector({\n key: \"cookieConsentState\",\n get: ({ get }) => get(userPrefState).consented,\n set: ({ set }, newValue) => {\n // Sync with cookies\n setCookie(\"pr-cookie-consent\", JSON.stringify(newValue), 10 * 365);\n // set(userPrefState, );\n set(userPrefState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n return { ...prev, consented: newValue };\n });\n },\n});\n","export const setCookie = (cname: string, cvalue: string, exdays: number) => {\n const d = new Date();\n d.setTime(d.getTime() + exdays * 24 * 60 * 60 * 1000);\n const expires = 'expires=' + d.toUTCString();\n document.cookie = cname + '=' + cvalue + ';' + expires + ';path=/';\n};\n\nexport const getCookie = (cname: string) => {\n const name = cname + '=';\n const decodedCookie = decodeURIComponent(document.cookie);\n const ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n }\n return null;\n};\n","import axios from 'axios'\n\nimport reportServerError from '../../helpers/reportServerError'\nimport { ServerResponse, Team, TeamMember } from '../../types'\nimport { API_ROOT } from '../../config/BackendApi';\n\nexport const getTeamAPI = async (id: number) => {\n try {\n const response = await axios.get(`${API_ROOT}/api/v1/team/${id}`)\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\nexport const getTeamMembersAPI = async (id: number) => {\n try {\n const response = await axios.get<\n ServerResponse & {\n users: TeamMember[]\n }\n >(`${API_ROOT}/api/v2/team/${id}/admin-panel/users`, {\n params: { exclude_supers: 1 }\n })\n return response.data.users\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\nexport const getTeamExperienceCountAPI = async (\n teamID: number,\n exclude_super_users = true,\n exclude_deleted_users = true\n) => {\n try {\n const response = await axios.get<\n ServerResponse & {\n count_experiences: number\n max_count_experiences: number | null\n }\n >(`${API_ROOT}/api/v1/team/${teamID}/count-experiences`, {\n params: { exclude_super_users, exclude_deleted_users }\n })\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\nexport const updateTeamLogoAPI = async (\n id: number,\n file: File,\n access_token?: string\n) => {\n try {\n const data = new FormData();\n data.append(\"logo_image\", file, file.name);\n const response = await axios.put<\n ServerResponse & { accessToken: string; team: Team }\n >(`${API_ROOT}/api/v1/team/${id}`, data, {\n headers: {\n Authorization: access_token\n ? 'Bearer ' + access_token\n : axios.defaults.headers.common['Authorization'],\n 'Content-Type': 'application/json'\n }\n })\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw reason.response.data.error;\n }\n throw reason;\n }\n};","import axios from 'axios'\nimport { isBackendError } from 'common/helpers'\nimport { XRPServerResponse } from 'common/types/xrp'\nimport { User } from 'types'\n\nimport { DOMAIN } from '../../../constants'\nimport reportServerError from '../../../helpers/reportServerError'\nimport { API_ROOT } from '../../../config/BackendApi'\n\nexport type LoginResponse = {\n access_token: string | null\n user: User\n} & XRPServerResponse\n\n/**\n * User login endpoint. Omit credentials to verify login with session cookie instead.\n * @param credentials Username and Password\n */\nexport const logInAPI = (\n credentials?: {\n email_or_username: string\n password: string\n remember?: boolean\n },\n add_props?: string\n) =>\n axios({\n url: credentials ? `${API_ROOT}/api/v2/login` : `${API_ROOT}/api/v2/verify_login`,\n method: credentials ? 'POST' : 'GET',\n data: credentials && {\n ...credentials,\n domain: DOMAIN,\n remember_duration: 7 /* days */\n },\n headers: { 'Content-Type': 'application/json' },\n params: { add_props }\n })\n .then(res => {\n axios.defaults.headers.common['Authorization'] =\n 'Bearer ' + res.data.access_token\n return res.data as LoginResponse\n })\n .catch(reason => {\n if (isBackendError(reason)) {\n throw reason.response.data.error\n }\n throw reason\n })\n\nexport const logOutAPI = async (): Promise => {\n try {\n await axios.get(`${API_ROOT}/api/v1/logout`)\n return\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\n/**\n * Send email for user verification.\n * @param id The user id.\n */\nexport const sendVerificationEmailAPI = async (id: number) => {\n try {\n const response = await axios.post(\n `${API_ROOT}/api/v2/user/${id}/send_verify_email`\n // null,\n // { headers: { \"Content-Type\": \"application/json\" } }\n )\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\n/**\n * Verifys a user's account.\n * @param token The verification token the user should have received via email.\n */\nexport const verifyAccountAPI = async (token: string) => {\n try {\n const response = await axios.put(\n `${API_ROOT}/api/v1/verify-email/${token}`\n )\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\n/**\n * Sends a password reset email to provided email.\n * Will fail if email is not in the DB.\n * @param email User's email.\n */\nexport const sendForgotPasswordEmailAPI = async (email: string) => {\n try {\n const response = await axios.post(\n `${API_ROOT}/api/v2/forgot-password/send-token`,\n {\n source_email: 'no-reply@postreality.io',\n target_email: email,\n domain: DOMAIN,\n template_name_suffix: 'post_reality'\n }\n )\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n\nexport const getForgotPasswordUserAPI = async (token: string) => {\n try {\n const response = await axios.post<\n XRPServerResponse & { accessToken: string; user: User }\n >(`${API_ROOT}/api/v1/forgot-password/lookup-user`, {\n token\n })\n return response.data\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason)\n throw reason.response.data.error\n }\n throw reason\n }\n}\n","import {\n atom,\n AtomEffect,\n DefaultValue,\n selector,\n selectorFamily,\n} from \"recoil\";\n\nimport {\n Experience,\n Asset,\n Marker,\n AssetInspectorState,\n} from \"../../models/exp-entities\";\n\ninterface EditorHistoryQueue {\n undoHistory: Array<{\n undo: () => Experience;\n redo: () => Experience;\n }>;\n redoHistory: Array<{\n undo: () => Experience;\n redo: () => Experience;\n }>;\n}\n\nexport let experienceHistory: EditorHistoryQueue = {\n undoHistory: [],\n redoHistory: [],\n};\n\nconst historyEffect: AtomEffect = ({ setSelf, onSet }) => {\n onSet((newValue, oldValue) => {\n if (oldValue === null) return;\n if (newValue === null) {\n experienceHistory.undoHistory = [];\n experienceHistory.redoHistory = [];\n return;\n }\n experienceHistory.undoHistory.push({\n undo: () => {\n setSelf(oldValue);\n const popped = experienceHistory.undoHistory.pop();\n if (popped) experienceHistory.redoHistory.push(popped);\n return oldValue as Experience;\n },\n redo: () => {\n setSelf(newValue);\n const popped = experienceHistory.redoHistory.pop();\n if (popped) experienceHistory.undoHistory.push(popped);\n return newValue as Experience;\n },\n });\n experienceHistory.redoHistory = [];\n });\n};\n\nexport const experienceState = atom({\n key: \"experienceState\",\n default: null,\n effects_UNSTABLE: [historyEffect],\n});\n\nexport const selectedAssetIDState = atom({\n key: \"selectedAssetIDState\",\n default: \"\",\n});\n\nexport const expMarkerState = selector({\n key: \"expMarkerState\",\n get: ({ get }) => get(experienceState)?.marker ?? null,\n set: ({ set }, newValue) => {\n set(experienceState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n if (prev) {\n return { ...prev, marker: newValue };\n }\n return prev;\n });\n },\n});\n\nexport const assetInspectorState = atom({\n key: \"assetsInspectorState\",\n default: { interaction: false, transform: false, playback: false },\n});\n\nexport const assetStoreState = atom<{\n open: boolean;\n type: string;\n replaceCurrent?: boolean;\n}>({\n key: \"assetStoreState\",\n default: { open: false, type: \"All\", replaceCurrent: false },\n});\n\nexport const expAssetsState = selector({\n key: \"expAssetsState\",\n get: ({ get }) => get(experienceState)?.asset_transform_info ?? [],\n set: ({ set }, newValue) => {\n set(experienceState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n if (prev) {\n return { ...prev, asset_transform_info: newValue };\n }\n return prev;\n });\n },\n});\n\nexport const expAssetState = selectorFamily<\n Asset | null,\n { session_id: string }\n>({\n key: \"expAssetState\",\n get:\n ({ session_id }) =>\n ({ get }) =>\n get(expAssetsState).find(asset => asset.session_id === session_id) ??\n null,\n set:\n ({ session_id }) =>\n ({ set, get }, newValue) => {\n set(expAssetsState, prev => {\n if (newValue instanceof DefaultValue) return newValue;\n const index = prev.findIndex(asset => asset.session_id === session_id);\n if (index > -1) {\n if (newValue === null)\n return prev.filter(asset => asset.session_id !== session_id);\n return [...prev.slice(0, index), newValue, ...prev.slice(index + 1)];\n }\n return prev;\n });\n },\n});\n","import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogContentText,\n DialogTitle,\n} from \"@material-ui/core\";\nimport React from \"react\";\n\nexport function ConfirmationDialog(props: {\n open: boolean;\n title?: React.ReactNode;\n message: React.ReactNode;\n yesColor?: \"primary\" | \"secondary\";\n onNoClick: () => void;\n onYesClick: () => void;\n isLoading?: boolean;\n}) {\n const { open, title, message, yesColor, onNoClick, onYesClick, isLoading } =\n props;\n\n const handleNo = () => {\n if (onNoClick) onNoClick();\n };\n\n const handleYes = () => {\n if (onYesClick) onYesClick();\n };\n\n return (\n \n {Boolean(title) && (\n {title}\n )}\n \n \n {message}\n \n \n \n \n No\n \n \n Yes\n \n \n \n );\n}\n","import { CardProps, Card } from \"@material-ui/core\";\nimport React from \"react\";\n//@ts-ignore\nimport { useBouncyShadowStyles } from \"@mui-treasury/styles/shadow/bouncy\";\n\nexport const BouncyShadowCard: React.FC> = props => {\n const styles = useBouncyShadowStyles();\n return ;\n};\n","import {\n BASIC_PLAN_NAME,\n MONTHLY_PLAN_NAME,\n SEMESTER_PLAN_NAME,\n YEARLY_PLAN_NAME\n} from '../../../constants'\n\nexport type StripePlans = {\n yearly: any\n semester: any\n monthly: any\n basic: any\n}\n\nexport const createStripePlans = (rawPlanData: any) => {\n if (Array.isArray(rawPlanData)) {\n return rawPlanData.reduce(\n (accum, curr, index, arr) => {\n switch (curr.nickname) {\n case 'personal/team every 12 months':\n accum.yearly = curr\n break\n case 'personal/team every 4 months':\n accum.semester = curr\n break\n case 'personal/team':\n accum.monthly = curr\n break\n case 'basic':\n accum.basic = curr\n break\n default:\n break\n }\n return accum\n },\n {\n yearly: null,\n semester: null,\n monthly: null,\n basic: null\n }\n )\n }\n return null\n}\n\nexport const getPlanDescription = (\n id: string,\n seats: number,\n plans: StripePlans\n) => {\n const type = seats > 1 ? 'TEAM' : 'PERSONAL'\n let description = type === 'TEAM' ? `${type} ${seats}` : type\n const plan = Object.values(plans).find(p => p.id === id)\n console.log(plan)\n switch (plan.nickname) {\n case YEARLY_PLAN_NAME:\n return 'Yearly ' + description\n case SEMESTER_PLAN_NAME:\n return 'Every 4 Months ' + description\n case MONTHLY_PLAN_NAME:\n return 'Monthly ' + description\n case BASIC_PLAN_NAME:\n return 'BASIC'\n }\n}\n\nexport const getCustomerSubscription = (customer: any) => {\n return customer?.subscriptions?.data[0]\n}\n\nexport const getCustomerPlan = (customer: any) => {\n return getCustomerSubscription(customer)?.plan\n}\n\nexport const getCustomerSeatQuantity = (customer: any) => {\n return getCustomerSubscription(customer)?.quantity\n}\n\nexport const getCustomerPlanName = (\n customer: any\n): 'Basic' | 'Personal' | 'Team' | null => {\n let tier = getCustomerSeatQuantity(customer)\n let nickname = getCustomerPlan(customer)?.nickname ?? null\n if (nickname === 'basic') return 'Basic'\n if (nickname !== null && (nickname as string).includes('personal/team')) {\n if (tier === 1) return 'Personal'\n if (tier > 1) return 'Team'\n }\n return null\n}\n\nexport const getCutomerBillingCycle = (customer: any) => {\n const cusPlan = getCustomerPlan(customer)\n if (Boolean(cusPlan)) {\n if (cusPlan.interval === 'month') {\n return cusPlan.interval_count as number\n } else if (cusPlan.interval === 'year') {\n return 12\n }\n }\n}\n\nexport const getCustomerSubsciptionPhases = (customer: any) => {\n console.log(getCustomerSubscription(customer)?.schedule?.phases)\n return getCustomerSubscription(customer)?.schedule?.phases\n}\n\nexport const getCustomerCurrentSubscriptionPhase = (customer: any) => {\n return getCustomerSubsciptionPhases(customer)[0]\n}\n\nexport const getCustomerUpcomingSubscriptionPhase = (customer: any) => {\n return getCustomerSubsciptionPhases(customer)[1]\n}\n\nexport const getCustomerPaymentSource = (customer: any) => {\n return customer?.sources?.data ? customer?.sources?.data[0] : undefined\n}\n\nexport const customerHasPaymentSource = (customer: any) => {\n return customer?.sources?.data ? true : false\n}\n\nexport const getCustomerInvoice = (customer: any) => {\n return getCustomerSubscription(customer)?.latest_invoice\n}\n\nexport const getPersonalTier = (plans: StripePlans, cycle: number) => {\n let plan: any = null\n switch (cycle) {\n case 1:\n plan = plans.monthly\n break\n case 4:\n plan = plans.semester\n break\n case 12:\n plan = plans.yearly\n break\n default:\n break\n }\n return plan?.tiers[0]\n}\n\nexport const getTeamTier = (\n plans: StripePlans,\n cycle: number,\n seats: number\n) => {\n let plan: any = null\n switch (cycle) {\n case 1:\n plan = plans.monthly\n break\n case 4:\n plan = plans.semester\n break\n case 12:\n plan = plans.yearly\n break\n default:\n break\n }\n return plan?.tiers.find((tier: any) => tier.up_to === seats)\n}\n","import {\n Avatar,\n CardActionArea,\n createStyles,\n Link,\n makeStyles\n} from '@material-ui/core'\nimport React from 'react'\n\nimport appIcon from '../resources/img/app_icon.png'\nimport { BouncyShadowCard } from './BouncyShadowCard'\n\ninterface StyleProps {\n width?: number\n height?: number\n elevation?: number\n interactive?: boolean\n}\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n root: {\n width: (props: StyleProps) =>\n props.width ? theme.spacing(props.width) : undefined,\n height: (props: StyleProps) =>\n props.height ? theme.spacing(props.height) : undefined\n }\n })\n)\n\nexport function AppIconAvatar(props: StyleProps) {\n const { interactive, ...styleProps } = props\n const classes = useStyles(styleProps)\n return (\n \n \n \n \n \n )\n}\n","import { Quaternion, Tools } from \"@babylonjs/core\";\nimport axios from \"axios\";\n\nimport { MAX_AR_IMG_QUERY_WIDTH } from \"../../constants\";\nimport {\n Asset,\n AssetType,\n Experience,\n Marker,\n PlayableAsset,\n} from \"../../models/exp-entities\";\nimport {\n AssetURLResponse,\n ExperienceListQuery,\n ExperienceRequest,\n GET_AssetURL,\n GET_ExperienceList,\n POST_Experience,\n POST_MarkerUpload,\n POST_PresignedAssetPOST,\n} from \"../../xr-platform-api\";\n\nconst generateSessionID = () => {\n // Math.random should be unique because of its seeding algorithm.\n // Convert it to base 36 (numbers + letters), and grab the first 9 characters\n // after the decimal.\n return \"_\" + Math.random().toString(36).substr(2, 9);\n};\n\nconst getToken = (exp: Experience) => {\n return exp.access_token ?? undefined;\n};\n\n/**\n * Handles initialization of experience and creates new entry in backend.\n * @param markerFile The image target image file of experience.\n * @param expName Name of experience.\n * @returns Experience ready for ExperienceSceneManager.\n */\nexport const initExperienceAsync = async (\n markerFile?: File,\n expName?: string,\n isVertical: boolean = false\n) => {\n let req: ExperienceRequest = {\n name: expName ?? \"Untitled\",\n asset_uuids: [],\n asset_transform_info: [],\n scene_color: \"#ffffff\",\n marker_floor_to_center_height: isVertical ? 1.5 : 0,\n settings: { is_vertical: isVertical },\n };\n let marker: Marker | null = null;\n if (markerFile) {\n marker = (await POST_MarkerUpload(markerFile, true)).marker;\n // await PUT_MarkerUpdate(marker.uuid, {\n // floor_to_center_height: isVertical ? 1.5 : 0,\n // });\n req.marker_uuid = marker.uuid;\n }\n const { experience } = await POST_Experience(req, \"asset_uuids\");\n if (marker && markerFile) {\n // marker.floor_to_center_height = isVertical ? 1.5 : 0;\n marker.url = URL.createObjectURL(markerFile);\n marker.session_id = generateSessionID();\n experience.marker = marker;\n }\n // experience.scene_color = \"#ffffff\";\n return experience;\n};\n\n/**\n * Handles retrieving experience and asset source from backend.\n * @param uuid UUID of experience to load from backend.\n * @param add_props Additional props to include in returned experience.\n * @param experience Experience to load. Use this if you already have experience data handy.\n * @returns Experience ready for ExperienceSceneManager.\n */\nexport const loadExperienceAsync = async (\n // uuid: string,\n // add_props?: ExperienceAddPropsQuery | ExperienceAddPropsQuery[],\n query: ExperienceListQuery,\n experience?: Experience,\n forViewer?: boolean\n) => {\n const exp = experience\n ? experience\n : (await GET_ExperienceList(query)).experiences[0];\n\n if (forViewer && exp.settings.is_public === false) {\n throw new Error(\"This presentation is private.\");\n }\n\n if (exp.marker) {\n const res = await GET_AssetURL(\n exp.marker!.uuid,\n true,\n undefined,\n getToken(exp)\n );\n\n const url = res.url ?? res.backup_url ?? \"\";\n exp.marker!.url = url;\n exp.marker!.session_id = generateSessionID();\n }\n\n const GET_SoundAssetURL = async (a: Asset) => {\n const res = await GET_AssetURL(a.uuid, false, {}, getToken(exp));\n const blobRes = await axios.get(res.url ?? res.backup_url ?? \"\", {\n responseType: \"blob\",\n });\n const objURL = URL.createObjectURL(blobRes.data);\n const response: AssetURLResponse = {\n url: objURL,\n backup_url: objURL,\n error: null,\n status: \"\",\n };\n return response;\n };\n const getAssetsURL = exp.asset_transform_info.map(a =>\n a.type === \"audio\"\n ? GET_SoundAssetURL(a)\n : GET_AssetURL(\n a.uuid,\n false,\n {\n width: a.type === \"image\" ? MAX_AR_IMG_QUERY_WIDTH : undefined,\n },\n getToken(exp)\n )\n );\n const results = await Promise.all(getAssetsURL);\n results.forEach((res, i) => {\n let url = res.url ?? res.backup_url ?? \"\";\n const asset = exp.asset_transform_info[i];\n asset.url = url;\n asset.session_id = generateSessionID();\n if (asset.strPos === undefined) {\n asset.strPos = asset.position\n ? Object.values(asset.position).map(v => v.toString())\n : [\"0\", \"0\", asset.type === \"3d\" ? \"-0.5\" : \"-0.01\"];\n }\n if (asset.strRot === undefined) {\n asset.strRot = [\n asset.rotation?.x.toString() ?? \"0\",\n asset.rotation?.y.toString() ?? \"0\",\n asset.rotation?.z.toString() ?? \"0\",\n asset.rotation?.w.toString() ?? \"1\",\n ];\n }\n if (asset.strScl === undefined) {\n asset.strScl = asset.scale\n ? Object.values(asset.scale).map(v => v.toString())\n : [\"1\", \"1\", \"1\"];\n }\n });\n return exp;\n};\n\n/**\n * Handles upload of asset and association with provided experience. Does not modify provided experience.\n * @param exp Experience to update.\n * @param file Asset file to upload.\n * @param type The asset type accepted by XRPlatform.\n * @returns Shallow copy of updated experience.\n */\nexport const addExperienceAssetAsync = async (\n exp: Experience,\n file: File,\n type: AssetType,\n replaceWith?: Asset,\n onUploadProgress?: (progess: any) => void\n): Promise => {\n if (exp.asset_uuids === undefined) {\n throw new Error(\n \"Experience is missing property asset_uuids. Cannot add new Asset\"\n );\n }\n\n let { asset } = await POST_PresignedAssetPOST(file, type, onUploadProgress);\n const objURL = URL.createObjectURL(file);\n if (asset.type === \"image\") {\n const imgPromise = new Promise<{ w: number; h: number }>(\n (resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ w: img.width, h: img.height });\n };\n img.onerror = ev => {\n reject(ev.toString());\n };\n img.src = objURL;\n }\n );\n const { w, h } = await imgPromise;\n asset.original_width = w;\n asset.original_height = h;\n } else if (asset.type === \"video\") {\n const vidPromise = new Promise<{ w: number; h: number }>(\n (resolve, reject) => {\n const vid = document.createElement(\"video\");\n vid.preload = \"metadata\";\n vid.onloadedmetadata = () => {\n resolve({ w: vid.videoWidth, h: vid.videoHeight });\n };\n vid.onerror = ev => {\n reject(ev.toString());\n };\n vid.src = objURL;\n }\n );\n const { w, h } = await vidPromise;\n asset.original_width = w;\n asset.original_height = h;\n (asset as PlayableAsset).volume = 1;\n } else if (asset.type === \"audio\") {\n asset.original_width = 0.25;\n asset.original_height = 0.25;\n (asset as PlayableAsset).volume = 1;\n }\n if (replaceWith) {\n asset = { ...replaceWith, ...asset };\n } else {\n const quat = Quaternion.FromEulerAngles(\n exp.settings.is_vertical ? 0 : Tools.ToRadians(90),\n 0,\n 0\n );\n asset.position = { x: 0, y: 0, z: asset.type === \"3d\" ? -0.05 : -0.01 };\n asset.rotation = { x: quat.x, y: quat.y, z: quat.z, w: quat.w };\n asset.scale = { x: 1, y: 1, z: 1 };\n asset.strPos = [\"0\", \"0\", asset.type === \"3d\" ? \"-0.05\" : \"-0.01\"];\n asset.strRot = [\n quat.x.toString(),\n quat.y.toString(),\n quat.z.toString(),\n quat.w.toString(),\n ];\n asset.strScl = [\"1\", \"1\", \"1\"];\n asset.session_id = generateSessionID();\n }\n asset.name = file.name;\n asset.url = objURL;\n\n if (replaceWith) {\n const index = exp.asset_transform_info.findIndex(\n a => a.session_id === replaceWith.session_id\n );\n if (index === -1) return exp;\n\n return {\n ...exp,\n asset_uuids: [\n ...exp.asset_uuids.map(a => (a === replaceWith.uuid ? asset.uuid : a)),\n ],\n asset_transform_info: [\n ...exp.asset_transform_info.slice(0, index),\n asset,\n ...exp.asset_transform_info.slice(index + 1),\n ],\n };\n }\n\n return {\n ...exp,\n asset_uuids: [...exp.asset_uuids, asset.uuid],\n asset_transform_info: [...exp.asset_transform_info, asset],\n };\n};\n\n/**\n * Get copy of asset from provided experience.\n * @param exp The experience to select the asset from.\n * @param sessionID The session identifier of the asset.\n * @returns Shallow copy of asset or null if not found.\n */\nexport const selectExperienceAsset = (\n exp: Experience,\n sessionID: string\n): Asset | null => {\n const asset = exp.asset_transform_info.find(a => a.session_id === sessionID);\n return asset ? { ...asset } : null;\n};\n\n/**\n * Apply asset updated to provided experience. Does not modify provided experience.\n * @param exp Experience to update.\n * @param update Updated data to apply to provided experience.\n * @returns Shallow copy of experience with updated asset.\n */\nexport const updateExperienceAsset = (exp: Experience, update: Asset) => {\n const i = exp.asset_transform_info.findIndex(\n a => a.session_id === update.session_id\n );\n if (i !== -1) {\n return {\n ...exp,\n asset_transform_info: [\n ...exp.asset_transform_info.slice(0, i),\n update,\n ...exp.asset_transform_info.slice(i + 1),\n ],\n };\n }\n return exp;\n};\n\n/**\n *\n * @param exp The experience to remove asset from.\n * @param sessionID Identifier of the asset to be deleted.\n * @returns Shallow copy of updated experience;\n */\nexport const removeExperienceAsset = (\n exp: Experience,\n sessionID: string\n): Experience => {\n return {\n ...exp,\n asset_transform_info: exp.asset_transform_info.filter(\n a => a.session_id !== sessionID\n ),\n };\n};\n","import { AxiosResponse } from 'axios'\nimport { XRPServerResponse } from './types/xrp'\n\nimport TagManager from 'react-gtm-module'\n\nconst reportServerError = (reason: any) => {\n if (process.env.NODE_ENV !== 'production') return\n TagManager.dataLayer({\n dataLayer: {\n event: 'server_error',\n error_code: reason.response.status,\n error_text: reason.response.statusText,\n request_url: reason.config.url\n }\n })\n}\n\nexport const isBackendError = (\n reason: any\n): reason is { response: AxiosResponse } => {\n return reason.response.data.error\n}\n\nexport const getAuthorizationHeader = (token: string) => ({\n Authorization: `Bearer ${token}`\n})\n\nexport const throwNetworkError = (r: unknown) => {\n // if (r instanceof CanceledError) throw r\n if (isBackendError(r)) {\n reportServerError(r)\n throw new Error(r?.response?.data?.error ?? undefined)\n }\n throw r\n}\n\nexport const getHeadPageTitle = (title: string) =>\n `${title} - Post Reality Studio`\n","import useSWR, { SWRConfiguration } from \"swr\";\nimport { getCustomerAPI } from \"./stripeAPI\";\nexport const useStripeCustomer = (config?: SWRConfiguration) => {\n const { data, error, isValidating, mutate } = useSWR(\n \"getCustomer\",\n key => getCustomerAPI(),\n config\n );\n\n return {\n customer: data,\n isLoading: !data && !error,\n error,\n isValidating,\n mutate,\n };\n};\n","export default __webpack_public_path__ + \"static/media/app_icon.b9490323.png\";","import React from \"react\";\nimport { Box, IconButton } from \"@material-ui/core\";\nimport Icon from \"@mdi/react\";\nimport { mdiArrowLeft, mdiArrowRight } from \"@mdi/js\";\n\ntype Props = {\n page: number;\n perPage: number;\n totalCount: number;\n onPageTurn: (pageOffset: number) => void;\n};\n\nexport const Pagination: React.FC = ({\n page,\n perPage,\n totalCount,\n onPageTurn,\n}) => {\n return (\n \n onPageTurn(-1)}>\n \n \n {`${page}/${Math.ceil(totalCount / perPage)}`}\n = totalCount / perPage}\n onClick={() => onPageTurn(1)}\n >\n \n \n \n );\n};\n","import { ExperienceSceneManager } from \"./experience-scene-manager\";\nimport React from \"react\";\n\nexport type ExperienceSceneManagerContextType = {\n experienceSceneManager: ExperienceSceneManager | null;\n};\n\nexport const ExperienceSceneManagerContext =\n React.createContext({\n experienceSceneManager: null,\n });\n\nexport const useExperienceSceneManagerContext = () =>\n React.useContext(ExperienceSceneManagerContext).experienceSceneManager;\n","import useSWR, { SWRConfiguration } from 'swr'\nimport { getTeamAPI, getTeamExperienceCountAPI } from './teamAPI'\n\nimport { Team, TeamMember } from '../../types/team'\nimport { getTeamMembersAPI } from './teamAPI'\nimport {\n getTeamsApi,\n PaginatedTeamsResponse,\n TeamsQuery\n} from 'xr-platform-api'\n\nexport const useTeam = (teamID?: number, config?: SWRConfiguration) => {\n const { data, error, isValidating, mutate } = useSWR(\n teamID ? ['getTeam', teamID] : null,\n (key, teamID) => getTeamAPI(teamID),\n config\n )\n\n return {\n team: data,\n isLoading: !error && !data,\n error,\n isValidating,\n mutate\n }\n}\n\nexport const useTeams = (\n query?: TeamsQuery,\n config?: SWRConfiguration\n) => {\n const { data, error, isValidating, mutate } = useSWR(\n query ? ['queryTeams', JSON.stringify(query)] : null,\n (key, queryString) => getTeamsApi(query),\n config\n )\n\n return {\n teams: data?.teams ?? [],\n isLoading: !error && !data,\n error,\n isValidating,\n mutate\n }\n}\n\nexport const useTeamMembers = (\n teamID?: number,\n config?: SWRConfiguration\n) => {\n const { data, error, isValidating, mutate } = useSWR(\n teamID ? ['getTeamMembers', teamID] : null,\n (key, teamID) => getTeamMembersAPI(teamID),\n config\n )\n\n return {\n members: data,\n isLoading: !error && !data,\n error,\n isValidating,\n mutate\n }\n}\n\nexport const useTeamExperienceCount = (\n teamID?: number,\n exclude_super_users = true,\n exclude_deleted_users = true\n) => {\n const { data, error, isValidating, mutate } = useSWR(\n teamID\n ? [\n 'GET_TeamExperienceCount',\n teamID,\n exclude_super_users,\n exclude_deleted_users\n ]\n : null,\n (key, teamID) =>\n getTeamExperienceCountAPI(\n teamID,\n exclude_super_users,\n exclude_deleted_users\n ),\n { revalidateOnFocus: false }\n )\n\n return {\n count_experiences: data?.count_experiences,\n max_count_experiences: data?.max_count_experiences,\n error,\n isValidating,\n mutate,\n isLoadidng: !data && !error\n }\n}\n","export const generateSessionID = () => {\n // Math.random should be unique because of its seeding algorithm.\n // Convert it to base 36 (numbers + letters), and grab the first 9 characters\n // after the decimal.\n return \"_\" + Math.random().toString(36).substr(2, 9);\n};\n","// A simple way to swap what backend you are pointing too\n\n//export const API_ROOT = 'https://s5d.postreality.io'; // for testing from a local machine, or if backend is not on the same URL\nexport const API_ROOT = ''; // if backend is at the same domain as front end","import { styled } from \"@material-ui/core\";\nimport Icon from \"@mdi/react\";\nimport { mdiMoonWaxingCrescent } from \"@mdi/js\";\n\nconst MoonIcon = styled(props => (\n \n))(({ theme }) => ({\n backgroundColor: theme.palette.primary.dark,\n color: theme.palette.text.secondary,\n border: `solid ${theme.palette.primary.main} 1px`,\n borderRadius: \"50%\",\n boxShadow: theme.shadows[3],\n}));\n\nexport default MoonIcon;\n","import { styled } from \"@material-ui/core\";\nimport Icon from \"@mdi/react\";\nimport { mdiWeatherSunny } from \"@mdi/js\";\n\nconst SunIcon = styled(props => (\n \n))(({ theme }) => ({\n backgroundColor: theme.palette.background.default,\n color: theme.palette.secondary.main,\n border: `solid ${theme.palette.background.default} 1px`,\n borderRadius: \"50%\",\n boxShadow: theme.shadows[3],\n}));\n\nexport default SunIcon;\n","export default __webpack_public_path__ + \"static/media/Metamask_Dark.879eef74.svg\";","export default __webpack_public_path__ + \"static/media/Metamask_Light.b6b3749b.svg\";","import { ServerResponse } from \"http\";\n\nimport { GET_TagsQuery, Tag, TagType } from \"../../types\";\n\nimport axios from \"axios\";\nimport reportServerError from \"../../helpers/reportServerError\";\nimport { API_ROOT } from '../../config/BackendApi';\n\n/**\n *\n * @param type The type of Tags to create ('a_tags' or 'e_tags')\n * @param tags Comma-separated, matches case-insensitive partials, OR-logic\n * @returns\n */\nexport const createTagsAPI = async (\n type: Exclude,\n tags: string\n) => {\n try {\n const response = await axios.post<\n ServerResponse & { [t in typeof type]: Tag[] }\n >(`${API_ROOT}/api/v1/${type.slice(0, -1)}/${tags}/create`);\n return response.data[type];\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw reason.response.data.error;\n }\n throw reason;\n }\n};\n\n/**\n *\n * @param type The type of Tags to create ('a_tags' or 'e_tags')\n * @param tag Single tag name to delete\n * @returns\n */\nexport const deleteTagAPI = async (\n type: Exclude,\n tag: string\n) => {\n try {\n const response = await axios.delete<\n ServerResponse & { [t in typeof type]: Tag }\n >(`${API_ROOT}/api/v1/${type}/${tag}/delete`);\n return response.data[type];\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw reason.response.data.error;\n }\n throw reason;\n }\n};\n\nexport const getTagAPI = async (\n type: Exclude,\n tag: string\n) => {\n try {\n const response = await axios.get<\n ServerResponse & { [t in typeof type]: Tag }\n >(`${API_ROOT}/api/v1/${type}/${tag}`);\n return response.data[type];\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw reason.response.data.error;\n }\n throw reason;\n }\n};\n\nexport const getTagsAPI = async (\n type: Exclude,\n query?: GET_TagsQuery\n) => {\n try {\n const response = await axios.get<\n ServerResponse & { [t in typeof type]: Tag[] }\n >(`${API_ROOT}/api/v1/${type}`, { params: query });\n return response.data[type];\n } catch (reason) {\n if (reason.response) {\n reportServerError(reason);\n throw reason.response.data.error;\n }\n throw reason;\n }\n};\n","import useSWR, { SWRConfiguration } from \"swr\";\n\nimport { GET_AssetsQuery } from \"../../../types\";\nimport {\n AssetListResponse,\n AssetListQuery,\n GET_Assets,\n} from \"../../../xr-platform-api\";\nimport { getMarkerURLAPI } from \"../apis/xrMarkerAPI\";\n\n// import { MAX_MARKER_QUERY_WIDTH } from \"../../../constants\";\nexport function useXRMarkerURL(uuid?: string, width?: number) {\n const { data, error, isValidating, mutate } = useSWR(\n uuid ? [\"getXRMarkerURL\", uuid, width] : null,\n (key, uuid, width) => getMarkerURLAPI(uuid, { width: width }),\n { revalidateOnFocus: false }\n );\n\n return {\n markerURL: data,\n isLoading: !error && !data,\n error,\n isValidating,\n mutate,\n };\n}\n\nexport const useAssetsList = (\n query?: GET_AssetsQuery,\n config?: SWRConfiguration\n) => {\n const { data, error, isValidating, mutate } = useSWR(\n query ? [\"GET_AssetList\", ...Object.values(query)] : null,\n (key, ...args) =>\n GET_Assets(\n args.reduce(\n (prev, curr, i) => {\n const key = Object.keys(prev!)[i] as keyof AssetListQuery;\n prev[key] = curr;\n return prev;\n },\n { ...query }\n )\n ),\n config\n );\n\n return {\n assets: data?.assets ?? [],\n page: data?.total_count === 0 ? 0 : data?.page ?? 0,\n totalCount: data?.total_count ?? 0,\n isLoading: !data && !error,\n isValidating,\n error,\n mutate,\n };\n};\n","import {\n Button,\n CardActions,\n CardMedia,\n IconButton,\n Typography,\n} from \"@material-ui/core\";\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\nimport { mdiPause, mdiPlay } from \"@mdi/js\";\nimport Icon from \"@mdi/react\";\nimport React from \"react\";\n\nimport { BouncyShadowCard } from \"../../components/BouncyShadowCard\";\nimport { Asset } from \"../../models/exp-entities\";\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n root: {\n padding: theme.spacing(1, 1, 0.5),\n \"& .media\": {\n backgroundColor: theme.palette.divider,\n position: \"relative\",\n width: \"100%\",\n height: 0,\n //4:3\n paddingTop: \"100%\",\n marginBottom: theme.spacing(1),\n border: `solid ${theme.palette.divider} ${theme.spacing(0.1)}px`,\n borderRadius: theme.shape.borderRadius,\n \"& video\": {\n position: \"absolute\",\n top: 0,\n borderRadius: theme.shape.borderRadius,\n },\n \"& #audio-preview\": {\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: theme.shape.borderRadius,\n outline: \"none\",\n border: \"none\",\n position: \"absolute\",\n top: 0,\n },\n \"& #model-preview\": {\n width: \"100%\",\n height: \"100%\",\n borderRadius: theme.shape.borderRadius,\n outline: \"none\",\n border: \"none\",\n position: \"absolute\",\n top: 0,\n },\n },\n \"& .meta\": {\n display: \"flex\",\n justifyContent: \"space-between\",\n },\n \"& .tag\": {\n margin: theme.spacing(0.5, 1, 0.5, 0),\n },\n },\n })\n);\n\ntype Props = {\n asset: Asset;\n forStore?: boolean;\n onPurchase?: (asset: Asset) => void;\n onImport?: (asset: Asset) => void;\n};\n\nexport const AssetCard: React.FC = ({\n asset,\n forStore,\n onPurchase,\n onImport,\n}) => {\n const styles = useStyles();\n const [playbackIcon, setPlaybackIcon] = React.useState(mdiPlay);\n\n const handleAudioPlayback = (assetID: number) => () => {\n const audio = document.getElementById(\n `audio-${assetID}`\n ) as HTMLAudioElement | null;\n if (audio) {\n if (audio.paused) {\n audio.play();\n setPlaybackIcon(mdiPause);\n } else {\n audio.pause();\n setPlaybackIcon(mdiPlay);\n }\n }\n };\n\n const handleButton = async () => {\n if (asset.belongs_to_my_teams && onImport) {\n onImport(asset);\n } else if (onPurchase) {\n onPurchase(asset);\n }\n };\n\n return (\n \n {/* */}\n {asset.type === \"audio\" && (\n \n
\n \n \n \n
\n
\n )}\n {(asset.type === \"image\" || asset.type === \"3d\") && (\n \n )}\n {asset.type === \"video\" && (\n
\n \n
\n )}\n \n {asset.name ?? \"NO NAME\"}\n \n {/*
*/}\n \n {asset.type?.toUpperCase() ?? \"UNKNOWN\"}\n \n {forStore && (\n \n {`${\n asset.belongs_to_my_teams\n ? \"OWNED\"\n : asset.price\n ? \"$\" + (asset.price / 100).toFixed(2)\n : \"FREE\"\n }`}\n \n )}\n\n {/*
*/}\n \n \n \n
\n );\n};\n","import {\n AppBar,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogProps,\n fade,\n Grid,\n IconButton,\n InputBase,\n Paper,\n Tab,\n Tabs,\n Toolbar,\n Typography,\n useTheme,\n} from \"@material-ui/core\";\nimport { createStyles, makeStyles } from \"@material-ui/core/styles\";\nimport { Autocomplete } from \"@material-ui/lab\";\nimport {\n mdiBasket,\n mdiCloseCircleOutline,\n mdiCube,\n mdiFilmstrip,\n mdiImage,\n mdiMagnify,\n mdiMusic,\n mdiWallet,\n} from \"@mdi/js\";\nimport Icon from \"@mdi/react\";\nimport { Token } from \"@stripe/stripe-js\";\nimport { useSnackbar } from \"notistack\";\nimport React from \"react\";\nimport { useRecoilState, useRecoilValue } from \"recoil\";\n\nimport { ConfirmationDialog } from \"../../components/ConfirmationDialog\";\nimport { Pagination } from \"../../components/Pagination\";\nimport { USER_ROLE_TYPE } from \"../../constants\";\nimport { Asset } from \"../../models/exp-entities\";\nimport metamaskD from \"../../resources/img/Metamask_Dark.svg\";\nimport metamaskL from \"../../resources/img/Metamask_Light.svg\";\nimport { XRAsset } from \"../../types/xrEntities\";\nimport { AssetListQuery, POST_PurchaseStoreAsset } from \"../../xr-platform-api\";\nimport { authState } from \"../account/auth/authStore\";\nimport { PaymentFormDialog } from \"../account/stripe/PaymentFormDialog\";\nimport { updatePaymentSourceAPI } from \"../account/stripe/stripeAPI\";\nimport { getCustomerPaymentSource } from \"../account/stripe/stripeHelpers\";\nimport { useStripeCustomer } from \"../account/stripe/useStripeCustomer\";\nimport { useTags } from \"../tag/tagHooks\";\nimport { updateExperienceAsset } from \"../xr_experience/experience-manager\";\nimport { useExperienceSceneManagerContext } from \"../xr_experience/experience-scene-manager-context\";\nimport {\n expAssetState,\n experienceState,\n selectedAssetIDState,\n} from \"../xr_experience/experience-store\";\nimport { useAssetsList } from \"../xr_experience/hooks/assetHooks\";\nimport { AssetCard } from \"./AssetCard\";\nimport { generateSessionID } from \"./assetUtilities\";\n\nconst TEAM_ASSET_PER_PAGE = 12;\nconst STORE_ASSET_PER_PAGE = 12;\n\nconst categories = [\n { label: \"Images\", icon: mdiImage, type: \"image\" },\n { label: \"Videos\", icon: mdiFilmstrip, type: \"video\" },\n { label: \"Audio\", icon: mdiMusic, type: \"audio\" },\n { label: \"Models\", icon: mdiCube, type: \"3d\" },\n { label: \"Purchased\", icon: mdiBasket, type: undefined },\n { label: \"NFT\", icon: mdiWallet, type: undefined },\n];\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n content: {\n backgroundColor: theme.palette.background.default,\n padding: theme.spacing(4),\n display: \"flex\",\n },\n actions: {\n // backgroundColor: theme.palette.background.default,\n padding: 0,\n borderTop: `1px solid ${theme.palette.divider}`,\n boxShadow: theme.shadows[2],\n },\n paper: {\n minWidth: \"85%\",\n minHeight: \"85%\",\n },\n title: {\n // flexGrow: 1,\n display: \"none\",\n [theme.breakpoints.up(\"sm\")]: {\n display: \"block\",\n },\n },\n divider: {\n marginLeft: theme.spacing(3),\n },\n tabs: {\n flexGrow: 1,\n },\n tab: {\n minWidth: 80,\n },\n search: {\n // position: 'relative',\n display: \"flex\",\n justifyContent: \"flex-start\",\n alignItems: \"center\",\n borderRadius: theme.shape.borderRadius,\n backgroundColor: fade(theme.palette.common.white, 0.15),\n \"&:hover\": {\n backgroundColor: fade(theme.palette.common.white, 0.25),\n },\n marginLeft: 0,\n width: \"100%\",\n [theme.breakpoints.up(\"sm\")]: {\n marginLeft: theme.spacing(1),\n width: \"auto\",\n },\n },\n searchIcon: {\n padding: theme.spacing(0, 2),\n height: \"100%\",\n // position: 'absolute',\n pointerEvents: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n inputRoot: {\n color: \"inherit\",\n },\n inputInput: {\n padding: theme.spacing(1, 1, 1, 0),\n // vertical padding + font size from searchIcon\n // paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,\n paddingLeft: \"0.5em\",\n transition: theme.transitions.create(\"width\"),\n width: \"20ch\",\n // width: '100%',\n // [theme.breakpoints.up('sm')]: {\n // width: '15ch',\n // '&:focus': {\n // width: '20ch',\n // },\n // },\n },\n chips: {\n display: \"flex\",\n },\n chip: {\n margin: theme.spacing(0.5, 0.25),\n },\n listBox: {\n border: `solid 1px ${theme.palette.divider}`,\n },\n confirmation: {\n zIndex: 9000,\n },\n ntf: {\n width: \"100%\",\n // height: \"100%\",\n display: \"flex\",\n flexGrow: 1,\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n metamask: {\n margin: theme.spacing(4, 0, 0),\n },\n })\n);\n\ntype Props = { type?: string; replaceCurrent?: boolean } & Omit<\n DialogProps,\n \"children\" | \"BackdropProps\" | \"style\" | \"PaperProps\"\n>;\n\nexport const AssetStore: React.FC = ({\n type,\n replaceCurrent,\n container,\n open,\n ...dialogProps\n}) => {\n const styles = useStyles();\n const theme = useTheme();\n const [openCCForm, setOpenCCForm] = React.useState(false);\n const [loading, setLoading] = React.useState(false);\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n const authUser = useRecoilValue(authState);\n const [editor, setEditor] = useRecoilState(experienceState);\n const [tab, setTab] = React.useState(0);\n const [searchInput, setSearchInput] = React.useState([]);\n const [toPurchase, setToPurchase] = React.useState(null);\n const expSceneManager = useExperienceSceneManagerContext();\n const selectedID = useRecoilValue(selectedAssetIDState);\n const assetReplace = useRecoilValue(\n expAssetState({ session_id: selectedID })\n );\n\n // const tabs =\n // authUser && authUser.role_type_id < USER_ROLE_TYPE.SUPER_CREATOR\n // ? categories\n // : categories.filter(c => c.label === \"Purchased\" || c.label === \"NFT\");\n\n const { tags } = useTags(\"a_tags\");\n const {\n customer,\n mutate: mutateCustomer,\n isLoading,\n // isValidating,\n } = useStripeCustomer({\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n });\n\n const [storeAssetsQuery, setStoreAssetsQuery] =\n React.useState({\n add_props: \"belongs_to_my_teams,price,preview_image_urls\",\n is_for_store: true,\n name: undefined,\n order_by: \"name\",\n page: 1,\n per_page: STORE_ASSET_PER_PAGE,\n reverse: false,\n tag: \"premium\",\n type: categories[0].type,\n });\n\n const prefetchStoreAssetsQuery = React.useMemo(\n () => ({ ...storeAssetsQuery, page: storeAssetsQuery.page! + 1 }),\n [storeAssetsQuery]\n );\n\n const [teamAssetsQuery, setTeamAssetsQuery] = React.useState({\n add_props: \"belongs_to_my_teams,preview_image_urls\",\n name: undefined,\n order_by: undefined,\n page: 1,\n per_page: TEAM_ASSET_PER_PAGE,\n reverse: true,\n tag: \"premium\",\n type: undefined,\n team_id: authUser!.team_id,\n });\n\n const prefetchTeamAssetsQuery = React.useMemo(\n () => ({ ...teamAssetsQuery, page: teamAssetsQuery.page! + 1 }),\n [teamAssetsQuery]\n );\n\n const {\n assets: storeAssets,\n page: storeAssetsPage,\n totalCount: totalStoreAssetsCount,\n } = useAssetsList(storeAssetsQuery);\n useAssetsList(prefetchStoreAssetsQuery);\n\n const {\n assets: teamAssets,\n page: teamAssetsPage,\n totalCount: totalTeamAssetsCount,\n mutate: mutateUserAssets,\n } = useAssetsList(teamAssetsQuery);\n useAssetsList(prefetchTeamAssetsQuery);\n\n const handleTagSearch = (event: React.ChangeEvent<{}>, value: string[]) => {\n setSearchInput(value);\n setStoreAssetsQuery(prev => ({\n ...prev,\n page: 1,\n tag: value.length ? value.join() : undefined,\n }));\n setTeamAssetsQuery(prev => ({\n ...prev,\n page: 1,\n tag: value.length ? value.join() : undefined,\n }));\n };\n\n const handleTagDelete = (tagToDelete: string) => () => {\n const newSearch = searchInput.filter(t => t !== tagToDelete);\n setSearchInput(newSearch);\n setStoreAssetsQuery(prev => ({\n ...prev,\n tag: newSearch.length ? newSearch.join() : undefined,\n }));\n };\n\n const handleStoreAssetsPageTurn = (pageOffset: number) => {\n setStoreAssetsQuery(prev => ({ ...prev, page: prev.page! + pageOffset }));\n };\n const handleTeamAssetsPageTurn = (pageOffset: number) => {\n setTeamAssetsQuery(prev => ({ ...prev, page: prev.page! + pageOffset }));\n };\n\n const handleBuy = async (assetToBuy: XRAsset) => {\n const price = assetToBuy.price ?? 0;\n if (authUser!.role_type_id >= USER_ROLE_TYPE.SUPER_CREATOR && price > 0) {\n enqueueSnackbar(\"Only account admins can make purchases.\", {\n variant: \"error\",\n });\n return;\n }\n if (assetToBuy.price !== undefined && assetToBuy.price === 0) {\n if (isLoading) return;\n let key: any;\n try {\n setLoading(true);\n key = enqueueSnackbar(`Importing item`, {\n variant: \"info\",\n persist: true,\n });\n const { asset } = await POST_PurchaseStoreAsset(assetToBuy.uuid);\n handleImport(asset);\n mutateUserAssets();\n } catch (reason) {\n console.error(reason);\n } finally {\n setLoading(false);\n closeSnackbar(key);\n }\n } else if (getCustomerPaymentSource(customer) === undefined) {\n setOpenCCForm(true);\n return;\n } else {\n setToPurchase(assetToBuy);\n }\n };\n\n const handleBuyConfirmation = async () => {\n if (toPurchase === null || isLoading) return;\n let key: any;\n try {\n setLoading(true);\n key = enqueueSnackbar(`Processing purchase`, {\n variant: \"info\",\n persist: true,\n });\n const { asset } = await POST_PurchaseStoreAsset(toPurchase.uuid);\n handleImport(asset);\n setToPurchase(null);\n\n // enqueueSnackbar(`Item purchased`, { variant: \"info\" });\n mutateUserAssets();\n } catch (reason) {\n console.error(reason);\n } finally {\n setLoading(false);\n closeSnackbar(key);\n }\n };\n\n const handleBuyRejection = () => {\n if (isLoading) return;\n setToPurchase(null);\n };\n\n const handleImport = async (toImport: Asset) => {\n toImport = { ...toImport };\n if (toImport.type === \"audio\") {\n toImport.original_width = 0.25;\n toImport.original_height = 0.25;\n }\n // toImport.position = {\n // x: 0,\n // y: 0,\n // z: toImport.type === \"3d\" ? -0.05 : -0.01,\n // };\n // toImport.rotation = { x: 0, y: 0, z: 0, w: 1 };\n // toImport.scale = { x: 1, y: 1, z: 1 };\n // toImport.strPos = [\"0\", \"0\", toImport.type === \"3d\" ? \"-0.05\" : \"-0.01\"];\n // toImport.strRot = [\"0\", \"0\", \"0\", \"1\"];\n // toImport.strScl = [\"1\", \"1\", \"1\"];\n // toImport.session_id = generateSessionID();\n toImport.position =\n assetReplace && replaceCurrent\n ? assetReplace.position\n : {\n x: 0,\n y: 0,\n z: toImport.type === \"3d\" ? -0.05 : -0.01,\n };\n toImport.rotation =\n assetReplace && replaceCurrent\n ? assetReplace.rotation\n : { x: 0, y: 0, z: 0, w: 1 };\n toImport.scale =\n assetReplace && replaceCurrent\n ? assetReplace.scale\n : { x: 1, y: 1, z: 1 };\n toImport.strPos =\n assetReplace && replaceCurrent\n ? assetReplace.strPos\n : [\"0\", \"0\", toImport.type === \"3d\" ? \"-0.05\" : \"-0.01\"];\n toImport.strRot =\n assetReplace && replaceCurrent\n ? assetReplace.strRot\n : [\"0\", \"0\", \"0\", \"1\"];\n toImport.strScl =\n assetReplace && replaceCurrent ? assetReplace.strScl : [\"1\", \"1\", \"1\"];\n toImport.session_id =\n assetReplace && replaceCurrent\n ? assetReplace.session_id\n : generateSessionID();\n // const update = {\n // ...editor!,\n // asset_uuids: [...(editor?.asset_uuids ?? []), toImport.uuid],\n // asset_transform_info: [...(editor?.asset_transform_info ?? []), toImport],\n // };\n const update =\n assetReplace && replaceCurrent\n ? {\n ...updateExperienceAsset(editor!, toImport),\n asset_uuids: editor!\n .asset_uuids!.filter(uuid => uuid !== assetReplace.uuid)\n .concat([toImport.uuid]),\n }\n : {\n ...editor!,\n asset_uuids: [...(editor?.asset_uuids ?? []), toImport.uuid],\n asset_transform_info: [\n ...(editor?.asset_transform_info ?? []),\n toImport,\n ],\n };\n setEditor(update);\n expSceneManager?.updateSceneWithStateAsync(update);\n if (dialogProps.onClose) dialogProps.onClose({}, \"escapeKeyDown\");\n enqueueSnackbar(`${toImport.name} added`, { variant: \"info\" });\n };\n\n const handleTabChange = (event: React.ChangeEvent<{}>, newValue: number) => {\n setStoreAssetsQuery(prev => ({\n ...prev,\n page: 1,\n type: categories[newValue].type,\n }));\n setTab(newValue);\n };\n\n const handleClose = () => {\n if (dialogProps.onClose) {\n dialogProps.onClose({}, \"escapeKeyDown\");\n }\n };\n\n const handlePaymentFormSubmit = (token: Token) => {\n mutateCustomer(async () => {\n try {\n setLoading(true);\n const udpatedCustomer = await updatePaymentSourceAPI(\n token,\n authUser!.email!\n );\n // setToEdit((prev) => ({ ...initEditState, plan: prev.plan, cc: false }));\n setOpenCCForm(false);\n enqueueSnackbar(\"Payment source added\", { variant: \"success\" });\n return udpatedCustomer;\n } catch (reason) {\n console.error(reason);\n enqueueSnackbar(JSON.stringify(reason), { variant: \"error\" });\n } finally {\n setLoading(false);\n }\n });\n };\n\n return (\n \n setOpenCCForm(false)}\n />\n \n \n \n \n \n {authUser && authUser.role_type_id >= USER_ROLE_TYPE.SUPER_CREATOR\n ? \"Team Library\"\n : \"Media Library\"}\n \n {/* */}\n \n {categories.map((c, i) => (\n }\n />\n ))}\n \n\n {authUser && authUser.role_type_id < USER_ROLE_TYPE.SUPER_CREATOR && (\n t.tag)}\n value={searchInput}\n onChange={handleTagSearch}\n ListboxComponent={params => (\n \n )}\n renderInput={params => (\n
\n
\n \n
\n
\n {searchInput.map(item => (\n \n ))}\n
\n \n
\n )}\n />\n )}\n \n \n \n
\n
\n \n {categories[tab].label !== \"Purchased\" &&\n categories[tab].label !== \"NFT\" && (\n \n {storeAssets.map(a => (\n \n \n \n ))}\n \n )}\n {categories[tab].label === \"Purchased\" && (\n \n {teamAssets.map(a => (\n \n \n \n ))}\n \n )}\n {categories[tab].label === \"NFT\" && (\n
\n \n COMING SOON\n \n \n Connect your MetaMask wallet\n \n \n to import your NFT media assets to Post Reality\n \n \n
\n )}\n
\n {categories[tab].label !== \"NFT\" && (\n \n \n \n )}\n \n
\n );\n};\n","import useSWR from 'swr';\n\nimport { GET_TagsQuery, TagType } from '../../types';\nimport { getTagsAPI } from './tagAPI';\n\nexport const useTags = (\n type: Exclude,\n query?: GET_TagsQuery\n) => {\n const { data, error, isValidating, mutate } = useSWR(\n ['getTags', type, query],\n (key, type, query) => getTagsAPI(type, query)\n );\n return {\n tags: data ?? [],\n error,\n isLoading: !data && !error,\n isValidating,\n mutate,\n };\n};\n","import { useTheme } from '@material-ui/core';\nimport React, { useRef, useImperativeHandle } from 'react';\n\nexport const StripeInput = ({ component: Component, inputRef, ...props }) => {\n const theme = useTheme();\n const textColor = theme.palette.text.primary;\n const elementRef = useRef();\n useImperativeHandle(inputRef, () => ({\n focus: () => elementRef.current.focus,\n }));\n return (\n (elementRef.current = element)}\n {...props}\n options={{\n showIcon: true,\n iconStyle: 'solid',\n style: { base: { color: textColor } },\n }}\n />\n );\n};\n","import \"./input.css\";\n\nimport {\n Button,\n CircularProgress,\n Collapse,\n Dialog,\n DialogActions,\n DialogContent,\n DialogProps,\n DialogTitle,\n FormControlLabel,\n Switch,\n TextField,\n} from \"@material-ui/core\";\nimport {\n CardCvcElement,\n CardExpiryElement,\n CardNumberElement,\n useElements,\n useStripe,\n} from \"@stripe/react-stripe-js\";\nimport { Token } from \"@stripe/stripe-js\";\nimport { useSnackbar } from \"notistack\";\nimport React from \"react\";\n\nimport { createTaxExemptProofs as createTaxExemptProofsAPI } from \"./stripeAPI\";\nimport { StripeInput } from \"./StripeInput\";\n\ntype Props = {\n onSubmit: (token: Token, exempt_tax?: boolean) => void;\n isLoading?: boolean;\n paymentSource?: any;\n} & Omit;\n\nexport const PaymentFormDialog: React.FC = ({\n onSubmit,\n isLoading,\n paymentSource,\n ...dialogProps\n}) => {\n const [fullname, setFullname] = React.useState(\n Boolean(paymentSource) ? paymentSource.name : \"\"\n );\n const [zip, setZip] = React.useState(\n Boolean(paymentSource) ? paymentSource.address_zip : \"\"\n );\n const [toggleTax, setToggleTax] = React.useState(false);\n const fileInput = React.useRef();\n\n const stripe = useStripe();\n const elements = useElements();\n const { enqueueSnackbar } = useSnackbar();\n\n const handleNameChange = (\n e: React.ChangeEvent\n ) => {\n setFullname(e.target.value);\n };\n\n const handleZipChange = (\n e: React.ChangeEvent\n ) => {\n setZip(e.target.value);\n };\n\n const handleToggleChange = () => {\n setToggleTax(prev => !prev);\n };\n\n const handleSubmit = async (event: React.FormEvent) => {\n event.preventDefault();\n\n if (!stripe || !elements) {\n return;\n }\n\n const cardElement = elements.getElement(CardNumberElement);\n\n if (cardElement === null) return;\n\n try {\n const { token } = await stripe.createToken(cardElement, {\n name: fullname,\n address_zip: zip,\n });\n\n let exemptTax = false;\n if (fileInput.current?.files?.length) {\n await createTaxExemptProofsAPI(Array.from(fileInput.current.files));\n exemptTax = true;\n }\n\n if (token) onSubmit(token, exemptTax);\n } catch (reason) {\n console.error(reason);\n enqueueSnackbar(JSON.stringify(reason), { variant: \"error\" });\n }\n };\n\n return (\n \n
\n \n {Boolean(paymentSource)\n ? \"Update Payment Source\"\n : \"Add Payment Source\"}\n \n \n \n \n \n \n \n \n }\n label=\"Tax Exempt\"\n />\n \n \n \n \n \n {\n if (dialogProps.onClose) dialogProps.onClose({}, \"escapeKeyDown\");\n }}\n >\n Cancel\n \n \n {isLoading ? (\n \n ) : (\n \"Submit\"\n )}\n \n \n
\n
\n );\n};\n","import TagManager from \"react-gtm-module\";\n\nconst reportServerError = (reason: any) => {\n if (process.env.NODE_ENV !== \"production\") return;\n TagManager.dataLayer({\n dataLayer: {\n event: \"server_error\",\n error_code: reason.response.status,\n error_text: reason.response.statusText,\n request_url: reason.config.url,\n },\n });\n};\n\nexport default reportServerError;\n","export default __webpack_public_path__ + \"static/media/loadRing.5d80ee75.svg\";","export default __webpack_public_path__ + \"static/media/loadSpinner.61754d3f.svg\";","import { DefaultLoadingScreen } from \"@babylonjs/core\";\n\nimport logoRing from \"../resources/img/loadRing.svg\";\nimport logoSpinner from \"../resources/img/loadSpinner.svg\";\n\nDefaultLoadingScreen.prototype.displayLoadingUI = function () {\n if (this._loadingDiv) {\n const enableDarkMode = JSON.parse(\n window.localStorage.getItem(\"dark-mode-enabled\") ?? \"false\"\n );\n this._loadingDiv.style.backgroundColor = enableDarkMode\n ? \"#303030\"\n : \"#f0f0f0\";\n return;\n }\n this._loadingDiv = document.createElement(\"div\");\n this._loadingDiv.id = \"babylonjsLoadingDiv\";\n\n this._loadingDiv.style.width = \"100%\";\n this._loadingDiv.style.height = \"100%\";\n\n this._loadingDiv.style.display = \"flex\";\n this._loadingDiv.style.flexDirection = \"column\";\n this._loadingDiv.style.alignItems = \"center\";\n this._loadingDiv.style.justifyContent = \"center\";\n this._loadingDiv.style.opacity = \"0\";\n this._loadingDiv.style.transition = \"opacity 1.5s ease\";\n this._loadingDiv.style.pointerEvents = \"none\";\n\n // // Loading text\n // this._loadingTextDiv = document.createElement(\"div\");\n // this._loadingTextDiv.style.position = \"absolute\";\n // this._loadingTextDiv.style.left = \"0\";\n // this._loadingTextDiv.style.top = \"50%\";\n // this._loadingTextDiv.style.marginTop = \"80px\";\n // this._loadingTextDiv.style.width = \"100%\";\n // this._loadingTextDiv.style.height = \"20px\";\n // this._loadingTextDiv.style.fontFamily = \"Arial\";\n // this._loadingTextDiv.style.fontSize = \"14px\";\n // this._loadingTextDiv.style.color = \"white\";\n // this._loadingTextDiv.style.textAlign = \"center\";\n // this._loadingTextDiv.innerHTML = \"Loading\";\n // this._loadingDiv.appendChild(this._loadingTextDiv);\n // this._loadingTextDiv.innerHTML = this._loadingText;\n // Generating keyframes\n var style = document.createElement(\"style\");\n style.type = \"text/css\";\n var keyFrames =\n \"@-webkit-keyframes spin1 { 0% { -webkit-transform: rotate(0deg);}\\n 100% { -webkit-transform: rotate(360deg);}\\n } @keyframes spin1 { 0% { transform: rotate(0deg);}\\n 100% { transform: rotate(360deg);}\\n }\";\n style.innerHTML = keyFrames;\n document.getElementsByTagName(\"head\")[0].appendChild(style);\n // Loading images\n\n var box = document.createElement(\"div\");\n box.id = \"spinner-box\";\n box.style.display = \"flex\";\n box.style.position = \"relative\";\n // box.style.flexDirection = \"column\";\n box.style.alignItems = \"center\";\n box.style.justifyContent = \"center\";\n\n var spinner = new Image();\n spinner.src = logoSpinner;\n spinner.style.position = \"absolute\";\n // imgBack.style.left = \"25%\";\n // imgBack.style.top = \"25%\";\n // imgBack.style.marginLeft = \"-60px\";\n // imgBack.style.marginTop = \"-60px\";\n spinner.style.display = \"block\";\n spinner.style.width = \"150px\";\n spinner.style.height = \"150px\";\n spinner.style.zIndex = 7000;\n spinner.style.animation = \"spin1 2s infinite ease-in-out\";\n spinner.style.webkitAnimation = \"spin1 2s infinite ease-in-out\";\n spinner.style.transformOrigin = \"50% 50%\";\n spinner.style.webkitTransformOrigin = \"50% 50%\";\n box.appendChild(spinner);\n\n var ring = new Image();\n ring.src = logoRing;\n ring.style.display = \"block\";\n ring.style.width = \"125px\";\n ring.style.height = \"125px\";\n ring.style.zIndex = 7100;\n box.appendChild(ring);\n\n this._loadingDiv.appendChild(box);\n\n this._resizeLoadingUI();\n window.addEventListener(\"resize\", this._resizeLoadingUI);\n const enableDarkMode = JSON.parse(\n window.localStorage.getItem(\"dark-mode-enabled\") ?? \"false\"\n );\n this._loadingDiv.style.backgroundColor = enableDarkMode\n ? \"#303030\"\n : \"#f0f0f0\";\n document.body.appendChild(this._loadingDiv);\n this._loadingDiv.style.opacity = \"1\";\n};\n","import { Container } from '@material-ui/core';\nimport React from 'react';\n\nimport { AssetStore } from './AssetStore';\n\nconst AssetStorePage: React.FC = () => {\n const [open, setOpen] = React.useState(true);\n return (\n \n setOpen(!open)}\n />\n \n );\n};\n\nexport default AssetStorePage;\n","import { Button, Link, Typography } from \"@material-ui/core\";\nimport { useSnackbar } from \"notistack\";\nimport React from \"react\";\nimport { useRecoilState } from \"recoil\";\n\nimport { cookieConsentState } from \"../features/account/user/userPrefStore\";\n\nexport function CookieConsent() {\n const [consented, setConsent] = useRecoilState(cookieConsentState);\n const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n\n const handleCloseSnackbar = React.useCallback(\n (key: string | number, accepted: boolean) => {\n if (accepted) setConsent(accepted);\n closeSnackbar(key);\n },\n [setConsent, closeSnackbar]\n );\n\n React.useEffect(() => {\n // let key: string | number = '';\n if (!consented) {\n enqueueSnackbar(\n \n This site uses cookies to deliver our services. By using our site, you\n acknowledge that you have read and understand our{\" \"}\n \n Terms of Service and Cookie Policy\n \n . Your use of Post Reality's Products and Services, is subject to\n these policies and terms.\n ,\n {\n persist: true,\n action: key => (\n {\n handleCloseSnackbar(key, true);\n }}\n >\n Accept\n \n ),\n // content: (id, msg) => (\n // \n // {msg}\n // \n // ),\n }\n );\n }\n // return () => {\n // if (!consented) {\n // handleCloseSnackbar(key, false);\n // }\n // };\n }, [consented, enqueueSnackbar, handleCloseSnackbar]);\n\n return null;\n}\n","import React from \"react\";\nimport { SvgIcon } from \"@material-ui/core\";\nimport type { SvgIconProps } from \"@material-ui/core\";\n\nconst TemplatesIcon: React.FC = props => {\n return (\n \n \n \n );\n};\n\nexport default TemplatesIcon;\n","import {\n Box,\n CircularProgress,\n createStyles,\n Divider,\n FormControlLabel,\n FormGroup,\n LinearProgress,\n ListItemIcon,\n makeStyles,\n Switch,\n Theme,\n Tooltip,\n Typography,\n TypographyProps\n} from '@material-ui/core'\nimport List from '@material-ui/core/List'\nimport ListItem from '@material-ui/core/ListItem'\nimport ListItemText from '@material-ui/core/ListItemText'\nimport {\n mdiAccountCog,\n mdiAccountGroup,\n mdiCloud,\n mdiCodeBracesBox,\n mdiCollage,\n mdiFrequentlyAskedQuestions,\n mdiLogoutVariant,\n mdiTheater\n} from '@mdi/js'\nimport Icon from '@mdi/react'\nimport { useTeams } from 'features/team/teamHooks'\nimport { useSnackbar } from 'notistack'\nimport React from 'react'\nimport { Link as RouterLink, useHistory } from 'react-router-dom'\nimport { useRecoilState } from 'recoil'\n\nimport { USER_ROLE_TYPE } from '../constants'\nimport { logOutAPI } from '../features/account/auth/authAPI'\nimport { authState } from '../features/account/auth/authStore'\nimport { darkModeState } from '../features/account/user/userPrefStore'\nimport { ConfirmationDialog } from './ConfirmationDialog'\nimport MoonIcon from './MoonIcon'\nimport SunIcon from './SunIcon'\nimport TemplatesIcon from './TemplatesIcon'\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n height: '100%',\n position: 'relative',\n maxWidth: 360,\n overflow: 'hidden'\n },\n item: {\n paddingLeft: 24\n },\n subList: {\n borderLeft: `solid ${theme.palette.divider} 1px`\n },\n nested: {\n paddingLeft: theme.spacing(4),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[50]\n },\n nestedItem: {\n paddingLeft: 20,\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[900]\n : theme.palette.grey[50]\n },\n toggle: {\n position: 'absolute',\n paddingLeft: 19,\n bottom: 55\n },\n logout: {\n position: 'absolute',\n bottom: 0\n },\n topProgress: {\n position: 'absolute',\n left: 0\n },\n bottomProgress: {\n color: theme.palette.divider\n }\n })\n)\n\nconst typographyProps: TypographyProps = {\n noWrap: true,\n variant: 'button'\n}\n\nconst routes = [\n // { path: '/create', icon: mdiCreation, label: 'Create' },\n { path: '/presentations', icon: mdiCollage, label: 'Presentations' },\n { path: '/templates', icon: mdiCodeBracesBox, label: 'Templates' },\n // {\n // path: '/admin',\n // subRoutes: [\n // { path: '/team', icon: mdiAccountGroup, label: 'Team' },\n // { path: '/showcases', icon: mdiTheater, label: 'Showcases' },\n // {\n // path: '/statistics',\n // icon: mdiChartTimelineVariant,\n // label: 'Statistics',\n // },\n // ],\n // icon: mdiAccountSupervisor,\n // label: 'Admin',\n // },\n { path: '/showcases', icon: mdiTheater, label: 'Showcases' },\n { path: '/team', icon: mdiAccountGroup, label: 'Team' },\n // {\n // path: '/statistics',\n // icon: mdiChartTimelineVariant,\n // label: 'Statistics',\n // },\n { path: '/account', icon: mdiAccountCog, label: 'Account' },\n { path: '/faq', icon: mdiFrequentlyAskedQuestions, label: 'FAQ' }\n]\n\nexport function Navigation(props: { sidebarCollapsed?: boolean }) {\n const { sidebarCollapsed } = props\n // const [openAdmin, setOpenAdmin] = React.useState(false);\n const [openLogout, setOpenLogout] = React.useState(false)\n const [darkMode, setDarkMode] = useRecoilState(darkModeState)\n const [authUser, setAuthUser] = useRecoilState(authState)\n const { teams } = useTeams(\n authUser\n ? {\n id: authUser.team_id as number,\n add_props:\n 'file_size,file_size_h,max_file_size,max_file_size_h,count_experience_views_h'\n }\n : undefined\n )\n const { enqueueSnackbar } = useSnackbar()\n const history = useHistory()\n const classes = useStyles()\n\n const handleDarkModeToggle = React.useCallback(() => {\n setDarkMode(prev => !prev)\n }, [setDarkMode])\n\n // const handleClick = () => {\n // setOpenAdmin(!openAdmin);\n // };\n\n const handleOpenLogout = () => {\n setOpenLogout(true)\n }\n const handleCloseLogout = () => {\n setOpenLogout(false)\n }\n\n const handleLogOut = async () => {\n try {\n await logOutAPI()\n setAuthUser(null)\n enqueueSnackbar('Have a nice day!')\n history.push('/auth/login')\n } catch (reason) {\n console.error(reason)\n enqueueSnackbar(JSON.stringify(reason), { variant: 'error' })\n }\n }\n\n const getStorageLabel = (file_size_h: string, max_file_size_h: string) => {\n return `${file_size_h} of ${max_file_size_h} used`\n }\n\n const getStoragePercent = (file_size: number, max_file_size: number) => {\n return Math.ceil((file_size / max_file_size) * 100)\n }\n\n return (\n \n \n \n {routes\n .filter(route =>\n authUser!.role_type_id >= USER_ROLE_TYPE.SUPER_CREATOR\n ? route.path !== '/showcases' && route.path !== '/team'\n : true\n )\n .map(route => (\n
\n {route.label}}\n placement='right'\n arrow\n disableFocusListener={!sidebarCollapsed}\n disableHoverListener={!sidebarCollapsed}\n disableTouchListener={!sidebarCollapsed}\n >\n = USER_ROLE_TYPE.SUPER_CREATOR) ||\n // getCustomerPlanName(customer) === \"Basic\" ||\n // getCustomerPlanName(customer) === \"Personal\") &&\n // (route.path === \"/showcases\" || route.path === \"/team\")\n // }\n selected={window.location.href.includes(route.path)}\n to={route.path}\n >\n \n {route.path === '/templates' ? (\n \n ) : (\n \n )}\n \n \n \n \n
\n ))}\n \n {teams.length > 0 && (\n {getStorageLabel(teams)}\n \n {getStorageLabel(\n teams[0].file_size_h!,\n teams[0].max_file_size_h!\n )}\n \n }\n placement='right'\n arrow\n disableFocusListener={!sidebarCollapsed}\n disableHoverListener={!sidebarCollapsed}\n disableTouchListener={!sidebarCollapsed}\n >\n \n {sidebarCollapsed && (\n \n {/* */}\n \n \n \n \n {`${getStoragePercent(\n teams[0].file_size!,\n teams[0].max_file_size!\n )}%`}\n \n \n \n )}\n \n \n \n \n
Storage
\n \n }\n secondary={\n !sidebarCollapsed ? (\n
\n \n \n {getStorageLabel(\n teams[0].file_size_h!,\n teams[0].max_file_size_h!\n )}\n \n
\n ) : null\n }\n primaryTypographyProps={typographyProps}\n secondaryTypographyProps={{ variant: 'caption' }}\n />\n \n \n )}\n {/* {teams.length > 0 && (\n \n {teams.length > 0 &&\n teams[0].count_experience_views_h &&\n teams[0].count_experience_views_h + ' Views'}\n \n }\n placement='right'\n arrow\n disableFocusListener={!sidebarCollapsed}\n disableHoverListener={!sidebarCollapsed}\n disableTouchListener={!sidebarCollapsed}\n >\n \n \n \n \n 0 &&\n teams[0].count_experience_views_h &&\n teams[0].count_experience_views_h + ' Views'\n }\n // secondary={}\n primaryTypographyProps={typographyProps}\n />\n \n \n )} */}\n\n \n Theme}\n placement='right'\n arrow\n disableFocusListener={!sidebarCollapsed}\n disableHoverListener={!sidebarCollapsed}\n disableTouchListener={!sidebarCollapsed}\n >\n }\n checkedIcon={}\n />\n \n }\n label={\n \n {darkMode ? 'Light Mode' : 'Dark Mode'}\n \n }\n />\n \n Log Out}\n placement='right'\n arrow\n disableFocusListener={!sidebarCollapsed}\n disableHoverListener={!sidebarCollapsed}\n disableTouchListener={!sidebarCollapsed}\n >\n \n \n \n \n \n \n \n \n
\n )\n}\n","import {\n Box,\n Divider,\n Toolbar,\n Typography,\n useMediaQuery,\n useTheme,\n} from \"@material-ui/core\";\nimport Layout, {\n getCollapseBtn,\n getContent,\n getDrawerSidebar,\n getHeader,\n getSidebarContent,\n getSidebarTrigger,\n Root,\n} from \"@mui-treasury/layout\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { AppIconAvatar } from \"./AppIconAvatar\";\nimport { CookieConsent } from \"./CookieConsent\";\nimport { LoadingScreen } from \"./LoadingScreen\";\nimport { Navigation } from \"./Navigation\";\n\nconst Header = getHeader(styled);\nconst DrawerSidebar = getDrawerSidebar(styled);\nconst Content = getContent(styled);\nconst SidebarTrigger = getSidebarTrigger(styled);\nconst SidebarContent = getSidebarContent(styled);\nconst CollapseBtn = getCollapseBtn(styled);\n\nconst Main = styled(\"div\")({ padding: \"0 48px\" });\n\nconst scheme = Layout();\n\n// Basically the fixed layout with some small tweaks.\nscheme.configureHeader(builder => {\n builder\n .registerConfig(\"xs\", {\n position: \"fixed\",\n initialHeight: 62,\n })\n .registerConfig(\"md\", {\n position: \"relative\",\n initialHeight: 64,\n });\n});\nscheme.configureEdgeSidebar(builder => {\n builder\n .create(\"primarySidebar\", {\n anchor: \"left\",\n })\n .registerTemporaryConfig(\"xs\", {\n width: 240,\n })\n .registerPermanentConfig(\"md\", {\n width: 240,\n collapsible: true,\n collapsedWidth: 72,\n });\n});\nscheme.enableAutoCollapse(\"primarySidebar\", \"md\");\n\n/**\n * Main layout used for authenticated part of the site.\n * Handles lazy loading in the Content section.\n * @param props.children Item to render in the Content section.\n */\nexport function MainLayout(props: { children?: React.ReactNode }) {\n const { children } = props;\n const theme = useTheme();\n const match = useMediaQuery(theme.breakpoints.up(\"md\"));\n\n return (\n \n {({ state: { sidebar } }) => (\n \n \n {!match && (\n
\n \n \n Post Reality\n \n
\n )}\n \n \n \n \n \n \n PostReality © {new Date().getFullYear()}\n \n \n \n \n \n \n \n \n \n
\n }>\n {children}\n \n
\n
\n
\n )}\n
\n );\n}\n","import React from 'react'\nimport {\n BrowserRouter,\n Redirect,\n Route,\n RouteProps,\n Switch\n} from 'react-router-dom'\nimport { useRecoilValueLoadable } from 'recoil'\n\nimport { authState } from '../features/account/auth/authStore'\nimport AssetStorePage from '../features/asset/AssetStorePage'\nimport { LoadingScreen } from '../components/LoadingScreen'\nimport { MainLayout } from '../components/MainLayout'\n\nconst AuthenticationPage = React.lazy(() => import('./AuthenticationPage'))\nconst StatisticsPage = React.lazy(\n () => import('../features/analytics/Statistics')\n)\nconst AccountPage = React.lazy(() => import('./AccountPage'))\n\nconst MyPresentationsPage = React.lazy(() => import('./MyExperiencesPage'))\nconst TemplatesPage = React.lazy(\n () => import('../features/xr_experience/components/TemplatesPage')\n)\nconst TeamPage = React.lazy(() => import('./TeamPage'))\nconst FaqPage = React.lazy(() => import('./FaqPage'))\nconst ShowcasePage = React.lazy(() => import('./ShowcasePage'))\nconst ManageShowcasesPage = React.lazy(() => import('./ManageShowcasesPage'))\n\nconst VerifyAccountPage = React.lazy(() => import('./VerifyAccountPage'))\nconst ForgotPasswordPage = React.lazy(() => import('./ForgotPasswordPage'))\nconst ResetPasswordPage = React.lazy(() => import('./ResetPasswordPage'))\n\nconst PresentationEditorPage = React.lazy(\n () => import('./PresentationEditorPage')\n)\nconst PresentationViewerPage = React.lazy(\n () => import('./PresentationViewerPage')\n)\n\nconst DeleteAccountPage = React.lazy(() => import('./DeleteAccountPage'))\n\nconst ProtectedRoute: React.FC = (props: RouteProps) => {\n const authUserLoadable = useRecoilValueLoadable(authState)\n\n switch (authUserLoadable.state) {\n case 'hasValue':\n if (authUserLoadable.contents?.role_type_id === 10) {\n return \n }\n // if (authUserLoadable.contents?.role_type_id === USER_ROLE_TYPE.CREATOR) {\n // return
Access Denied
;\n // }\n if (authUserLoadable.contents === null) {\n return \n }\n return \n case 'loading':\n return \n case 'hasError':\n return \n }\n}\n\nexport function AppRouter() {\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 \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 \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 }>\n \n \n \n\n \n
Page not found
\n
\n
\n
\n )\n}\n","import TagManager, { TagManagerArgs } from \"react-gtm-module\";\n\nconst tagManagerArgs: TagManagerArgs = {\n gtmId: \"GTM-PQBNNNS\",\n // dataLayerName: \"\"\n};\n\nconst initGTM = () => {\n TagManager.initialize(tagManagerArgs);\n};\n\nexport default initGTM;\n","import { loadStripe } from \"@stripe/stripe-js\";\n\nconst stripeConfig = loadStripe(process.env.REACT_APP_PUB_STRIPE_KEY!);\n\nexport default stripeConfig;\n","// eslint-disable-next-line\nimport '../src/helpers/setUpExpLoadingScreen'\n\nimport {\n createMuiTheme,\n createStyles,\n CssBaseline,\n Fade,\n makeStyles,\n responsiveFontSizes,\n Theme,\n ThemeProvider as MuiThemeProvider,\n useMediaQuery\n} from '@material-ui/core'\nimport { cyan, deepOrange, lightBlue, pink } from '@material-ui/core/colors'\nimport { TransitionProps } from '@material-ui/core/transitions'\nimport { Elements } from '@stripe/react-stripe-js'\nimport { SnackbarProvider } from 'notistack'\nimport React from 'react'\nimport { useRecoilValue } from 'recoil'\n\nimport { AppRouter } from './pages/AppRouter'\nimport initGTM from './config/gtm'\nimport stripeConfig from './config/stripe'\nimport { darkModeState } from './features/account/user/userPrefStore'\n\n// // Import the functions you need from the SDKs you need\n// import { initializeApp } from \"firebase/app\";\n// import { getAnalytics } from \"firebase/analytics\";\n// // TODO: Add SDKs for Firebase products that you want to use\n// // https://firebase.google.com/docs/web/setup#available-libraries\n\n// // Your web app's Firebase configuration\n// // For Firebase JS SDK v7.20.0 and later, measurementId is optional\n// const firebaseConfig = {\n// apiKey: \"AIzaSyAcah1tegZcJAFLCKu8MIqwAR15uf852Zo\",\n// authDomain: \"post-reality-studio-site.firebaseapp.com\",\n// projectId: \"post-reality-studio-site\",\n// storageBucket: \"post-reality-studio-site.appspot.com\",\n// messagingSenderId: \"1025640020851\",\n// appId: \"1:1025640020851:web:108245ab7e15d6f04b2306\",\n// measurementId: \"G-NJV832MSZQ\",\n// };\n\n// // Initialize Firebase\n// const app = initializeApp(firebaseConfig);\n// const analytics = getAnalytics(app);\n\nif (process.env.NODE_ENV === 'production') {\n initGTM()\n}\n\nconst useSnackbarStyles = makeStyles(theme =>\n createStyles({\n anchorOriginBottomCenter: { minWidth: 0 },\n anchorOriginBottomRight: {\n minWidth: 0\n }\n })\n)\n\nfunction App() {\n const classes = useSnackbarStyles()\n const darkMode = useRecoilValue(darkModeState)\n\n let baseTheme = React.useMemo((): Theme => {\n const theme = createMuiTheme({\n palette: {\n type: darkMode ? 'dark' : 'light',\n background: { default: darkMode ? '#303030' : '#f0f0f0' },\n primary: { main: darkMode ? cyan[100] : lightBlue['A700'] },\n secondary: { main: darkMode ? pink['A100'] : deepOrange[500] }\n },\n shape: { borderRadius: 8 },\n props: {\n MuiTextField: {\n variant: 'outlined'\n },\n\n MuiButton: {\n disableElevation: true,\n variant: 'contained'\n },\n MuiButtonGroup: {\n disableElevation: true,\n variant: 'contained'\n },\n MuiPaper: {\n elevation: 0\n },\n MuiCard: {\n elevation: 0\n },\n MuiTooltip: {\n arrow: true\n }\n }\n })\n return {\n ...theme,\n overrides: {\n MuiContainer: {\n root: {\n paddingBottom: theme.spacing(5)\n }\n }\n }\n }\n }, [darkMode])\n baseTheme = responsiveFontSizes(baseTheme)\n\n const match = useMediaQuery(baseTheme.breakpoints.up('md'))\n\n return (\n \n \n }\n TransitionProps={{ style: { minWidth: 0, minHeight: 64 } }}\n classes={{\n anchorOriginBottomCenter: classes.anchorOriginBottomCenter,\n anchorOriginBottomRight: classes.anchorOriginBottomRight\n }}\n >\n \n \n \n \n \n )\n}\n\nexport default App\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 https://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.0/8 are 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\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: 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(\n process.env.PUBLIC_URL,\n window.location.href\n );\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 https://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: string, config?: 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 https://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: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\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\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { RecoilRoot } from 'recoil';\n\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\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: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}