{"version":3,"sources":["helpers/GeneralHelper.js","helpers/AWSHelper.js","helpers/GoogleAnalyticsHelper.js","store/connect/focusConnect.js","constants/gql/query/appSyncQuery.js","helpers/gaFunctions.ts","images/NextLogo.png","App.js","store/index.js","store/config.js","store/reducers/index.js","store/reducers/presetReducer.js","store/reducers/authReducer.js","components/layout/Layout.js","store/actions/authActions.js","routes/config/index.js","routes/pages/main/routes.js","components/common/loader/index.js","components/common/loader/CircleLoader.js"],"names":["GeneralHelper","x","toString","replace","obj","hasOwnProperty","iterateKey","string","toLowerCase","split","map","s","charAt","toUpperCase","substring","join","authUser","quota_type","vForKey","Object","keys","length","title","channel","photo","chat_members","JSON","parse","atob","identity","fullName","value","parseFloat","toFixed","date","year","month","day","d","undefined","location","search","decodeURI","user","groupId","numberString","parseInt","number","str","key","props","nextProps","circularJSON","stringify","val","isNaN","url","m","match","pop","Date","getFullYear","emptyType","float","email","test","params","URLSearchParams","goalYear","get","appElem","document","getElementById","requestFullscreen","webkitRequestFullscreen","msRequestFullscreen","localStorage","setItem","min","current","timeFromNow","add","toDate","this","setItemToLocalStorage","item","getItem","e","queryParamsToObject","localParams","retrieveLocalStorageItem","pathname","communityID","sceneID","window","innerHeight","innerWidth","navigator","userAgent","items","replacer","header","csv","row","index","fieldName","blob","Blob","a","createElement","href","URL","createObjectURL","type","download","body","appendChild","click","removeChild","camelCaseString","word","getSum","array","total","forEach","formatMoney","amount","AWSHelper","appSyncClient","AWSAppSyncClient","process","region","auth","AUTH_TYPE","API_KEY","apiKey","cognitoUrl","federatedConfig","facebook_app_id","REACT_APP_FACEBOOK_APP_ID","google_client_id","REACT_APP_GOOGLE_APP_ID","amazon_client_id","REACT_APP_AMAZON_APP_ID","Auth","configure","client","query","fetchPolicy","response","mutation","mutate","currentAuthenticatedUser","res","provider","federatedSignIn","GoogleAnalyticsHelper","sendEvent","gaFunction","dsSendStandardEvent","signOut","console","log","path","Amplify","aws_appsync_graphqlEndpoint","aws_appsync_region","aws_appsync_authenticationType","identityPoolId","identityPoolRegion","userPoolId","userPoolWebClientId","mandatorySignIn","oauth","domain","scope","redirectSignIn","redirectSignOut","responseType","federationTarget","Storage","bucket","getConfigureObj","presetHash","compositorcanvas","Promise","resolve","toBlob","blobData","put","contentType","result","hitString","sendQueueItems","GAproperty","uuidv4","trackerIsActive","setInterval","onTimerCheckQue","GAPropertyID","focusClientID","builderName","builderDivision","projectName","CommunityID","sourceName","ClientUDID","encodeURI","c","r","Math","random","fetch","then","status","catch","error","shift","userID","addCustomDimension","cdStr","indexOf","spHitStr","spIndex","fStr","i","splice","push","pageURL","eventCategory","eventAction","eventLabel","eventValue","timeCategory","timeAction","timeLabel","timeValue","globalActions","setUserObj","signOutUser","component","mapState","state","mapActions","styles","theme","connect","getGlobalState","stateProps","dispatchProps","ownProps","forwardRef","withStyles","collectionID","id","sceneId","sceneData","clientID","image","presetLabel","selections","sceneSubTitle","sceneTitle","materialID","clientIDNumber","clientDivision","communityName","username","name","debugMode","param","eventParams","sendQueueItemsURL","measurementId","lastTime","firstClickfunction","hasBeenInitialized","timers","print","elevationDialog","singleElevation","time","interiorDialog","singleInterior","notes","measure","customFurniture","customFurnitureRoom","compareDialog","comparePlans","plan1","plan2","viewFloorPlan","userId","sessionId","user_id","client_id","non_personalized_ads","user_properties","newClientId","method","floor","getTime","app_id","app_env","newSession","gav","setClientId","now","addEventListener","firstClick","focusClientId","clientName","client_name","client_division","communityId","community_id","community_name","removeEventListener","currentTarget","feature","module_id","category","action","label","planName","plan_name","sendPageview","Cat","Action","Label","Value","CameraName","cat","scene_title","selectedFloor","interiorName","isFirst","getTimerValue","time_ms","time_format","optionName","show","room","event_plan_name","elevationStyle","lotTitle","elevationName","lot_title","poiCategoryTitle","poiTitle","input","selectedFilterCategoryName","selectedFilterName","hitStr","screen","availWidth","availHeight","getNavigatorLanguage","encodeURIComponent","inIframe","referrer","hit2Str","addUserParametersToURL","entries","dt","eventName","eventObject","computeDt","pageTitle","language","languages","self","top","timer","total_seconds","total_minutes","total_hours","days","seconds","minutes","hours","App","useState","typography","useNextVariants","fontSize","fontFamily","palette","primary","main","secondary","overrides","MuiPaper","root","textTransform","MuiBreadcrumbs","MuiTypography","body1","zIndex","body2","h5","fontWeight","h6","caption","setTheme","useEffect","getBuilderTheme","queryString","urlParams","has","awsHelper","appSyncQuery","getCommunityCollection","data","listDesignerSceneCollections","builderTheme","clientFont","getSceneData","getDesignerScene","Provider","store","MuiThemeProvider","createTheme","ReactDOM","render","initialState","enhancers","applyMiddleware","thunk","createStore","rootReducer","compose","module","combineReducers","preset","appOptionHierarchy","scene","list","payload","classes","history","configureCognito","getCurrentUser","Hub","listen","event","setUserAttributes","initBasicTracking","startSession","defaultView","errEvent","message","lineno","setLoggedInUserID","setUserSub","attributes","sub","signInUserSession","accessToken","className","BrowserRouter","Switch","routes","route","Route","exact","Redirect","to","getUniqueKey","background","display","flexDirection","flex","overflow","mainRoutes","loader","loading","LoadingComponent","isLoading","style","height","justifyContent","alignItems","src","NextLogo","displayName","progress","position","left","progressContainer","CircularProgress"],"mappings":"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","file":"static/js/main.0de25bc1.chunk.js","sourcesContent":["import { v4 as uuidv4 } from \"uuid\";\r\nimport circularJSON from \"circular-json\";\r\nimport ismobile from \"is-mobile\";\r\nimport moment from \"moment\";\r\n\r\nclass GeneralHelper {\r\n static currencyFormatter(x) {\r\n if (!x) {\r\n return \"\";\r\n }\r\n if (typeof x === \"number\") {\r\n x = x.toString();\r\n }\r\n return \"$\" + x.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n\r\n static iterateKey(obj) {\r\n if (obj.hasOwnProperty(\"iterateKey\")) return obj.iterateKey;\r\n\r\n obj.iterateKey = uuidv4();\r\n\r\n return obj.iterateKey;\r\n }\r\n\r\n // static deleteNotifications(type) {\r\n // this.referralAxios(\r\n // axiosConfig(\"delete-notifications\", { type: type })\r\n // ).catch(() => false);\r\n // }\r\n\r\n static capitalizeFirstLetterEachWord(string) {\r\n return string\r\n .toLowerCase()\r\n .split(\" \")\r\n .map((s) => s.charAt(0).toUpperCase() + s.substring(1))\r\n .join(\" \");\r\n }\r\n\r\n static showQuota(authUser) {\r\n return authUser.quota_type !== \"unlimited\";\r\n }\r\n\r\n static vForKey(obj) {\r\n if (obj.hasOwnProperty(\"vForKey\")) return obj.vForKey;\r\n\r\n obj.vForKey = uuidv4();\r\n\r\n return obj.vForKey;\r\n }\r\n\r\n static isObjectEmpty(obj) {\r\n return obj ? !Object.keys(obj).length : true;\r\n }\r\n\r\n static truncatedReferralTitle(title) {\r\n return title.substring(0, 21) + \"...\";\r\n }\r\n\r\n static channelAvatar(channel) {\r\n return channel.photo ? channel.photo : \"/images/i-blankImg.svg\";\r\n }\r\n\r\n static channelName(channel) {\r\n return !channel.chat_members.length\r\n ? \"\"\r\n : JSON.parse(atob(channel.chat_members[0].identity)).fullName;\r\n }\r\n\r\n static currency(value) {\r\n if (value === null) return \"\";\r\n\r\n value = typeof value === \"string\" ? parseFloat(value) : value;\r\n\r\n if (value >= 1000000000)\r\n return (value / 1000000000).toFixed(1).replace(/\\.0$/, \"\") + \"B\";\r\n else if (value >= 1000000)\r\n return (value / 1000000).toFixed(1).replace(/\\.0$/, \"\") + \"M\";\r\n else if (value >= 1000)\r\n return (value / 1000).toFixed(1).replace(/\\.0$/, \"\") + \"K\";\r\n else return value.toFixed(1).replace(/(\\d)(?=(\\d{3})+\\.)/g, \"$1,\");\r\n }\r\n\r\n static dateFormat(date) {\r\n if (!date) return \"\";\r\n\r\n const [year, month, day] = date.split(\" \")[0].split(\"-\");\r\n return `${month}/${day}/${year}`;\r\n }\r\n\r\n static formatChatDate(d) {\r\n if (d !== undefined && d !== null) {\r\n d = d.toString().split(\" \", 4);\r\n const [day, month, date, year] = d;\r\n return `${day} ${month} ${date}th`;\r\n }\r\n }\r\n\r\n static queryParamsToObject(location) {\r\n let search = location.search.substring(1);\r\n\r\n if (search === \"\" || typeof search !== \"string\") {\r\n return {};\r\n }\r\n return JSON.parse(\r\n '{\"' +\r\n decodeURI(search)\r\n .replace(/\"/g, '\\\\\"')\r\n .replace(/&/g, '\",\"')\r\n .replace(/=/g, '\":\"') +\r\n '\"}'\r\n );\r\n }\r\n\r\n static getUserPhoto(user) {\r\n return user.photo !== null ? user.photo : \"/images/i-blankImg.svg\";\r\n }\r\n\r\n static getPlanIconFromGroupId(groupId) {\r\n if (groupId === 1) return \"/images/core-logo.svg\";\r\n else if (groupId === 2) return \"/images/elite-logo.svg\";\r\n else if (groupId === 3) return \"/images/team-logo.svg\";\r\n else if (groupId === 5) return \"/images/coach-logo.svg\";\r\n else if (groupId === 7) return \"/images/mgmt-logo.svg\";\r\n else if (groupId === 8) return \"/images/pro-logo.svg\";\r\n else if (groupId === 9) return \"/images/community-logo.svg\";\r\n else if (groupId === 10) return \"/images/lite-logo.svg\";\r\n }\r\n\r\n static removeCommas(numberString) {\r\n if (numberString !== null) {\r\n numberString = numberString.replace(/,\\s?/g, \"\");\r\n return parseInt(numberString);\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n static addCommas(number) {\r\n if (number !== undefined && number !== null) {\r\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n }\r\n\r\n static getUniqueKey() {\r\n return uuidv4();\r\n }\r\n\r\n static generateStrFromObj(str) {\r\n return `${Object.keys(str)\r\n .map((key) => key + \"=\" + str[key])\r\n .join(\"&\")}`;\r\n }\r\n\r\n static checkReceivedProps(props, nextProps) {\r\n if (circularJSON.stringify(props) !== circularJSON.stringify(nextProps)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n static isNumeric(val) {\r\n return !isNaN(val);\r\n }\r\n\r\n static getFileNameFromFullUrl(url) {\r\n if (!url) return \"\";\r\n\r\n var m = url.toString().match(/.*\\/(.+?)\\./);\r\n if (m && m.length > 1) {\r\n return m[1];\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n static getFileTypeFromS3Url(url) {\r\n let type = url.split(\"?\")[0].split(\".\").pop();\r\n return type;\r\n }\r\n\r\n // static getFileIcon(url) {\r\n // const ext = this.getFileTypeFromS3Url(url);\r\n //\r\n // switch (ext) {\r\n // case 'pdf': return {'pdf'};\r\n // case 'mp4': return {'mp4'};\r\n // case 'mp3': return {'mp3'};\r\n // case 'docx': return {'docx'};\r\n // case 'jpg': return {'pdf'};\r\n // case 'jpeg': return {'pdf'};\r\n // case 'svg': return {'pdf'};\r\n // case 'png': return {'pdf'};\r\n // default: return {'pdf'};\r\n // }\r\n // }\r\n\r\n static getCurrentYear() {\r\n return new Date().getFullYear();\r\n }\r\n\r\n static camelCaseString = (string) => {\r\n return string\r\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (word, index) {\r\n return index === 0 ? word.toLowerCase() : word.toUpperCase();\r\n })\r\n .replace(/\\s+/g, \"\")\r\n .replace(/\\//g, \"\");\r\n };\r\n\r\n static getSum = (array) => {\r\n let total = 0;\r\n array.forEach((value) => {\r\n if (value) {\r\n total += parseFloat(value);\r\n }\r\n });\r\n return total;\r\n };\r\n\r\n static formatMoney = (amount) => {\r\n if (amount !== null && amount !== undefined) {\r\n amount = typeof amount === \"string\" ? amount : amount.toString();\r\n amount = amount.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return \"$\" + amount;\r\n } else {\r\n return \"$0\";\r\n }\r\n };\r\n\r\n static numberWithCommas(number, emptyType = \"string\") {\r\n if (number) {\r\n let float = parseFloat(number);\r\n if (float && float % 1 !== 0) {\r\n number = parseFloat(number).toFixed(2);\r\n }\r\n return number.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n }\r\n if (emptyType === \"string\") {\r\n return \"\";\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n static validateEmail(email) {\r\n let emailTest = /^\\w+([.-]?\\w+)*@\\w+([.-]?\\w+)*(\\.\\w{2,3})+$/;\r\n return emailTest.test(email);\r\n }\r\n\r\n static getYearFromQueryParam(location) {\r\n if (location) {\r\n const search = location.search;\r\n const params = new URLSearchParams(search);\r\n let goalYear = params.get(\"year\") ? parseInt(params.get(\"year\")) : 2020;\r\n return goalYear < 2020 ? 2020 : goalYear;\r\n }\r\n }\r\n\r\n static getFromUrlQuery(location, key) {\r\n if (location) {\r\n const search = location.search;\r\n const params = new URLSearchParams(search);\r\n return params.get(key) ? params.get(key) : null;\r\n }\r\n return null;\r\n }\r\n\r\n static expandFullScreen() {\r\n let appElem = document.getElementById(\"root\");\r\n\r\n if (appElem.requestFullscreen) {\r\n appElem.requestFullscreen();\r\n } else if (appElem.webkitRequestFullscreen) {\r\n appElem.webkitRequestFullscreen();\r\n } else if (appElem.msRequestFullscreen) {\r\n appElem.msRequestFullscreen();\r\n }\r\n }\r\n\r\n static setItemToLocalStorage(key, value) {\r\n if ( value || value === false ) {\r\n if ( ( typeof value === 'object' ) || ( typeof value === 'array' ) ) {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } else {\r\n localStorage.setItem(key, value);\r\n }\r\n }\r\n }\r\n\r\n static setExpireTimeToLocalStorage(key, min) {\r\n const current = new Date();\r\n const timeFromNow = moment(current).add(min, \"m\").toDate();\r\n this.setItemToLocalStorage(key, timeFromNow);\r\n }\r\n\r\n static retrieveLocalStorageItem(key) {\r\n const item = localStorage.getItem(key);\r\n try {\r\n return JSON.parse(item);\r\n } catch (e) {\r\n return item;\r\n }\r\n }\r\n\r\n static loadUrlParams(location) {\r\n const params = this.queryParamsToObject(location);\r\n const localParams = this.retrieveLocalStorageItem(\"params\");\r\n if (location.pathname === \"/\") {\r\n if (params.communityID) {\r\n return params;\r\n } else if (localParams && localParams.communityID) {\r\n return localParams;\r\n }\r\n } else {\r\n if (params.communityID && params.sceneID) {\r\n return params;\r\n } else if (\r\n localParams &&\r\n localParams.communityID &&\r\n localParams.sceneID\r\n ) {\r\n return localParams;\r\n }\r\n }\r\n }\r\n\r\n static detectMobileOrientation() {\r\n return !ismobile()\r\n ? \"desktop\"\r\n : window.innerHeight > window.innerWidth\r\n ? \"portrait\"\r\n : \"landscape\";\r\n }\r\n\r\n static detectIOSChrome() {\r\n let userAgent = window.navigator.userAgent;\r\n\r\n return !userAgent.match(/CriOS/i) ? false : true;\r\n }\r\n\r\n static downloadJSON2CSV(items) {\r\n const replacer = (key, value) => (value === null ? \"\" : value);\r\n const header = Object.keys({ \"#\": \"\", ...items[0] });\r\n const csv = [\r\n header.join(\",\"), // header row first\r\n ...items.map((row, index) =>\r\n header\r\n .map((fieldName) =>\r\n JSON.stringify(\r\n fieldName === \"#\" ? index + 1 : row[fieldName],\r\n replacer\r\n )\r\n )\r\n .join(\",\")\r\n ),\r\n ].join(\"\\r\\n\");\r\n\r\n let blob = new Blob([csv]);\r\n\r\n let a = window.document.createElement(\"a\");\r\n a.href = window.URL.createObjectURL(blob, { type: \"text/plain\" });\r\n a.download = \"DesignerUserReport.csv\";\r\n document.body.appendChild(a);\r\n a.click(); // IE: \"Access is denied\"; see: https://connect.microsoft.com/IE/feedback/details/797361/ie-10-treats-blob-url-as-cross-origin-and-denies-access\r\n document.body.removeChild(a);\r\n }\r\n}\r\n\r\nexport default GeneralHelper;\r\n","import Amplify, { Auth, Storage } from \"aws-amplify\";\r\nimport AWSAppSyncClient, { AUTH_TYPE } from \"aws-appsync\";\r\nimport gql from \"graphql-tag\";\r\nimport GoogleAnalyticsHelper from \"reactSrc/helpers/GoogleAnalyticsHelper\";\r\nimport {gaFunction} from \"reactSrc/helpers/gaFunctions.ts\";\r\nclass AWSHelper {\r\n static client = new AWSHelper();\r\n appSyncClient = new AWSAppSyncClient({\r\n url: process.env.REACT_APP_APP_SYNC_URL,\r\n region: process.env.REACT_APP_AWS_REGION,\r\n auth: {\r\n type: AUTH_TYPE.API_KEY,\r\n apiKey: process.env.REACT_APP_APP_SYNC_API_KEY,\r\n },\r\n });\r\n cognitoUrl = process.env.REACT_APP_AWS_COGNITO_DOMAIN_URL;\r\n federatedConfig = {\r\n facebook_app_id: process.env.REACT_APP_FACEBOOK_APP_ID,\r\n google_client_id: process.env.REACT_APP_GOOGLE_APP_ID,\r\n amazon_client_id: process.env.REACT_APP_AMAZON_APP_ID,\r\n };\r\n\r\n getConfigureObj() {\r\n return Auth.configure();\r\n }\r\n\r\n static getFederatedConfig() {\r\n return this.client.federatedConfig;\r\n }\r\n\r\n static async appSyncQuery(query) {\r\n try {\r\n const response = await this.client.appSyncClient.query({\r\n query: gql(query),\r\n fetchPolicy: \"network-only\",\r\n });\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n }\r\n\r\n static async appSyncMutation(mutation) {\r\n try {\r\n const response = await this.client.appSyncClient.mutate({\r\n mutation: gql(mutation),\r\n });\r\n return response;\r\n } catch (e) {\r\n return e;\r\n }\r\n }\r\n\r\n static async getCurrentUser() {\r\n try {\r\n const res = await Auth.currentAuthenticatedUser();\r\n return res;\r\n } catch (e) {\r\n return e;\r\n }\r\n }\r\n\r\n static async signIn(provider) {\r\n try {\r\n await Auth.federatedSignIn({ provider });\r\n GoogleAnalyticsHelper.sendEvent(\"Menu\", \"Sign in Type\", provider);\r\n\r\n if ( gaFunction ){\r\n gaFunction.dsSendStandardEvent(\"Menu\", \"Sign in Type\", provider);\r\n } \r\n\r\n } catch (e) {\r\n return e;\r\n }\r\n }\r\n\r\n static async signOut() {\r\n try {\r\n await Auth.signOut();\r\n } catch (error) {\r\n console.log(\"error signing out: \", error);\r\n }\r\n }\r\n\r\n static configureCognito() {\r\n const path = window.location.pathname.split(\"&\")[0];\r\n\r\n Amplify.configure({\r\n aws_appsync_graphqlEndpoint: process.env.REACT_APP_APP_SYNC_URL,\r\n aws_appsync_region: process.env.REACT_APP_AWS_REGION,\r\n aws_appsync_authenticationType: \"AWS_IAM\",\r\n Auth: {\r\n // REQUIRED only for Federated Authentication - Amazon Cognito Identity Pool ID\r\n identityPoolId: process.env.REACT_APP_AWS_IDENTITY_POOL_ID,\r\n\r\n // REQUIRED - Amazon Cognito Region\r\n region: process.env.REACT_APP_AWS_REGION,\r\n\r\n // OPTIONAL - Amazon Cognito Federated Identity Pool Region\r\n // Required only if it's different from Amazon Cognito Region\r\n identityPoolRegion: \"us-west-1\",\r\n\r\n // OPTIONAL - Amazon Cognito User Pool ID\r\n userPoolId: process.env.REACT_APP_AWS_USER_POOL_ID,\r\n\r\n // OPTIONAL - Amazon Cognito Web Client ID (26-char alphanumeric string)\r\n userPoolWebClientId: process.env.REACT_APP_AWS_USER_POOL_APP_ID,\r\n\r\n // OPTIONAL - Enforce user authentication prior to accessing AWS resources or not\r\n mandatorySignIn: false,\r\n\r\n // OPTIONAL - Configuration for cookie storage\r\n // Note: if the secure flag is set to true, then the cookie transmission requires a secure protocol\r\n // cookieStorage: {\r\n // // REQUIRED - Cookie domain (only required if cookieStorage is provided)\r\n // domain: '.yourdomain.com',\r\n // // OPTIONAL - Cookie path\r\n // path: '/',\r\n // // OPTIONAL - Cookie expiration in days\r\n // expires: 365,\r\n // // OPTIONAL - See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite\r\n // sameSite: \"strict\" | \"lax\",\r\n // // OPTIONAL - Cookie secure flag\r\n // // Either true or false, indicating if the cookie transmission requires a secure protocol (https).\r\n // secure: true\r\n // },\r\n\r\n // OPTIONAL - customized storage object\r\n // storage: MyStorage,\r\n\r\n // OPTIONAL - Manually set the authentication flow type. Default is 'USER_SRP_AUTH'\r\n // authenticationFlowType: 'USER_PASSWORD_AUTH',\r\n\r\n // OPTIONAL - Manually set key value pairs that can be passed to Cognito Lambda Triggers\r\n // clientMetadata: { myCustomKey: 'myCustomValue' },\r\n\r\n // OPTIONAL - Hosted UI configuration\r\n //?client_id=78p6l7gv7qtmf9dms3lbr9slua&response_type=code&scope=aws.cognito.signin.user.admin+email+openid+phone+profile&redirect_uri=https://dev.focus360.com\r\n oauth: {\r\n domain: process.env.REACT_APP_AWS_COGNITO_DOMAIN_URL,\r\n scope: [\r\n \"phone\",\r\n \"email\",\r\n \"profile\",\r\n \"openid\",\r\n \"aws.cognito.signin.user.admin\",\r\n ],\r\n redirectSignIn: `${process.env.REACT_APP_DOMAIN}${path}`,\r\n redirectSignOut:\r\n path === \"/\"\r\n ? process.env.REACT_APP_DOMAIN\r\n : process.env.REACT_APP_DOMAIN + path,\r\n responseType: \"token\", // or 'token', note that REFRESH token will only be generated when the responseType is code\r\n },\r\n federationTarget: \"COGNITO_USER_POOLS\",\r\n },\r\n Storage: {\r\n bucket: \"focus360designer\",\r\n region: process.env.REACT_APP_AWS_REGION,\r\n },\r\n });\r\n Auth.configure(this.client.getConfigureObj().oauth);\r\n }\r\n\r\n static async storePresetImage(communityID, presetHash, compositorcanvas) {\r\n let blobData = await new Promise(function (resolve) {\r\n compositorcanvas.toBlob(resolve);\r\n });\r\n\r\n let result = await Storage.put(\r\n \"assets/\" + communityID + \"/designer/800/\" + presetHash + \".jpg\",\r\n blobData,\r\n {\r\n contentType: \"image/jpeg\",\r\n }\r\n );\r\n\r\n return result;\r\n }\r\n}\r\n\r\nexport default AWSHelper;\r\n","class GoogleAnalyticsHelper {\r\n static client = new GoogleAnalyticsHelper();\r\n hitString = \"https://www.google-analytics.com/collect?v=1&tid=\";\r\n sendQueueItems = [];\r\n\r\n initBasicTracking(GAproperty) {\r\n this.hitString += GAproperty;\r\n this.hitString += \"&cid=\" + this.uuidv4();\r\n this.sendQueueItems = [];\r\n this.trackerIsActive = true;\r\n\r\n setInterval(() => {\r\n this.onTimerCheckQue();\r\n }, 250);\r\n }\r\n\r\n initClientTracking(\r\n GAPropertyID,\r\n focusClientID,\r\n builderName,\r\n builderDivision,\r\n projectName,\r\n CommunityID,\r\n sourceName\r\n ) {\r\n let ClientUDID = this.uuidv4();\r\n //where is GAproperty coming from?\r\n this.hitString += GAPropertyID;\r\n this.hitString += encodeURI(\r\n \"&cid=\" +\r\n ClientUDID +\r\n \"&cd1=\" +\r\n focusClientID +\r\n \"&cd2=\" +\r\n builderName +\r\n \"&cd3=\" +\r\n builderDivision +\r\n \"&cd4=\" +\r\n projectName +\r\n \"&cd5=\" +\r\n CommunityID +\r\n \"&cd7=\" +\r\n sourceName\r\n );\r\n this.sendQueueItems = [];\r\n setInterval(() => {\r\n this.onTimerCheckQue();\r\n }, 250);\r\n }\r\n\r\n uuidv4() {\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(\r\n /[xy]/g,\r\n function (c) {\r\n var r = (Math.random() * 16) | 0,\r\n v = c === \"x\" ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n }\r\n );\r\n }\r\n\r\n onTimerCheckQue() {\r\n if (this.sendQueueItems.length > 0) {\r\n if ( this.trackerIsActive ) {\r\n fetch(this.hitString + this.sendQueueItems[0])\r\n .then((response) => {\r\n if (response.status.toString() !== \"200\") {\r\n //console.log(response);\r\n }\r\n })\r\n .catch((error) => {\r\n /* if google-analytics fails, likly ad blocker, attempt proxy url */\r\n this.hitString = this.hitString.replace(\r\n \"www.google-analytics.com\",\r\n \"analytics.focus360.com\"\r\n );\r\n });\r\n }\r\n //console.log(this.sendQueueItems[0]);\r\n this.sendQueueItems.shift();\r\n }\r\n }\r\n\r\n static setLoggedInUserID(userID) {\r\n this.addCustomDimension(9, userID);\r\n }\r\n\r\n static setUserSub( userID ) {\r\n this.addCustomDimension(10, userID);\r\n }\r\n\r\n static disableTracking(){\r\n this.client.trackerIsActive = false;\r\n }\r\n\r\n static enableTracking(){\r\n this.client.trackerIsActive = true;\r\n }\r\n\r\n static addCustomDimension(index, value) {\r\n let cdStr = \"&cd\" + index.toString();\r\n\r\n /* if index is found in current string remove */\r\n if (this.client.hitString.indexOf(cdStr) !== -1) {\r\n let spHitStr = this.client.hitString.split(\"&\");\r\n let spIndex = -1;\r\n let fStr = \"cd\" + index.toString() + \"=\";\r\n for (let i = 0; i < spHitStr.length; ++i) {\r\n if (spHitStr[i].indexOf(fStr) === 0) {\r\n spIndex = i;\r\n }\r\n }\r\n if (spIndex !== -1) {\r\n spHitStr.splice(spIndex, 1);\r\n }\r\n this.client.hitString = spHitStr.join(\"&\");\r\n }\r\n\r\n this.client.hitString += encodeURI(cdStr + \"=\" + value);\r\n }\r\n\r\n static startSession() {\r\n this.client.sendQueueItems.push(\r\n \"&t=event&ec=App&ea=Start%20Session&sc=start\"\r\n );\r\n }\r\n\r\n static endSession() {\r\n this.client.sendQueueItems.push(\"&t=event&ec=App&ea=End%20Session&&sc=end\");\r\n }\r\n\r\n static sendPageview(pageURL) {\r\n this.client.sendQueueItems.push(\"&t=pageview&dl=\" + pageURL);\r\n }\r\n\r\n static sendEvent(eventCategory, eventAction, eventLabel, eventValue = 0) {\r\n this.client.sendQueueItems.push(\r\n encodeURI(\r\n \"&t=event&ec=\" +\r\n eventCategory +\r\n \"&ea=\" +\r\n eventAction +\r\n \"&el=\" +\r\n eventLabel +\r\n \"&ev=\" +\r\n eventValue\r\n )\r\n );\r\n }\r\n\r\n static sendTiming(timeCategory, timeAction, timeLabel, timeValue = 0) {\r\n this.client.sendQueueItems.push(\r\n encodeURI(\r\n \"&t=timing&utc=\" +\r\n timeCategory +\r\n \"&utv=\" +\r\n timeAction +\r\n \"&utl=\" +\r\n timeLabel +\r\n \"&utt=\" +\r\n timeValue\r\n )\r\n );\r\n }\r\n}\r\n\r\nexport default GoogleAnalyticsHelper;\r\n","import { connect } from \"react-redux\";\r\n// import { enqueueSnackbar } from \"reactSrc/store/actions/notificationActions\";\r\n// import { toggleLoader } from \"reactSrc/store/actions/loaderActions\"\r\n// import { getUserObj } from \"reactSrc/store/actions/authActions\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport { setUserObj, signOutUser } from \"reactSrc/store/actions/authActions\";\r\n\r\nconst globalActions = { setUserObj, signOutUser };\r\n\r\nfunction getGlobalState(state) {\r\n return { user: state.auth.user };\r\n // return {}\r\n}\r\n\r\nfunction focusConnect({\r\n component: component = () => ({}),\r\n mapState: mapState = (state) => ({}),\r\n mapActions: mapActions = {},\r\n styles: styles = (theme) => ({}),\r\n}) {\r\n return connect(\r\n (state) => ({ ...mapState(state), ...getGlobalState(state) }),\r\n { ...mapActions, ...globalActions },\r\n (stateProps, dispatchProps, ownProps) => ({\r\n ...ownProps,\r\n ...stateProps,\r\n ...dispatchProps,\r\n }),\r\n { forwardRef: true }\r\n )(withStyles(styles)(component));\r\n}\r\n\r\nexport default focusConnect;\r\n","export const getCommunityCollection = function (collectionID) {\r\n return `\r\n query getCommunityCollection {\r\n listDesignerSceneCollections(filter: {id: {eq: \"${collectionID}\"}}) {\r\n items {\r\n\t clientIDNumber\r\n\t clientDivision\r\n\t clientFont\r\n\t clientLogoPath\r\n collectionID\r\n\t communityID\r\n\t communityName\r\n\t collectionTagline\r\n\t collectionTitle\r\n disclaimer\r\n\t collectionBackgroundPathToImage\r\n filters {\r\n enabled\r\n label\r\n uid\r\n values {\r\n uid\r\n value\r\n }\r\n }\r\n id\r\n projectLogo\r\n\t enableTutorial\r\n scenes {\r\n communityID\r\n enabled\r\n id\r\n label\r\n navigateToCollection\r\n collectionUrl\r\n extraJSON\r\n presets {\r\n pathToImages\r\n presetID\r\n presetLabel\r\n }\r\n\t\trelatedCollectionID\r\n\t\tcollectionDropdownLabel\r\n }\r\n }\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const getSceneData = function (id, sceneId) {\r\n return `\r\nquery GetSceneData {\r\n getDesignerScene(id: \"${id}\", sceneID: \"${sceneId}\") {\r\n appOptionHierarchy {\r\n cameraID\r\n optionRollover\r\n geoTypes {\r\n enabled\r\n geoTypeID\r\n geoTypeLabel\r\n includeLabelInInfo\r\n materials {\r\n enabled\r\n filters {\r\n filterUID\r\n valueUID\r\n }\r\n materialID\r\n menuOrder\r\n price\r\n productID\r\n swatchLabel\r\n }\r\n menuOrder\r\n }\r\n layer\r\n menuOrder\r\n optionID\r\n optionIcon\r\n optionLabel\r\n\t optionRollover\r\n }\r\n cameraDynamicSwitching\r\n cameras {\r\n cameraID\r\n cameraIcon\r\n cameraLabel\r\n centerX\r\n centerY\r\n\t printIndex\r\n }\r\n communityID\r\n filters {\r\n label\r\n uid\r\n values {\r\n uid\r\n value\r\n }\r\n }\r\n id\r\n menuOpacity\r\n showOptionsNavigationBar\r\n\t planCode\r\n presets\r\n sceneID\r\n sceneSubTitle\r\n sceneTitle\r\n clientIDNumber\r\n\tclientDivision\r\n\tclientLogoPath\r\n\tclientFont\r\n originalURL\r\n }\r\n}\r\n`;\r\n};\r\n\r\nexport const saveUserScene = function (sceneData) {\r\n return `\r\n mutation saveUserScene {\r\n createDesignerUserSaves(input:\r\n {\r\n clientIDNumber: \"${sceneData.clientID}\",\r\n\t collectionID: \"${sceneData.collectionID}\",\r\n communityID: \"${sceneData.communityID}\",\r\n createdAt: \"\",\r\n id: \"\",\r\n presetID: \"\",\r\n pathToImages: \"${sceneData.image}\",\r\n presetLabel: \"${sceneData.presetLabel}\",\r\n selections: \"${sceneData.selections}\"\r\n sceneID: \"${sceneData.sceneID}\",\r\n sceneSubTitle: \"${sceneData.sceneSubTitle}\",\r\n sceneTitle: \"${sceneData.sceneTitle}\",\r\n userID: \"${sceneData.userID}\"\r\n })\r\n {\r\n clientIDNumber\r\n\tcollectionID\r\n communityID\r\n createdAt\r\n id\r\n pathToImages\r\n presetID\r\n presetLabel\r\n selections \r\n sceneID\r\n sceneSubTitle\r\n sceneTitle\r\n userID\r\n }\r\n }\r\n `;\r\n};\r\n\r\nexport const getUserSaves = function (userID, communityID, sceneID) {\r\n return `\r\n query getUserSaves {\r\n listDesignerUserSaves(filter: {userID: {eq: \"${userID}\"}, communityID: {eq: \"${communityID}\"}}) {\r\n items {\r\n clientIDNumber\r\n\t collectionID\r\n communityID\r\n id\r\n userID\r\n pathToImages\r\n presetID\r\n presetLabel\r\n selections\r\n sceneID\r\n sceneSubTitle\r\n sceneTitle\r\n }\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const getUserPreset = function (id, userID) {\r\n return `\r\n query getUserPreset {\r\n getDesignerUserSaves(id: \"${id}\", userID: \"${userID}\") {\r\n id\r\n clientIDNumber\r\n\tcollectionID\r\n communityID\r\n pathToImages\r\n presetID\r\n presetLabel\r\n sceneID\r\n sceneSubTitle\r\n sceneTitle\r\n selections\r\n userID\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const getUserFavoriteMaterials = function (userID, communityID) {\r\n return `\r\n query getUserFavoriteMaterials {\r\n listDesignerUserFavoriteMaterials(filter: \r\n {\r\n userID: {eq: \"${userID}\"}, \r\n communityID: {eq: \"${communityID}\"}\r\n })\r\n {\r\n items {\r\n communityID\r\n id\r\n materialID\r\n userID\r\n }\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const deleteUserSave = function (id, userID) {\r\n return `\r\n mutation deleteUserSave {\r\n deleteDesignerUserSaves(input: \r\n {\r\n id: \"${id}\", \r\n userID: \"${userID}\"\r\n }) {\r\n clientIDNumber\r\n\tcollectionID\r\n communityID\r\n id\r\n pathToImages\r\n presetID\r\n presetLabel\r\n selections\r\n sceneID\r\n sceneSubTitle\r\n sceneTitle\r\n userID\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const favoriteUserMaterial = function (communityID, materialID, userID) {\r\n return `\r\n mutation userFavoriteMaterial {\r\n createDesignerUserFavoriteMaterials(\r\n input:\r\n {\r\n communityID: \"${communityID}\",\r\n id: \"\",\r\n materialID: \"${materialID}\",\r\n userID: \"${userID}\"\r\n })\r\n {\r\n communityID\r\n id\r\n materialID\r\n userID\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const deleteFavoriteUserMaterial = function (id, userID) {\r\n return `\r\n mutation deleteFavoriteUserMaterial {\r\n deleteDesignerUserFavoriteMaterials(input:\r\n {\r\n id: \"${id}\",\r\n userID: \"${userID}\"\r\n })\r\n {\r\n id\r\n } \r\n}\r\n `;\r\n};\r\n\r\nexport const trackUserSelections = function (\r\n userID,\r\n email = \"\",\r\n communityID = \"\",\r\n sceneID = \"\",\r\n clientIDNumber = \"\",\r\n clientDivision = \"\",\r\n communityName = \"\",\r\n username = \"\",\r\n name = \"\"\r\n) {\r\n return `\r\n mutation trackUserSelections {\r\n createUserAccessTracking(input: {\r\n appID: \"NEXT Designer\", \r\n communityID: \"${communityID}\", \r\n\tcommunityName: \"${communityName}\",\r\n\tclientIDNumber: \"${clientIDNumber}\",\r\n\tclientDivision: \"${clientDivision}\",\r\n sceneID: \"${sceneID}\", \r\n timestamp: \"\", \r\n userID: \"${userID}\",\r\n\tusername: \"${username}\",\r\n\tname: \"${name}\",\r\n\temail: \"${email}\"\r\n }) {\r\n appID\r\n communityID\r\n sceneID\r\n timestamp\r\n userID\r\n\tusername\r\n\tname\r\n\temail\r\n }\r\n}\r\n `;\r\n};\r\n\r\nexport const getUserTrackingReport = function (\r\n clientIDNumber = \"\",\r\n clientDivision = \"\"\r\n) {\r\n return `\r\n query getUserTrackingReport {\r\n listUserAccessTrackings(filter: {clientIDNumber: {eq: \"${clientIDNumber}\"}, clientDivision: {eq: \"${clientDivision}\"}}) {\r\n items {\r\n\t clientIDNumber\r\n\t clientDivision\r\n appID\r\n communityID\r\n communityName\r\n email\r\n name\r\n sceneID\r\n timestamp\r\n userID\r\n }\r\n }\r\n}\r\n`;\r\n};\r\n\r\nexport const setUserTermsAcceptance = function (userID) {\r\n return `\r\nmutation setUserTermsAcceptance {\r\n createUserTermsAcceptance(input: {\r\n\tacceptedTerms: true, \r\n\taccessTimestamp: \"\", \r\n\tappID: \"NEXT Designer\", \r\n\tuserID: \"${userID}\"\r\n }) {\r\n acceptedTerms\r\n accessTimestamp\r\n appID\r\n userID\r\n }\r\n}\r\n`;\r\n};\r\n\r\nexport const getUserTermsAcceptance = function (userID) {\r\n return `\r\nquery getUserTermsAcceptance {\r\n getUserTermsAcceptance(appID: \"NEXT Designer\", userID: \"${userID}\") {\r\n acceptedTerms\r\n accessTimestamp\r\n appID\r\n userID\r\n }\r\n}\r\n`;\r\n};\r\n","class gaFunctions {\r\n debugMode: 0 | 1;\r\n param: IParams;\r\n eventParams: IEventParams;\r\n sendQueueItemsURL: string[];\r\n measurementId: string;\r\n lastTime: number;\r\n firstClickfunction:any;\r\n hasBeenInitialized: boolean;\r\n timers: {\r\n print: number;\r\n elevationDialog: number;\r\n singleElevation: {\r\n name: string;\r\n time: number;\r\n };\r\n interiorDialog: number;\r\n singleInterior: {\r\n name: string;\r\n time: number;\r\n };\r\n notes: number;\r\n measure: number;\r\n customFurniture: number;\r\n customFurnitureRoom: {\r\n name: string;\r\n time: number;\r\n };\r\n compareDialog: number;\r\n comparePlans: {\r\n plan1: string;\r\n plan2: string;\r\n time: number;\r\n };\r\n viewFloorPlan: {\r\n name: string;\r\n time: number;\r\n };\r\n };\r\n\r\n constructor() {\r\n this.debugMode = process.env.NODE_ENV === 'development' ? 1 : 0;\r\n this.hasBeenInitialized = false;\r\n this.lastTime = 0;\r\n\r\n this.timers = {\r\n print: 0,\r\n elevationDialog: 0,\r\n singleElevation: {\r\n name: '',\r\n time: 0,\r\n },\r\n interiorDialog: 0,\r\n singleInterior: {\r\n name: '',\r\n time: 0,\r\n },\r\n notes: 0,\r\n measure: 0,\r\n customFurniture: 0,\r\n customFurnitureRoom: {\r\n name: '',\r\n time: 0,\r\n },\r\n compareDialog: 0,\r\n comparePlans: {\r\n plan1: '',\r\n plan2: '',\r\n time: 0,\r\n },\r\n viewFloorPlan: {\r\n name: '',\r\n time: 0,\r\n },\r\n };\r\n \r\n this.measurementId = 'G-WBTE88TFQ6';\r\n\r\n this.param = {\r\n /* end point for GA, with credits */\r\n hitString: 'https://www.google-analytics.com/mp/collect?',\r\n /* focus 360 user id */\r\n userId: '',\r\n sessionId: '',\r\n };\r\n\r\n this.eventParams = {\r\n /* non-required, focus user id */\r\n user_id: '',\r\n /* GA required, typically uuidv4 */\r\n client_id: '',\r\n /* GA required */\r\n non_personalized_ads: false,\r\n /* ga user properties, used to store persistent info such as Custom Properties, sent with each hit */\r\n user_properties: {},\r\n /* debug var */\r\n };\r\n\r\n this.sendQueueItemsURL = [];\r\n }\r\n\r\n private uuidv4(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n const r = (Math.random() * 16) | 0,\r\n v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n }\r\n\r\n /* client Id is a google tracking id, saved in the users browser */\r\n private setClientId(newClientId: string) {\r\n this.eventParams.client_id = newClientId;\r\n localStorage.setItem('f360ga4id', newClientId);\r\n }\r\n\r\n private onTimerCheckQue() {\r\n if (this.sendQueueItemsURL.length > 0) {\r\n fetch(this.sendQueueItemsURL[0], { method: 'POST' });\r\n this.sendQueueItemsURL.shift();\r\n }\r\n }\r\n\r\n public newSession() {\r\n this.param.sessionId = Math.floor(new Date().getTime() / 1000).toString();\r\n }\r\n\r\n public initBasicTracking(app_id: AppID, app_env: string) {\r\n \r\n /* set init flag */\r\n if ( this.param.sessionId === ''){\r\n this.newSession();\r\n }\r\n\r\n this.hasBeenInitialized = true\r\n /* append api secret to the URL, this determines what account it is tracked to */\r\n this.param.hitString += 'measurement_id=' + this.measurementId;\r\n\r\n if ( this.param.sessionId === '' ) {\r\n this.newSession();\r\n }\r\n\r\n /* init user properties object */\r\n this.eventParams.user_properties = {\r\n /* set tracking code version */\r\n gav: '2.2',\r\n /* set app_id */\r\n app_id,\r\n /* set app_env */\r\n app_env:app_env,\r\n };\r\n\r\n /* check local storage for previous focus ga4 tracking */\r\n const client_id = localStorage.getItem('f360ga4id') ?? this.uuidv4();\r\n\r\n /* set this client id on data object */\r\n this.eventParams.client_id = client_id;\r\n\r\n /* initially set user ID to client_id, unless a \"login\" happens */\r\n this.setClientId(client_id);\r\n\r\n /* init queue array */\r\n this.sendQueueItemsURL = [];\r\n\r\n /* use set interval to send hits from queue */\r\n setInterval(() => {\r\n this.onTimerCheckQue();\r\n }, 200);\r\n\r\n /* set lastTime starting time for time tracking */\r\n this.lastTime = Date.now();\r\n\r\n /* record first click. Many sessions may not have a first click, is shows real engagement */\r\n this.firstClickfunction = document.addEventListener('click', this.firstClick);\r\n\r\n /* add window error tracking */\r\n // window.addEventListener('error', this.onErrorReport);\r\n }\r\n\r\n // public onErrorReport(e: ErrorEvent) {\r\n // gaFunction.sendEvent('window_error', {\r\n // module_id: 'na',\r\n // error_message: e.message,\r\n // error_file: e.filename,\r\n // error_line: e.lineno,\r\n // error_error: e.error,\r\n // });\r\n // }\r\n\r\n public setClientInformation(focusClientId: string, clientName: string, clientDivision: string) {\r\n /* ensure undefined or null is never set */\r\n if (focusClientId) {\r\n this.eventParams.user_properties.client_id = focusClientId;\r\n }\r\n if (clientName) {\r\n this.eventParams.user_properties.client_name = clientName;\r\n }\r\n if (clientDivision) {\r\n this.eventParams.user_properties.client_division = clientDivision;\r\n }\r\n }\r\n\r\n public setCommunityInformation(communityId: string, communityName: string) {\r\n /* ensure \"undefined\" or null is never set */\r\n if (communityId) {\r\n this.eventParams.user_properties.community_id = communityId;\r\n }\r\n if (communityName) {\r\n this.eventParams.user_properties.community_name = communityName;\r\n }\r\n }\r\n\r\n // public resetUser() {\r\n // this.setClientId(this.uuidv4());\r\n // this.newSession();\r\n // }\r\n\r\n public newUser() {\r\n this.setClientId(this.uuidv4());\r\n this.newSession();\r\n }\r\n\r\n /* user Id is a focus user identifier. should be from log in */\r\n // public setUserId(newUserId: string, method: string = 'na') {\r\n // this.eventParams.user_id = newUserId;\r\n // this.sendEvent('login', { method: method });\r\n // }\r\n\r\n // public clearUserId(newUserId: string) {\r\n // this.eventParams.user_id = newUserId;\r\n // this.sendEvent('logout', {});\r\n // }\r\n\r\n public setAppId(app_id: AppID) {\r\n this.eventParams.user_properties.app_id = app_id;\r\n }\r\n\r\n //******************** EVENTS *************************/\r\n public firstClick(e: Event) {\r\n document.removeEventListener('click', this.firstClickfunction );\r\n (e.currentTarget as Document).removeEventListener('click', gaFunction.firstClick);\r\n gaFunction.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action: 'First Click' ,\r\n label:'' \r\n });\r\n }\r\n \r\n public dsViewDesignerScene( planName:string ){\r\n this.eventParams.user_properties.plan_name = planName;\r\n\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action:\"Open Scene\",\r\n label: planName\r\n });\r\n this.sendPageview(planName);\r\n }\r\n\r\n public dsSceneOpenedFromEmail( planName:string ){\r\n this.eventParams.user_properties.plan_name = planName;\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action:\"Scene opened from email link\",\r\n label: planName\r\n });\r\n }\r\n\r\n public dsViewDesignerSelector( planName:string ){\r\n this.eventParams.user_properties.plan_name = planName;\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action:\"View Selector Page\",\r\n label: planName\r\n });\r\n }\r\n\r\n public dsSendStandardEvent( Cat:string, Action:string, Label:string ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:Cat,\r\n action:Action,\r\n label:Label\r\n });\r\n }\r\n \r\n public dsSendStandardEventAndValue( Cat:string, Action:string, Label:string, Value:number ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:Cat,\r\n action:Action,\r\n label:Label,\r\n value:Value\r\n });\r\n }\r\n public dsSelectCamera( CameraName:string ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action:\"Camera by Sidebar\",\r\n label: CameraName\r\n });\r\n }\r\n\r\n public dsScenePrint( planName:string ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action:\"Scene opened from email link\",\r\n label: planName\r\n });\r\n }\r\n public dsRecordSelection( cat:string, action:string, label:string, value:number ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:cat,\r\n action:action,\r\n label:label,\r\n value:value\r\n });\r\n }\r\n\r\n public dsOpenOptionBar( ){\r\n this.sendEvent('designer_event', {\r\n feature:'designer',\r\n module_id: 'ds',\r\n category:'App',\r\n action: 'Option Bar',\r\n label: 'Open'\r\n });\r\n }\r\n \r\n\r\n public dsSetSceneTitle( sceneTitle:string ){\r\n this.eventParams.user_properties.scene_title = sceneTitle;\r\n }\r\n \r\n /*************************** FLOOR PLAN *****************************/\r\n // VIEW FLOOR PLAN\r\n public fpViewFloorPlan(planName: string) {\r\n this.eventParams.user_properties.plan_name = planName;\r\n this.sendEvent('view_floor_plan', {\r\n module_id: 'fp',\r\n label: 'View Floor Plan',\r\n feature: 'floor_plan',\r\n value: planName,\r\n });\r\n\r\n this.timers.viewFloorPlan = {\r\n name: planName,\r\n time: Date.now(),\r\n };\r\n }\r\n\r\n // FLIP\r\n public fpFlipPlan() {\r\n this.sendEvent('flip', { module_id: 'fp', label: 'Flip Plan', feature: 'flip' });\r\n }\r\n\r\n // FIND ON SITE MAP\r\n public fpFindOnSiteMap(planName: string) {\r\n this.sendEvent('find_on_site_map', {\r\n module_id: 'fp',\r\n label: 'Find Floor Plan On Site Map',\r\n feature: 'find_on_site_map',\r\n value: planName,\r\n });\r\n }\r\n\r\n // FLOORS\r\n public fpViewFloor(selectedFloor: string) {\r\n this.sendEvent('view_floor', {\r\n module_id: 'fp',\r\n label: 'View Floor',\r\n feature: 'floor',\r\n value: selectedFloor === 'All' ? `All Floors` : `Floor ${selectedFloor}`,\r\n });\r\n }\r\n\r\n // INTERIORS\r\n public fpOpenInteriorDialog() {\r\n this.timers.interiorDialog = Date.now();\r\n this.sendEvent('interior_dialog_open', {\r\n module_id: 'fp',\r\n label: 'Open Interior Dialog',\r\n feature: 'interior',\r\n });\r\n }\r\n\r\n public fpViewInterior(interiorName: string, isFirst: boolean) {\r\n this.sendEvent('view_interior', {\r\n module_id: 'fp',\r\n label: 'View Interior',\r\n feature: 'interior',\r\n value: interiorName,\r\n });\r\n\r\n if (isFirst) {\r\n this.sendEvent('view_interior_first', {\r\n module_id: 'fp',\r\n label: 'First Interior View',\r\n feature: 'interior',\r\n value: interiorName,\r\n });\r\n }\r\n\r\n if (this.timers.singleInterior.time !== 0) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.singleInterior.time);\r\n this.sendEvent('view_interior_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Single Interior',\r\n feature: 'interior',\r\n value: this.timers.singleInterior.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.timers.singleInterior = {\r\n name: interiorName,\r\n time: Date.now(),\r\n };\r\n }\r\n\r\n public fpCloseInteriorDialog() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.interiorDialog);\r\n\r\n this.sendEvent('interior_dialog_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Interior Dialog',\r\n feature: 'interior',\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n if (this.timers.singleInterior.time !== 0) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.singleInterior.time);\r\n this.sendEvent('view_interior_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Single Interior',\r\n feature: 'interior',\r\n value: this.timers.singleInterior.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.timers.singleInterior = {\r\n name: '',\r\n time: 0,\r\n };\r\n }\r\n\r\n // public fpOpenMPVRDialog() {\r\n // this.dialogTimer = Date.now();\r\n // }\r\n // public fpCloseMPVRDialog() {\r\n // this.sendTiming('dialog', 'Viewing Multipoint VR', Date.now() - this.dialogTimer);\r\n // }\r\n // public fpOpenPivotVRDialog() {\r\n // this.dialogTimer = Date.now();\r\n // }\r\n // public fpClosePivotVRDialog() {\r\n // this.sendTiming('dialog', 'Viewing Pivot VR', Date.now() - this.dialogTimer);\r\n // }\r\n // public fpOpenLiveFlexDialog() {\r\n // this.dialogTimer = Date.now();\r\n // }\r\n // public fpCloseLiveFlexDialog() {\r\n // this_close.sendTiming('dialog', 'Viewing Live Flex', Date.now() - this.dialogTimer);\r\n // }\r\n\r\n // NOTES\r\n public fpNotesOpen() {\r\n this.timers.notes = Date.now();\r\n this.sendEvent('notes_open', {\r\n module_id: 'fp',\r\n label: 'Open Notes Editor',\r\n feature: 'notes',\r\n });\r\n }\r\n\r\n public fpNotesClose() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.notes);\r\n this.sendEvent('notes_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Notes Editor',\r\n feature: 'notes',\r\n time_format,\r\n time_ms,\r\n });\r\n this.timers.notes = 0;\r\n }\r\n\r\n public fpNotesAdd() {\r\n this.sendEvent('notes_add', {\r\n module_id: 'fp',\r\n label: 'Add Note',\r\n feature: 'notes',\r\n });\r\n }\r\n\r\n public fpNotesDelete() {\r\n this.sendEvent('notes_delete', {\r\n module_id: 'fp',\r\n label: 'Delete Note',\r\n feature: 'notes',\r\n });\r\n }\r\n\r\n // OPTIONS\r\n public fpSelectOption(optionName: string) {\r\n this.sendEvent('select_option', {\r\n module_id: 'fp',\r\n label: 'Select Option',\r\n feature: 'option',\r\n value: optionName,\r\n });\r\n }\r\n\r\n // LABELS\r\n public fpLabels(show: boolean) {\r\n if (show) {\r\n this.sendEvent('show_labels', {\r\n module_id: 'fp',\r\n label: 'Show Room Labels',\r\n feature: 'labels',\r\n });\r\n } else {\r\n this.sendEvent('hide_labels', {\r\n module_id: 'fp',\r\n label: 'Hide Room Labels',\r\n feature: 'labels',\r\n });\r\n }\r\n }\r\n\r\n // FURNITURE\r\n public fpAutoFill(room: string) {\r\n this.sendEvent('auto_fill_furn', {\r\n module_id: 'fp',\r\n label: 'Auto Fill Furniture',\r\n feature: 'furniture',\r\n value: room,\r\n });\r\n }\r\n public fpCustomFurnitureStart() {\r\n this.timers.customFurniture = Date.now();\r\n this.sendEvent('custom_furn_start', {\r\n module_id: 'fp',\r\n label: 'Start Custom Furniture',\r\n feature: 'furniture',\r\n });\r\n }\r\n public fpCustomFurnitureSelectRoom(room: string) {\r\n if (this.timers.customFurnitureRoom.name && this.timers.customFurnitureRoom.time) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.customFurnitureRoom.time);\r\n\r\n this.sendEvent('custom_furn_room_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Custom Furniture Room',\r\n feature: 'furniture',\r\n value: this.timers.customFurnitureRoom.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.sendEvent('custom_furn_select_room', {\r\n module_id: 'fp',\r\n label: 'Select Room for Custom Furniture',\r\n feature: 'furniture',\r\n value: room,\r\n });\r\n\r\n this.timers.customFurnitureRoom = {\r\n name: room,\r\n time: Date.now(),\r\n };\r\n }\r\n public fpPlaceFurniture() {\r\n this.sendEvent('place_furniture', {\r\n module_id: 'fp',\r\n label: 'Place Furniture',\r\n feature: 'furniture',\r\n });\r\n }\r\n public fpCustomFurnitureEnd() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.customFurniture);\r\n // send custom furniture time event and reset timer\r\n this.sendEvent('custom_furn_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Custom Furniture',\r\n feature: 'furniture',\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n this.timers.customFurniture = 0;\r\n\r\n // send custom furniture room time event and reset timer\r\n if (this.timers.customFurnitureRoom.name && this.timers.customFurnitureRoom.time) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.customFurnitureRoom.time);\r\n\r\n this.sendEvent('custom_furn_room_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Custom Furniture Room',\r\n feature: 'furniture',\r\n value: this.timers.customFurnitureRoom.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n this.timers.customFurnitureRoom = {\r\n name: '',\r\n time: 0,\r\n };\r\n }\r\n\r\n // MEASURE\r\n public fpMeasureStart() {\r\n this.timers.measure = Date.now();\r\n this.sendEvent('measure_start', {\r\n module_id: 'fp',\r\n label: 'Start Measuring',\r\n feature: 'measure',\r\n });\r\n }\r\n public fpMeasureEnd() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.measure);\r\n\r\n this.sendEvent('measure_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent Measuring',\r\n feature: 'measure',\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n this.timers.measure = 0;\r\n }\r\n\r\n // COMPARE\r\n public fpOpenCompareDialog() {\r\n this.timers.compareDialog = Date.now();\r\n this.sendEvent('compare_dialog_open', {\r\n module_id: 'fp',\r\n label: 'Open Compare Dialog',\r\n feature: 'compare',\r\n });\r\n }\r\n public fpCloseCompareDialog() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.compareDialog);\r\n // send compare dialog time event and reset timer\r\n this.sendEvent('compare_dialog_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent On Compare Dialog',\r\n feature: 'compare',\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n this.timers.compareDialog = 0;\r\n\r\n // send compare room time event and reset timer\r\n if (\r\n this.timers.comparePlans.plan1 &&\r\n this.timers.comparePlans.plan2 &&\r\n this.timers.comparePlans.time\r\n ) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.comparePlans.time);\r\n\r\n this.sendEvent('compare_plans_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent Comparing Plans',\r\n feature: 'compare',\r\n value: this.timers.comparePlans.plan1,\r\n event_plan_name: this.timers.comparePlans.plan2,\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n this.timers.comparePlans = {\r\n plan1: '',\r\n plan2: '',\r\n time: 0,\r\n };\r\n }\r\n }\r\n public fpComparePlans(plan1: string, plan2: string) {\r\n if (\r\n this.timers.comparePlans.plan1 &&\r\n this.timers.comparePlans.plan2 &&\r\n this.timers.comparePlans.time\r\n ) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.comparePlans.time);\r\n\r\n this.sendEvent('compare_plans_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent Comparing Plans',\r\n feature: 'compare',\r\n value: this.timers.comparePlans.plan1,\r\n event_plan_name: this.timers.comparePlans.plan2,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.timers.comparePlans = {\r\n plan1,\r\n plan2,\r\n time: Date.now(),\r\n };\r\n this.sendEvent('compare_plans', {\r\n module_id: 'fp',\r\n label: 'Compare Plans',\r\n feature: 'compare',\r\n value: plan1,\r\n event_plan_name: plan2,\r\n });\r\n }\r\n\r\n // VIEW ELEVATION ON FP\r\n public fpViewElevationOnFloorPlan(elevationStyle: string) {\r\n this.sendEvent('view_elevation_on_plan', {\r\n module_id: 'fp',\r\n label: 'View Elevation On Floor Plan',\r\n feature: 'elevation',\r\n value: elevationStyle,\r\n });\r\n }\r\n\r\n public fpViewFloorPlanTime() {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.viewFloorPlan.time);\r\n\r\n this.sendEvent('view_floor_plan_time', {\r\n module_id: 'fp',\r\n label: 'Time Spent Viewing Floor Plan',\r\n feature: 'floor_plan',\r\n value: this.timers.viewFloorPlan.name,\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n this.timers.viewFloorPlan = {\r\n name: '',\r\n time: 0,\r\n };\r\n }\r\n\r\n /*************************** SITE MAP *****************************/\r\n public spSelectLot(lotTitle: string) {\r\n this.sendEvent('select_lot', {\r\n module_id: 'sp',\r\n feature: 'lot',\r\n label: 'Select Lot',\r\n value: lotTitle,\r\n });\r\n }\r\n\r\n public spSelectPlanFromLot(lotTitle: string, planName: string, elevationName: string) {\r\n this.eventParams.user_properties.plan_name = planName;\r\n this.sendEvent('select_elevation_from_lot', {\r\n module_id: 'sp',\r\n label: 'Select Elevation From Lot',\r\n feature: 'lot',\r\n value: elevationName,\r\n event_plan_name: planName,\r\n lot_title: lotTitle,\r\n });\r\n }\r\n\r\n public spShowDetails() {\r\n this.sendEvent('show_details', { module_id: 'sp', label: 'Show Details', feature: 'details' });\r\n }\r\n public spShowDimensions() {\r\n this.sendEvent('show_dimensions', {\r\n module_id: 'sp',\r\n label: 'Show Dimensions',\r\n feature: 'dimensions',\r\n });\r\n }\r\n\r\n public spTerrain(show: boolean) {\r\n this.sendEvent(show ? 'show_terrain' : 'hide_terrain', {\r\n module_id: 'sp',\r\n label: show ? 'Show Terrain' : 'Hide Terrain',\r\n feature: 'terrain',\r\n });\r\n }\r\n\r\n /*************************** VICINITY MAP *****************************/\r\n public vmSelectPOIMarker(poiCategoryTitle: string, poiTitle: string) {\r\n this.sendEvent('select_marker', {\r\n module_id: 'vm',\r\n label: 'Select Marker',\r\n feature: 'marker',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n }\r\n\r\n public vmSelectPOIMenu(poiCategoryTitle: string, poiTitle: string) {\r\n this.sendEvent('select_poi', {\r\n module_id: 'vm',\r\n label: 'Select Point of Interest',\r\n feature: 'poi',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n }\r\n\r\n public vmViewPOIDetails(poiCategoryTitle: string, poiTitle: string) {\r\n this.sendEvent('view_poi_details', {\r\n module_id: 'vm',\r\n label: 'View Point of Interest Details',\r\n feature: 'details',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n }\r\n\r\n public vmViewCategoryMenu(poiCategoryTitle: string) {\r\n this.sendEvent('view_category_menu', {\r\n module_id: 'vm',\r\n label: 'View Category Menu',\r\n feature: 'category',\r\n value: poiCategoryTitle,\r\n });\r\n }\r\n\r\n public vmMapIt(input: string) {\r\n this.sendEvent('map_it', {\r\n module_id: 'vm',\r\n label: 'Map It',\r\n feature: 'map_it',\r\n value: input,\r\n });\r\n }\r\n\r\n public vmViewSendPOI(poiCategoryTitle: string, poiTitle: string) {\r\n this.sendEvent('view_send_poi', {\r\n module_id: 'vm',\r\n label: 'View Send POI',\r\n feature: 'send_poi',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n }\r\n\r\n public vmSendPOI(type: 'email' | 'sms', poiCategoryTitle: string, poiTitle: string) {\r\n if (type === 'sms') {\r\n this.sendEvent('send_poi_sms', {\r\n module_id: 'vm',\r\n label: 'Send Point of Interest SMS',\r\n feature: 'sms',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n } else {\r\n this.sendEvent('send_poi_email', {\r\n module_id: 'vm',\r\n label: 'Send Point of Interest Email',\r\n feature: 'email',\r\n value: poiTitle,\r\n category: poiCategoryTitle,\r\n });\r\n }\r\n }\r\n\r\n public vmViewSiteMap() {\r\n this.sendEvent('view_site_map_from_vm', {\r\n module_id: 'vm',\r\n label: 'View Site Map From Vicinity Map',\r\n feature: 'site_map_overlay',\r\n });\r\n }\r\n\r\n /*************************** PLAN BROWSER *****************************/\r\n public pbSelectPlan(planName: string) {\r\n this.eventParams.user_properties['plan_name'] = planName;\r\n this.sendEvent('select_plan', {\r\n module_id: 'pb',\r\n label: 'Select Plan',\r\n feature: 'floor_plan',\r\n value: planName,\r\n });\r\n }\r\n\r\n /*************************** GENERIC *****************************/\r\n // RESET\r\n public reset(module_id: 'fp' | 'sp' | 'vm' | 'pb') {\r\n const label =\r\n module_id === 'fp'\r\n ? 'Reset Floor Plan'\r\n : module_id === 'sp'\r\n ? 'Reset Site Plan'\r\n : module_id === 'vm'\r\n ? 'Reset Vicinity Map'\r\n : module_id === 'pb'\r\n ? 'Reset Plan Browser'\r\n : 'Reset';\r\n this.sendEvent('reset', { module_id, label, feature: 'reset' });\r\n }\r\n\r\n // ELEVATIONS\r\n public openElevationDialog(module_id: 'fp' | 'sp') {\r\n this.timers.elevationDialog = Date.now();\r\n this.sendEvent('elevation_dialog_open', {\r\n module_id,\r\n label: 'Open Elevation Dialog',\r\n feature: 'elevation',\r\n });\r\n }\r\n\r\n public viewElevation(module_id: 'fp' | 'sp', elevationStyle: string, isFirst: boolean) {\r\n this.sendEvent('view_elevation', {\r\n module_id,\r\n label: 'View Elevation',\r\n feature: 'elevation',\r\n value: elevationStyle,\r\n });\r\n\r\n if (isFirst) {\r\n this.sendEvent('view_elevation_first', {\r\n module_id,\r\n label: 'First Elevation View',\r\n feature: 'elevation',\r\n value: elevationStyle,\r\n });\r\n }\r\n\r\n if (this.timers.singleElevation.time !== 0) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.singleElevation.time);\r\n\r\n this.sendEvent('view_elevation_time', {\r\n module_id,\r\n label: 'Time Spent On Single Elevation',\r\n feature: 'elevation',\r\n value: this.timers.singleElevation.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.timers.singleElevation = {\r\n name: elevationStyle,\r\n time: Date.now(),\r\n };\r\n }\r\n\r\n public closeElevationDialog(module_id: 'fp' | 'sp') {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.elevationDialog);\r\n this.sendEvent('elevation_dialog_time', {\r\n module_id,\r\n label: 'Time Spent On Elevation Dialog',\r\n feature: 'elevation',\r\n time_format,\r\n time_ms,\r\n });\r\n\r\n if (this.timers.singleElevation.time !== 0) {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.singleElevation.time);\r\n\r\n this.sendEvent('view_elevation_time', {\r\n module_id,\r\n label: 'Time Spent On Single Elevation',\r\n feature: 'elevation',\r\n value: this.timers.singleElevation.name,\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n this.timers.singleElevation = {\r\n name: '',\r\n time: 0,\r\n };\r\n }\r\n\r\n // PRINT\r\n public printOpen(module_id: 'fp' | 'sp') {\r\n this.timers.print = Date.now();\r\n this.sendEvent('print_open', { module_id, label: 'Open Print', feature: 'print' });\r\n }\r\n\r\n public printCancel(module_id: 'fp' | 'sp') {\r\n const { time_ms, time_format } = this.getTimerValue(this.timers.print);\r\n\r\n this.sendEvent('print_time', {\r\n module_id,\r\n label: 'Time Spent On Print',\r\n feature: 'print',\r\n time_format,\r\n time_ms,\r\n });\r\n }\r\n\r\n public printStart(module_id: T, params: PrintStartParams[T]) {\r\n this.sendEvent('print_start', {\r\n module_id,\r\n label: 'Print',\r\n feature: 'print',\r\n });\r\n }\r\n\r\n // FILTER\r\n public selectFilter(\r\n module_id: 'sp' | 'pb',\r\n selectedFilterCategoryName: string,\r\n selectedFilterName: string\r\n ) {\r\n this.sendEvent('select_filter', {\r\n module_id,\r\n label: 'Select Filter',\r\n feature: 'filter',\r\n value: selectedFilterName,\r\n category: selectedFilterCategoryName,\r\n });\r\n }\r\n\r\n // EMAIL\r\n public sendEmail(module_id: 'sp' | 'fp') {\r\n this.sendEvent('email', {\r\n module_id,\r\n label: 'Email',\r\n feature: 'email',\r\n });\r\n }\r\n\r\n // SESSION\r\n public startSession() {\r\n this.param.sessionId = Math.floor(new Date().getTime() / 1000).toString();\r\n\r\n let hitStr =\r\n 'https://www.google-analytics.com/g/collect?v=2&_et=100&_s=1&seg=0&tid=' + this.measurementId;\r\n hitStr += '&en=session_start';\r\n hitStr += '&cid=' + this.eventParams.client_id;\r\n hitStr += '&sid=' + this.param.sessionId;\r\n if (this.eventParams.user_id !== '') {\r\n hitStr += '&uid=' + this.eventParams.user_id;\r\n }\r\n hitStr += '&sr=' + window.screen.availWidth + 'x' + window.screen.availHeight;\r\n hitStr += '&ul=' + this.getNavigatorLanguage().toLowerCase();\r\n hitStr += '&dl=' + encodeURIComponent(document.location.href);\r\n hitStr += '&dt=' + encodeURIComponent(document.title);\r\n hitStr += '&_dbg=' + this.debugMode;\r\n\r\n if (document.title === 'GA4-Tester') {\r\n hitStr += '&dr=';\r\n } else if (this.inIframe()) {\r\n hitStr += '&dr=iframe';\r\n } else {\r\n hitStr += '&dr=' + encodeURIComponent(document.referrer);\r\n }\r\n\r\n const hit2Str = this.addUserParametersToURL(hitStr);\r\n\r\n fetch(hit2Str, { method: 'POST' });\r\n }\r\n\r\n private addUserParametersToURL(hitStr: string): string {\r\n Object.entries(this.eventParams.user_properties).forEach(([key, value]: [string, string]) => {\r\n hitStr += '&up.' + key + '=' + encodeURIComponent(value);\r\n });\r\n\r\n return hitStr;\r\n }\r\n\r\n private computeDt(): number {\r\n /* compute time since last event */\r\n let dt = Date.now() - this.lastTime;\r\n this.lastTime = Date.now();\r\n\r\n /* if greater than 5 mins from last event, set to 100 */\r\n if (dt > 5 * 60 * 1000) dt = 100;\r\n\r\n return dt;\r\n }\r\n\r\n private sendEvent(eventName: string, eventObject: IEventObject) {\r\n const dt = this.computeDt();\r\n\r\n let hitStr =\r\n 'https://www.google-analytics.com/g/collect?v=2&_s=1&seg=0&tid=' + this.measurementId;\r\n hitStr += '&en=' + eventName;\r\n hitStr += '&cid=' + this.eventParams.client_id;\r\n hitStr += '&sid=' + this.param.sessionId;\r\n if (this.eventParams.user_id !== '') {\r\n hitStr += '&uid=' + this.eventParams.user_id;\r\n }\r\n\r\n /* copy event properties to the ep.* parameters */\r\n Object.entries(eventObject).forEach(([key, value]) => {\r\n hitStr += '&ep.' + key + '=' + encodeURIComponent(value);\r\n });\r\n\r\n hitStr += '&sr=' + window.screen.availWidth + 'x' + window.screen.availHeight;\r\n hitStr += '&_et=' + dt.toString();\r\n // hitStr += '&dt=' + encodeURIComponent(document.title);\r\n hitStr += '&ul=' + this.getNavigatorLanguage().toLowerCase();\r\n hitStr += '&_dbg=' + this.debugMode;\r\n\r\n const hit2Str = this.addUserParametersToURL(hitStr);\r\n this.sendQueueItemsURL.push(hit2Str);\r\n }\r\n\r\n public sendPageview(pageTitle: string) {\r\n const dt = 100;\r\n\r\n let hitStr =\r\n 'https://www.google-analytics.com/g/collect?v=2&_s=1&seg=0&tid=' + this.measurementId;\r\n hitStr += '&en=page_view';\r\n hitStr += '&cid=' + this.eventParams.client_id;\r\n hitStr += '&sid=' + this.param.sessionId;\r\n if (this.eventParams.user_id !== '') {\r\n hitStr += '&uid=' + this.eventParams.user_id;\r\n }\r\n //hitStr += \"&sr=\"+window.screen.availWidth+\"x\"+window.screen.availHeight;\r\n hitStr += '&ep.page_title=' + pageTitle;\r\n hitStr += '&_et=' + dt.toString();\r\n hitStr += '&ul=' + this.getNavigatorLanguage().toLowerCase();\r\n hitStr += '&_dbg=' + this.debugMode;\r\n const hit2Str = this.addUserParametersToURL(hitStr);\r\n this.sendQueueItemsURL.push(hit2Str);\r\n }\r\n\r\n // public sendTiming(\r\n // label: string,\r\n // categoryAsFeature: string,\r\n // valueAsTime: number,\r\n // nameAsValue: string\r\n // ) {\r\n // let dt = this.computeDt();\r\n\r\n // let hitStr =\r\n // 'https://www.google-analytics.com/g/collect?v=2&_s=1&seg=0&tid=' + this.measurementId;\r\n // hitStr += '&en=timing_complete&cid=' + this.eventParams.client_id;\r\n // hitStr += '&sid=' + this.param.sessionId;\r\n // if (this.eventParams.user_id !== '') {\r\n // hitStr += '&uid=' + this.eventParams.user_id;\r\n // }\r\n // hitStr += '&ep.event_label=' + label;\r\n // hitStr += '&ep.event_category=' + categoryAsFeature;\r\n // hitStr += '&epn.value=' + valueAsTime;\r\n // hitStr += '&ep.name=' + nameAsValue;\r\n // hitStr += '&_et=' + valueAsTime;\r\n // hitStr += '&ul=' + this.getNavigatorLanguage().toLowerCase();\r\n // hitStr += '&_dbg=' + (this.debugMode === true ? '1' : '0');\r\n\r\n // let hit2Str = this.addUserParametersToURL(hitStr);\r\n // this.sendQueueItemsURL.push(hit2Str);\r\n // }\r\n\r\n private getNavigatorLanguage(): string {\r\n return navigator.language || navigator.languages[0] || 'en';\r\n }\r\n\r\n private inIframe(): boolean {\r\n try {\r\n return window.self !== window.top;\r\n } catch (e) {\r\n return true;\r\n }\r\n }\r\n\r\n private getTimerValue(timer: number) {\r\n const time_ms = Math.min(Date.now() - timer, 1_800_000);\r\n\r\n let time_format: string;\r\n if (time_ms < 1000) {\r\n time_format = time_ms + 'ms';\r\n } else {\r\n const total_seconds = Math.floor(time_ms / 1000);\r\n const total_minutes = Math.floor(total_seconds / 60);\r\n const total_hours = Math.floor(total_minutes / 60);\r\n\r\n const days = Math.floor(total_hours / 24);\r\n const seconds = total_seconds % 60;\r\n const minutes = total_minutes % 60;\r\n const hours = total_hours % 24;\r\n time_format = `${days ? days + 'd ' : ''}${hours ? hours + 'h ' : ''}${\r\n minutes ? minutes + 'm ' : ''\r\n }${seconds ? seconds + 's ' : ''}`;\r\n }\r\n\r\n return {\r\n time_ms,\r\n time_format,\r\n };\r\n }\r\n}\r\n\r\nexport const gaFunction = new gaFunctions();\r\n\r\ntype AppID = 'fp' | 'sp' | 'vm' | 'ki';\r\ntype ModuleID = 'fp' | 'sp' | 'vm' | 'ki' | 'pb' | 'na' | 'ds';\r\ninterface IUserProperties {\r\n client_division?: string;\r\n client_id?: string;\r\n client_name?: string;\r\n community_id?: string;\r\n community_name?: string;\r\n scene_title?:string;\r\n gav?: string;\r\n plan_name?: string;\r\n app_id?: AppID;\r\n app_env?: string;\r\n}\r\n\r\ninterface IEventParams {\r\n user_id: string;\r\n client_id: string;\r\n non_personalized_ads: boolean;\r\n user_properties: IUserProperties;\r\n}\r\n\r\ninterface IParams {\r\n hitString: string;\r\n userId: string;\r\n sessionId: string;\r\n}\r\n\r\ninterface IEventObject {\r\n module_id: ModuleID;\r\n label: string;\r\n feature: string;\r\n value?: string | number;\r\n category?: string;\r\n time_format?: string;\r\n time_ms?: number;\r\n lot_title?: string;\r\n event_plan_name?: string;\r\n action?: string;\r\n}\r\n\r\ninterface PrintStartParams {\r\n fp: {\r\n layout: string;\r\n dimension: boolean;\r\n };\r\n sp: {\r\n includeLotData: boolean;\r\n };\r\n}\r\n","export default __webpack_public_path__ + \"static/media/NextLogo.425ae503.png\";","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n getCommunityCollection,\r\n getSceneData,\r\n} from \"reactSrc/constants/gql/query/appSyncQuery\";\r\nimport \"./App.css\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.css\";\r\nimport { MuiThemeProvider, createTheme } from \"@material-ui/core/styles\";\r\nimport { Provider } from \"react-redux\";\r\nimport store from \"reactSrc/store\";\r\nimport Layout from \"reactSrc/components/layout/Layout\";\r\nimport awsHelper from \"reactSrc/helpers/AWSHelper\";\r\nimport GeneralHelper from \"reactSrc/helpers/GeneralHelper\";\r\n\r\nfunction App() {\r\n const [theme, setTheme] = useState({\r\n typography: {\r\n useNextVariants: true,\r\n fontSize: 15,\r\n fontFamily: '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\r\n },\r\n palette: {\r\n primary: { main: \"#006DB7\" },\r\n secondary: { main: \"#173159\" },\r\n },\r\n overrides: {\r\n MuiPaper: {\r\n root: {\r\n textTransform: \"uppercase\",\r\n },\r\n },\r\n MuiBreadcrumbs: {\r\n root: {\r\n textTransform: \"uppercase\",\r\n },\r\n },\r\n MuiTypography: {\r\n body1: {\r\n fontSize: \"calc( 10px + 0.3vw)\",\r\n zIndex: 1000,\r\n },\r\n body2: {\r\n fontSize: \"calc( 10px + 0.3vw)\",\r\n zIndex: 1000,\r\n },\r\n h5: {\r\n fontSize: \"calc( 16px + 0.3vw)\",\r\n fontWeight: 600,\r\n zIndex: 1000,\r\n },\r\n h6: {\r\n fontSize: \"calc( 20px + 0.3vw)\",\r\n fontWeight: 600,\r\n zIndex: 1000,\r\n },\r\n caption: {\r\n fontSize: \"calc( 8px + 0.3vw)\",\r\n zIndex: 1000,\r\n },\r\n },\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n getBuilderTheme();\r\n }, []);\r\n\r\n const getBuilderTheme = async () => {\r\n const queryString = window.location.search;\r\n const urlParams = new URLSearchParams(queryString);\r\n const localParams = GeneralHelper.retrieveLocalStorageItem(\"params\");\r\n\r\n if (urlParams.has(\"collectionID\")) {\r\n const {\r\n data: {\r\n listDesignerSceneCollections: { items },\r\n },\r\n } = await awsHelper.appSyncQuery(\r\n getCommunityCollection(urlParams.get(\"collectionID\"))\r\n );\r\n\r\n if (items.length) {\r\n console.log( items );\r\n let builderTheme = {\r\n ...theme,\r\n typography: {\r\n ...theme.typography,\r\n fontFamily: items[0].clientFont\r\n ? items[0].clientFont\r\n : '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\r\n },\r\n };\r\n\r\n setTheme(builderTheme);\r\n }\r\n } else if (localParams && localParams.collectionID) {\r\n const {\r\n data: {\r\n listDesignerSceneCollections: { items },\r\n },\r\n } = await awsHelper.appSyncQuery(\r\n getCommunityCollection(localParams.collectionID)\r\n );\r\n\r\n if (items.length) {\r\n let builderTheme = {\r\n ...theme,\r\n typography: {\r\n ...theme.typography,\r\n fontFamily: items[0].clientFont\r\n ? items[0].clientFont\r\n : '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\r\n },\r\n };\r\n\r\n setTheme(builderTheme);\r\n }\r\n } else if (urlParams.has(\"communityID\") && urlParams.has(\"sceneID\")) {\r\n let {\r\n data: { getDesignerScene },\r\n } = await awsHelper.appSyncQuery(\r\n getSceneData(\r\n `${urlParams.get(\"communityID\")}-${urlParams.get(\"sceneID\")}`,\r\n urlParams.get(\"sceneID\")\r\n )\r\n );\r\n let item = getDesignerScene;\r\n\r\n let builderTheme = {\r\n ...theme,\r\n typography: {\r\n ...theme.typography,\r\n fontFamily: item.clientFont\r\n ? item.clientFont\r\n : '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\r\n },\r\n };\r\n\r\n setTheme(builderTheme);\r\n } else if (localParams.communityID && localParams.sceneID) {\r\n let {\r\n data: { getDesignerScene },\r\n } = await awsHelper.appSyncQuery(\r\n getSceneData(\r\n `${localParams.communityID}-${localParams.sceneID}`,\r\n localParams.sceneID\r\n )\r\n );\r\n let item = getDesignerScene;\r\n\r\n let builderTheme = {\r\n ...theme,\r\n typography: {\r\n ...theme.typography,\r\n fontFamily: item.clientFont\r\n ? item.clientFont\r\n : '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif',\r\n },\r\n };\r\n\r\n setTheme(builderTheme);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nReactDOM.render(, document.getElementById(\"root\"));\r\n","import storeConfig from './config';\r\n\r\nexport default storeConfig();\r\n","/**\r\n * Main store function\r\n */\r\nimport { createStore, applyMiddleware, compose } from \"redux\";\r\nimport thunk from \"redux-thunk\";\r\nimport { createLogger } from \"redux-logger\";\r\nimport rootReducer from \"./reducers\";\r\n\r\nexport default function(initialState = {}) {\r\n // Middleware and store enhancers\r\n const enhancers = [applyMiddleware(thunk)];\r\n\r\n if (process.env.NODE_ENV !== \"production\") {\r\n window.__REDUX_DEVTOOLS_EXTENSION__ && enhancers.push(window.__REDUX_DEVTOOLS_EXTENSION__());\r\n\r\n if (process.env.MIX_SHOW_REDUX_LOGGER !== \"false\") {\r\n enhancers.push(applyMiddleware(createLogger()));\r\n }\r\n }\r\n\r\n const store = createStore(rootReducer, initialState, compose(...enhancers));\r\n\r\n // For hot reloading reducers\r\n if (module.hot) {\r\n // Enable Webpack hot module replacement for reducers\r\n module.hot.accept(\"./reducers\", () => {\r\n const nextReducer = require(\"./reducers\").default; // eslint-disable-line global-require\r\n store.replaceReducer(nextReducer);\r\n });\r\n }\r\n\r\n return store;\r\n}\r\n","import { combineReducers } from \"redux\";\r\nimport preset from './presetReducer';\r\nimport auth from './authReducer';\r\n\r\nexport default combineReducers({auth, preset});\r\n","const initialState = {\r\n appOptionHierarchy: {},\r\n scene: {},\r\n list: [],\r\n};\r\n\r\nfunction preset(state = initialState, action) {\r\n switch (action.type) {\r\n case \"SET_PRESET\":\r\n return {\r\n ...state,\r\n scene: action.payload,\r\n };\r\n case \"SET_PRESET_LIST\":\r\n return {\r\n ...state,\r\n list: action.payload,\r\n };\r\n case \"SET_APP_HIERARCHY\":\r\n return {\r\n ...state,\r\n appOptionHierarchy: action.payload,\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default preset;\r\n","\r\nconst initialState = {\r\n user: null\r\n}\r\n\r\nfunction auth(state = initialState, action) {\r\n switch (action.type) {\r\n case 'SET_USER':\r\n return {\r\n ...state,\r\n user: action.payload\r\n }\r\n case 'SIGNOUT_USER':\r\n return {\r\n ...state,\r\n user: null\r\n }\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default auth;\r\n","import React, { useEffect } from \"react\";\r\nimport { Switch, Route, BrowserRouter, Redirect } from \"react-router-dom\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport focusConnect from \"reactSrc/store/connect/focusConnect\";\r\n\r\nimport routes from \"reactSrc/routes/config\";\r\nimport GeneralHelper from \"reactSrc/helpers/GeneralHelper\";\r\nimport { Hub } from \"aws-amplify\";\r\nimport awsHelper from \"reactSrc/helpers/AWSHelper\";\r\nimport GoogleAnalyticsHelper from \"reactSrc/helpers/GoogleAnalyticsHelper\";\r\n\r\nconst Layout = ({ classes, history, setUserObj, signOutUser }) => {\r\n useEffect(() => {\r\n awsHelper.configureCognito();\r\n getCurrentUser();\r\n\r\n Hub.listen(\"auth\", ({ payload: { event, data } }) => {\r\n if (event === \"signIn\") {\r\n setUserAttributes(data);\r\n }\r\n if (event === \"signOut\") {\r\n signOutUser();\r\n }\r\n if (event === \"configured\") {\r\n localStorage.setItem(\"amplify-redirected-from-hosted-ui\", false);\r\n }\r\n });\r\n\r\n /* start up basic GA tracking */\r\n GoogleAnalyticsHelper.client.initBasicTracking(\"UA-189680614-1\");\r\n GoogleAnalyticsHelper.sendPageview(\"Designer\");\r\n\r\n GoogleAnalyticsHelper.startSession();\r\n\r\n document.defaultView.addEventListener(\"error\", (errEvent) => {\r\n GoogleAnalyticsHelper.sendEvent(\r\n \"Error\",\r\n errEvent.message,\r\n errEvent.lineno\r\n );\r\n });\r\n }, []);\r\n\r\n const getCurrentUser = async () => {\r\n const user = await awsHelper.getCurrentUser();\r\n if (user && typeof user == \"object\") {\r\n setUserAttributes(user);\r\n // TODO: if ( optInToTrackingEverythingIDo === true ) {\r\n if (user.hasOwnProperty(\"username\") === true) {\r\n GoogleAnalyticsHelper.setLoggedInUserID( user.username );\r\n }\r\n if (user.hasOwnProperty(\"attributes\") === true) {\r\n GoogleAnalyticsHelper.setUserSub( user.attributes.sub );\r\n }\r\n //}\r\n }\r\n };\r\n\r\n const setUserAttributes = (data) => {\r\n data.attributes\r\n ? setUserObj({\r\n ...data.attributes,\r\n ...data.signInUserSession.accessToken.payload,\r\n })\r\n : setUserObj({\r\n ...data.accessToken.payload,\r\n ...data.signInUserSession.accessToken.payload,\r\n });\r\n };\r\n\r\n const getRoutes = () => {\r\n return [\r\n ...routes.map((route) => {\r\n return (\r\n \r\n );\r\n }),\r\n ...[\r\n }\r\n />,\r\n ],\r\n ];\r\n };\r\n\r\n return (\r\n
\r\n \r\n {getRoutes()}\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default focusConnect({\r\n component: Layout,\r\n styles: (theme) => ({\r\n body: {\r\n background: \"#E0E0E0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n flex: 1,\r\n overflow: \"hidden\",\r\n },\r\n }),\r\n});\r\n","export const setUserObj = payload => ({\r\n type: 'SET_USER',\r\n payload\r\n})\r\n\r\nexport const signOutUser = () => ({\r\n type: 'SIGNOUT_USER'\r\n})\r\n\r\n","import mainRoutes from '../pages/main/routes';\r\n\r\nexport default [\r\n ...mainRoutes\r\n];\r\n","import Loadable from \"react-loadable\";\r\nimport LoadingComponent from \"reactSrc/components/common/loader\";\r\n\r\nconst ROUTES = [\r\n {\r\n path: \"/\",\r\n exact: true,\r\n component: Loadable({\r\n loader: () =>\r\n import(\r\n /* webpackChunkName: \"js/selector\" */ \"reactSrc/components/pages/selector/SelectorPage.js\"\r\n ),\r\n loading: LoadingComponent,\r\n }),\r\n },\r\n {\r\n path: \"/scene\",\r\n exact: true,\r\n component: Loadable({\r\n loader: () =>\r\n import(\r\n /* webpackChunkName: \"js/home\" */ \"reactSrc/components/pages/home/HomePage.js\"\r\n ),\r\n loading: LoadingComponent,\r\n }),\r\n },\r\n {\r\n path: \"/signin\",\r\n exact: true,\r\n component: Loadable({\r\n loader: () =>\r\n import(\r\n /* webpackChunkName: \"js/signin\" */ \"reactSrc/components/pages/signin/SignInPage.js\"\r\n ),\r\n loading: LoadingComponent,\r\n }),\r\n },\r\n {\r\n path: \"/404\",\r\n exact: true,\r\n component: Loadable({\r\n loader: () =>\r\n import(\r\n /* webpackChunkName: \"js/signin\" */ \"reactSrc/components/pages/404\"\r\n ),\r\n loading: LoadingComponent,\r\n }),\r\n },\r\n];\r\n\r\nexport default ROUTES;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\n\r\nimport CircleLoader from \"./CircleLoader\";\r\nimport NextLogo from '@images/NextLogo.png';\r\n\r\n// set display name for component\r\nconst displayName = \"CommonLoader\";\r\n\r\n// validate component properties\r\nconst propTypes = {\r\n isLoading: PropTypes.bool,\r\n error: PropTypes.object\r\n};\r\n\r\nconst LoadingComponent = ({ isLoading, error }) => {\r\n // Handle the loading state\r\n if (isLoading) {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n // Handle the error state\r\n else if (error) {\r\n return (\r\n
\r\n \r\n
\r\n
\r\n
\r\n Sorry, there was a error loading this page.\r\n
\r\n
\r\n )\r\n } else {\r\n return null;\r\n }\r\n};\r\n\r\nLoadingComponent.displayName = displayName;\r\nLoadingComponent.propTypes = propTypes;\r\n\r\nexport default LoadingComponent;\r\n","import React from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport { CircularProgress } from '@material-ui/core';\r\n\r\nconst styles = theme => ({\r\n progress: {\r\n position: 'fixed!important',\r\n top: '50vh!important',\r\n left: '50%!important',\r\n zIndex: 9999\r\n },\r\n progressContainer: {\r\n height: '100%',\r\n position: 'relative'\r\n }\r\n});\r\n\r\nfunction CircleLoader(props) {\r\n const { classes, style } = props;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nCircleLoader.propTypes = {\r\n classes: PropTypes.object.isRequired\r\n};\r\n\r\nexport default withStyles(styles)(CircleLoader);\r\n"],"sourceRoot":""}