{"version":3,"sources":["redux/actions/index.js","widgets/FIconButtonSecondary.js","widgets/FTextField.js","core/Utils.js","config.js","widgets/FGridListTile.js","widgets/FTileImage.js","widgets/FTablePagination.js","widgets/FButtonPrimary.js","styles.js","redux/store/store.js","redux/reducer/ComponentResizeReducer.js","redux/reducer/ProjectsReducer.js","redux/reducer/CommonReducer.js","redux/reducer/UsersReducer.js","redux/reducer/TimelinerReducer.js","redux/reducer/PointCloudModelsReducer.js","redux/reducer/WakeCapDataReducer.js","redux/reducer/index.js","redux/constants/action_types.js","commonDialogs/WarningDialog.js","widgets/Privileged.js","serviceWorker.js","core/Aws.js","core/Auth.js","widgets/FSnackBar.js","Footer.js","widgets/Navigator.js","Header.js","widgets/DataTableNew.js","widgets/BitProgressBar.js","commonDialogs/InformativeDialog.js","project/FileUploadDialog.js","project/ImageUploadDialog.js","project/FileListView.js","pointCloud/PointCloudFileUploadDialog.js","pointCloud/PointCloudFileListView.js","project/ProjectWorkspaceActionView.js","project/ProjectWorkspace.js","App.js","index.js"],"names":["headerResize","payload","type","Actions","footerResize","projectWorkspaceActionViewResize","windowResize","signIn","notify","updateUserProfileData","setPublicURL","addProjectsToList","replaceProjectList","replaceProject","replaceSearchProjectList","openProject","closeProject","addProject","updateProject","updateLastEvalKey","deleteProject","addAECData","setLevel","cleanupProjectStore","setRoles","createUserToRedux","deleteUserFromRedux","setUsers","disableUsers","enableUsers","addUserToGroupToRedux","Email","role","setAdmins","setViewers","setEdits","createTask","task","existingTask","removeNode","updateNode","removeTask","addColour","loadedModels","loadedLevels","setSelectedPointCloudModels","selectedPointCloudModels","setWakeCapLoginInfo","wakeCapLoginInfo","isUserLoggedinWakecap","wakecapLogin","setWakeCapAvailableSitesForUser","wakeCapAvailableSitesForUser","setWakeCapAvailableBlueprintForSite","wakeCapAvailableBlueprintsForSite","setWakeCapZoneForBlueprint","wakeCapZoneForBlueprint","setWakeCapWorkerDetailsForSite","wakeCapWorkerDetailsForSite","FIconButtonPrimary","React","forwardRef","props","ref","newProps","classes","variant","color","children","displayName","commonStyles","className","tb_m","lr_m","join","Utils","len","text","possible","i","charAt","Math","floor","random","length","require","uniqueString","window","location","pathname","substr","lastIndexOf","fileId","btoa","replace","URN","decoded","atob","split","err","urlPathWords","urns","startAdding","forEach","word","push","count","URNs","decodedURN","splitURN","fileNames","decodeFileURN","params","AttributeDefinitions","AttributeName","AttributeType","GlobalSecondaryIndexes","IndexName","KeySchema","KeyType","Projection","NonKeyAttributes","ProjectionType","ProvisionedThroughput","ReadCapacityUnits","WriteCapacityUnits","TableName","_self","this","Promise","resolve","reject","_auth","validate","then","_dynamodb","createTable","catch","config","newObj","Object","assign","describeTable","data","dataUmMarshalled","Items","item","AWS","DynamoDB","Converter","unmarshall","DocumentClient","delete","param","Bucket","BucketName","Key","_s3","getObject","appState","store","getState","common","urn","getFileURN","AWSDBService","getThumbnail","blob","Blob","URL","createObjectURL","undefined","userData","getLoggedInUserProfile","a","res","Name","name","Value","aboutMe","phoneNumber","email","picturePath","OrgId","Organization","projectId","projectList","projects","find","Project_Id","queryAllItems","toUpperCase","slice","randomPass","number","specialSymbol","lowerCaseChar","b","project","selectedFileNames","forgeModelNamesOfSelectedFiles","Data","Files","fileName","file","values","concat","found","stage","Environment","fetch","method","headers","result","json","items","access_token","console","log","region","credentials","CognitoIdentityCredentials","IdentityPoolId","constants","Logins","get","Item","StorageLink","Expires","getS3ObjectPreSignedURL","fileURL","path","response","status","error","key","projectsTableBucketName","orgId","obj","JSON","stringify","File","Body","uploadJson","link","updateItem","S3","upload","send","Location","tableName","keyVal","attributes","ExpressionAttributeNames","ExpressionAttributeValues","rootProjectList","keys","pathHash","j","projection","UpdateExpression","update","getSignedUrl","url","publicURL","pid","getProjectId","getProjectParams","batchGetItems","newProject","publicLinks","includes","Development","projectsTableName","sharingTableName","settingsTableName","existingSharedUserDataTable","projectLogBucketName","projectsBucketName","us_east_1","canada","projectsBucketNameForPointCloud","creditsUsageTableName","fileServingBucket","subscriptionTableName","cognitoUserDataBucketName","cognitoUserDataFolderName","AppWebDomain","UserPoolId","ClientId","RedirectUriSignIn","RedirectUriSignOut","GoogleProjectClientId","GoogleDriveAPIKey","GoogleDriveReadonlyScope","paidUserTableName","subscriptionPremiumPlanID","subscriptionLitePlanID","subscriptionProPlanID","paypalClientID","Testing","Production","dataTile","src","alt","dataTileImage","toolbar","paginationFront","caption","FButtonPrimary","withStyles","theme","grow","flexGrow","display","justifyContent","overflow","minWidth","width","dataTileTitleBack","height","position","background","dataTileTitleFront","chip","marginLeft","spacing","marginRight","marginTop","marginBottom","textDecoration","fontWeight","cursor","iconButtonLarge","fontSize","lr_p","paddingLeft","paddingRight","tb_p","paddingTop","paddingBottom","persistConfig","storage","reducers","persistCombineReducers","componentSizes","userList","tasks","wakeCapData","createStore","composeWithDevTools","persistor","persistStore","initialState","headerSize","footerSize","projectActionViewSize","projectWorkspaceActionViewSize","windowSize","state","action","HEADER_RESIZE","FOOTER_RESIZE","PROJECT_ACTION_VIEW_RESIZE","PROJECT_WORKSPACE_ACTION_VIEW_RESIZE","WINDOW_RESIZE","searchProjectList","currentProject","lastEvalKey","ADD_PROJECTS_TO_LIST","REPLACE_PROJECT_LIST","REPLACE_SEARCH_PROJECT_LIST","OPEN_PROJECT","aecData","CLOSE_PROJECT","ADD_PROJECT","REPLACE_PROJECT","_project","index","findIndex","splice","UPDATE_PROJECT","index1","UPDATE_LASTEVALKEY","DELETE_PROJECT","indexOf","ADD_AEC_DATA","cpl","SET_LEVEL","activeLevel","CLEANUP_PROJECT_STORE","userProfileData","isPublicURL","SIGN_IN","NOTIFY","UPDATE_USERDATA","IS_PUBLIC_URL","users","roles","viewers","edits","admins","SET_ROLES","SET_USERS","CREATE_USER","DELETE_USER","filter","user","ENABLE_USERS","map","Enabled","DISABLE_USERS","ADD_USER_TO_GROUP","Role","SET_ADMINS","SET_VIEWERS","SET_EDITS","tasksreducers","CREATE_TASK","EXISTING_TASK","REMOVE_TASK","REMOVE_NODE","UPDATE_TASK","UPDATE_NODE","ADD_COLOUR","loadedModelsReducer","LOADED_MODELS","loadedLevelReducer","LOADED_LEVELS","pointCloudModelsReducer","SELECTED_POINT_CLOUD_MODELS","wakeCapLoginAPIData","wakeCapAvailableBluePrintForSite","wakeCapZoneForBluePrint","wakeCapLoginStatus","GET_LOGIN_INFO","GET_AVAILABLE_SITES","GET_AVAILABLE_BLUEPRINT","GET_ZONE_FOR_BLUEPRINT","GET_WORKER_DETAILS","USER_lOGGED_IN","DialogTitle","root","borderBottom","palette","divider","margin","disableTypography","DialogContent","MuiDialogContent","DialogActions","borderTop","padding","MuiDialogActions","WarningDialog","open","setState","uploadInProgress","_close","yesCB","noCB","title","message","yesBtnName","noBtnName","_title","_message","_yesBtnName","_noBtnName","onClose","aria-labelledby","id","handleClose","style","component","onClick","_handleYes","_handleNo","Component","Privileged","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","AWSServices","_dynamoDb","bind","changePassword","deleteObjects","deletePointCloudObject","emptyPotreeFileFolder","updateUserAttributes","createUser","registerAppBoundle","createAliasForAppBundle","updateExistingAppBundle","createActivity","createAliasForActivity","updateExistingActivity","createBucket","getBuckets","uploadInputFileOSS","getTempUploadUrl","getTempDownloadUrl","createWorkItem","deleteTranslation","statusOfWorkItem","AddUserOrganization","put","batchGet","Responses","itemsToDelete","DeleteRequest","RequestItems","batchWrite","itemsToWrite","PutRequest","scan","dynamoDbCrc32","query","dataToReturn","LastEvaluatedKey","SharedPublicly","savePublicSharedDataToS3","projectData","template","Project_Name","category","Status","uploadedBy","Date","toLocaleString","txtData","uploadLog","progressCB","on","event","pgs","loaded","total","uploadObjectToAdskBucket","uploadBy","DisplayFileName","Region","resultData","displayFileName","token","accessToken","Authorization","body","fileKey","getForgeToken","mode","getReader","read","done","value","deleteFromAdskBucket","deleteObject","deleteFileFromADSKBucket","Delete","Objects","object","callback","listObjects","Contents","paramstodelete","content","oldPassword","newPassword","CognitoUser","getSession","getUserAttributes","attributeList","attribute","AmazonCognitoIdentity","updateAttributes","username","Username","CognitoIdentityServiceProvider","adminListGroupsForUser","Manifest_details","putObject","rdata","userEmail","group","GroupName","adminAddUserToGroup","subSettingsData","currentDateOnly","getTime","getProjectFromDB","DefaultProjectIds","getItem","Creation_Date","ProjectOwner","Description","uploadtime","paramsForputItem","putItem","environment","subSettingsParams","Env","active_plan","credits","TrialCredits","payment_history","credits_added","date","payment_email","plan","setDefaultProject","adminRemoveUserFromGroup","adminDisableUser","adminEnableUser","DesiredDeliveryMediums","TemporaryPassword","createUniquePassword","UserAttributes","organization","adminCreateUser","dataFromUserCreate","addUserToGroup","adminDeleteUser","listGroups","_idData","Users","newName","orgName","adminGetUser","Delimiter","Prefix","folderPath","objectKeys","SES","apiVersion","sendEmail","promise","CommonPrefixes","Id","engine","description","uploadAppBoundle","formData","FormData","uploadParameters","append","endpointURL","version","Ndata","commandLine","parameters","rvtFile","zip","ondemand","verb","required","localName","appbundles","bucketKey","access","policyKey","inputFile","outputFile","activityId","arguments","input","deleteFileDervativesFromADSKBucket","urnData","output","formats","views","advanced","verifyTranslation","progress","Auth","signInCb","signOutCB","_configAndSaveAuth","_authData","_parseJwt","getSignInUserSession","jwtToken","idToken","signOut","loginKey","loginVal","_signInCB","_signOutCB","_initCognitoSDK","RTCBResolve","RTCBReject","curUrl","href","parseCognitoWebResponse","_getQueryString","_stripAuthInfoFromUrl","isSignedIn","clearCachedId","self","authData","TokenScopesArray","AmazonCognitoAuth","useCodeGrantFlow","poolData","userPool","getCurrentUser","userhandler","onFailure","base64","parse","history","replaceState","document","origin","search","RegExp","decodeURIComponent","isValid","cookies","cookie","eqPos","userSession","getIdToken","getJwtToken","getAccessToken","variantIcon","success","CheckCircleIcon","warning","WarningIcon","ErrorIcon","info","InfoIcon","MySnackbarContentWrapper","backgroundColor","green","dark","primary","amber","icon","iconVariant","opacity","alignItems","other","Icon","SnackbarContent","classNames","aria-describedby","IconButton","aria-label","PFSnackbar","_lastType","reason","notifyCall","openVal","hideDuration","time","Snackbar","anchorOrigin","vertical","horizontal","m_t","autoHideDuration","FSnackbar","connect","dispatch","PFooter","AppBar","appBar","copyright","isMobile","Typography","Footer","sizeMe","monitorHeight","bottom","PNavigator","unListen","urlPath","linkNameMap","label","linkIcon","listen","navList","Breadcrumbs","linkDecoration","separator","arial-label","_value","to","Grid","container","direction","pathNames","x","last","Hidden","smDown","Navigator","withRouter","withTheme","PHeader","handleClickOpen","wakeCapLoginOpen","handleWakeCapLoginClose","handleWakecapTabChange","_","newValue","wakeCapSelectedTab","_getAllProjectsForThisUser","_getUserProjectListQueryConfig","element","_getUserProjects","noProjectsMessage","_updateProjectsThumbnailImageURL","userProjectList","Keys","getProjectDataFromS3","_getAllProjects","_getQueryConfig","entries","ExclusiveStartKey","getAllProjects","getSharedUserProject","e","getSubscriptionData","user_payment_history","subscriptionID","_subDataUpdated","_onSignIn","auth","AWSService","reload","deleteAllCookies","anchorEl","workerDetails","userRoleData","warningDialogRef","createRef","_userDataSet","_loginWithWakeCap","signUpWithWakeCap","getAvailableSitesForUser","validateEmail","Roles","_getProjects","Groups","getAllUser","_getPublicProject","userProjectId","current","show","_onSignOut","isViewer","userEmailId","fetchLimit","ScanIndexForward","selected_NewFirst","KeyConditionExpression","orgID","getUserInfo","paramsToGetProjects","owner_orgid","files","FeatureImagePath","updateWithFeatureImage","storeProject","Thumbnail_URL","getThumbnailImageURL","replaceWhat","searchProjects","picURL","ViewersArray","EditArray","AdminArray","listUsersInPool","listOfUserFromPool","listOfExistingOrgUsers","getUsersInPool","usersFromExistingOrganization","existingUserRefId","unique_id","accessRole","listOfUser","localUser","userAttr","Attributes","UserLastModifiedDate","attr","PhoneNo","getGroupsForUser","groupData","setTimeout","currentTarget","revokeObjectURL","getUserProfile","waitingForAPIResponse","pictureURL","getOrganizationCredits","Credits","emailId","getElementById","validEmail","test","String","toLowerCase","warningDiv","innerText","wakeCapEmail","authToken","password","loginInfo","authorization","inviteResponse","inviteStatus","errors","wakeCapPassword","loginStatus","LoginInfo","loginData","authtoken","availableSites","availableSitesForUser","getAvailableBlueprintForSite","siteId","siteid","BlueprintInfo","_blueprintInfo","blueprintId","getAvailableZonesForSite","clickAway","blueprintid","ZoneInfo","_zoneInfo","nextPageId","nextPageworkerDetails","nextpageid","WorkerDetails","_WorkerDetails","meta","next","getWorkerDetailsForSite","Toolbar","only","_smallScreenLayout","_largeScreenLayout","_menu","_yesCB","projectName","ProjectName","mdUp","l_m","pictureUrl","getUserProfilePicURL","Avatar","avatar","initials","fullName","n","settingsButtonRef","avatarButtonRef","userButtonRef","Tooltip","SvgIcon","fill","d","Dialog","maxWidth","fullWidth","Divider","DialogContentText","TextField","autoFocus","onKeyUp","Button","Link","FIconButtonSecondary","_onManageUsers","_onProjectSettings","handleMenu","_avatar","_onSubscribe","_onFAQ","Menu","menuMargin","transformOrigin","MenuItem","_onProfile","_onAnalytics","_openSignOutWarningDialog","_projectName","xs","justify","_settingsAndAccountButtons","Header","wakeCapLogin","blueprintInfo","zoneInfo","border","main","EnhancedTableHead","columns","dataColumns","TableHead","TableRow","row","TableCell","align","numeric","disablePadding","EnhancedTable","selected","page","rowsPerPage","handleSelectAllClick","target","checked","handleChangePage","handleChangeRowsPerPage","isSelected","rowCount","Table","numSelected","TableBody","hover","tabIndex","scope","FTablePagination","rowsPerPageOptions","onChangePage","onChangeRowsPerPage","BitProgressBar","now","progressInstance","InformativeDialog","okCB","lines","okBtnName","line","_handleOk","PaperComponent","cancel","Paper","closeButton","right","top","grey","Category","Progress","PFileUploadDialog","_deleteAndUploadNewFile","fileNameToDelete","selectedFiles","projectRegion","bucketName","saveProjectDataToS3","_uploadFiles","_downloadDriveFile","googleAuthToken","getTranslation","interval","setInterval","_getFileTranslationStatus","_FileStatusInterval","uploadedFileCount","downloadInProgress","unsupportedFileList","sameFileList","longFileName","supportedFileFormats","supportedFileFormatDialogRef","unsupportedSameFileDialogRef","longFileNameDialogRef","lowCreditsDialogRef","_cancelUpload","multiple","accept","onChange","onFileSelect","htmlFor","clientId","developerKey","_onDriveFileSelect","onAuthenticate","_storeGoogleAuthToken","onAuthFailed","multiselect","navHidden","authImmediate","mimeTypes","onFileSelectionFromDrive","docs","uniqueNameExt","unsupportedFileFormatError","longFileNameError","sameFileError","_getFileUploadErrorMessage","_supportedFileFormatDialogOkCB","_getSameFileNameErrorMessage","_unsupportedSameFileOkDialogOkCB","_getFileNameLongErrorMessage","_longFileNameOkDialogOkCB","_lowCreditsDialogOkCB","disabled","_uploadOrReplaceFile","_driveFileDownloadProgressBar","Array","from","fileExtension","pop","_isSameFilePresent","_openUnsupportedSameFileOkDialog","_openFileNameLongOkDialog","_openSupportedFileFormatOkDialog","fileIndex","ext","uniqueName","createUniqueIdV2","_getDriveFile","creditToDeduct","fileNameofSelectedFile","setting","ComplexJobFiles","ComplexJobRate","SimpleJobRate","Newparams","subData","uploadObject","progresss","fileData","saveLoggerDataToS3","close","_lowCreditsOkDialog","getFileTranslationStatus","clearInterval","_select","Select","_onCategorySelected","_upload","round","CircularProgress","size","disableShrink","filesNames","FileUploadDialog","PImageUploadDialog","_uploadImage","selectedFile","env","uploadObjectToS3","openDialog","fileUrl","_previousPictureUrl","reader","FileReader","addEventListener","readAsDataURL","newFile","defineProperty","writable","imgURL","_getImageURL","_selectButtonComponent","_thumbnailPic","_handleUpload","_onFileSelect","ImageUploadDialog","downloadList","Map","PFileListView","isTranslationProgressCheckInProgress","_deleteFiles","filesToDelete","isDefaultProject","getFlairSettingsData","FileIdsNotToDelete","getFileIdsNotToDelete","fileIdFound","getOwnPropertyNames","finally","allFileSelect","fileDetails","selectedFileData","userRoleAdmin","userRoleViewer","isSharedProject","dialogRef","dialogUploadRef","fileDetailsDialogRef","translationInProgressDialogRef","_fileIdsNotToDelete","getRoleDataFromHeader","getTypeOfProject","selectedPointCloudFiles","_openMultipleFiles","_openTranslationInProgressDialog","PID","toCheckRoleofUser","isPointCloudFileTranslationInProgress","allFilesReady","PointCloudFiles","pointCloudFileListViewRef","_getPointCloudFileTranslationStatus","pathToPush","selectedFiless","details","_getFilesInfoString","selectedFilesArr","projectFiles","capitalizeWord","sort","localeCompare","keyy","filedata","getFile","tempUploadresult","tempDownloadResult","signedUrl","wrkItmResult","filesToDownload","has","downloadFromAdskBucket","set","request","createElement","download","appendChild","click","parentElement","removeChild","forceUpdate","_commonActionsOnFiles","_adminActionsOnFiles","overflowX","_data","_openFileDetailsDialog","Checkbox","_onAllFileSelect","_fileColumnName","_onFileSelected","_open3DModel","_openFileImage","_isFileSelected","_isSingleFileSelected","_downloadFile","_openFileDeleteWarningDialog","_openFileUpload","FileListView","PPointCloudFileUploadDialog","downloadPointCloudFileOnServer","_pointCloudFileStatusInterval","openProcessForFileConversion","fileNameToReProcess","params1","_replaceFileDialogYesCB","_replaceFileDialogCancelCB","uploadPointCloudObject","flag","iterator","fileReProcessCount","retry","PointCloudFilesList","reProcessForFileConversion","handleRemovePointCloudFile","PointCloudFileUploadDialog","PPointCloudFileListView","onPointCloudFileListViewStateChange","thumbnail","thumbnailName","params2","selectedPointCloudFilesArr","PointCloudFileListView","pointCloudModels","PProjectWorkspaceActionView","_updateProjectInDB","isTextFieldDisabled","flexDirection","FTextField","onBlur","_onNameSet","_onNameChange","multiline","rows","_onDescriptionSet","_onDescriptionChange","ProjectWorkspaceActionView","P_ProjectWorkspace","changePointCloudFileListViewState","updatedPointCloudFileListViewState","_fileStatusInterval","thumbnailUrl","_getProject","lastPath","projectInList","findProjectInList","_currentProject","_getFileStatus","pointcloudinterval","sm","md","onSize","r_m","t_m","b_m","FGridListTile","FTileImage","ProjectWorkspace","Settings","lazy","ProjectList","ProjectCharts","CreateProject","Viewer","Timeliner","FAQ","Subscription","Dashboard","UserList","UsageHisoty","createMuiTheme","secondary","PApp","publicUrl","public","innerWidth","innerHeight","removeEventListener","handleWindowResize","checkInDatabase","ShowHomePage","getProjectDataFromS3Projects","fileURNs","getURNsFromCurrentURL","newURL","redirectToNew","completeName","fallback","extension","selectedModels","heightForForgeViewer","cs","w","Window","documentElement","g","getElementsByTagName","wsHeight","clientHeight","ganttChartDiv","flairRoute","redirectUrl","localStorage","setItem","_updateHeight","maxSnack","TransitionComponent","Slide","exact","render","dashboard","projectWorkspace","viewer","manageProjects","settings","subscription","analytics","usageHisoty","manageUsers","App","ReactDOM","loading","process","contentType","ready","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.c3c8b062.chunk.js","sourcesContent":["import * as Actions from \"../constants/action_types\";\r\n\r\n//component resize actions\r\nexport function headerResize(payload) {\r\n return { type: Actions.HEADER_RESIZE, payload };\r\n}\r\n\r\nexport function footerResize(payload) {\r\n return { type: Actions.FOOTER_RESIZE, payload };\r\n}\r\n\r\nexport function projectActionViewResize(payload) {\r\n return { type: Actions.PROJECT_ACTION_VIEW_RESIZE, payload };\r\n}\r\n\r\nexport function projectWorkspaceActionViewResize(payload) {\r\n return { type: Actions.PROJECT_WORKSPACE_ACTION_VIEW_RESIZE, payload };\r\n}\r\n\r\nexport function windowResize(payload) {\r\n return { type: Actions.WINDOW_RESIZE, payload };\r\n}\r\n\r\n//user sign in actions\r\nexport function signIn(payload) {\r\n return { type: Actions.SIGN_IN, payload };\r\n}\r\n\r\nexport function notify(payload) {\r\n return { type: Actions.NOTIFY, payload };\r\n}\r\n\r\nexport function updateUserProfileData(payload) {\r\n return { type: Actions.UPDATE_USERDATA, payload };\r\n}\r\n\r\nexport function setPublicURL(payload) {\r\n return { type: Actions.IS_PUBLIC_URL, payload };\r\n}\r\n\r\n//project actions\r\nexport function addProjectsToList(payload) {\r\n return { type: Actions.ADD_PROJECTS_TO_LIST, payload };\r\n}\r\n\r\nexport function replaceProjectList(payload) {\r\n return { type: Actions.REPLACE_PROJECT_LIST, payload };\r\n}\r\nexport function replaceProject(payload) {\r\n return { type: Actions.REPLACE_PROJECT, payload };\r\n}\r\n\r\nexport function replaceSearchProjectList(payload) {\r\n return { type: Actions.REPLACE_SEARCH_PROJECT_LIST, payload };\r\n}\r\n\r\nexport function openProject(payload) {\r\n return { type: Actions.OPEN_PROJECT, payload };\r\n}\r\n\r\nexport function closeProject() {\r\n return { type: Actions.CLOSE_PROJECT };\r\n}\r\n\r\nexport function addProject(payload) {\r\n return { type: Actions.ADD_PROJECT, payload };\r\n}\r\n\r\nexport function updateProject(payload) {\r\n return { type: Actions.UPDATE_PROJECT, payload };\r\n}\r\n\r\nexport function updateLastEvalKey(payload) {\r\n return { type: Actions.UPDATE_LASTEVALKEY, payload };\r\n}\r\n\r\nexport function deleteProject(payload) {\r\n return { type: Actions.DELETE_PROJECT, payload };\r\n}\r\n\r\nexport function addAECData(payload) {\r\n return { type: Actions.ADD_AEC_DATA, payload };\r\n}\r\n\r\nexport function setLevel(payload) {\r\n return { type: Actions.SET_LEVEL, payload };\r\n}\r\n\r\nexport function cleanupProjectStore() {\r\n return { type: Actions.CLEANUP_PROJECT_STORE };\r\n}\r\n\r\nexport function setRoles(payload) {\r\n return { type: Actions.SET_ROLES, payload };\r\n}\r\nexport function createUserToRedux(payload) {\r\n return { type: Actions.CREATE_USER, payload };\r\n}\r\nexport function deleteUserFromRedux(payload) {\r\n return { type: Actions.DELETE_USER, payload };\r\n}\r\n\r\nexport function setUsers(payload) {\r\n return { type: Actions.SET_USERS, payload };\r\n}\r\nexport function disableUsers(payload) {\r\n return { type: Actions.DISABLE_USERS, payload };\r\n}\r\nexport function enableUsers(payload) {\r\n return { type: Actions.ENABLE_USERS, payload };\r\n}\r\nexport function addUserToGroupToRedux(Email, role) {\r\n return { type: Actions.ADD_USER_TO_GROUP, Email, role };\r\n}\r\nexport function setAdmins(payload) {\r\n return { type: Actions.SET_ADMINS, payload };\r\n}\r\nexport function setViewers(payload) {\r\n return { type: Actions.SET_VIEWERS, payload };\r\n}\r\nexport function setEdits(payload) {\r\n return { type: Actions.SET_EDITS, payload };\r\n}\r\n\r\n//timeliner actions\r\nexport function createTask(task) {\r\n return { type: Actions.CREATE_TASK, task };\r\n}\r\nexport function existingTask(task) {\r\n return { type: Actions.EXISTING_TASK, task };\r\n}\r\nexport function removeNode(task) {\r\n return { type: Actions.REMOVE_NODE, task };\r\n}\r\nexport function updateNode(task) {\r\n return { type: Actions.UPDATE_NODE, task };\r\n}\r\n\r\nexport function removeTask(task) {\r\n return { type: Actions.REMOVE_TASK, task };\r\n}\r\nexport function updateTask(updatetask) {\r\n return { type: Actions.UPDATE_TASK, updatetask };\r\n}\r\nexport function addColour(task) {\r\n return { type: Actions.ADD_COLOUR, task };\r\n}\r\nexport function loadedModels(loadedModels) {\r\n return { type: Actions.LOADED_MODELS, loadedModels };\r\n}\r\n\r\nexport function loadedLevels(loadedLevels) {\r\n return { type: Actions.LOADED_LEVELS, loadedLevels };\r\n}\r\n\r\n//Point Cloud Models actions\r\nexport function setSelectedPointCloudModels(selectedPointCloudModels) {\r\n return {\r\n type: Actions.SELECTED_POINT_CLOUD_MODELS,\r\n selectedPointCloudModels,\r\n };\r\n}\r\n\r\n//WakeCap Login Data\r\nexport function setWakeCapLoginInfo(wakeCapLoginInfo) {\r\n return { type: Actions.GET_LOGIN_INFO, wakeCapLoginInfo };\r\n}\r\n\r\nexport function isUserLoggedinWakecap(wakecapLogin) {\r\n return { type: Actions.USER_lOGGED_IN, wakecapLogin };\r\n}\r\n\r\nexport function setWakeCapAvailableSitesForUser(wakeCapAvailableSitesForUser) {\r\n return { type: Actions.GET_AVAILABLE_SITES, wakeCapAvailableSitesForUser };\r\n}\r\n\r\nexport function setWakeCapAvailableBlueprintForSite(\r\n wakeCapAvailableBlueprintsForSite\r\n) {\r\n return {\r\n type: Actions.GET_AVAILABLE_BLUEPRINT,\r\n wakeCapAvailableBlueprintsForSite,\r\n };\r\n}\r\n\r\nexport function setWakeCapZoneForBlueprint(wakeCapZoneForBlueprint) {\r\n return { type: Actions.GET_ZONE_FOR_BLUEPRINT, wakeCapZoneForBlueprint };\r\n}\r\n\r\nexport function setWakeCapWorkerDetailsForSite(wakeCapWorkerDetailsForSite) {\r\n return { type: Actions.GET_WORKER_DETAILS, wakeCapWorkerDetailsForSite };\r\n}\r\n","import IconButton from '@material-ui/core/IconButton';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport commonStyles from '../styles';\r\n\r\nconst FIconButtonPrimary = React.forwardRef((props, ref) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return {props.children}\r\n})\r\n\r\nFIconButtonPrimary.displayName = 'FIconButtonPrimary';\r\n\r\nFIconButtonPrimary.propTypes = {\r\n children: PropTypes.any,\r\n classes: PropTypes.object,\r\n};\r\n\r\nexport default commonStyles(FIconButtonPrimary);\r\n","import Grid from '@material-ui/core/Grid';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport commonStyles from '../styles';\r\n\r\nconst FTextField = (props) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return \r\n \r\n \r\n}\r\n\r\nFTextField.propTypes = {\r\n classes: PropTypes.object,\r\n};\r\n\r\nexport default commonStyles(FTextField);","import find from \"lodash/find\";\r\nimport store from \"../redux/store/store\";\r\nimport { Environment, constants } from \"../config\";\r\nimport AWS from \"aws-sdk\";\r\n\r\nclass Utils {\r\n /**\r\n * ! Deprecated\r\n * Creates random id for given string length.\r\n * Doesn't guarantee uniqueness\r\n * @param {*} len\r\n */\r\n static createUniqueId(len = 6) {\r\n var text = \"\";\r\n var possible =\r\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\r\n for (var i = 0; i < len; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n return text;\r\n }\r\n\r\n /**\r\n * Generate a unique random string.\r\n * @returns — A 32 character unique string. Matches the length of MD5, which is unique enough for non-crypto purposes.\r\n */\r\n static createUniqueIdV2() {\r\n const uniqueString = require(\"unique-string\");\r\n return uniqueString();\r\n }\r\n\r\n /**\r\n * Returns last item in url\r\n */\r\n static lastPath() {\r\n return window.location.pathname.substr(\r\n window.location.pathname.lastIndexOf(\"/\") + 1,\r\n window.location.pathname.length\r\n );\r\n }\r\n\r\n /**\r\n * Returns file URN present in Autodesk forge from given file id\r\n * @param {string} fileId\r\n */\r\n static getFileURN(fileId) {\r\n //flair-projects this name is of ADSK bucket do not replace with value from constants\r\n return btoa(`urn:adsk.objects:os.object:flair-projects/${fileId}`).replace(\r\n /=/g,\r\n \"\"\r\n );\r\n }\r\n\r\n /**\r\n * Decodes file URN to file id\r\n * @param {string} URN\r\n */\r\n static decodeFileURN(URN) {\r\n let decoded;\r\n try {\r\n decoded = atob(URN.split(\".\")[0]);\r\n } catch (err) {\r\n decoded = \"\";\r\n }\r\n return decoded;\r\n }\r\n\r\n /**\r\n * Returns URNs from current url\r\n */\r\n static getURNsFromCurrentURL() {\r\n const urlPathWords = window.location.pathname.split(\"/\");\r\n const urns = [];\r\n let startAdding = false;\r\n urlPathWords.forEach((word) => {\r\n if (startAdding) {\r\n urns.push(word);\r\n }\r\n if (word === \"viewer\") {\r\n startAdding = true;\r\n }\r\n });\r\n return urns;\r\n }\r\n\r\n static getViewerModelCount() {\r\n const urlPathWords = window.location.pathname.split(\"/\");\r\n let count = 0;\r\n let startAdding = false;\r\n urlPathWords.forEach((word) => {\r\n if (startAdding) {\r\n count++;\r\n }\r\n if (word === \"viewer\") {\r\n startAdding = true;\r\n }\r\n });\r\n return count;\r\n }\r\n\r\n /**\r\n * Returns array of file names from given array of file URNs\r\n * @param {string[]} URNs\r\n */\r\n static getFileNamesFromURNs(URNs) {\r\n let fileNames = [];\r\n let decodedURN;\r\n let splitURN;\r\n URNs.forEach((URN) => {\r\n decodedURN = Utils.decodeFileURN(URN);\r\n splitURN = decodedURN.split(\"/\");\r\n fileNames.push(splitURN[splitURN.length - 1]);\r\n });\r\n return fileNames;\r\n }\r\n\r\n /**\r\n * Create table method for dynamoDB\r\n * Not in use\r\n */\r\n static createTable() {\r\n let params = {\r\n AttributeDefinitions: [\r\n {\r\n AttributeName: \"Project_Id\",\r\n AttributeType: \"S\",\r\n },\r\n {\r\n AttributeName: \"Creation_Date\",\r\n AttributeType: \"N\",\r\n },\r\n {\r\n AttributeName: \"Project_Name\",\r\n AttributeType: \"S\",\r\n },\r\n ],\r\n GlobalSecondaryIndexes: [\r\n {\r\n IndexName: \"Project_Name\",\r\n KeySchema: [\r\n {\r\n AttributeName: \"Project_Name\",\r\n KeyType: \"HASH\",\r\n },\r\n ],\r\n Projection: {\r\n NonKeyAttributes: [\"Data\"],\r\n ProjectionType: \"ALL\",\r\n },\r\n ProvisionedThroughput: {\r\n ReadCapacityUnits: 5,\r\n WriteCapacityUnits: 5,\r\n },\r\n },\r\n {\r\n IndexName: \"Creation_Date\",\r\n KeySchema: [\r\n {\r\n AttributeName: \"Creation_Date\",\r\n KeyType: \"HASH\",\r\n },\r\n ],\r\n Projection: {\r\n ProjectionType: \"ALL\",\r\n },\r\n ProvisionedThroughput: {\r\n ReadCapacityUnits: 5,\r\n WriteCapacityUnits: 5,\r\n },\r\n },\r\n ],\r\n KeySchema: [\r\n {\r\n AttributeName: \"Project_Id\",\r\n KeyType: \"HASH\",\r\n },\r\n ],\r\n ProvisionedThroughput: {\r\n ReadCapacityUnits: 5,\r\n WriteCapacityUnits: 5,\r\n },\r\n TableName: \"Projects\",\r\n };\r\n let _self = this;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n _self._dynamodb.createTable(params, function(err) {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve();\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Check if table exists in dynamoDb\r\n * ! Not in use. Never modified to worked\r\n * @param {object} config\r\n */\r\n static checkIfTableExists(config) {\r\n let _self = this;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let newItem = {};\r\n let newObj = Object.assign(newItem, config);\r\n _self._dynamodb.describeTable(newObj, function(err, data) {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n let dataUmMarshalled = [];\r\n data.Items.forEach((item) => {\r\n dataUmMarshalled.push(\r\n _self._auth.AWS.DynamoDB.Converter.unmarshall(item)\r\n );\r\n });\r\n return resolve(dataUmMarshalled);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete Items from dynamoDb\r\n * ! Not in use\r\n * @param {object} params\r\n */\r\n static deleteItem(params) {\r\n let _self = this;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let documentClient = new _self._auth.AWS.DynamoDB.DocumentClient();\r\n documentClient.delete(params, function(err, data) {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get specific s3 object\r\n * ! Not in use\r\n * @param {object} data\r\n */\r\n static getObject(data) {\r\n let _self = this;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let param = {\r\n Bucket: data.BucketName,\r\n Key: data.Key,\r\n };\r\n\r\n _self._s3.getObject(param, function(err, data) {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Returns thumbnail url for given file id\r\n * @param {string} fileId\r\n */\r\n static getThumbnailImageURL(fileId) {\r\n return new Promise((resolve) => {\r\n let appState = store.getState().common.appState;\r\n if (appState) {\r\n let urn = Utils.getFileURN(fileId);\r\n appState.AWSDBService.getThumbnail(urn)\r\n .then((data) => {\r\n let blob = new Blob([data], { type: \"image/png\" });\r\n resolve(URL.createObjectURL(blob));\r\n })\r\n .catch(() => {\r\n resolve(undefined); //resolving with undefined instead of reject\r\n });\r\n } else {\r\n resolve(undefined); //resolving with undefined instead of reject\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Gets user profile from cognito\r\n */\r\n static getUserProfile() {\r\n return new Promise((resolve, reject) => {\r\n let userData = {};\r\n let appState = store.getState().common.appState;\r\n appState.AWSDBService.getLoggedInUserProfile()\r\n .then(async (res) => {\r\n //Saving user attributes in local state\r\n for (let i = 0; i < res.length; i++) {\r\n if (res[i].Name === \"name\") userData.name = res[i].Value;\r\n else if (res[i].Name === \"profile\") userData.aboutMe = res[i].Value;\r\n else if (res[i].Name === \"phone_number\")\r\n userData.phoneNumber = res[i].Value;\r\n else if (res[i].Name === \"email\") userData.email = res[i].Value;\r\n else if (res[i].Name === \"picture\")\r\n userData.picturePath = res[i].Value;\r\n else if (res[i].Name === \"custom:OrgId\")\r\n userData.OrgId = res[i].Value;\r\n else if (res[i].Name === \"custom:Organization\")\r\n userData.Organization = res[i].Value;\r\n }\r\n return resolve(userData);\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Find project in project list by project id\r\n * @param {string} projectId\r\n */\r\n static findProjectInList(projectId) {\r\n let projectList = store.getState().projects.projectList;\r\n if (projectList && projectList.length > 0) {\r\n let project = find(projectList, { Project_Id: projectId });\r\n return project;\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Returns all projects from db\r\n * @param {object} params\r\n */\r\n static getAllProjects(params) {\r\n return new Promise((resolve, reject) => {\r\n let appState = store.getState().common.appState;\r\n if (appState) {\r\n appState.AWSDBService.queryAllItems(params)\r\n .then((data) => {\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n } else {\r\n resolve([]);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Capitalizes given word\r\n * @param {string} word\r\n */\r\n static capitalizeWord(word) {\r\n return word.charAt(0).toUpperCase() + word.slice(1);\r\n }\r\n\r\n /**\r\n * Creates unique password of given length, default password length 8\r\n * @param {number} len\r\n */\r\n static createUniquePassword(len = 8) {\r\n var text = \"\";\r\n var randomPass = \"\";\r\n var possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n var number = \"0123456789\";\r\n var specialSymbol = \"@-_\";\r\n var lowerCaseChar = \"abcdefghijklmnopqrstuvwxyz\";\r\n for (var i = 0; i < len; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n randomPass += number.charAt(Math.floor(Math.random() * number.length));\r\n text +=\r\n randomPass +\r\n specialSymbol.charAt(Math.floor(Math.random() * specialSymbol.length)) +\r\n lowerCaseChar.charAt(Math.floor(Math.random() * lowerCaseChar.length));\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * Compares two arrays for equality\r\n * Firstly compares by length and then by contents\r\n * @param {[]} a\r\n * @param {[]} b\r\n */\r\n static areArraysEqual(a, b) {\r\n if (a === undefined || b === undefined) return false;\r\n // if length is not equal\r\n if (a.length !== b.length) return false;\r\n else {\r\n // comparing each element of array\r\n for (var i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Returns forge file names for given displayed names of files\r\n * @param {string[]} selectedModels\r\n */\r\n static _getForgeModelFileNames(project, selectedFileNames) {\r\n // Get the FileNames all in lower case for better comparison later.\r\n let forgeModelNamesOfSelectedFiles = [];\r\n // In case of shared project, we wouldn't have project.Data.\r\n // In this case, the selectedModels will contain the forgeFileName instead of their actual names.\r\n if (project && project.Data && project.Data.Files) {\r\n selectedFileNames.forEach((fileName) => {\r\n const file = find(Object.values(project.Data.Files), {\r\n fileName: fileName,\r\n });\r\n forgeModelNamesOfSelectedFiles.push(file.fileId);\r\n });\r\n } else {\r\n forgeModelNamesOfSelectedFiles = forgeModelNamesOfSelectedFiles.concat(\r\n selectedFileNames\r\n );\r\n }\r\n\r\n return forgeModelNamesOfSelectedFiles;\r\n }\r\n\r\n /**\r\n * Returns project id from url\r\n */\r\n static getProjectId() {\r\n const urlPathWords = window.location.pathname.split(\"/\");\r\n let projectId = \"\";\r\n let found = false;\r\n urlPathWords.forEach((word) => {\r\n if (found) {\r\n projectId = word;\r\n found = false;\r\n }\r\n if (word === \"workspace\") {\r\n found = true;\r\n }\r\n });\r\n return projectId;\r\n }\r\n\r\n //Functions required for public link sharing\r\n /**\r\n * Get forge Token for public urls\r\n */\r\n static getPublicForgeToken() {\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(`https://9z1p3gl2k6.execute-api.us-east-1.amazonaws.com/${stage}`, {\r\n method: \"GET\",\r\n headers: {},\r\n })\r\n .then((result) => result.json())\r\n .then((items) => {\r\n resolve(items.access_token.access_token);\r\n })\r\n .catch((err) => {\r\n console.log(\"error\", err);\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Batch get Items\r\n * @param params\r\n */\r\n static batchGetItems(params) {\r\n return new Promise((resolve, reject) => {\r\n AWS.config.region = \"us-east-1\";\r\n AWS.config.credentials = new AWS.CognitoIdentityCredentials({\r\n IdentityPoolId: constants[Environment].IdentityPoolId,\r\n Logins: {},\r\n });\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.get(params, (err, data) => {\r\n if (err) {\r\n console.log(\"Error getting batch item from dynamoDB \", err);\r\n return reject(err);\r\n } else {\r\n console.log(\"Responses :\", data);\r\n return resolve(data.Item);\r\n }\r\n });\r\n });\r\n }\r\n\r\n static getProjectDataFromS3(project) {\r\n return new Promise((resolve, reject) => {\r\n let request = (path) =>\r\n fetch(path)\r\n .then((response) =>\r\n response.status !== 404 ? response.json() : null\r\n )\r\n .then((data) => {\r\n if (data !== null) {\r\n project.Data = data;\r\n }\r\n resolve(project);\r\n })\r\n .catch((err) => {\r\n console.log(\"Cant get project data from S3\", err);\r\n reject();\r\n });\r\n if (project.StorageLink) {\r\n const key = project.Project_Id + \".json\";\r\n let params = {\r\n Bucket: \"publicsharedprojectbucket\",\r\n Key: key,\r\n Expires: 864000,\r\n };\r\n this.getS3ObjectPreSignedURL(params)\r\n .then((fileURL) => {\r\n request(fileURL).catch((err) => {\r\n console.error(err);\r\n reject();\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n reject();\r\n });\r\n } else {\r\n resolve(project);\r\n }\r\n });\r\n }\r\n static getProjectDataFromS3Projects(project) {\r\n return new Promise((resolve, reject) => {\r\n let request = (path) =>\r\n fetch(path)\r\n .then((response) =>\r\n response.status !== 404 ? response.json() : null\r\n )\r\n .then((data) => {\r\n if (data !== null) {\r\n project.Data = data;\r\n }\r\n resolve(project);\r\n })\r\n .catch((err) => {\r\n console.log(\"Cant get project data from S3\", err);\r\n reject();\r\n });\r\n if (project.StorageLink) {\r\n const key = project.Project_Id + \".json\";\r\n let params = {\r\n Bucket: constants[Environment].projectsTableBucketName,\r\n Key: key,\r\n Expires: 864000,\r\n };\r\n this.getS3ObjectPreSignedURL(params)\r\n .then((fileURL) => {\r\n request(fileURL).catch((err) => {\r\n console.error(err);\r\n reject();\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n reject();\r\n });\r\n } else {\r\n resolve(project);\r\n }\r\n });\r\n }\r\n\r\n static saveProjectDataToS3(project, orgId) {\r\n var obj = JSON.stringify(project.Data);\r\n let blob = new Blob([obj], { type: \"text/plain\" });\r\n var json = new File([blob], project.Project_Id + \".json\");\r\n let param = {\r\n Bucket: \"publicsharedprojectbucket\",\r\n Key: project.Project_Id + \".json\",\r\n Body: json,\r\n orgId,\r\n };\r\n Utils.uploadJson(param)\r\n .then((link) => {\r\n Utils.updateItem(\r\n \"PublicSharedProjects\",\r\n {\r\n Project_Id: project.Project_Id,\r\n },\r\n [\"StorageLink\"],\r\n [link]\r\n )\r\n .then(() => {})\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n static uploadJson(param) {\r\n return new Promise((resolve, reject) => {\r\n new AWS.S3().upload(param).send((err, data) => {\r\n if (err) {\r\n reject(err);\r\n }\r\n resolve(data.Location);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Update item in dynamoDb. Limitation works only for set operation\r\n * @param tableName\r\n * @param keyVal\r\n * @param attributes\r\n * @param values\r\n */\r\n static updateItem(tableName, keyVal, attributes, values) {\r\n let params = {\r\n Key: keyVal,\r\n TableName: tableName,\r\n ExpressionAttributeNames: {},\r\n ExpressionAttributeValues: {},\r\n };\r\n\r\n let rootProjectList = [];\r\n\r\n for (let i = 0; i < attributes.length; i++) {\r\n let keys = attributes[i].split(\".\");\r\n let pathHash = [];\r\n\r\n for (let j = 0; j < keys.length; j++) {\r\n const key = keys[j];\r\n pathHash.push(\"#\" + key);\r\n params.ExpressionAttributeNames[\"#\" + key] = key;\r\n params.ExpressionAttributeValues[\":val\" + i] = values[i];\r\n }\r\n\r\n let projection = pathHash.join(\".\") + \"= :val\" + i;\r\n rootProjectList.push(projection);\r\n }\r\n params.UpdateExpression = \"set \" + rootProjectList.join(\",\");\r\n\r\n return new Promise((resolve, reject) => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.update(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Returns per signed url for getObject operation only\r\n * @param params\r\n */\r\n static getS3ObjectPreSignedURL(params) {\r\n return new Promise((resolve, reject) => {\r\n new AWS.S3().getSignedUrl(\"getObject\", params, (err, url) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(url);\r\n }\r\n });\r\n });\r\n }\r\n\r\n static async checkInDatabase(publicURL) {\r\n let pid = Utils.getProjectId();\r\n let getProjectParams = {\r\n Key: { Project_Id: pid },\r\n TableName: \"PublicSharedProjects\",\r\n };\r\n let newProject = await Utils.batchGetItems(getProjectParams);\r\n if (newProject) {\r\n if (newProject.publicLinks.includes(publicURL)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n\r\nexport default Utils;\r\n","export const constants = {\r\n Development: {\r\n projectsTableName: \"Projects\",\r\n projectsTableBucketName: \"projecttabledata\",\r\n sharingTableName: \"Sharing\",\r\n settingsTableName: \"FlairSettings\",\r\n existingSharedUserDataTable: \"ExistingSharedUserData\",\r\n projectLogBucketName: \"flair-logger\",\r\n projectsBucketName: {\r\n us_east_1: \"flair-projects\",\r\n canada: \"flair-projects-canada\"\r\n },\r\n projectsBucketNameForPointCloud: {\r\n us_east_1: \"flair-projects-pointcloudfiles\",\r\n canada: \"flair-projects-pointcloudfiles-canada\"\r\n },\r\n creditsUsageTableName: \"Usage-History\",\r\n fileServingBucket: \"flair-static-website\",\r\n subscriptionTableName: \"Subscription\",\r\n cognitoUserDataBucketName: \"flair-cognito-userdata\",\r\n cognitoUserDataFolderName: \"Dev-Testing\",\r\n IdentityPoolId: \"us-east-1:45a1b428-7242-4191-bf3f-70c8f8fe82da\",\r\n AppWebDomain: \"devapp-auth.flair3d.com\",\r\n UserPoolId: \"us-east-1_LR7PsCpmC\",\r\n ClientId: \"5ntunc2v6tgj2v3e8jpgmhgnse\",\r\n RedirectUriSignIn: \"https://dev-app.flair3d.com\",\r\n RedirectUriSignOut: \"https://dev-app.flair3d.com\",\r\n GoogleProjectClientId:\r\n \"249471719775-ojnkvobaalu26qq0rtfaiagg0theq0rq.apps.googleusercontent.com\",\r\n GoogleDriveAPIKey: \"AIzaSyDeLTtfTNnEZrlolmdNJBFE1pmMua-GdQg\",\r\n GoogleDriveReadonlyScope: \"https://www.googleapis.com/auth/drive.readonly\",\r\n paidUserTableName: \"PaidUserData\",\r\n subscriptionPremiumPlanID: \"P-20M2648564861172UL3BPNAI\",\r\n subscriptionLitePlanID: \"P-1H185729FJ823094XL7QJDMA\",\r\n subscriptionProPlanID: \"P-9T253725LT742324XL72XDLQ\",\r\n paypalClientID:\r\n \"AacNsri10sWiMTTGb6Yw_K6tESwniu_SiL029xfZ6j2q8Kp-v28G_xzNsvfO16wCl3y_HLMCiiF_HGBh\"\r\n },\r\n Testing: {\r\n projectsTableName: \"Projects\",\r\n projectsTableBucketName: \"projecttabledata\",\r\n sharingTableName: \"Sharing\",\r\n settingsTableName: \"FlairSettings\",\r\n existingSharedUserDataTable: \"ExistingSharedUserData\",\r\n projectLogBucketName: \"flair-logger\",\r\n projectsBucketName: {\r\n us_east_1: \"flair-projects\",\r\n canada: \"flair-projects-canada\"\r\n },\r\n projectsBucketNameForPointCloud: {\r\n us_east_1: \"flair-projects-pointcloudfiles\",\r\n canada: \"flair-projects-pointcloudfiles-canada\"\r\n },\r\n creditsUsageTableName: \"Usage-History\",\r\n fileServingBucket: \"flair-static-website\",\r\n subscriptionTableName: \"Subscription\",\r\n cognitoUserDataBucketName: \"flair-cognito-userdata\",\r\n cognitoUserDataFolderName: \"Dev-Testing\",\r\n IdentityPoolId: \"us-east-1:45a1b428-7242-4191-bf3f-70c8f8fe82da\",\r\n AppWebDomain: \"devapp-auth.flair3d.com\",\r\n UserPoolId: \"us-east-1_LR7PsCpmC\",\r\n ClientId: \"2r69s642oecu4c3kgukk5st6uj\",\r\n RedirectUriSignIn: \"http://localhost:3000\",\r\n RedirectUriSignOut: \"https://localhost:3000\",\r\n GoogleProjectClientId:\r\n \"249471719775-ojnkvobaalu26qq0rtfaiagg0theq0rq.apps.googleusercontent.com\",\r\n GoogleDriveAPIKey: \"AIzaSyDeLTtfTNnEZrlolmdNJBFE1pmMua-GdQg\",\r\n GoogleDriveReadonlyScope: \"https://www.googleapis.com/auth/drive.readonly\",\r\n paidUserTableName: \"PaidUserData\",\r\n subscriptionPremiumPlanID: \"P-20M2648564861172UL3BPNAI\",\r\n subscriptionLitePlanID: \"P-1H185729FJ823094XL7QJDMA\",\r\n subscriptionProPlanID: \"P-9T253725LT742324XL72XDLQ\",\r\n paypalClientID:\r\n \"AacNsri10sWiMTTGb6Yw_K6tESwniu_SiL029xfZ6j2q8Kp-v28G_xzNsvfO16wCl3y_HLMCiiF_HGBh\"\r\n },\r\n Production: {\r\n projectsTableName: \"Prod-Projects\",\r\n projectsTableBucketName: \"prod-projecttabledata\",\r\n sharingTableName: \"Prod-Sharing\",\r\n settingsTableName: \"FlairSettings\",\r\n existingSharedUserDataTable: \"ExistingSharedUserData\",\r\n projectLogBucketName: \"prod-flair-logger\",\r\n projectsBucketName: {\r\n us_east_1: \"prod-flair-projects\",\r\n canada: \"prod-flair-projects-canada\"\r\n },\r\n projectsBucketNameForPointCloud: {\r\n us_east_1: \"flair-projects-pointcloudfiles\",\r\n canada: \"flair-projects-pointcloudfiles-canada\"\r\n },\r\n creditsUsageTableName: \"Prod-Usage-History\",\r\n fileServingBucket: \"prod-flair-static-website\",\r\n subscriptionTableName: \"Prod-Subscription\",\r\n cognitoUserDataBucketName: \"flair-cognito-userdata\",\r\n cognitoUserDataFolderName: \"Production\",\r\n IdentityPoolId: \"us-east-1:4751dabf-c691-460c-8841-5fe963b00753\",\r\n AppWebDomain: \"app-auth.flair3d.com\",\r\n UserPoolId: \"us-east-1_G1uEyq044\",\r\n ClientId: \"3ldsrrq99dntad0hlbt8m9og8u\",\r\n RedirectUriSignIn: \"https://app.flair3d.com\",\r\n RedirectUriSignOut: \"https://flair3d.com\",\r\n GoogleProjectClientId:\r\n \"249471719775-ojnkvobaalu26qq0rtfaiagg0theq0rq.apps.googleusercontent.com\",\r\n GoogleDriveAPIKey: \"AIzaSyDeLTtfTNnEZrlolmdNJBFE1pmMua-GdQg\",\r\n GoogleDriveReadonlyScope: \"https://www.googleapis.com/auth/drive.readonly\",\r\n paidUserTableName: \"PaidUserData\",\r\n subscriptionPremiumPlanID: \"P-20M2648564861172UL3BPNAI\",\r\n subscriptionLitePlanID: \"P-1H185729FJ823094XL7QJDMA\",\r\n subscriptionProPlanID: \"P-9T253725LT742324XL72XDLQ\",\r\n paypalClientID:\r\n \"AacNsri10sWiMTTGb6Yw_K6tESwniu_SiL029xfZ6j2q8Kp-v28G_xzNsvfO16wCl3y_HLMCiiF_HGBh\"\r\n }\r\n};\r\n\r\nexport const Environment = \"Production\";\r\n","import GridListTile from '@material-ui/core/GridListTile';\r\nimport PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport commonStyles from '../styles';\r\n\r\nconst FGridListTile = (props) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return {props.children}\r\n}\r\n\r\nFGridListTile.propTypes = {\r\n classes: PropTypes.object,\r\n children: PropTypes.any\r\n};\r\n\r\nexport default commonStyles(FGridListTile);\r\n","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport commonStyles from '../styles';\r\n\r\nconst FTileImage = (props) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return \r\n}\r\n\r\nFTileImage.propTypes = {\r\n src: PropTypes.string,\r\n classes: PropTypes.object,\r\n};\r\n\r\nexport default commonStyles(FTileImage);","import PropTypes from 'prop-types';\r\nimport React from 'react';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport commonStyles from '../styles';\r\n\r\nconst FTablePagination = (props) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return {props.children}\r\n}\r\n\r\nFTablePagination.propTypes = {\r\n children: PropTypes.any,\r\n classes: PropTypes.object,\r\n};\r\n\r\nexport default commonStyles(FTablePagination);","import React, { forwardRef } from 'react';\r\n\r\nimport Button from \"@material-ui/core/Button\";\r\nimport PropTypes from 'prop-types';\r\nimport commonStyles from '../styles';\r\n\r\nconst FButtonPrimary = forwardRef((props, ref) => {\r\n const newProps = { ...props };\r\n delete newProps.classes;\r\n return \r\n})\r\n\r\nFButtonPrimary.displayName = 'FButtonPrimary';\r\n\r\nFButtonPrimary.propTypes = {\r\n classes: PropTypes.object,\r\n children: PropTypes.any\r\n};\r\n\r\nexport default commonStyles(FButtonPrimary);\r\n","import withStyles from \"@material-ui/core/styles/withStyles\";\r\n\r\nconst styles = theme => {\r\n return {\r\n grow: {\r\n flexGrow: 1,\r\n },\r\n\r\n dataTile: {\r\n display: 'flex',\r\n justifyContent: 'space-around',\r\n overflow: 'hidden',\r\n minWidth: 200,\r\n width: 200,\r\n },\r\n\r\n dataTileTitleBack: {\r\n height: 45,\r\n width: 200,\r\n position: 'relative',\r\n background: '#d5dbe1',\r\n },\r\n\r\n dataTileTitleFront: {\r\n color: \"#000\",\r\n },\r\n\r\n dataTileImage: {\r\n width: 200,\r\n height: 200,\r\n },\r\n\r\n paginationFront: {\r\n color: \"#000\",\r\n },\r\n\r\n chip: {\r\n height:25,\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1),\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1)\r\n },\r\n\r\n link: {\r\n textDecoration: 'none',\r\n color: 'rgb(0,0,0)',\r\n '&hover': {\r\n textDecoration: 'none',\r\n fontWeight: 'bold',\r\n cursor: 'pointer',\r\n },\r\n },\r\n\r\n iconButtonLarge: {\r\n fontSize: 'large',\r\n },\r\n\r\n lr_p: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(2)\r\n },\r\n\r\n tb_p: {\r\n paddingTop: theme.spacing(2),\r\n paddingBottom: theme.spacing(2)\r\n },\r\n\r\n tb_m: {\r\n marginTop: theme.spacing(2),\r\n marginBottom: theme.spacing(2)\r\n },\r\n\r\n lr_m: {\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2)\r\n }\r\n }\r\n};\r\n\r\nexport default withStyles(styles);","import { common, componentSizes, loadedModels,loadedLevels ,projects, tasks, userList, selectedPointCloudModels, wakeCapData } from \"../reducer/index.js\";\r\nimport { persistCombineReducers, persistStore } from 'redux-persist'\r\n\r\nimport { composeWithDevTools } from 'redux-devtools-extension';\r\nimport { createStore } from \"redux\";\r\nimport storage from 'redux-persist/lib/storage';\r\n\r\n// defaults to localStorage\r\nconst persistConfig = {\r\n key: 'root',\r\n storage\r\n};\r\n\r\nconst reducers = persistCombineReducers(persistConfig, {\r\n common,\r\n componentSizes,\r\n projects,\r\n userList,\r\n tasks,\r\n loadedModels,\r\n loadedLevels,\r\n selectedPointCloudModels,\r\n wakeCapData\r\n});\r\n\r\nconst store = createStore(reducers, composeWithDevTools());\r\nexport const persistor = persistStore(store);\r\nexport default store;","import {\r\n FOOTER_RESIZE,\r\n HEADER_RESIZE,\r\n PROJECT_ACTION_VIEW_RESIZE,\r\n PROJECT_WORKSPACE_ACTION_VIEW_RESIZE,\r\n WINDOW_RESIZE\r\n} from \"../constants/action_types\";\r\n\r\nconst initialState = {\r\n headerSize: undefined,\r\n footerSize: undefined,\r\n projectActionViewSize: undefined,\r\n projectWorkspaceActionViewSize: undefined,\r\n windowSize: undefined\r\n};\r\n\r\nfunction componentSizes(state = initialState, action) {\r\n\r\n switch (action.type) {\r\n case HEADER_RESIZE:\r\n return Object.assign({}, state, {\r\n headerSize: action.payload\r\n });\r\n case FOOTER_RESIZE:\r\n return Object.assign({}, state, {\r\n footerSize: action.payload\r\n });\r\n case PROJECT_ACTION_VIEW_RESIZE:\r\n return Object.assign({}, state, {\r\n projectActionViewSize: action.payload\r\n });\r\n case PROJECT_WORKSPACE_ACTION_VIEW_RESIZE:\r\n return Object.assign({}, state, {\r\n projectWorkspaceActionViewSize: action.payload\r\n });\r\n case WINDOW_RESIZE:\r\n return Object.assign({}, state, {\r\n windowSize: action.payload\r\n });\r\n default:\r\n break;\r\n }\r\n return state;\r\n}\r\n\r\nexport default componentSizes;","/* eslint-disable no-undefined */\r\nimport {\r\n ADD_AEC_DATA,\r\n ADD_PROJECT,\r\n ADD_PROJECTS_TO_LIST,\r\n CLEANUP_PROJECT_STORE,\r\n CLOSE_PROJECT,\r\n DELETE_PROJECT,\r\n OPEN_PROJECT,\r\n REPLACE_PROJECT,\r\n REPLACE_PROJECT_LIST,\r\n REPLACE_SEARCH_PROJECT_LIST,\r\n SET_LEVEL,\r\n UPDATE_LASTEVALKEY,\r\n UPDATE_PROJECT,\r\n} from \"../constants/action_types\";\r\n\r\nimport find from \"lodash/find\";\r\nimport findIndex from \"lodash/findIndex\";\r\n\r\nconst initialState = {\r\n projectList: [],\r\n searchProjectList: [],\r\n currentProject: {},\r\n lastEvalKey: {},\r\n};\r\n\r\nfunction projects(state = initialState, action) {\r\n switch (action.type) {\r\n case ADD_PROJECTS_TO_LIST:\r\n return Object.assign({}, state, {\r\n projectList: Object.assign([], action.payload), // Revert to concat operation while using limited loading in\r\n });\r\n case REPLACE_PROJECT_LIST:\r\n return Object.assign({}, state, {\r\n projectList: Object.assign([], action.payload),\r\n });\r\n case REPLACE_SEARCH_PROJECT_LIST: {\r\n return Object.assign({}, state, {\r\n searchProjectList: Object.assign([], action.payload),\r\n });\r\n }\r\n case OPEN_PROJECT: {\r\n let aecData =\r\n state.currentProject && state.currentProject.aecData\r\n ? state.currentProject.aecData\r\n : undefined;\r\n let currentProject = Object.assign({}, action.payload);\r\n currentProject.aecData = aecData ? aecData : undefined;\r\n return Object.assign({}, state, {\r\n currentProject: Object.assign({}, currentProject),\r\n });\r\n }\r\n case CLOSE_PROJECT:\r\n return Object.assign({}, state, {\r\n currentProject: undefined,\r\n });\r\n case ADD_PROJECT:\r\n return Object.assign({}, state, {\r\n currentProject: Object.assign({}, action.payload),\r\n projectList: [action.payload, ...state.projectList],\r\n });\r\n case REPLACE_PROJECT: {\r\n let projectList = state.projectList;\r\n let _project = find(projectList, {\r\n Project_Id: action.payload.Project_Id,\r\n });\r\n _project = Object.assign({}, action.payload);\r\n let index = findIndex(projectList, {\r\n Project_Id: action.payload.Project_Id,\r\n });\r\n // Replace item at index using native splice\r\n projectList.splice(index, 1, _project);\r\n return Object.assign({}, state, {\r\n projectList: Object.assign([], projectList),\r\n });\r\n }\r\n\r\n case UPDATE_PROJECT: {\r\n let projectList = state.projectList;\r\n\r\n let _project = find(projectList, {\r\n Project_Id: action.payload.Project_Id,\r\n });\r\n _project = Object.assign({}, action.payload);\r\n\r\n let index1 = findIndex(projectList, {\r\n Project_Id: action.payload.Project_Id,\r\n });\r\n // Replace item at index using native splice\r\n projectList.splice(index1, 1, _project);\r\n\r\n return Object.assign({}, state, {\r\n currentProject: Object.assign({}, action.payload),\r\n projectList: Object.assign([], projectList),\r\n });\r\n }\r\n case UPDATE_LASTEVALKEY:\r\n if (action.payload === undefined) {\r\n return Object.assign({}, state, {\r\n lastEvalKey: undefined,\r\n });\r\n }\r\n return Object.assign({}, state, {\r\n lastEvalKey: Object.assign({}, action.payload),\r\n });\r\n\r\n case DELETE_PROJECT: {\r\n let projectList = state.projectList;\r\n for (let i = 0; i < projectList.length; i++) {\r\n if (action.payload.indexOf(projectList[i].Project_Id) > -1) {\r\n projectList.splice(i, 1);\r\n }\r\n }\r\n return Object.assign({}, state, {\r\n currentProject: undefined,\r\n projectList: Object.assign([], projectList),\r\n });\r\n }\r\n case ADD_AEC_DATA: {\r\n let cpl = state.currentProject;\r\n if (cpl) {\r\n if (cpl.aecData === undefined) {\r\n cpl.aecData = action.payload;\r\n } else {\r\n const key = Object.keys(action.payload)[0];\r\n if (cpl.aecData[key] === undefined)\r\n cpl.aecData[key] = action.payload[key];\r\n }\r\n }\r\n return Object.assign({}, state, {\r\n currentProject: Object.assign({}, cpl),\r\n });\r\n }\r\n case SET_LEVEL: {\r\n let currentProject = state.currentProject;\r\n if (currentProject) currentProject.activeLevel = action.payload;\r\n return Object.assign({}, state, {\r\n currentProject: Object.assign({}, currentProject),\r\n });\r\n }\r\n case CLEANUP_PROJECT_STORE:\r\n return Object.assign({}, state, {\r\n lastEvalKey: undefined,\r\n projectList: Object.assign([], undefined),\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport default projects;\r\n","import {\r\n NOTIFY,\r\n SIGN_IN,\r\n UPDATE_USERDATA,\r\n IS_PUBLIC_URL,\r\n} from \"../constants/action_types\";\r\n\r\nconst initialState = {\r\n appState: undefined,\r\n notify: undefined,\r\n userProfileData: undefined,\r\n isPublicURL: false,\r\n};\r\n\r\nfunction common(state = initialState, action) {\r\n switch (action.type) {\r\n case SIGN_IN:\r\n return Object.assign({}, state, {\r\n appState: action.payload,\r\n });\r\n case NOTIFY:\r\n return Object.assign({}, state, {\r\n notify: action.payload,\r\n });\r\n case UPDATE_USERDATA:\r\n return Object.assign({}, state, {\r\n userProfileData: action.payload,\r\n });\r\n case IS_PUBLIC_URL:\r\n return Object.assign({}, state, {\r\n isPublicURL: action.payload,\r\n });\r\n default:\r\n break;\r\n }\r\n return state;\r\n}\r\n\r\nexport default common;\r\n","import {\r\n ADD_USER_TO_GROUP,\r\n CREATE_USER,\r\n DELETE_USER,\r\n DISABLE_USERS,\r\n ENABLE_USERS,\r\n SET_ROLES,\r\n SET_USERS,\r\n SET_ADMINS,\r\n SET_EDITS,\r\n SET_VIEWERS\r\n\r\n} from '../constants/action_types';\r\n\r\nconst initialState = {\r\n users: [],\r\n roles: [],\r\n viewers: [],\r\n edits: [],\r\n admins: []\r\n};\r\n\r\nfunction userList(state = initialState, action) {\r\n switch (action.type) {\r\n case SET_ROLES:\r\n\r\n return Object.assign({}, state, {\r\n roles: action.payload,\r\n });\r\n case SET_USERS:\r\n\r\n return Object.assign({}, state, {\r\n users: action.payload,\r\n });\r\n case CREATE_USER:\r\n return Object.assign({}, state, {\r\n\r\n users: [action.payload, ...state.users],\r\n });\r\n case DELETE_USER:\r\n return Object.assign({}, state, {\r\n ...state,\r\n users: state.users.filter(user => user.Email !== action.payload)\r\n\r\n });\r\n case ENABLE_USERS:\r\n return Object.assign({}, state, {\r\n ...state,\r\n users: state.users.map(user => user.Email === action.payload ? {\r\n ...user,\r\n Enabled: true\r\n } : user\r\n )\r\n });\r\n case DISABLE_USERS:\r\n return Object.assign({}, state, {\r\n ...state,\r\n users: state.users.map(user => user.Email === action.payload ? {\r\n ...user,\r\n Enabled: false\r\n } : user\r\n )\r\n });\r\n case ADD_USER_TO_GROUP:\r\n return Object.assign({}, state, {\r\n ...state,\r\n users: state.users.map(user => user.Email === action.Email ? {\r\n ...user,\r\n Role: action.role\r\n } : user\r\n )\r\n });\r\n case SET_ADMINS:\r\n return Object.assign({}, state, {\r\n admins: action.payload,\r\n });\r\n case SET_VIEWERS:\r\n return Object.assign({}, state, {\r\n viewers: action.payload,\r\n });\r\n case SET_EDITS:\r\n return Object.assign({}, state, {\r\n edits: action.payload,\r\n });\r\n\r\n default:\r\n break;\r\n }\r\n return state;\r\n}\r\n\r\nexport default userList;","import {\r\n CREATE_TASK,\r\n EXISTING_TASK,\r\n REMOVE_TASK,\r\n REMOVE_NODE,\r\n UPDATE_TASK,\r\n UPDATE_NODE,\r\n ADD_COLOUR,\r\n LOADED_MODELS,\r\n LOADED_LEVELS,\r\n} from \"../constants/action_types\";\r\n\r\nconst initialState = {\r\n task: [],\r\n};\r\nexport function tasksreducers(state = initialState, action) {\r\n switch (action.type) {\r\n case CREATE_TASK:\r\n return Object.assign({}, state, {\r\n task: action.task,\r\n });\r\n case EXISTING_TASK:\r\n return Object.assign({}, state, {\r\n task: action.task,\r\n });\r\n case REMOVE_TASK:\r\n return Object.assign({}, state, {\r\n task: Object.assign([], action.task),\r\n });\r\n case REMOVE_NODE:\r\n return Object.assign({}, state, {\r\n task: Object.assign([], action.task),\r\n });\r\n case UPDATE_TASK:\r\n return Object.assign({}, state, {\r\n task: Object.assign([], action.task),\r\n });\r\n case UPDATE_NODE:\r\n return Object.assign({}, state, {\r\n task: Object.assign([], action.task),\r\n });\r\n case ADD_COLOUR:\r\n return Object.assign({}, state, {\r\n task: Object.assign([], action.task),\r\n });\r\n default:\r\n return state;\r\n }\r\n}\r\nexport function loadedModelsReducer(state = [], action) {\r\n switch (action.type) {\r\n case LOADED_MODELS:\r\n var loadedModels = [...state, { ...action.loadedModels }];\r\n return [loadedModels[loadedModels.length - 1]];\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nexport function loadedLevelReducer(state = [], action) {\r\n switch (action.type) {\r\n case LOADED_LEVELS:\r\n var loadedLevels = [...state, { ...action.loadedLevels }];\r\n return [loadedLevels[loadedLevels.length - 1]];\r\n default:\r\n return state;\r\n }\r\n}\r\n","import {\r\n SELECTED_POINT_CLOUD_MODELS\r\n } from \"../constants/action_types\";\r\n\r\n const initialState = {\r\n selectedPointCloudModels: []\r\n };\r\n\r\nexport function pointCloudModelsReducer(state = initialState, action) {\r\n switch (action.type) {\r\n case SELECTED_POINT_CLOUD_MODELS: {\r\n return Object.assign({}, state, {\r\n selectedPointCloudModels: Object.assign([], action.selectedPointCloudModels)\r\n });\r\n }\r\n default:\r\n return state;\r\n }\r\n}","import {\r\n GET_LOGIN_INFO,\r\n GET_AVAILABLE_SITES,\r\n GET_AVAILABLE_BLUEPRINT,\r\n GET_ZONE_FOR_BLUEPRINT,\r\n GET_WORKER_DETAILS,\r\n USER_lOGGED_IN\r\n \r\n } from '../constants/action_types';\r\n \r\n const initialState = {\r\n wakeCapLoginAPIData: {},\r\n wakeCapAvailableSitesForUser: {},\r\n wakeCapAvailableBluePrintForSite: {},\r\n wakeCapZoneForBluePrint : {},\r\n wakeCapWorkerDetailsForSite: {},\r\n wakeCapLoginStatus:{}\r\n };\r\n \r\n function wakeCapData(state = initialState, action) {\r\n switch (action.type) {\r\n case GET_LOGIN_INFO:\r\n \r\n return Object.assign({}, state, {\r\n wakeCapLoginAPIData: action.wakeCapLoginInfo,\r\n });\r\n \r\n case GET_AVAILABLE_SITES:\r\n\r\n return Object.assign({}, state, {\r\n wakeCapAvailableSitesForUser: action.wakeCapAvailableSitesForUser,\r\n });\r\n\r\n case GET_AVAILABLE_BLUEPRINT:\r\n\r\n return Object.assign({}, state, {\r\n wakeCapAvailableBluePrintForSite: action.wakeCapAvailableBlueprintsForSite,\r\n });\r\n\r\n case GET_ZONE_FOR_BLUEPRINT:\r\n\r\n return Object.assign({}, state, {\r\n wakeCapZoneForBluePrint: action.wakeCapZoneForBlueprint,\r\n });\r\n\r\n case GET_WORKER_DETAILS:\r\n\r\n return Object.assign({}, state, {\r\n wakeCapWorkerDetailsForSite: action.wakeCapWorkerDetailsForSite,\r\n });\r\n\r\n case USER_lOGGED_IN:\r\n \r\n return Object.assign({}, state, {\r\n wakeCapLoginStatus: action.wakecapLogin,\r\n });\r\n\r\n default:\r\n break;\r\n }\r\n return state;\r\n }\r\n \r\n export default wakeCapData;","export { default as componentSizes } from \"./ComponentResizeReducer\";\r\nexport { default as projects } from \"./ProjectsReducer\";\r\nexport { default as common } from \"./CommonReducer\";\r\nexport { default as userList } from \"./UsersReducer\";\r\nexport {\r\n tasksreducers as tasks,\r\n loadedModelsReducer as loadedModels,\r\n loadedLevelReducer as loadedLevels\r\n} from \"./TimelinerReducer\";\r\nexport { pointCloudModelsReducer as selectedPointCloudModels } from \"./PointCloudModelsReducer\";\r\nexport { default as wakeCapData} from \"./WakeCapDataReducer\";\r\n","//user sign in action\r\nexport const SIGN_IN = \"SIGN_IN\";\r\nexport const NOTIFY = \"NOTIFY\";\r\nexport const UPDATE_USERDATA = \"UPDATE_USERDATA\";\r\nexport const IS_PUBLIC_URL = \"IS_PUBLIC_URL\";\r\n\r\n//user setting action\r\n\r\nexport const SET_ROLES = \"SET_GROUPS\";\r\nexport const CREATE_USER = \"CREATE_USER\";\r\nexport const DELETE_USER = \"DELETE_USER\";\r\nexport const SET_USERS = \"SET_USERS\";\r\nexport const DISABLE_USERS = \"DISABLE_USERS\";\r\nexport const ENABLE_USERS = \"constantName\";\r\nexport const ADD_USER_TO_GROUP = \"ADD_USER_TO_GROUP\";\r\nexport const SET_VIEWERS = \"SET_VIEWERS\";\r\nexport const SET_EDITS = \"SET_EDITS\";\r\nexport const SET_ADMINS = \"SET_ADMINS\";\r\n//project actions\r\nexport const ADD_PROJECTS_TO_LIST = \"ADD_PROJECTS_TO_LIST\";\r\nexport const REPLACE_PROJECT_LIST = \"REPLACE_PROJECT_LIST\";\r\nexport const REPLACE_SEARCH_PROJECT_LIST = \"REPLACE_SEARCH_PROJECT_LIST\";\r\nexport const OPEN_PROJECT = \"OPEN_PROJECT\";\r\nexport const CLOSE_PROJECT = \"CLOSE_PROJECT\";\r\nexport const UPDATE_PROJECT = \"UPDATE_PROJECT\";\r\nexport const UPDATE_LASTEVALKEY = \"UPDATE_LASTEVALKEY\";\r\nexport const DELETE_PROJECT = \"DELETE_PROJECT\";\r\nexport const ADD_PROJECT = \"ADD_PROJECT\";\r\nexport const ADD_AEC_DATA = \"ADD_AEC_DATA\";\r\nexport const SET_LEVEL = \"SET_LEVEL\";\r\nexport const CLEANUP_PROJECT_STORE = \"CLEANUP_PROJECT_STORE\";\r\nexport const REPLACE_PROJECT = \"REPLACE_PROJECT\";\r\n\r\n// resize actions\r\nexport const HEADER_RESIZE = \"HEADER_RESIZE\";\r\nexport const FOOTER_RESIZE = \"FOOTER_RESIZE\";\r\nexport const PROJECT_ACTION_VIEW_RESIZE = \"PROJECT_ACTION_VIEW_RESIZE\";\r\nexport const PROJECT_WORKSPACE_ACTION_VIEW_RESIZE =\r\n \"PROJECT_WORKSPACE_ACTION_VIEW_RESIZE\";\r\nexport const WINDOW_RESIZE = \"WINDOW_RESIZE\";\r\n\r\n//Timeliner action\r\nexport const CREATE_TASK = \"CREATE_TASK\";\r\nexport const EXISTING_TASK = \"EXISTING_TASK\";\r\nexport const REMOVE_TASK = \"REMOVE_TASK\";\r\nexport const REMOVE_NODE = \"REMOVE_NODE\";\r\nexport const LOAD_EXISTING_TASK = \"LOAD_EXISTING_TASK\";\r\nexport const UPDATE_TASK = \"UPDATE_TASK\";\r\nexport const UPDATE_NODE = \"UPDATE_NODE\";\r\nexport const ADD_COLOUR = \"ADD_COLOUR\";\r\nexport const LOADED_MODELS = \"LOADED_MODELS\";\r\nexport const LOADED_LEVELS = \"LOADED_LEVELS\";\r\n\r\n//Point Cloud Models actions\r\nexport const SELECTED_POINT_CLOUD_MODELS = \"SELECTED_POINT_CLOUD_MODELS\";\r\n\r\n//Wake Cap actions\r\nexport const GET_LOGIN_INFO = \"GET_LOGIN_INFO\";\r\nexport const GET_AVAILABLE_SITES = \"GET_AVAILABLE_SITES\";\r\nexport const GET_AVAILABLE_BLUEPRINT = \"GET_AVAILABLE_BLUEPRINT\";\r\nexport const GET_ZONE_FOR_BLUEPRINT = \"GET_ZONE_FOR_BLUEPRINT\";\r\nexport const GET_WORKER_DETAILS = \"GET_WORKER_DETAILS\";\r\nexport const USER_lOGGED_IN = \"GET_lOGIN_sTATUS\";\r\n","import React, { Component } from 'react';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MuiDialogActions from '@material-ui/core/DialogActions';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport PropTypes from 'prop-types';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { withStyles } from '@material-ui/core/styles';\r\n\r\nconst DialogTitle = withStyles(theme => ({\r\n root: {\r\n borderBottom: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0\r\n },\r\n}))(props => {\r\n const { children, classes } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles(() => ({\r\n root: {\r\n margin: 0,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst DialogActions = withStyles(theme => ({\r\n root: {\r\n borderTop: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n padding: theme.spacing(1)\r\n },\r\n}))(MuiDialogActions);\r\n\r\nclass WarningDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n }\r\n }\r\n\r\n show() {\r\n this.setState({ open: true, });\r\n }\r\n\r\n _close() {\r\n if (!this.state.uploadInProgress) {\r\n this.setState({ open: false });\r\n }\r\n }\r\n\r\n _handleYes() {\r\n this._close();\r\n if (this.props.yesCB) {\r\n this.props.yesCB();\r\n }\r\n }\r\n\r\n _handleNo() {\r\n this._close();\r\n if (this.props.noCB) {\r\n this.props.noCB();\r\n }\r\n }\r\n\r\n render() {\r\n const { title, message, yesBtnName, noBtnName } = this.props;\r\n let _title = (title !== undefined) ? title : \"Warning Dialog\";\r\n let _message = (message !== undefined) ? message : \"Warning message\";\r\n let _yesBtnName = (yesBtnName !== undefined) ? yesBtnName : \"Yes\";\r\n let _noBtnName = (noBtnName !== undefined) ? noBtnName : \"No\";\r\n return (\r\n { this._close() }}\r\n aria-labelledby=\"customized-dialog-title\"\r\n open={this.state.open}\r\n >\r\n { this.handleClose() }}>\r\n {_title}\r\n \r\n \r\n \r\n {_message}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\nWarningDialog.propTypes = {\r\n title: PropTypes.string,\r\n message: PropTypes.string,\r\n yesCB: PropTypes.func,\r\n noCB: PropTypes.func,\r\n yesBtnName: PropTypes.string,\r\n noBtnName: PropTypes.string\r\n};\r\n\r\nexport default WarningDialog","import React, { Component, Fragment } from 'react';\r\n\r\nimport PropTypes from 'prop-types';\r\n\r\nclass Privileged extends Component {\r\n render() {\r\n let { roles, children } = this.props;\r\n return (\r\n \r\n {roles.indexOf('Admins') > -1 || roles.indexOf('Edit') > -1 ? children : null}\r\n \r\n )\r\n }\r\n}\r\n\r\nPrivileged.propTypes = {\r\n roles: PropTypes.array,\r\n children: PropTypes.any\r\n};\r\n\r\nexport default Privileged;","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n \r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated pre-cached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been pre-cached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch({\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import * as AmazonCognitoIdentity from \"amazon-cognito-identity-js\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\n\r\nimport AWS from \"aws-sdk\";\r\nimport Utils from \"../core/Utils\";\r\n//let ForgeSDK = require('forge-apis');\r\nclass AWSServices {\r\n /**\r\n * AWS Services Constructor\r\n * @param _auth - Auth object\r\n */\r\n constructor(_auth) {\r\n this._auth = _auth;\r\n this._dynamoDb = new AWS.DynamoDB();\r\n\r\n this.getThumbnail = this.getThumbnail.bind(this);\r\n this.changePassword = this.changePassword.bind(this);\r\n this.getLoggedInUserProfile = this.getLoggedInUserProfile.bind(this);\r\n this.deleteObjects = this.deleteObjects.bind(this);\r\n this.deletePointCloudObject = this.deletePointCloudObject.bind(this);\r\n this.emptyPotreeFileFolder = this.emptyPotreeFileFolder.bind(this);\r\n this.updateUserAttributes = this.updateUserAttributes.bind(this);\r\n this.createUser = this.createUser.bind(this);\r\n\r\n this.registerAppBoundle = this.registerAppBoundle.bind(this);\r\n this.createAliasForAppBundle = this.createAliasForAppBundle.bind(this);\r\n this.updateExistingAppBundle = this.updateExistingAppBundle.bind(this);\r\n this.createActivity = this.createActivity.bind(this);\r\n this.createAliasForActivity = this.createAliasForActivity.bind(this);\r\n this.updateExistingActivity = this.updateExistingActivity.bind(this);\r\n\r\n this.createBucket = this.createBucket.bind(this);\r\n this.getBuckets = this.getBuckets.bind(this);\r\n this.uploadInputFileOSS = this.uploadInputFileOSS.bind(this);\r\n this.getTempUploadUrl = this.getTempUploadUrl.bind(this);\r\n this.getTempDownloadUrl = this.getTempDownloadUrl.bind(this);\r\n this.createWorkItem = this.createWorkItem.bind(this);\r\n this.deleteTranslation = this.deleteTranslation.bind(this);\r\n this.statusOfWorkItem = this.statusOfWorkItem.bind(this);\r\n this.AddUserOrganization = this.AddUserOrganization.bind(this);\r\n }\r\n\r\n /**\r\n * Put single item in DynamoDb\r\n * @param params\r\n */\r\n putItem(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.put(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get specific item from dynamoDb table\r\n * @param params\r\n */\r\n getItem(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.get(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data.Item);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Batch get Items\r\n * @param params\r\n */\r\n batchGetItems(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.batchGet(params, (err, data) => {\r\n if (err) {\r\n console.log(\"Error in getting batch items \", err);\r\n return reject(err);\r\n } else {\r\n return resolve(\r\n data.Responses[constants[Environment].projectsTableName]\r\n );\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\"Error in validating \", err);\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Batch delete items\r\n * @param items\r\n * @param config\r\n */\r\n batchDelete(items, config) {\r\n let itemsToDelete = [];\r\n\r\n for (const item of items) {\r\n itemsToDelete.push({\r\n DeleteRequest: {\r\n Key: item,\r\n },\r\n });\r\n }\r\n\r\n let params = {\r\n RequestItems: {},\r\n };\r\n\r\n params.RequestItems[config.TableName] = itemsToDelete;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.batchWrite(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Batch Write items\r\n * @param config\r\n * @param items\r\n */\r\n batchWrite(config, items) {\r\n let itemsToWrite = [];\r\n\r\n for (const item of items) {\r\n itemsToWrite.push({\r\n PutRequest: {\r\n Item: item,\r\n },\r\n });\r\n }\r\n\r\n let params = {\r\n RequestItems: {},\r\n };\r\n\r\n params.RequestItems[config.TableName] = itemsToWrite;\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.batchWrite(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Scan items from dynamoDb. Use only for searching\r\n * @param params\r\n */\r\n scanAllItems(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.scan(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data.Items);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Query items from dynamoDb\r\n * @param params\r\n */\r\n queryAllItems(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient({\r\n dynamoDbCrc32: false,\r\n });\r\n docClient.query(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n let dataToReturn = {};\r\n dataToReturn.Items = data.Items;\r\n if (data.LastEvaluatedKey) {\r\n dataToReturn.LastEvaluatedKey = data.LastEvaluatedKey;\r\n }\r\n return resolve(dataToReturn);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Update item in dynamoDb. Limitation works only for set operation\r\n * @param tableName\r\n * @param keyVal\r\n * @param attributes\r\n * @param values\r\n */\r\n updateItem(tableName, keyVal, attributes, values) {\r\n let params = {\r\n Key: keyVal,\r\n TableName: tableName,\r\n ExpressionAttributeNames: {},\r\n ExpressionAttributeValues: {},\r\n };\r\n\r\n let rootProjectList = [];\r\n\r\n for (let i = 0; i < attributes.length; i++) {\r\n let keys = attributes[i].split(\".\");\r\n let pathHash = [];\r\n\r\n for (let j = 0; j < keys.length; j++) {\r\n const key = keys[j];\r\n pathHash.push(\"#\" + key);\r\n params.ExpressionAttributeNames[\"#\" + key] = key;\r\n params.ExpressionAttributeValues[\":val\" + i] = values[i];\r\n }\r\n\r\n let projection = pathHash.join(\".\") + \"= :val\" + i;\r\n rootProjectList.push(projection);\r\n }\r\n params.UpdateExpression = \"set \" + rootProjectList.join(\",\");\r\n\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let docClient = new AWS.DynamoDB.DocumentClient();\r\n docClient.update(params, (err, data) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(data);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n savePublicSharedDataToS3(project, orgId) {\r\n var obj = JSON.stringify(project.Data);\r\n let blob = new Blob([obj], { type: \"text/plain\" });\r\n var json = new File([blob], project.Project_Id + \".json\");\r\n let param = {\r\n Bucket: \"publicsharedprojectbucket\",\r\n Key: project.Project_Id + \".json\",\r\n Body: json,\r\n orgId,\r\n };\r\n this.uploadJson(param)\r\n .then((link) => {\r\n this.updateItem(\r\n \"PublicSharedProjects\",\r\n {\r\n Project_Id: project.Project_Id,\r\n },\r\n [\"StorageLink\"],\r\n [link]\r\n )\r\n .then(() => {})\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n saveProjectDataToS3(project, orgId) {\r\n var obj = JSON.stringify(project.Data);\r\n let blob = new Blob([obj], { type: \"text/plain\" });\r\n var json = new File([blob], project.Project_Id + \".json\");\r\n let param = {\r\n Bucket: constants[Environment].projectsTableBucketName,\r\n Key: project.Project_Id + \".json\",\r\n Body: json,\r\n orgId,\r\n };\r\n this.uploadJson(param)\r\n .then((link) => {\r\n this.updateItem(\r\n constants[Environment].projectsTableName,\r\n {\r\n Project_Id: project.Project_Id,\r\n },\r\n [\"StorageLink\"],\r\n [link]\r\n )\r\n .then(() => {\r\n if (project.SharedPublicly) {\r\n this.savePublicSharedDataToS3(project, orgId);\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n uploadJson(param) {\r\n return new Promise((resolve, reject) => {\r\n this._auth.validate().then(() => {\r\n new AWS.S3().upload(param).send((err, data) => {\r\n if (err) {\r\n reject(err);\r\n }\r\n resolve(data.Location);\r\n });\r\n });\r\n });\r\n }\r\n\r\n\r\n saveLoggerDataToS3(fileId, project) {\r\n let projectData = project.Data.Files;\r\n for (let file in projectData){\r\n if(fileId === projectData[file].fileId){\r\n var template = `Filename : ${projectData[file].fileName}\\nProject Name: ${project.Project_Name}\\nCategory: ${projectData[file].category}\\nTranslation Status: ${projectData[file].Status}\\nUploadedBy: ${projectData[file].uploadedBy}\\nLast Modified: ${new Date().toLocaleString()}` ;\r\n let blob = new Blob([template], { type: \"text/plain\" });\r\n var txtData = new File([blob], fileId + \".txt\");\r\n let param = {\r\n Bucket: constants[Environment].projectLogBucketName,\r\n Key: fileId + \".txt\",\r\n Body: txtData\r\n };\r\n this.uploadLog(param)\r\n .then((link) => {\r\n console.log('Log Updated')\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n }); \r\n }\r\n }\r\n \r\n }\r\n\r\n uploadLog(param) {\r\n return new Promise((resolve, reject) => {\r\n this._auth.validate().then(() => {\r\n new AWS.S3().upload(param).send((err, data) => {\r\n if (err) {\r\n reject(err);\r\n }\r\n resolve(data.Location);\r\n });\r\n });\r\n });\r\n }\r\n\r\n getProjectDataFromS3(project) {\r\n return new Promise((resolve, reject) => {\r\n let request = (path) =>\r\n fetch(path)\r\n .then((response) =>\r\n response.status !== 404 ? response.json() : null\r\n )\r\n .then((data) => {\r\n if (data !== null) {\r\n project.Data = data;\r\n }\r\n resolve(project);\r\n })\r\n .catch((err) => {\r\n console.log(\"Error getting project data from S3 \", err);\r\n reject();\r\n });\r\n if (project.StorageLink !== undefined || project.StorageLink !== null) {\r\n const key = project.Project_Id + \".json\";\r\n let params = {\r\n Bucket: constants[Environment].projectsTableBucketName,\r\n Key: key,\r\n Expires: 864000,\r\n };\r\n this.getS3ObjectPreSignedURL(params)\r\n .then((fileURL) => {\r\n request(fileURL).catch((err) => {\r\n console.error(\"Error getting fileURL \", err);\r\n reject();\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\"Error getting S3 object pre signed URL \", err);\r\n reject();\r\n });\r\n } else {\r\n resolve(project);\r\n }\r\n });\r\n }\r\n /**\r\n * Upload object to s3 bucket\r\n * @param data\r\n * @param progressCB\r\n */\r\n uploadObject(data, progressCB) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let param = {\r\n Bucket: data.BucketName,\r\n Key: data.Key,\r\n Body: data.File,\r\n orgId: data.orgId,\r\n };\r\n\r\n new AWS.S3()\r\n .upload(param)\r\n .on(\"httpUploadProgress\", (event) => {\r\n if (progressCB) {\r\n const pgs = (event.loaded / event.total) * 100;\r\n progressCB(pgs >= 100 ? 100 : pgs);\r\n }\r\n })\r\n .send((err) => {\r\n if (err) {\r\n reject(err);\r\n }\r\n this.uploadObjectToAdskBucket(\r\n param.Key,\r\n param.orgId,\r\n data.uploadBy,\r\n data.DisplayFileName,\r\n data.Region\r\n )\r\n .then((resultData) => {\r\n resolve(resultData);\r\n console.log(\"Uploaded to adsk bucket \", resultData);\r\n })\r\n .catch((error) => {\r\n reject(error);\r\n console.log(\"Error uploading to adsk bucket \", error);\r\n });\r\n resolve();\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\"Error uploading object \", err);\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Upload Point Cloud file to s3 bucket\r\n * @param data\r\n * @param progressCB\r\n */\r\n uploadPointCloudObject(data, progressCB) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let param = {\r\n Bucket: data.BucketName,\r\n Key: data.Key,\r\n Body: data.File,\r\n orgId: data.orgId,\r\n };\r\n\r\n new AWS.S3()\r\n .upload(param)\r\n .on(\"httpUploadProgress\", (event) => {\r\n if (progressCB) {\r\n const pgs = (event.loaded / event.total) * 100;\r\n progressCB(pgs);\r\n }\r\n })\r\n .send((err) => {\r\n if (err) {\r\n reject(err);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Upload object to adsk bucket\r\n * @param fileId\r\n */\r\n uploadObjectToAdskBucket(fileId, orgId, uploadBy, displayFileName, region) {\r\n let token = this._auth.accessToken;\r\n\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n\r\n fetch(\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/upload-file`,\r\n // `http://localhost:5001/upload-file`,\r\n // `https://5s9s2mxem7.execute-api.us-east-1.amazonaws.com/dev2/upload-file`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({\r\n orgId,\r\n fileKey: fileId,\r\n uploadBy,\r\n displayFileName,\r\n stage,\r\n region,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n console.log(\"Successful adsk upload fetch\", data);\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n console.log(\"Error in upload to adsk bucket fetch \", err);\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete file from ADSK bucket\r\n * @param fileId\r\n */\r\n deleteFileFromADSKBucket(fileId) {\r\n let token = this._auth.accessToken;\r\n\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n // `http://localhost:5001/delete-file?key=${fileId}`,\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/delete-file?key=${fileId}`,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((data) => {\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Download file from ADSK bucket\r\n * @param fileId\r\n */\r\n downloadFromAdskBucket(fileId) {\r\n let token = this._auth.accessToken;\r\n\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/download-file?key=${fileId}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get thumbnail from forge\r\n * @param urn\r\n */\r\n getThumbnail(urn) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/modelderivative/v2/designdata/${urn}/thumbnail?width=400&height=400`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n },\r\n mode: \"cors\",\r\n }\r\n )\r\n .then((response) => {\r\n const reader = response.body.getReader();\r\n reader.read().then(({ done, value }) => {\r\n if (done) {\r\n return resolve(value);\r\n }\r\n return resolve(value);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n })\r\n .catch(() => {});\r\n });\r\n }\r\n\r\n /**\r\n * Get forge Token\r\n */\r\n getForgeToken() {\r\n let token = this._auth.accessToken;\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/get-token`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((items) => {\r\n resolve(items.access_token.access_token);\r\n })\r\n .catch((err) => {\r\n console.log(\"error\", err);\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete single file from s3 bucket\r\n * @param params\r\n * @param deleteFromAdskBucket\r\n */\r\n deleteObject(params, deleteFromAdskBucket = false) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n new AWS.S3().deleteObject(params, (err) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n if (deleteFromAdskBucket) {\r\n this.deleteFileFromADSKBucket(params.Key)\r\n .then((data) => {\r\n return resolve(data);\r\n })\r\n .catch((error) => {\r\n return reject(error);\r\n });\r\n } else {\r\n return resolve();\r\n }\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete multiple files from s3 bucket\r\n * @param params\r\n */\r\n deleteObjects(params, deleteFromAdskBucket = false) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n new AWS.S3().deleteObjects(params, (err) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n if (deleteFromAdskBucket) {\r\n for (const object of params.Delete.Objects) {\r\n this.deleteFileFromADSKBucket(object.Key)\r\n .then((data) => {\r\n return resolve(data);\r\n })\r\n .catch((error) => {\r\n return reject(error);\r\n });\r\n }\r\n } else {\r\n return resolve();\r\n }\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete single point cloud file from s3 bucket\r\n * @param params\r\n * @param deleteFromAdskBucket\r\n */\r\n deletePointCloudObject(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n this.emptyPotreeFileFolder(params, (err) => {\r\n if (err) {\r\n console.log(\"Error deleting point cloud files : \", err);\r\n return reject(err);\r\n } else {\r\n return resolve();\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\"Error deleting point cloud files : \", err);\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n emptyPotreeFileFolder(params, callback) {\r\n new AWS.S3().listObjects(params, (err, data) => {\r\n if (err) {\r\n console.log(\"Error deleting point cloud files : \", err);\r\n return callback(err);\r\n }\r\n\r\n if (data.Contents.length === 0) callback();\r\n\r\n let paramstodelete = { Bucket: params.Bucket };\r\n paramstodelete.Delete = { Objects: [] };\r\n\r\n data.Contents.forEach((content) => {\r\n paramstodelete.Delete.Objects.push({ Key: content.Key });\r\n });\r\n\r\n if (data !== null)\r\n new AWS.S3().deleteObjects(paramstodelete, (error, resultData) => {\r\n if (error) {\r\n console.log(\"Error deleting point cloud files : \", error);\r\n return callback(error);\r\n }\r\n if (resultData.Contents && resultData.Contents.length === 1000)\r\n this.emptyPotreeFileFolder(params, callback);\r\n else callback();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Change password\r\n * @param oldPassword\r\n * @param newPassword\r\n */\r\n changePassword(oldPassword, newPassword) {\r\n return new Promise((resolve, reject) => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n this._auth._auth.CognitoUser.getSession((err) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n });\r\n }\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n this._auth._auth.CognitoUser.changePassword(\r\n oldPassword,\r\n newPassword,\r\n (error, result) => {\r\n if (error) {\r\n return reject(error);\r\n }\r\n return resolve(\"call result: \" + result);\r\n }\r\n );\r\n } else {\r\n return reject(\"Internal server error\");\r\n }\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get Cognito user attributes\r\n */\r\n getLoggedInUserProfile() {\r\n return new Promise((resolve, reject) => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n this._auth._auth.CognitoUser.getSession((err) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n });\r\n }\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n this._auth._auth.CognitoUser.getUserAttributes((err, result) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n return resolve(result);\r\n });\r\n } else {\r\n return reject(\"Internal server error\");\r\n }\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Update Cognito user attributes\r\n * @param {*} attributes\r\n */\r\n updateUserAttributes(attributes) {\r\n return new Promise((resolve, reject) => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n this._auth._auth.CognitoUser.getSession((err) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n });\r\n }\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n if (this._auth._auth.CognitoUser !== null) {\r\n const attributeList = [];\r\n for (let i = 0; i < attributes.length; i++) {\r\n const attribute = new AmazonCognitoIdentity.CognitoUserAttribute(\r\n attributes[i]\r\n );\r\n attributeList.push(attribute);\r\n }\r\n\r\n this._auth._auth.CognitoUser.updateAttributes(\r\n attributeList,\r\n (err, result) => {\r\n if (err) {\r\n return reject(err);\r\n }\r\n return resolve(result);\r\n }\r\n );\r\n } else {\r\n return reject(\"Internal server error\");\r\n }\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get groups for user\r\n * @param username\r\n */\r\n getGroupsForUser(username) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId /* required */,\r\n Username: username /* required */,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminListGroupsForUser(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get file translation status from forge\r\n * @param fileId\r\n */\r\n getFileTranslationStatus(fileId) {\r\n let token = this._auth.accessToken;\r\n let urn = Utils.getFileURN(fileId);\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/get-translation-progress?urn=${urn}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n // console.log(\"get translation status\", data.Manifest_details.body);\r\n resolve(data.Manifest_details.body);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n }); \r\n });\r\n }\r\n\r\n //\r\n /**\r\n * Upload object to s3 bucket\r\n * @param data\r\n */\r\n uploadObjectToS3(data) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n let params = {\r\n Bucket: data.BucketName,\r\n Key: data.Key,\r\n Body: data.File,\r\n };\r\n\r\n new AWS.S3().putObject(params, (err, rdata) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(rdata);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Returns per signed url for getObject operation only\r\n * @param params\r\n */\r\n getS3ObjectPreSignedURL(params) {\r\n return new Promise((resolve, reject) => {\r\n this._auth\r\n .validate()\r\n .then(() => {\r\n new AWS.S3().getSignedUrl(\"getObject\", params, (err, url) => {\r\n if (err) {\r\n return reject(err);\r\n } else {\r\n return resolve(url);\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Add given user email to given group\r\n * @param {string} userEmail\r\n * @param {string} group\r\n */\r\n addUserToGroup(userEmail, group) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n GroupName: group,\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminAddUserToGroup(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n console.log(\"user added to group successfully\", group);\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n setDefaultProject(user, subSettingsData) {\r\n let currentDateOnly = new Date().getTime();\r\n const projectsTableName =\r\n constants[Environment].UserPoolId === \"us-east-1_MmPgaDtdY\"\r\n ? \"Projects\"\r\n : \"Prod-Projects\";\r\n this.getProjectFromDB(\r\n user,\r\n projectsTableName,\r\n currentDateOnly,\r\n subSettingsData\r\n );\r\n }\r\n\r\n getProjectFromDB(user, projectsTableName, currentDateOnly, subSettingsData) {\r\n const pids = subSettingsData.DefaultProjectIds; //Default project ids\r\n pids.forEach(async (pid, index) => {\r\n const params = {\r\n Key: { Project_Id: pid },\r\n TableName: projectsTableName,\r\n };\r\n const newProject = await this.getItem(params);\r\n if (newProject) {\r\n let project = newProject;\r\n project.orgId = user.orgId;\r\n project.Creation_Date = currentDateOnly;\r\n project.Data.ProjectOwner = user.userEmail;\r\n //todo get correct thumbnail imge for selected project and set\r\n //project.FeatureImagePath= \"Project Thumbnails/\"+s3Environment+\"/defaultProject/Industrial Bulding.PNG\";\r\n project.Project_Id = user.orgId + \"_defaultproject\" + index;\r\n project.Data.Description = \"This is your default project.\";\r\n\r\n for (let item in project.Data.Files) {\r\n project.Data.Files[item].uploadedBy = user.userEmail;\r\n project.Data.Files[item].uploadtime = currentDateOnly;\r\n }\r\n\r\n const paramsForputItem = {\r\n TableName: projectsTableName,\r\n Item: project,\r\n };\r\n await this.putItem(paramsForputItem);\r\n }\r\n });\r\n }\r\n\r\n AddUserOrganization(user) {\r\n return new Promise(async (resolve, reject) => {\r\n // Add organization in subscription table\r\n const environment =\r\n constants[Environment].UserPoolId === \"us-east-1_MmPgaDtdY\"\r\n ? \"Testing\"\r\n : \"Production\";\r\n let subSettingsParams = {\r\n Key: { Env: environment },\r\n TableName: \"FlairSettings\",\r\n };\r\n const subSettingsData = await this.getItem(subSettingsParams);\r\n const subscriptionTableName =\r\n constants[Environment].UserPoolId === \"us-east-1_MmPgaDtdY\"\r\n ? \"Subscription\"\r\n : \"Prod-Subscription\";\r\n const params = {\r\n TableName: subscriptionTableName,\r\n Item: {\r\n orgId: user.orgId,\r\n active_plan: \"Trial\",\r\n credits: subSettingsData.TrialCredits,\r\n payment_history: [\r\n {\r\n credits_added: subSettingsData.TrialCredits,\r\n date: new Date().getTime(),\r\n payment_email: user.userEmail,\r\n plan: \"Trial\",\r\n },\r\n ],\r\n },\r\n };\r\n await this.putItem(params);\r\n this.setDefaultProject(user, subSettingsData);\r\n resolve();\r\n });\r\n }\r\n\r\n /**\r\n * Removes users from given user email from given group\r\n * @param {string} userEmail\r\n * @param {string} group\r\n */\r\n removeUserFromGroup(userEmail, group) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n GroupName: group,\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminRemoveUserFromGroup(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n console.log(\"user removed from \", group, data);\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Disables given user\r\n * @param {string} userEmail\r\n */\r\n disableUser(userEmail) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminDisableUser(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Enables given user\r\n * @param {string} userEmail\r\n */\r\n enableUser(userEmail) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminEnableUser(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Creates user in user pool and also adds it user given group\r\n * @param {Object} user\r\n * @param {string} group\r\n */\r\n createUser(user, group) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: user.userEmail,\r\n DesiredDeliveryMediums: [\"EMAIL\"],\r\n TemporaryPassword: Utils.createUniquePassword(),\r\n UserAttributes: [\r\n {\r\n Name: \"email\",\r\n Value: user.userEmail,\r\n },\r\n {\r\n Name: \"custom:Organization\",\r\n Value: user.organization,\r\n },\r\n {\r\n Name: \"custom:OrgId\",\r\n Value: user.orgId,\r\n },\r\n {\r\n Name: \"email_verified\",\r\n Value: \"true\",\r\n },\r\n ],\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminCreateUser(\r\n params,\r\n (err, dataFromUserCreate) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n this.addUserToGroup(user.userEmail, group)\r\n .then((data) => {\r\n console.log(\"user added to group\", data);\r\n resolve(dataFromUserCreate);\r\n })\r\n .catch((error) => {\r\n reject(error);\r\n });\r\n\r\n this.AddUserOrganization(user)\r\n .then((data) => {\r\n console.log(\"Adding user to organization successful\");\r\n })\r\n .catch((error) => {\r\n console.log(\"Adding user to organization unsuccessful\");\r\n });\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Deletes user from userPool\r\n * @param {string} userEmail\r\n */\r\n deleteUser(userEmail) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminDeleteUser(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Lists groups in user pool\r\n */\r\n listGroups() {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.listGroups(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Lists users in user pool\r\n */\r\n listUsersInPool() {\r\n return new Promise((resolve, reject) => {\r\n let token = this._auth.accessToken;\r\n const orgId = this._auth._idData[\"custom:OrgId\"];\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://oor28w2601.execute-api.us-east-1.amazonaws.com/${stage}/getusers?orgId=${orgId}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((items) => {\r\n resolve({ Users: items });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n getUsersInPool(email) {\r\n return new Promise((resolve, reject) => {\r\n let token = this._auth.accessToken;\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://oor28w2601.execute-api.us-east-1.amazonaws.com/${stage}/getusers?email=${email}`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((items) => {\r\n resolve({ Users: items });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Change Organization name for all users in organization\r\n */\r\n changeOrganizationName(newName) {\r\n return new Promise((resolve, reject) => {\r\n let token = this._auth.accessToken;\r\n const orgId = this._auth._idData[\"custom:OrgId\"];\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n fetch(\r\n `https://oor28w2601.execute-api.us-east-1.amazonaws.com/${stage}/changeorgname`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n body: JSON.stringify({ orgId, orgName: newName }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Gets user attribute for given user email\r\n * @param {string} userEmail\r\n */\r\n getUserAttributes(userEmail) {\r\n return new Promise((resolve, reject) => {\r\n let params = {\r\n UserPoolId: constants[Environment].UserPoolId,\r\n Username: userEmail,\r\n };\r\n const cognitoServiceProvider = new AWS.CognitoIdentityServiceProvider();\r\n cognitoServiceProvider.adminGetUser(params, (err, data) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * List objects inside S3 bucket\r\n * @param {object} data\r\n */\r\n getObjects(data) {\r\n return new Promise((resolve, reject) => {\r\n let param = {\r\n Bucket: data.BucketName,\r\n Delimiter: \"/\",\r\n Prefix: data.folderPath,\r\n };\r\n\r\n new AWS.S3().listObjects(param, (err, rdata) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n const objectKeys = [];\r\n rdata.Contents.forEach((object) => {\r\n objectKeys.push(object.Key);\r\n });\r\n resolve(objectKeys);\r\n }\r\n });\r\n });\r\n }\r\n\r\n sendEmail(params) {\r\n return new AWS.SES({ apiVersion: \"2010-12-01\" })\r\n .sendEmail(params)\r\n .promise();\r\n }\r\n\r\n /**\r\n * List folders inside S3 bucket\r\n * @param {object} data\r\n */\r\n getFolders(data) {\r\n return new Promise((resolve, reject) => {\r\n let param = {\r\n Bucket: data.BucketName,\r\n Delimiter: \"/\",\r\n Prefix: data.folderPath,\r\n };\r\n\r\n new AWS.S3().listObjects(param, (err, rdata) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(rdata.CommonPrefixes);\r\n }\r\n });\r\n });\r\n }\r\n\r\n registerAppBoundle(file) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken().then((data) => {\r\n fetch(`https://developer.api.autodesk.com/da/us-east/v3/appbundles`, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n Id: \"DeleteWallsNewAppBoundle1\",\r\n engine: \"Autodesk.Revit+2020\",\r\n description: \"Delete Walls AppBundle based on Revit 2020\",\r\n }),\r\n })\r\n .then((result) => result.json())\r\n .then((resultData) => {\r\n console.log(\"data\", resultData);\r\n\r\n this.uploadAppBoundle(resultData, file)\r\n .then(() => {})\r\n .catch(() => {});\r\n resolve(resultData);\r\n })\r\n .catch((err) => {\r\n console.log(\"err\", err);\r\n reject(err);\r\n })\r\n .catch(() => {});\r\n });\r\n });\r\n }\r\n uploadAppBoundle(data, file) {\r\n console.log(\"data\", data);\r\n const formData = new FormData();\r\n if (data) {\r\n for (const key in data.uploadParameters.formData) {\r\n formData.append(key, data.uploadParameters.formData[key]);\r\n }\r\n formData.append(`file`, file);\r\n }\r\n return new Promise((resolve, reject) => {\r\n fetch(`${data.uploadParameters.endpointURL}`, {\r\n method: \"POST\",\r\n headers: {\r\n \"Cache-Control\": \"no-cache\",\r\n },\r\n body: formData,\r\n })\r\n .then((resultData) => {\r\n console.log(\"upload bundle\", resultData);\r\n //this.createAliasForAppBundle()\r\n resolve(resultData);\r\n })\r\n .catch((err) => {\r\n console.log(\"upload boundle\", err);\r\n reject(err);\r\n });\r\n });\r\n }\r\n createAliasForAppBundle() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsNewAppBoundle1/aliases`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n version: 1,\r\n id: \"test\",\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((Ndata) => {\r\n console.log(\"alias name\", Ndata);\r\n //this.updateExistingAppBundle();\r\n resolve(Ndata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n updateExistingAppBundle(file) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsNewAppBoundle1/versions`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n id: null,\r\n engine: \"Autodesk.Revit+2020\",\r\n description:\r\n \"Delete Walls AppBundle based on Revit 2020 Update\",\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"updated existing api\", rdata);\r\n this.uploadAppBoundle(rdata, file)\r\n .then((resultData) => {\r\n console.log(\"upload result\", resultData);\r\n })\r\n .catch(() => {});\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n assignExistingAlisetoUpdatedAppBoundle() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/appbundles/DeleteWallsNewAppBoundle1/aliases/test `,\r\n {\r\n method: \"PATCH\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n version: 2,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((resultData) => {\r\n // this.createWorkItem();\r\n console.log(\"create activity api\", resultData);\r\n resolve(resultData);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n createActivity() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(`https://developer.api.autodesk.com/da/us-east/v3/activities`, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n id: \"DeleteWallsNewActivity1\",\r\n commandLine: [\r\n \"$(engine.path)\\\\\\\\revitcoreconsole.exe /i $(args[rvtFile].path) /al $(appbundles[DeleteWallsNewAppBoundle1].path)\",\r\n ],\r\n parameters: {\r\n rvtFile: {\r\n zip: false,\r\n ondemand: false,\r\n verb: \"get\",\r\n description: \"Input Revit model\",\r\n required: true,\r\n localName: \"$(rvtFile)\",\r\n },\r\n result: {\r\n zip: false,\r\n ondemand: false,\r\n verb: \"put\",\r\n description: \"Results\",\r\n required: true,\r\n localName: \"result.rvt\",\r\n },\r\n },\r\n engine: \"Autodesk.Revit+2020\",\r\n appbundles: [\r\n \"V0XRbvF7fj6glAh1PFwcG0s2680gZmTL.DeleteWallsNewAppBoundle1+test\",\r\n ],\r\n description: \"Deletes walls from Revit file.\",\r\n }),\r\n })\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n // this.createWorkItem();\r\n console.log(\"create activity api\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n createAliasForActivity() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/activities/DeleteWallsNewActivity1/aliases `,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n version: 1,\r\n id: \"test\",\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n // this.createWorkItem();\r\n console.log(\"create activity api\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n updateExistingActivity() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/activities/DeleteWallsNewActivity1/versions `,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n id: null,\r\n commandLine: [\r\n \"$(engine.path)\\\\\\\\revitcoreconsole.exe /i $(args[rvtFile].path) /al $(appbundles[DeleteWallsNewAppBoundle1].path)\",\r\n ],\r\n parameters: {\r\n rvtFile: {\r\n zip: false,\r\n ondemand: false,\r\n verb: \"get\",\r\n description: \"Input Revit model\",\r\n required: true,\r\n localName: \"$(rvtFile)\",\r\n },\r\n result: {\r\n zip: false,\r\n ondemand: false,\r\n verb: \"put\",\r\n description: \"Results\",\r\n required: true,\r\n localName: \"result.rvt\",\r\n },\r\n },\r\n engine: \"Autodesk.Revit+2020\",\r\n appbundles: [\r\n \"V0XRbvF7fj6glAh1PFwcG0s2680gZmTL.DeleteWallsNewAppBoundle1+test\",\r\n ],\r\n description: \"Deletes walls from Revit file Updated.\",\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n // this.createWorkItem();\r\n console.log(\"create activity api\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n assignExistingAlisetoUpdatedActivity() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/activities/DeleteWallsNewActivity1/aliases/test `,\r\n {\r\n method: \"PATCH\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n version: 2,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n // this.createWorkItem();\r\n console.log(\"create activity api\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n /**\r\n * create new auto desk bucket\r\n * this is only one time proces\r\n * currently used bucket for delete walls demo is automation-demo-mybucket-01\r\n */\r\n createBucket() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(`https://developer.api.autodesk.com/oss/v2/buckets`, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n bucketKey: \"\",\r\n access: \"full\",\r\n policyKey: \"transient\",\r\n }),\r\n })\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"updated existing api\", rdata);\r\n resolve(data);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n getBuckets() {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(`https://developer.api.autodesk.com/oss/v2/buckets`, {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n }).then((rdata) => {\r\n console.log(\"updated existing api\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n uploadInputFileOSS(file) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/oss/v2/buckets/automation-demo-mybucket-01/objects/${file.name}`,\r\n {\r\n method: \"PUT\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"accept-encoding\": \"gzip, deflate\",\r\n //\"Content-Type\": `application/x-www-form-urlencoded`\r\n },\r\n body: file,\r\n }\r\n )\r\n .then((rdata) => rdata.json())\r\n .then(\r\n (resultData) => console.log(resultData) || resolve(resultData)\r\n )\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n getTempUploadUrl(file) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/oss/v2/buckets/flair-projects/objects/${file}/signed?access=readwrite`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({}),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"temp upload url\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n getTempDownloadUrl(file) {\r\n // console.log(\"temp download file\", file);\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken().then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/oss/v2/buckets/flair-projects/objects/${file}/signed`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({}),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"temp download url\", rdata);\r\n resolve(rdata);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n });\r\n }\r\n createWorkItem(fileId, inputFile, outputFile) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(`https://developer.api.autodesk.com/da/us-east/v3/workitems`, {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n activityId: `V0XRbvF7fj6glAh1PFwcG0s2680gZmTL.DeleteWallsNewActivity1+test`,\r\n arguments: {\r\n rvtFile: {\r\n url: inputFile,\r\n },\r\n result: {\r\n verb: \"put\",\r\n url: outputFile,\r\n },\r\n },\r\n }),\r\n })\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"create work item\", rdata);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n statusOfWorkItem(input, fileId) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/da/us-east/v3/workitems/${input.id} `,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"create activity api\", rdata);\r\n if (rdata.status !== \"success\") {\r\n this.statusOfWorkItem(input, fileId);\r\n }\r\n if (rdata.status === \"success\") {\r\n // //this.deleteTranslation(fileId);// now this function called from lambda\r\n this.deleteFileDervativesFromADSKBucket(fileId).then(() => {\r\n resolve(fileId);\r\n });\r\n // this.getFileTranslation(fileId) // now this function called from lambda\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Delete model file derivatives from ADSK bucket\r\n * @param fileId\r\n */\r\n deleteFileDervativesFromADSKBucket(fileId) {\r\n let token = this._auth.accessToken;\r\n console.log(\"auth token\", token);\r\n let urn = Utils.getFileURN(fileId);\r\n return new Promise((resolve, reject) => {\r\n const stage =\r\n Environment === \"Development\" || Environment === \"Testing\"\r\n ? \"dev\"\r\n : \"prod\";\r\n\r\n fetch(\r\n `https://65gn3ejel9.execute-api.us-east-1.amazonaws.com/${stage}/delete-derivative?urn=${urn}`,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }\r\n )\r\n .then((result) => {\r\n resolve(result);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n /**\r\n * currently not in use\r\n * currently perming this activity from lambda\r\n * @param {*} fileId\r\n */\r\n deleteTranslation(fileId) {\r\n let urnData = Utils.getFileURN(fileId);\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/modelderivative/v2/designdata/${urnData}/manifest`,\r\n {\r\n method: \"DELETE\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"delete model translation\", rdata);\r\n //this.getFileTranslation(fileId);\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n /**\r\n * currently not in use\r\n * currently perming this activity from lambda\r\n * @param {*} fileId\r\n */\r\n getFileTranslation(fileId) {\r\n let urnData = Utils.getFileURN(fileId);\r\n // console.log(\"urn \", urnData);\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/modelderivative/v2/designdata/job`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n body: JSON.stringify({\r\n input: {\r\n urn: urnData,\r\n },\r\n output: {\r\n formats: [\r\n {\r\n type: \"svf\",\r\n views: [\"3d\"],\r\n },\r\n {\r\n type: \"Thumbnail\",\r\n advanced: { width: 400, height: 400 },\r\n },\r\n ],\r\n },\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n this.verifyTranslation(urnData);\r\n console.log(\"get translation\", rdata);\r\n\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n /**\r\n * currently not in use\r\n * currently perming this activity from lambda\r\n * @param {*} fileId\r\n */\r\n verifyTranslation(urnData) {\r\n return new Promise((resolve, reject) => {\r\n this.getForgeToken()\r\n .then((data) => {\r\n fetch(\r\n `https://developer.api.autodesk.com/modelderivative/v2/designdata/${urnData}/manifest`,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: `Bearer ${data}`,\r\n \"Content-Type\": `application/json`,\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((rdata) => {\r\n console.log(\"get translation\", rdata);\r\n if (rdata.progress !== \"complete\") {\r\n this.verifyTranslation(urnData);\r\n }\r\n\r\n resolve(rdata);\r\n });\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n}\r\nexport default AWSServices;\r\n","import * as AmazonCognitoAuth from \"amazon-cognito-auth-js\";\r\nimport * as AmazonCognitoIdentity from \"amazon-cognito-identity-js\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\n\r\nimport AWS from \"aws-sdk\";\r\n\r\nvar userRole = \" \";\r\nclass Auth {\r\n constructor(signInCb, signOutCB) {\r\n this._signInCB = signInCb;\r\n this._signOutCB = signOutCB;\r\n\r\n this._auth = undefined;\r\n this._initCognitoSDK();\r\n\r\n this._authData = undefined;\r\n this._idData = undefined;\r\n this.RTCBResolve = undefined;\r\n this.RTCBReject = undefined;\r\n }\r\n\r\n signIn() {\r\n let curUrl = window.location.href;\r\n this._auth.parseCognitoWebResponse(curUrl);\r\n\r\n if (this._getQueryString(\"code\") === null) {\r\n if (this._auth.getSignInUserSession().accessToken.jwtToken === \"\") {\r\n this._auth.getSession();\r\n } else {\r\n this._configAndSaveAuth();\r\n }\r\n }\r\n this._stripAuthInfoFromUrl();\r\n }\r\n\r\n signOut() {\r\n if (this.isSignedIn) {\r\n this._auth.signOut();\r\n AWS.config.credentials.clearCachedId();\r\n }\r\n }\r\n\r\n get authData() {\r\n return this._authData;\r\n }\r\n\r\n get idData() {\r\n return this._idData;\r\n }\r\n\r\n get isSignedIn() {\r\n const userSession = this._auth.getSignInUserSession();\r\n if (userSession) {\r\n return userSession.accessToken.jwtToken !== \"\";\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n get idToken() {\r\n return this._auth\r\n .getSignInUserSession()\r\n .getIdToken()\r\n .getJwtToken();\r\n }\r\n\r\n get accessToken() {\r\n return this._auth\r\n .getSignInUserSession()\r\n .getAccessToken()\r\n .getJwtToken();\r\n }\r\n\r\n get userInfo() {\r\n if (this.isSignedIn) {\r\n return {\r\n email: this._idData.email,\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n _initCognitoSDK() {\r\n const self = this;\r\n const authData = {\r\n ClientId: constants[Environment].ClientId,\r\n AppWebDomain: constants[Environment].AppWebDomain,\r\n TokenScopesArray: [\r\n \"email\",\r\n \"openid\",\r\n \"profile\",\r\n \"aws.cognito.signin.user.admin\",\r\n ],\r\n RedirectUriSignIn: constants[Environment].RedirectUriSignIn,\r\n RedirectUriSignOut: constants[Environment].RedirectUriSignOut,\r\n UserPoolId: constants[Environment].UserPoolId,\r\n };\r\n this._auth = new AmazonCognitoAuth.CognitoAuth(authData);\r\n this._auth.useCodeGrantFlow();\r\n\r\n //Getting cognito user\r\n const poolData = {\r\n UserPoolId: authData.UserPoolId,\r\n ClientId: authData.ClientId,\r\n };\r\n const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);\r\n this._auth.CognitoUser = userPool.getCurrentUser();\r\n\r\n this._auth.userhandler = {\r\n onSuccess: function() {\r\n self._stripAuthInfoFromUrl();\r\n self._auth.CognitoUser = userPool.getCurrentUser();\r\n //save auth details\r\n self._configAndSaveAuth();\r\n if (self.RTCBResolve) {\r\n self.RTCBResolve();\r\n self.RTCBResolve = undefined;\r\n }\r\n },\r\n onFailure: function(err) {\r\n self.signOut();\r\n if (self.RTCBReject) {\r\n self.RTCBReject(err);\r\n self.RTCBReject = undefined;\r\n }\r\n },\r\n };\r\n if (this._auth.getSignInUserSession().accessToken.jwtToken !== \"\") {\r\n this._authData = this._parseJwt(\r\n this._auth.getSignInUserSession().accessToken.jwtToken\r\n );\r\n }\r\n }\r\n\r\n _configAndSaveAuth = () => {\r\n this._authData = this._parseJwt(\r\n this._auth.getSignInUserSession().accessToken.jwtToken\r\n );\r\n this._idData = this._parseJwt(\r\n this._auth.getSignInUserSession().idToken.jwtToken\r\n );\r\n AWS.config.region = \"us-east-1\"; // Region\r\n AWS.config.credentials = new AWS.CognitoIdentityCredentials({\r\n IdentityPoolId: constants[Environment].IdentityPoolId,\r\n Logins: {},\r\n });\r\n const _self = this;\r\n AWS.config.credentials.get(function(err) {\r\n if (err) {\r\n _self.signOut();\r\n }\r\n });\r\n const loginKey =\r\n \"cognito-idp.us-east-1.amazonaws.com/\" +\r\n constants[Environment].UserPoolId;\r\n const loginVal = this._auth.getSignInUserSession().idToken.jwtToken;\r\n AWS.config.credentials.params.Logins[loginKey] = loginVal;\r\n\r\n if (this._signInCB) {\r\n this._signInCB(this);\r\n }\r\n };\r\n\r\n _parseJwt(token) {\r\n var base64Url = token.split(\".\")[1];\r\n var base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n return JSON.parse(window.atob(base64));\r\n }\r\n\r\n _stripAuthInfoFromUrl() {\r\n if (this._getQueryString(\"code\") !== undefined) {\r\n window.history.replaceState(\r\n {},\r\n document.title,\r\n window.location.origin + window.location.pathname\r\n );\r\n }\r\n }\r\n\r\n _getQueryString(key) {\r\n key = key.replace(/[*+?^$.[\\]{}()|\\\\/]/g, \"\\\\$&\"); // escape RegEx meta chars\r\n let match = window.location.search.match(\r\n new RegExp(\"[?&]\" + key + \"=([^&]+)(&|$)\")\r\n );\r\n return match && decodeURIComponent(match[1].replace(/\\+/g, \"+\"));\r\n }\r\n\r\n validate() {\r\n let self = this;\r\n return new Promise((resolve, reject) => {\r\n if (self._auth.getSignInUserSession().isValid()) {\r\n resolve();\r\n } else {\r\n self.RTCBResolve = resolve;\r\n self.RTCBReject = reject;\r\n self._auth.getSession();\r\n }\r\n });\r\n }\r\n\r\n get role() {\r\n if (\r\n this._authData[\"cognito:groups\"] &&\r\n this._authData[\"cognito:groups\"][0]\r\n ) {\r\n return this._authData[\"cognito:groups\"][0];\r\n }\r\n return \"\";\r\n }\r\n\r\n isViewer() {\r\n if (this._authData[\"cognito:groups\"]) {\r\n if (\r\n this._authData[\"cognito:groups\"][0] === \"Admins\" ||\r\n this._authData[\"cognito:groups\"][0] === \"Viewers\" ||\r\n this._authData[\"cognito:groups\"][0] === \"Edit\"\r\n ) {\r\n userRole = this._authData[\"cognito:groups\"][0];\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n deleteAllCookies() {\r\n var cookies = window.document.cookie.split(\";\");\r\n\r\n for (var i = 0; i < cookies.length; i++) {\r\n var cookie = cookies[i];\r\n var eqPos = cookie.indexOf(\"=\");\r\n var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\r\n window.document.cookie = name + \"=;expires=Thu, 01 Jan 1970 00:00:00 GMT\";\r\n }\r\n }\r\n}\r\n\r\nexport function GetUserRole() {\r\n return userRole;\r\n}\r\n\r\nexport default Auth;\r\n","import * as Actions from \"../redux/actions\";\r\n\r\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport ErrorIcon from \"@material-ui/icons/Error\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport InfoIcon from \"@material-ui/icons/Info\";\r\nimport PropTypes from \"prop-types\";\r\nimport React from \"react\";\r\nimport Snackbar from \"@material-ui/core/Snackbar\";\r\nimport SnackbarContent from \"@material-ui/core/SnackbarContent\";\r\nimport WarningIcon from \"@material-ui/icons/Warning\";\r\nimport amber from \"@material-ui/core/colors/amber\";\r\nimport classNames from \"classnames\";\r\nimport { connect } from \"react-redux\";\r\nimport green from \"@material-ui/core/colors/green\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\nconst variantIcon = {\r\n success: CheckCircleIcon,\r\n warning: WarningIcon,\r\n error: ErrorIcon,\r\n info: InfoIcon,\r\n};\r\n\r\nconst styles1 = (theme) => ({\r\n success: {\r\n backgroundColor: green[600],\r\n },\r\n error: {\r\n backgroundColor: theme.palette.error.dark,\r\n },\r\n info: {\r\n backgroundColor: theme.palette.primary.dark,\r\n },\r\n warning: {\r\n backgroundColor: amber[700],\r\n },\r\n icon: {\r\n fontSize: 20,\r\n },\r\n iconVariant: {\r\n opacity: 0.9,\r\n marginRight: theme.spacing(1),\r\n },\r\n message: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n },\r\n});\r\n\r\nfunction MySnackbarContent(props) {\r\n const { classes, className, message, onClose, variant, ...other } = props;\r\n const Icon = variantIcon[variant];\r\n\r\n return (\r\n \r\n \r\n {message}\r\n \r\n }\r\n action={[\r\n \r\n \r\n ,\r\n ]}\r\n {...other}\r\n />\r\n );\r\n}\r\n\r\nMySnackbarContent.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n className: PropTypes.string,\r\n message: PropTypes.node,\r\n onClose: PropTypes.func,\r\n variant: PropTypes.oneOf([\"success\", \"warning\", \"error\", \"info\"]).isRequired,\r\n};\r\n\r\nconst MySnackbarContentWrapper = withStyles(styles1)(MySnackbarContent);\r\n\r\nconst styles2 = (theme) => ({\r\n margin: {\r\n margin: theme.spacing(2),\r\n },\r\n m_t: {\r\n marginTop: theme.spacing(5),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n notify: state.common.notify,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n notifyCall: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\nclass PFSnackbar extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this._lastType = \"\";\r\n }\r\n\r\n handleClose(event, reason) {\r\n if (reason === \"clickAway\") {\r\n return;\r\n }\r\n this.props.notifyCall(undefined);\r\n }\r\n\r\n render() {\r\n let message =\r\n this.props.notify && this.props.notify.message\r\n ? this.props.notify.message\r\n : \"\";\r\n let type =\r\n this.props.notify && this.props.notify.type ? this.props.notify.type : \"\";\r\n let openVal = this.props.notify && message ? true : false;\r\n let hideDuration =\r\n this.props.notify && this.props.notify.time\r\n ? this.props.notify.time\r\n : 6000;\r\n const { classes } = this.props;\r\n if (type !== \"\") {\r\n this._lastType = type;\r\n }\r\n\r\n return (\r\n {\r\n this.ref = ref;\r\n }}\r\n >\r\n {\r\n this.handleClose();\r\n }}\r\n >\r\n {\r\n this.handleClose();\r\n }}\r\n variant={this._lastType}\r\n message={message}\r\n />\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nPFSnackbar.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n notify: PropTypes.object,\r\n notifyCall: PropTypes.func,\r\n};\r\n\r\nconst FSnackbar = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withStyles(styles2)(PFSnackbar));\r\nexport default FSnackbar;\r\n","import React, { Component } from \"react\";\r\n\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport PropTypes from \"prop-types\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { isMobile } from \"react-device-detect\";\r\nimport sizeMe from \"react-sizeme\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\nconst styles = () => ({\r\n root: {\r\n width: \"100vw\",\r\n position: \"absolute\",\r\n bottom: 0\r\n },\r\n appBar: {\r\n alignItems: \"flex-end\"\r\n }\r\n});\r\n\r\nclass PFooter extends Component {\r\n get copyright() {\r\n if (isMobile) {\r\n return (\r\n \r\n © 2024 Copyright, GET-TECH Innovative Solutions Inc. All rights\r\n reserved.\r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n © 2024 Copyright, GET-TECH Innovative Solutions Inc. All rights\r\n reserved.\r\n \r\n );\r\n }\r\n\r\n render() {\r\n //Below code is commented for public home page work\r\n const { classes } = this.props;\r\n return (\r\n
\r\n \r\n {this.copyright}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nPFooter.propTypes = {\r\n appState: PropTypes.object,\r\n classes: PropTypes.object\r\n};\r\n\r\nconst Footer = sizeMe({ monitorHeight: true })(withStyles(styles)(PFooter));\r\nexport default Footer;\r\n","import { Grid, Hidden } from \"@material-ui/core\";\r\nimport React, { Component } from \"react\";\r\n\r\nimport Breadcrumbs from \"@material-ui/core/Breadcrumbs\";\r\nimport Group from \"@material-ui/icons/Group\";\r\nimport HelpIcon from \"@material-ui/icons/Help\";\r\nimport { Link } from \"react-router-dom\";\r\nimport NavigateNextIcon from \"@material-ui/icons/NavigateNext\";\r\nimport NewIcon from \"@material-ui/icons/NoteAdd\";\r\nimport Person from \"@material-ui/icons/Person\";\r\nimport MonetizationOnIcon from '@material-ui/icons/MonetizationOn';\r\nimport PieChart from \"@material-ui/icons/PieChart\";\r\nimport Profile from \"@material-ui/icons/SupervisedUserCircle\";\r\nimport PropTypes from \"prop-types\";\r\nimport ThreeD from \"@material-ui/icons/ThreeDRotation\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport ViewList from \"@material-ui/icons/ViewList\";\r\nimport Workspace from \"@material-ui/icons/Work\";\r\nimport sizeMe from \"react-sizeme\";\r\nimport store from \"../redux/store/store\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\nconst styles = theme => ({\r\n linkDecoration: {\r\n textDecoration: \"none\",\r\n color: \"rgb(255,255,255)\"\r\n },\r\n grow: {\r\n flexGrow: 1\r\n },\r\n linkIcon: {\r\n marginLeft: theme.spacing(1),\r\n marginRight: theme.spacing(1)\r\n }\r\n});\r\n\r\nclass PNavigator extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.unListen = null;\r\n this.state = {\r\n location: null\r\n };\r\n\r\n let { classes } = this.props;\r\n let urlPath = window.location.pathname;\r\n\r\n this.linkNameMap = {\r\n \"/settings\": {\r\n path: \"/settings\",\r\n label: \"Profile Settings\",\r\n icon: \r\n },\r\n \"/project/new\": {\r\n path: \"/\",\r\n label: \"New Project\",\r\n icon: \r\n },\r\n \"/project/workspace\": {\r\n path: \"/project/workspace/:pid\",\r\n label: \"Workspace\",\r\n icon: \r\n },\r\n \"/project/workspace/viewer\": {\r\n path: urlPath,\r\n label: \"Viewer\",\r\n icon: \r\n },\r\n \"/project/settings\": {\r\n path: \"/\",\r\n label: \"Manage Projects\",\r\n icon: \r\n },\r\n \"/user/settings\": {\r\n path: \"/\",\r\n label: \"Manage Users\",\r\n icon: \r\n },\r\n \"/faq\": {\r\n path: \"/faq\",\r\n label: \"FAQ Section\",\r\n icon: \r\n },\r\n \"/analytics\": {\r\n path: \"/analytics\",\r\n label: \"Analytics\",\r\n icon: \r\n },\r\n \"/profile\": {\r\n path: \"/profile\",\r\n label: \"Profile\",\r\n icon: \r\n },\r\n \"/subscription\": {\r\n path: \"/subscription\",\r\n label: \"Subscription Plans\",\r\n icon: \r\n }\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ location: window.location });\r\n this.unListen = this.props.history.listen(location => {\r\n this.setState({ location });\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n this.unListen();\r\n }\r\n\r\n get navList() {\r\n let navList = [];\r\n let { classes } = this.props;\r\n\r\n navList.push(\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n let project = store.getState().projects.currentProject;\r\n\r\n if (this.state.location) {\r\n const pathNames = this.state.location.pathname.split(\"/\").filter(x => x);\r\n\r\n for (let i = 0; i < pathNames.length; i++) {\r\n const to = `/${pathNames.slice(0, i + 1).join(\"/\")}`;\r\n const last =\r\n i === pathNames.length - 2 ||\r\n pathNames.length === 1 ||\r\n i === pathNames.length - 1;\r\n\r\n if (!this.linkNameMap[to] && !last) continue;\r\n\r\n if (this.linkNameMap[to]) {\r\n let path = this.linkNameMap[to].path;\r\n const label = this.linkNameMap[to].label;\r\n const icon = this.linkNameMap[to].icon;\r\n\r\n if (last) {\r\n navList.push(\r\n \r\n {icon}\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n );\r\n break;\r\n } else {\r\n if (path.lastIndexOf(\":pid\") > -1) {\r\n if (project) {\r\n path = path.replace(\":pid\", project.Project_Id);\r\n }\r\n }\r\n\r\n navList.push(\r\n \r\n \r\n {icon}\r\n \r\n \r\n {label}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!project || (project && !project.Project_Id)) {\r\n navList.splice(1, navList.length - 2);\r\n }\r\n\r\n return navList;\r\n }\r\n\r\n render() {\r\n let { classes } = this.props;\r\n let navList = this.navList;\r\n return (\r\n }\r\n arial-label=\"Breadcrumb\"\r\n >\r\n {navList.map((_value, index) => {\r\n return navList[index];\r\n })}\r\n \r\n );\r\n }\r\n}\r\n\r\nPNavigator.propTypes = {\r\n classes: PropTypes.object,\r\n history: PropTypes.object\r\n};\r\n\r\nconst Navigator = sizeMe()(\r\n withRouter(withStyles(styles, { withTheme: true })(PNavigator))\r\n);\r\nexport default Navigator;\r\n","import * as Actions from \"./redux/actions/index\";\r\n\r\nimport { Environment, constants } from \"./config\";\r\nimport { Grid, Hidden } from \"@material-ui/core\";\r\nimport React, { Component, Fragment } from \"react\";\r\n\r\nimport AWSService from \"./core/Aws\";\r\nimport AppBar from \"@material-ui/core/AppBar\";\r\nimport Auth from \"./core/Auth\";\r\nimport Avatar from \"@material-ui/core/Avatar\";\r\nimport FIconButtonSecondary from \"./widgets/FIconButtonSecondary\";\r\nimport Group from \"@material-ui/icons/Group\";\r\nimport Help from \"@material-ui/icons/Help\";\r\nimport Menu from \"@material-ui/core/Menu\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Navigator from \"./widgets/Navigator\";\r\nimport Person from \"@material-ui/icons/Person\";\r\nimport MonetizationOnIcon from \"@material-ui/icons/MonetizationOn\";\r\nimport Privileged from \"./widgets/Privileged\";\r\nimport PropTypes from \"prop-types\";\r\nimport Toolbar from \"@material-ui/core/Toolbar\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Utils from \"./core/Utils\";\r\nimport ViewList from \"@material-ui/icons/ViewList\";\r\nimport WarningDialog from \"./commonDialogs/WarningDialog\";\r\nimport { connect } from \"react-redux\";\r\nimport find from \"lodash/find\";\r\nimport sizeMe from \"react-sizeme\";\r\nimport store from \"./redux/store/store\";\r\nimport { withRouter } from \"react-router-dom\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport SvgIcon from \"@material-ui/core/SvgIcon\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport DialogActions from \"@material-ui/core/DialogActions\";\r\nimport DialogContent from \"@material-ui/core/DialogContent\";\r\nimport DialogContentText from \"@material-ui/core/DialogContentText\";\r\nimport DialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport { Divider } from \"@material-ui/core\";\r\nimport Link from \"@material-ui/core/Link\";\r\n\r\nconst styles = (theme) => ({\r\n l_m: {\r\n marginLeft: theme.spacing(1),\r\n },\r\n tb_m: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(2.5),\r\n },\r\n menuMargin: {\r\n marginLeft: theme.spacing(2),\r\n marginTop: theme.spacing(6),\r\n },\r\n avatar: {\r\n border: \"0.1vh solid\",\r\n backgroundColor: theme.palette.primary.main,\r\n height: theme.spacing(4),\r\n width: theme.spacing(4),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n appState: state.common.appState,\r\n userProfileData: state.common.userProfileData,\r\n\r\n pictureUrl: state.common.userProfileData\r\n ? state.common.userProfileData.pictureURL\r\n : \"\",\r\n project: state.projects.currentProject,\r\n projects: state.projects.projectList,\r\n users: state.userList.users,\r\n roles: state.userList.roles,\r\n wakeCapData: state.wakeCapData,\r\n isPublicURL: state.common.isPublicURL,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n closeProject: () => dispatch(Actions.closeProject()),\r\n updateUserProfileData: (userData) =>\r\n dispatch(Actions.updateUserProfileData(userData)),\r\n replaceProjectList: (projectList) =>\r\n dispatch(Actions.replaceProjectList(projectList)),\r\n replaceProject: (project) => dispatch(Actions.replaceProject(project)),\r\n setWakeCapLoginInfo: (wakeCapLoginInfo) =>\r\n dispatch(Actions.setWakeCapLoginInfo(wakeCapLoginInfo)),\r\n isUserLoggedinWakecap: (wakeCapLogin) =>\r\n dispatch(Actions.isUserLoggedinWakecap(wakeCapLogin)),\r\n setWakeCapAvailableSitesForUser: (wakeCapAvailableSitesForUser) =>\r\n dispatch(\r\n Actions.setWakeCapAvailableSitesForUser(wakeCapAvailableSitesForUser)\r\n ),\r\n setWakeCapWorkerDetailsForSite: (workerDetails) =>\r\n dispatch(Actions.setWakeCapWorkerDetailsForSite(workerDetails)),\r\n setWakeCapAvailableBlueprintForSite: (blueprintInfo) =>\r\n dispatch(Actions.setWakeCapAvailableBlueprintForSite(blueprintInfo)),\r\n setWakeCapZoneForBlueprint: (zoneInfo) =>\r\n dispatch(Actions.setWakeCapZoneForBlueprint(zoneInfo)),\r\n\r\n signIn: (appState) => dispatch(Actions.signIn(appState)),\r\n setRoles: (role) => dispatch(Actions.setRoles(role)),\r\n setUsers: (user) => dispatch(Actions.setUsers(user)),\r\n setAdmins: (users) => dispatch(Actions.setAdmins(users)),\r\n setViewers: (users) => dispatch(Actions.setViewers(users)),\r\n setEdits: (users) => dispatch(Actions.setEdits(users)),\r\n addProjectsToList: (projects) =>\r\n dispatch(Actions.addProjectsToList(projects)),\r\n addProject: (projectData) => dispatch(Actions.addProject(projectData)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n openProject: (projectData) => dispatch(Actions.openProject(projectData)),\r\n };\r\n}\r\n\r\nclass PHeader extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n anchorEl: null,\r\n workerDetails: null,\r\n userRoleData: undefined,\r\n wakeCapLoginOpen: false,\r\n wakeCapSelectedTab: 0,\r\n };\r\n this.warningDialogRef = React.createRef();\r\n this._userDataSet = false;\r\n this._subDataUpdated = false;\r\n this._loginWithWakeCap = this._loginWithWakeCap.bind(this);\r\n this.signUpWithWakeCap = this.signUpWithWakeCap.bind(this);\r\n this.getAvailableSitesForUser = this.getAvailableSitesForUser.bind(this);\r\n this.validateEmail = this.validateEmail.bind(this);\r\n }\r\n\r\n async componentDidMount() {\r\n if (!this.props.isPublicURL) {\r\n const { appState } = this.props;\r\n let Roles = [];\r\n this._getProjects();\r\n\r\n //get all the roles present in aws\r\n const listOfRoles = await appState.AWSDBService.listGroups();\r\n\r\n listOfRoles.Groups.forEach((group) => {\r\n switch (group.GroupName) {\r\n case \"Edit\":\r\n case \"SuperAdmin\":\r\n break;\r\n case \"Admins\":\r\n case \"Viewers\":\r\n Roles.push(group.GroupName);\r\n break;\r\n default:\r\n break;\r\n }\r\n });\r\n //update the roles array into store\r\n this.props.setRoles(Roles);\r\n //get the role of currently logged in user\r\n const roles = this.props.appState.Auth._authData[\"cognito:groups\"];\r\n //check the user role if user role is Admin or Edit then only provide the user management functionality\r\n let condition = roles.includes(\"Admins\") || roles.includes(\"Edit\");\r\n if (condition) {\r\n await this.getAllUser();\r\n }\r\n } else {\r\n let pid = Utils.getProjectId();\r\n this._getPublicProject(pid);\r\n this.props.setRoles(\"Viewers\");\r\n }\r\n }\r\n\r\n _getPublicProject(userProjectId) {\r\n let params = {\r\n Key: { Project_Id: userProjectId },\r\n TableName: \"PublicSharedProjects\",\r\n };\r\n\r\n Utils.batchGetItems(params)\r\n .then(async (data) => {\r\n if (data) {\r\n let projectData = data;\r\n if (data.StorageLink) {\r\n projectData = await Utils.getProjectDataFromS3(data);\r\n this.props.addProjectsToList(projectData);\r\n this.props.openProject(projectData);\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"Error getting project data: \", err);\r\n });\r\n }\r\n\r\n componentDidUpdate() {\r\n if (this._userDataSet && !this._subDataUpdated) {\r\n this.getSubscriptionData();\r\n }\r\n }\r\n handleClickOpen = () => {\r\n this.setState({ wakeCapLoginOpen: true });\r\n };\r\n\r\n handleWakeCapLoginClose = () => {\r\n this.setState({ wakeCapLoginOpen: false });\r\n };\r\n\r\n handleWakecapTabChange = (_, newValue) => {\r\n this.setState({ wakeCapSelectedTab: newValue });\r\n };\r\n\r\n _openSignOutWarningDialog() {\r\n this.warningDialogRef.current.show();\r\n }\r\n\r\n _yesCB() {\r\n this._onSignOut();\r\n }\r\n\r\n _getProjects() {\r\n const { appState } = this.props;\r\n if (appState.Auth && appState.Auth.isSignedIn) {\r\n if (appState.Auth.isViewer()) {\r\n this._getAllProjectsForThisUser();\r\n } else {\r\n this._getAllProjects();\r\n // this._getAllProjectsForThisUser();\r\n }\r\n }\r\n }\r\n\r\n _getAllProjectsForThisUser = () => {\r\n const { projects, appState } = this.props;\r\n if (appState.AWSDBService && appState.Auth) {\r\n if (projects.length === 0 || projects.length === 1) {\r\n const config = this._getUserProjectListQueryConfig(\r\n appState.Auth._idData.email\r\n );\r\n\r\n appState.AWSDBService.queryAllItems(config)\r\n .then((data) => {\r\n if (data && data.Items && data.Items.length > 0) {\r\n let projectList = [];\r\n data.Items.forEach((element) => {\r\n projectList.push({ Project_Id: element.Project_Id });\r\n });\r\n\r\n this._getUserProjects(projectList);\r\n } else {\r\n this.setState({\r\n noProjectsMessage: false,\r\n });\r\n }\r\n })\r\n .catch(() => {});\r\n } else {\r\n //thumbnails\r\n this._updateProjectsThumbnailImageURL(projects);\r\n }\r\n }\r\n };\r\n\r\n //Get all project ids for current logged in user\r\n _getUserProjects = (userProjectList) => {\r\n let params = {\r\n RequestItems: {},\r\n };\r\n params.RequestItems[constants[Environment].projectsTableName] = {\r\n Keys: userProjectList,\r\n };\r\n\r\n this.props.appState.AWSDBService.batchGetItems(params)\r\n .then(async (data) => {\r\n if (data && data.length > 0) {\r\n let projectData = data;\r\n projectData = await this.getProjectDataFromS3(data);\r\n this.props.addProjectsToList(data);\r\n //download thumbnail\r\n this._updateProjectsThumbnailImageURL(data);\r\n }\r\n })\r\n .catch(() => {});\r\n };\r\n\r\n _getUserProjectListQueryConfig(userEmailId) {\r\n if (this.fetchLimit === 16) {\r\n this.fetchLimit = 8;\r\n } else if (this.fetchLimit === 0) {\r\n this.fetchLimit = 16;\r\n }\r\n\r\n return {\r\n TableName: constants[Environment].sharingTableName,\r\n //Limit: this.fetchLimit,\r\n ScanIndexForward: this.selected_NewFirst,\r\n KeyConditionExpression: \"Email_Id = :value\",\r\n ExpressionAttributeValues: {\r\n \":value\": userEmailId,\r\n },\r\n };\r\n }\r\n\r\n getSharedUserProject(projects) {\r\n const { appState } = this.props;\r\n const config = this._getUserProjectListQueryConfig(\r\n appState.Auth._idData.email\r\n );\r\n appState.AWSDBService.queryAllItems(config)\r\n .then((data) => {\r\n if (data && data.Items && data.Items.length > 0) {\r\n let projectList = [];\r\n data.Items.forEach((element) => {\r\n projectList.push({ Project_Id: element.Project_Id });\r\n });\r\n let params = {\r\n RequestItems: {},\r\n };\r\n params.RequestItems[constants[Environment].projectsTableName] = {\r\n Keys: projectList,\r\n };\r\n\r\n this.props.appState.AWSDBService.batchGetItems(params)\r\n .then(async (data) => {\r\n if (data && data.length > 0) {\r\n let projectData = await this.getProjectDataFromS3(data);\r\n projectData.forEach((element) => {\r\n projects.push(element);\r\n });\r\n // let role = \"Admins\";\r\n // let result = projects.map((project) => {\r\n // project.Role = role;\r\n // return project;\r\n // });\r\n for (let index = 0; index < projects.length; index++) {\r\n let orgID = projects[index].orgId;\r\n let params = {\r\n TableName:\r\n constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"owner_orgid = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": orgID,\r\n },\r\n };\r\n appState.AWSDBService.queryAllItems(params)\r\n .then((data) => {\r\n this.setState({ userRoleData: data });\r\n for (\r\n let i = 0;\r\n i < this.state.userRoleData.Items.length;\r\n i++\r\n ) {\r\n if (\r\n this.state.userRoleData.Items[i].email ===\r\n this.props.userProfileData.email &&\r\n this.state.userRoleData.Items[i].role === \"Admins\"\r\n ) {\r\n projects[index].Role = \"Admins\";\r\n } else if (\r\n projects[index].Data.ProjectOwner ===\r\n this.props.userProfileData.email\r\n ) {\r\n projects[index].Role = \"Admins\";\r\n } else if (\r\n this.state.userRoleData.Items[i].email ===\r\n this.props.userProfileData.email &&\r\n this.state.userRoleData.Items[i].role === \"Viewers\"\r\n ) {\r\n projects[index].Role = \"Viewers\";\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n this.props.addProjectsToList(projects);\r\n //download thumbnail\r\n this._updateProjectsThumbnailImageURL(data);\r\n }\r\n })\r\n .catch(() => {});\r\n // this._getUserProjects(projectList);\r\n } else {\r\n this.setState({\r\n noProjectsMessage: false,\r\n });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"Header error \", err);\r\n });\r\n }\r\n\r\n _getAllProjects = () => {\r\n const { projects, lastEvalKey } = this.props;\r\n if (\r\n projects.length === 0 ||\r\n projects.length === 1 ||\r\n lastEvalKey !== undefined\r\n ) {\r\n let config = this._getQueryConfig();\r\n if (lastEvalKey && Object.entries(lastEvalKey).length !== 0) {\r\n config.ExclusiveStartKey = lastEvalKey;\r\n }\r\n Utils.getAllProjects(config)\r\n .then(async (data) => {\r\n // let role = \"Admins\";\r\n // let result = data.Items.map((project) => {\r\n // project.Role = role;\r\n // return project;\r\n // });\r\n let projectData = data;\r\n projectData = await this.getProjectDataFromS3(data.Items);\r\n this.props.addProjectsToList(projectData);\r\n //download thumbnail\r\n this._updateProjectsThumbnailImageURL(projectData);\r\n this.getSharedUserProject(projectData);\r\n })\r\n .catch((e) => {\r\n console.log(e);\r\n this.getSharedUserProject([]);\r\n });\r\n } else {\r\n //thumbnails\r\n this._updateProjectsThumbnailImageURL(projects);\r\n }\r\n };\r\n\r\n async getProjectsFromOtherUser() {\r\n const { appState } = this.props;\r\n const email = appState.Auth._idData.email;\r\n let params = {\r\n TableName: constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"email-Creation_Date-index\",\r\n KeyConditionExpression: \"email = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": email,\r\n },\r\n };\r\n let userData = await this.getUserInfo(params);\r\n for (let i = 0; i < userData.Items.length; i++) {\r\n let paramsToGetProjects = {\r\n TableName: constants[Environment].projectsTableName,\r\n //Limit: this.fetchLimit,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"orgId = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": userData.Items[i].owner_orgid,\r\n },\r\n };\r\n Utils.getAllProjects(paramsToGetProjects)\r\n .then(async (data) => {\r\n let projectData = data;\r\n projectData = await this.getProjectDataFromS3(data.Items);\r\n projectData.map(async (item) => {\r\n this.props.addProject(item);\r\n });\r\n this._updateProjectsThumbnailImageURL(projectData);\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n\r\n getProjectDataFromS3(projectData) {\r\n return new Promise((resolve, reject) => {\r\n let count = 1;\r\n projectData.map(async (project) => {\r\n if (project.StorageLink) {\r\n project = await this.props.appState.AWSDBService.getProjectDataFromS3(\r\n project\r\n );\r\n }\r\n if (count === projectData.length) {\r\n resolve(projectData);\r\n }\r\n count++;\r\n });\r\n });\r\n }\r\n\r\n getSubscriptionData = () => {\r\n const { userProfileData, updateUserProfileData } = this.props;\r\n const params = {\r\n Key: {\r\n orgId: this.props.appState.Auth._idData[\"custom:OrgId\"],\r\n },\r\n TableName: constants[Environment].subscriptionTableName,\r\n };\r\n this.props.appState.AWSDBService.getItem(params)\r\n .then((data) => {\r\n let userData = userProfileData;\r\n userData[\"Credits\"] = data.credits;\r\n userData[\"subscriptionID\"] = data.user_payment_history.subscriptionID;\r\n updateUserProfileData(userData);\r\n this._subDataUpdated = true;\r\n const user = find(this.props.users, { Email: userProfileData.email });\r\n\r\n if (\r\n user &&\r\n (user.Role === \"Admins\" || user.Role === \"SuperAdmin\") &&\r\n data &&\r\n data.credits < 20\r\n ) {\r\n // Uncomment later\r\n this.props.notify({\r\n message:\r\n \"Low Credits!!. Get Subscription or contact info@flair3d.com for more credits\",\r\n type: \"warning\",\r\n });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"Error in getting subscription data\", err);\r\n });\r\n };\r\n\r\n //this function gets thumbnail image url generation done and update those projects in store\r\n _updateProjectsThumbnailImageURL(projectList) {\r\n const { projects, replaceProjectList, replaceProject } = this.props;\r\n for (const _project of projectList) {\r\n const files = _project.Data.Files;\r\n if (_project.FeatureImagePath) {\r\n this.updateWithFeatureImage(_project, \"projectList\");\r\n } else if (files) {\r\n if (Object.keys(files).length > 0) {\r\n let file = files[Object.keys(files)[0]];\r\n if (file.Status === \"complete\") {\r\n let storeProject = find(projects, {\r\n Project_Id: _project.Project_Id,\r\n });\r\n if (\r\n storeProject &&\r\n storeProject.Data &&\r\n storeProject.Data.Thumbnail_URL !== undefined\r\n ) {\r\n continue;\r\n }\r\n Utils.getThumbnailImageURL(file.fileId)\r\n .then(async (url) => {\r\n storeProject.Data.Thumbnail_URL = url;\r\n replaceProject(storeProject);\r\n })\r\n .catch(() => {\r\n if (storeProject && storeProject.Data) {\r\n storeProject.Data.Thumbnail_URL = undefined;\r\n }\r\n replaceProjectList(projects);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateWithFeatureImage(_project, replaceWhat) {\r\n const {\r\n searchProjects,\r\n projects,\r\n replaceProjectList,\r\n replaceSearchProjectList,\r\n } = this.props;\r\n let params = {\r\n Bucket: constants[Environment].cognitoUserDataBucketName,\r\n Key: _project.FeatureImagePath,\r\n };\r\n let storeProject =\r\n replaceWhat === \"searchProjectList\"\r\n ? find(searchProjects, { Project_Id: _project.Project_Id })\r\n : find(projects, { Project_Id: _project.Project_Id });\r\n if (storeProject && storeProject.Data) {\r\n this.props.appState.AWSDBService.getS3ObjectPreSignedURL(params).then(\r\n (picURL) => {\r\n storeProject.Data.Thumbnail_URL = picURL;\r\n replaceWhat === \"searchProjectList\"\r\n ? replaceSearchProjectList(searchProjects)\r\n : replaceProjectList(projects);\r\n }\r\n );\r\n }\r\n }\r\n\r\n _getQueryConfig() {\r\n if (this.fetchLimit === 16) {\r\n this.fetchLimit = 8;\r\n } else if (this.fetchLimit === 0) {\r\n this.fetchLimit = 16;\r\n }\r\n return {\r\n TableName: constants[Environment].projectsTableName,\r\n //Limit: this.fetchLimit,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"orgId = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": this.props.appState.Auth._idData[\"custom:OrgId\"],\r\n },\r\n };\r\n }\r\n\r\n getUserInfo(params) {\r\n const { appState } = this.props;\r\n return new Promise((resolve, reject) => {\r\n appState.AWSDBService.queryAllItems(params)\r\n .then((data) => {\r\n resolve(data);\r\n })\r\n .catch((err) => {\r\n reject();\r\n });\r\n });\r\n }\r\n //get all the users present in the userPool, get all attributes and user role and update all the information into store\r\n async getAllUser() {\r\n const { appState, setUsers, setAdmins, setEdits, setViewers } = this.props;\r\n let ViewersArray = [];\r\n let EditArray = [];\r\n let AdminArray = [];\r\n // get All users from user pool of aws\r\n let listOfUserFromPool = await appState.AWSDBService.listUsersInPool();\r\n const orgId = appState.Auth._idData[\"custom:OrgId\"];\r\n let params = {\r\n TableName: constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"owner_orgid = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": orgId,\r\n },\r\n };\r\n const listOfExistingOrgUsers = await this.getUserInfo(params);\r\n\r\n for (let i = 0; i < listOfExistingOrgUsers.Items.length; i++) {\r\n let usersFromExistingOrganization = await appState.AWSDBService.getUsersInPool(\r\n listOfExistingOrgUsers.Items[i].email\r\n );\r\n for (let j = 0; j < usersFromExistingOrganization.Users.length; j++) {\r\n usersFromExistingOrganization.Users[j].existingUserRefId =\r\n listOfExistingOrgUsers.Items[i].unique_id;\r\n usersFromExistingOrganization.Users[j].accessRole =\r\n listOfExistingOrgUsers.Items[i].role;\r\n listOfUserFromPool.Users.push(usersFromExistingOrganization.Users[j]);\r\n }\r\n }\r\n\r\n const listOfUser = listOfUserFromPool;\r\n listOfUser.Users &&\r\n listOfUser.Users.forEach(async (user) => {\r\n let localUser = user;\r\n\r\n //get User Attributes For Single user from Aws by using User Name\r\n const userAttr = await appState.AWSDBService.getUserAttributes(\r\n user.Username\r\n );\r\n localUser.Attributes = userAttr.UserAttributes;\r\n delete localUser.UserLastModifiedDate;\r\n localUser.Attributes.forEach((attr) => {\r\n if (attr.Name === \"email\") {\r\n localUser.Email = attr.Value;\r\n }\r\n if (attr.Name === \"phone_number\") {\r\n localUser.PhoneNo = attr.Value;\r\n }\r\n if (user.existingUserRefId) {\r\n localUser.existingUserRefId = user.existingUserRefId;\r\n }\r\n });\r\n //get the info of currently user present in which group from aws\r\n const role = await appState.AWSDBService.getGroupsForUser(\r\n user.Username\r\n );\r\n role.Groups.forEach((groupData) => {\r\n localUser.Role = groupData.GroupName;\r\n });\r\n user = localUser;\r\n\r\n //check user Role and create the array of users having edit role\r\n if (localUser.Role === \"Edit\") {\r\n EditArray.push(localUser);\r\n }\r\n //check user Role and create the array of users having Viewers role\r\n else if (localUser.Role === \"Viewers\") {\r\n ViewersArray.push(localUser);\r\n }\r\n //check user Role and create the array of users having Admins role\r\n else if (localUser.Role === \"Admins\") {\r\n AdminArray.push(localUser);\r\n }\r\n });\r\n //Users data updated in store\r\n setTimeout(() => {\r\n setUsers(listOfUser.Users);\r\n }, 3000);\r\n\r\n //Admin Users updated in store\r\n setAdmins(AdminArray);\r\n //Edit Users updated in store\r\n setEdits(EditArray);\r\n //Viewer Users updated in store\r\n setViewers(ViewersArray);\r\n }\r\n\r\n handleMenu(event) {\r\n this.setState({ anchorEl: event.currentTarget });\r\n }\r\n\r\n handleClose() {\r\n this.setState({ anchorEl: null });\r\n }\r\n\r\n _onProfile() {\r\n this.setState({ anchorEl: null });\r\n this.props.history.push(\"/profile\");\r\n }\r\n\r\n _onSubscribe() {\r\n this.setState({ anchorEl: null });\r\n this.props.history.push(\"/subscription\");\r\n }\r\n\r\n _onFAQ() {\r\n this.setState({ anchorEl: null });\r\n this.props.history.push(\"/faq\");\r\n }\r\n\r\n _onAnalytics() {\r\n this.setState({ anchorEl: null });\r\n this.props.history.push(\"/analytics\");\r\n }\r\n\r\n _onSignOut() {\r\n this.setState({ anchorEl: null });\r\n\r\n //revoking thumbnail image urls before clearing store\r\n let _projectList = store.getState().projects.projectList;\r\n _projectList.forEach((_project) => {\r\n if (_project.Data.Thumbnail_URL !== undefined) {\r\n URL.revokeObjectURL(_project.Data.Thumbnail_URL);\r\n }\r\n });\r\n //clearing store state\r\n this.props.closeProject();\r\n this.props.replaceProjectList([]);\r\n this.props.appState.Auth.signOut();\r\n }\r\n\r\n _onProjectSettings() {\r\n this.props.history.push(\"/project/settings\");\r\n }\r\n\r\n _onManageUsers() {\r\n this.props.history.push(\"/user/settings\");\r\n }\r\n\r\n //Below code is added for public home page work\r\n _onSignIn = () => {\r\n const auth = new Auth(\r\n (auth) => {\r\n if (auth) {\r\n this.props.signIn({\r\n Auth: auth,\r\n AWSDBService: new AWSService(auth),\r\n });\r\n }\r\n },\r\n () => {\r\n this.props.signIn(undefined);\r\n }\r\n );\r\n auth.signIn();\r\n document.location.reload();\r\n auth.deleteAllCookies();\r\n };\r\n\r\n get _projectName() {\r\n const { classes, project } = this.props;\r\n let projectName = \"\";\r\n if (project && project.Data) {\r\n projectName = project.Data.ProjectName;\r\n }\r\n\r\n if (projectName === \"\") return null;\r\n\r\n return (\r\n \r\n \r\n \r\n {projectName}\r\n \r\n \r\n \r\n \r\n {projectName}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n getOrganizationCredits() {\r\n return new Promise((resolve, reject) => {\r\n const params = {\r\n Key: {\r\n orgId: this.props.appState.Auth._idData[\"custom:OrgId\"],\r\n },\r\n TableName: constants[Environment].subscriptionTableName,\r\n };\r\n this.props.appState.AWSDBService.getItem(params)\r\n .then((credits) => {\r\n return resolve(credits);\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n getUserProfilePicURL() {\r\n const { appState, updateUserProfileData } = this.props;\r\n Utils.getUserProfile()\r\n .then(async (data) => {\r\n const userData = { ...data };\r\n let picURL = \"\";\r\n if (userData && userData.picturePath) {\r\n let params = {\r\n Bucket: constants[Environment].cognitoUserDataBucketName,\r\n Key: userData.picturePath,\r\n Expires: 86400,\r\n };\r\n\r\n this.waitingForAPIResponse = false;\r\n picURL = await appState.AWSDBService.getS3ObjectPreSignedURL(params);\r\n userData.pictureURL = picURL;\r\n }\r\n const credits = await this.getOrganizationCredits();\r\n userData.Credits = credits.credits;\r\n //update user data in store\r\n updateUserProfileData(userData);\r\n this._userDataSet = true;\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n get _avatar() {\r\n const { userProfileData, pictureUrl, classes } = this.props;\r\n if (!userProfileData && !this.waitingForAPIResponse) {\r\n this.waitingForAPIResponse = true;\r\n this.getUserProfilePicURL();\r\n }\r\n\r\n if (\r\n userProfileData &&\r\n userProfileData.pictureURL &&\r\n userProfileData.pictureURL !== \"\"\r\n ) {\r\n return (\r\n \r\n );\r\n } else if (userProfileData && userProfileData.name) {\r\n const fullName = userProfileData.name;\r\n const initials = ((fullName) =>\r\n fullName\r\n .map((n, i) => (i === 0 || i === fullName.length - 1) && n[0])\r\n .filter((n) => n)\r\n .join(\"\"))(fullName.split(\" \"));\r\n return {initials};\r\n } else {\r\n return ;\r\n }\r\n }\r\n\r\n validateEmail() {\r\n let emailId = document.getElementById(\"wakecapid\").value;\r\n\r\n const re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n let validEmail = re.test(String(emailId).toLowerCase());\r\n\r\n let warningDiv = document.getElementById(\"invalidEmailWarning\");\r\n\r\n if (!validEmail) {\r\n warningDiv.innerText = \"Please enter valid email id\";\r\n } else {\r\n warningDiv.innerText = \"\";\r\n }\r\n return validEmail;\r\n }\r\n\r\n async signUpWithWakeCap() {\r\n let wakeCapEmail = document.getElementById(\"wakecapid\").value;\r\n if (!this.validateEmail()) {\r\n this.props.notify({\r\n message: \"Invalid email id. Please try again\",\r\n type: \"error\",\r\n });\r\n return;\r\n }\r\n let authToken = null;\r\n await fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/loginwithwakecap\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n email: \"flair3d_integration@wakecap.com\",\r\n password: \"khC1o]3`B3r5_a^\",\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n let loginInfo = JSON.parse(data.body);\r\n authToken = loginInfo.loginInfo.data.access_token;\r\n })\r\n .catch((err) => {\r\n console.error(\"Error in Login \", err);\r\n });\r\n let authorization = \"Bearer \" + authToken;\r\n await fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/sendwakecapinvite\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n email: wakeCapEmail,\r\n token: authorization,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n let inviteResponse = JSON.parse(data.body);\r\n if (inviteResponse.inviteStatus.errors) {\r\n this.props.notify({\r\n message: inviteResponse.inviteStatus.errors.email,\r\n type: \"error\",\r\n });\r\n }\r\n if (inviteResponse.inviteStatus.status === \"success\") {\r\n this.props.notify({\r\n message: inviteResponse.inviteStatus.message,\r\n type: \"success\",\r\n });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"Error sending invite \", err);\r\n });\r\n }\r\n\r\n _loginWithWakeCap() {\r\n let wakeCapEmail = document.getElementById(\"wakecapid\").value;\r\n let wakeCapPassword = document.getElementById(\"wakecappassword\").value;\r\n if (!this.validateEmail()) {\r\n if (wakeCapPassword === null || wakeCapPassword === \"\") {\r\n this.props.notify({\r\n message: \"Invalid email and password. Please try again\",\r\n type: \"error\",\r\n });\r\n return;\r\n }\r\n this.props.notify({\r\n message: \"Invalid email id. Please try again\",\r\n type: \"error\",\r\n });\r\n return;\r\n }\r\n if (wakeCapPassword === null || wakeCapPassword === \"\") {\r\n this.props.notify({\r\n message: \"Invalid password. Please try again\",\r\n type: \"error\",\r\n });\r\n return;\r\n }\r\n let loginStatus = false;\r\n fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/loginwithwakecap\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n email: wakeCapEmail,\r\n password: wakeCapPassword,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((LoginInfo) => {\r\n // console.log(\"login info \", LoginInfo);\r\n let loginData = JSON.parse(LoginInfo.body);\r\n if (loginData.loginInfo.status !== \"fail\") {\r\n loginData = loginData.loginInfo;\r\n this.props.setWakeCapLoginInfo(loginData);\r\n loginStatus = true;\r\n this.props.isUserLoggedinWakecap(loginStatus);\r\n if (loginData && loginData.data && loginData.data.access_token)\r\n this.getAvailableSitesForUser(loginData.data.access_token);\r\n } else if (loginData.loginInfo.status === \"fail\") {\r\n this.props.notify({\r\n message: \"WakeCap login error. Please try again\",\r\n type: \"error\",\r\n });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n this.props.notify({\r\n message: \"WakeCap login error. Please try again\",\r\n type: \"error\",\r\n });\r\n });\r\n }\r\n\r\n getAvailableSitesForUser(token) {\r\n fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/getavailablesitesforuser\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n authtoken: token,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((availableSites) => {\r\n if (availableSites.body) {\r\n let availableSitesForUser = JSON.parse(availableSites.body);\r\n availableSitesForUser = availableSitesForUser.data;\r\n this.props.setWakeCapAvailableSitesForUser(availableSitesForUser);\r\n this.getAvailableBlueprintForSite(availableSitesForUser);\r\n this.props.notify({\r\n message: \"You are successfully logged in with WakeCap\",\r\n type: \"success\",\r\n });\r\n } else if (availableSites.status === \"error\") {\r\n this.props.notify({\r\n message: \"WakeCap login error. Please try again\",\r\n type: \"error\",\r\n });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n this.props.notify({\r\n message: \"WakeCap login error. Please try again\",\r\n type: \"error\",\r\n });\r\n });\r\n }\r\n\r\n getAvailableBlueprintForSite(availableSitesForUser) {\r\n const { wakeCapData, setWakeCapAvailableBlueprintForSite } = this.props;\r\n if (\r\n wakeCapData &&\r\n wakeCapData.wakeCapLoginAPIData &&\r\n wakeCapData.wakeCapLoginAPIData.data &&\r\n wakeCapData.wakeCapLoginAPIData.data.access_token &&\r\n availableSitesForUser &&\r\n availableSitesForUser.data\r\n ) {\r\n let token = wakeCapData.wakeCapLoginAPIData.data.access_token;\r\n let siteId = availableSitesForUser.data[0].id;\r\n fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/getavailableblueprintforsite\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n authtoken: token,\r\n siteid: siteId,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((BlueprintInfo) => {\r\n if (BlueprintInfo.body) {\r\n let _blueprintInfo = JSON.parse(BlueprintInfo.body);\r\n _blueprintInfo = _blueprintInfo.data;\r\n let blueprintId = _blueprintInfo.data[0].id;\r\n setWakeCapAvailableBlueprintForSite(_blueprintInfo);\r\n this.getAvailableZonesForSite(token, siteId, blueprintId);\r\n // this.getWorkerDetailsForSite(token, siteId, null);\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n } else {\r\n this.props.notify({\r\n message: \"You have not logged in to WakeCap. Please Login to WakeCap\",\r\n type: \"warning\",\r\n clickAway: true,\r\n });\r\n }\r\n }\r\n\r\n getAvailableZonesForSite(authToken, siteId, blueprintId) {\r\n const { setWakeCapZoneForBlueprint } = this.props;\r\n fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/getavailablezonesforblueprint\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n authtoken: authToken,\r\n siteid: siteId,\r\n blueprintid: blueprintId,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((ZoneInfo) => {\r\n if (ZoneInfo.body) {\r\n let _zoneInfo = JSON.parse(ZoneInfo.body);\r\n _zoneInfo = _zoneInfo.data;\r\n setWakeCapZoneForBlueprint(_zoneInfo);\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n getWorkerDetailsForSite(authToken, siteId, nextPageId) {\r\n const { setWakeCapWorkerDetailsForSite } = this.props;\r\n let nextPageworkerDetails = this.state.workerDetails;\r\n fetch(\r\n \"https://ibhbtntc3c.execute-api.us-east-1.amazonaws.com/prod/getworkerdetailsforsite\",\r\n {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n authtoken: authToken,\r\n siteid: siteId,\r\n nextpageid: nextPageId,\r\n }),\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((WorkerDetails) => {\r\n if (WorkerDetails.body) {\r\n let _WorkerDetails = JSON.parse(WorkerDetails.body);\r\n _WorkerDetails = _WorkerDetails.data;\r\n if (nextPageId === null) nextPageworkerDetails = _WorkerDetails;\r\n else\r\n nextPageworkerDetails.data.items = nextPageworkerDetails.data.items.concat(\r\n _WorkerDetails.data.items\r\n );\r\n\r\n this.setState({ workerDetails: nextPageworkerDetails });\r\n if (_WorkerDetails.data.meta.next === null) {\r\n setWakeCapWorkerDetailsForSite(nextPageworkerDetails);\r\n this.props.notify({\r\n message: \"You can explore all Wakecap workers in Flair\",\r\n type: \"success\",\r\n });\r\n } else {\r\n this.getWorkerDetailsForSite(\r\n authToken,\r\n siteId,\r\n _WorkerDetails.data.meta.next\r\n );\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n get _settingsAndAccountButtons() {\r\n const settingsButtonRef = React.createRef();\r\n const avatarButtonRef = React.createRef();\r\n const userButtonRef = React.createRef();\r\n return (\r\n \r\n \r\n
\r\n {\r\n // this._loginWithWakeCap();\r\n this.setState({\r\n wakeCapLoginOpen: true,\r\n });\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n {\r\n this.handleWakeCapLoginClose();\r\n }}\r\n aria-labelledby=\"form-dialog-title\"\r\n maxWidth=\"xs\"\r\n fullWidth\r\n >\r\n Sign In\r\n \r\n \r\n Email Id:\r\n \r\n \r\n \r\n \r\n Password\r\n \r\n \r\n \r\n {\r\n this.handleWakeCapLoginClose();\r\n }}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n Cancel\r\n \r\n {\r\n this.handleWakeCapLoginClose();\r\n this._loginWithWakeCap();\r\n }}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n >\r\n Log In\r\n \r\n \r\n \r\n \r\n \r\n Need an account?{\" \"}\r\n {\r\n this.handleWakeCapLoginClose();\r\n this.signUpWithWakeCap();\r\n }}\r\n >\r\n Sign up!\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n this._onManageUsers();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n this._onProjectSettings();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.handleMenu(e);\r\n }}\r\n color=\"inherit\"\r\n >\r\n {this._avatar}\r\n \r\n \r\n \r\n {\r\n this._onSubscribe();\r\n }}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n \r\n \r\n {\r\n this._onFAQ();\r\n }}\r\n color=\"inherit\"\r\n >\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n get _menu() {\r\n const { anchorEl } = this.state;\r\n const open = Boolean(anchorEl);\r\n const { classes, appState } = this.props;\r\n\r\n return (\r\n {\r\n this.handleClose();\r\n }}\r\n >\r\n {\r\n this._onProfile();\r\n }}\r\n >\r\n My Profile\r\n \r\n \r\n {\r\n this._onAnalytics();\r\n }}\r\n >\r\n Analytics\r\n \r\n \r\n {\r\n this._openSignOutWarningDialog();\r\n }}\r\n >\r\n Sign Out\r\n \r\n \r\n );\r\n }\r\n\r\n get _smallScreenLayout() {\r\n const { classes } = this.props;\r\n if (this._projectName === null) {\r\n return (\r\n \r\n \r\n \r\n \r\n {!this.props.isPublicURL ? (\r\n \r\n {this._settingsAndAccountButtons}\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n );\r\n } else {\r\n return (\r\n \r\n \r\n {this._projectName}\r\n \r\n {!this.props.isPublicURL ? (\r\n \r\n {this._settingsAndAccountButtons}\r\n \r\n ) : (\r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n get _largeScreenLayout() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {this._projectName}\r\n \r\n {!this.props.isPublicURL ? (\r\n \r\n {this._settingsAndAccountButtons}\r\n \r\n ) : (\r\n
\r\n )}\r\n
\r\n );\r\n }\r\n\r\n render() {\r\n // if (\r\n // this.props.appState &&\r\n // this.props.appState.Auth &&\r\n // this.props.appState.Auth.isSignedIn\r\n // )\r\n {\r\n // const auth = this.props.appState.Auth;\r\n // if (auth)\r\n {\r\n return (\r\n \r\n \r\n \r\n {this._smallScreenLayout}\r\n \r\n {this._largeScreenLayout}\r\n {!this.props.isPublicURL ? this._menu : \"\"}\r\n {\r\n this._yesCB();\r\n }}\r\n ref={this.warningDialogRef}\r\n />\r\n \r\n \r\n );\r\n }\r\n // else {\r\n // return null;\r\n // }\r\n }\r\n // else {\r\n // return null;\r\n // }\r\n }\r\n}\r\n\r\nPHeader.propTypes = {\r\n appState: PropTypes.object,\r\n classes: PropTypes.object,\r\n history: PropTypes.object,\r\n closeProject: PropTypes.func,\r\n replaceProjectList: PropTypes.func,\r\n project: PropTypes.object,\r\n userProfileData: PropTypes.object,\r\n pictureUrl: PropTypes.string,\r\n setUsers: PropTypes.any,\r\n setRoles: PropTypes.any,\r\n users: PropTypes.array,\r\n setAdmins: PropTypes.func,\r\n setEdits: PropTypes.func,\r\n setViewers: PropTypes.func,\r\n projects: PropTypes.array,\r\n lastEvalKey: PropTypes.object,\r\n replaceSearchProjectList: PropTypes.any,\r\n replaceProject: PropTypes.any,\r\n setWakeCapLoginInfo: PropTypes.any,\r\n isUserLoggedinWakecap: PropTypes.any,\r\n setWakeCapAvailableSitesForUser: PropTypes.any,\r\n setWakeCapWorkerDetailsForSite: PropTypes.func,\r\n setWakeCapAvailableBlueprintForSite: PropTypes.func,\r\n setWakeCapZoneForBlueprint: PropTypes.func,\r\n wakeCapData: PropTypes.any,\r\n searchProjects: PropTypes.any,\r\n notify: PropTypes.any,\r\n updateUserProfileData: PropTypes.func,\r\n isPublicURL: PropTypes.bool,\r\n addProjectsToList: PropTypes.func,\r\n openProject: PropTypes.func,\r\n addProject: PropTypes.func,\r\n};\r\n\r\nconst Header = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(sizeMe({ monitorHeight: true })(withRouter(withStyles(styles)(PHeader))));\r\nexport default Header;\r\n","import React, { Component, Fragment } from 'react';\r\n\r\nimport FTablePagination from './FTablePagination';\r\nimport PropTypes from 'prop-types';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\n\r\nclass EnhancedTableHead extends Component {\r\n\r\n render() {\r\n const columns = this.props.dataColumns;\r\n return (\r\n \r\n \r\n {columns.map(\r\n row => (\r\n \r\n {row.label}\r\n \r\n ),\r\n this,\r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nEnhancedTableHead.propTypes = {\r\n dataColumns: PropTypes.any\r\n}\r\n\r\nclass EnhancedTable extends Component {\r\n state = {\r\n selected: [],\r\n page: 0,\r\n rowsPerPage: 5,\r\n };\r\n\r\n handleSelectAllClick = event => {\r\n if (event.target.checked) {\r\n this.setState(() => ({ selected: this.props.data.map(n => n.id) }));\r\n return;\r\n }\r\n this.setState({ selected: [] });\r\n };\r\n\r\n handleChangePage = (event, page) => {\r\n this.setState({ page });\r\n };\r\n\r\n handleChangeRowsPerPage = event => {\r\n this.setState({\r\n rowsPerPage: event.target.value,\r\n page: 0\r\n });\r\n };\r\n\r\n isSelected = id => this.state.selected.indexOf(id) !== -1;\r\n\r\n render() {\r\n const { selected, rowsPerPage, page } = this.state;\r\n const { data, dataColumns, rowCount } = this.props;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n {data.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((n, index) => {\r\n return (\r\n \r\n {n[dataColumns[0].id]}\r\n {n[dataColumns[1].id]}\r\n {n[dataColumns[2].id]}\r\n {n[dataColumns[3].id]}\r\n \r\n );\r\n })}\r\n\r\n \r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nEnhancedTable.propTypes = {\r\n data: PropTypes.any,\r\n dataColumns: PropTypes.array,\r\n rowCount: PropTypes.number,\r\n};\r\n\r\nexport default EnhancedTable;","import React, { Component } from 'react';\r\n\r\nimport ProgressBar from '@bit/react-bootstrap.react-bootstrap.progress-bar';\r\nimport PropTypes from 'prop-types';\r\nimport ReactBootstrapStyle from '@bit/react-bootstrap.react-bootstrap.internal.style-links';\r\n\r\nclass BitProgressBar extends Component {\r\n render() {\r\n const { now } = this.props;\r\n const progressInstance = ;\r\n return (\r\n <>\r\n \r\n
\r\n {progressInstance}\r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nBitProgressBar.propTypes = {\r\n now: PropTypes.number\r\n};\r\n\r\nexport default BitProgressBar;","import React, { Component } from 'react';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport MuiDialogActions from '@material-ui/core/DialogActions';\r\nimport MuiDialogContent from '@material-ui/core/DialogContent';\r\nimport MuiDialogTitle from '@material-ui/core/DialogTitle';\r\nimport PropTypes from 'prop-types';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { withStyles } from '@material-ui/core/styles';\r\n\r\nconst DialogTitle = withStyles(theme => ({\r\n root: {\r\n borderBottom: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n },\r\n}))(props => {\r\n const { children, classes } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles(() => ({\r\n root: {\r\n margin: 0,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst DialogActions = withStyles(theme => ({\r\n root: {\r\n borderTop: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n padding: theme.spacing(2)\r\n },\r\n}))(MuiDialogActions);\r\n\r\nclass InformativeDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n }\r\n }\r\n\r\n show() {\r\n this.setState({ open: true, });\r\n }\r\n\r\n _close() {\r\n this.setState({ open: false });\r\n }\r\n\r\n _handleOk() {\r\n this._close();\r\n if (this.props.okCB) {\r\n this.props.okCB();\r\n }\r\n }\r\n\r\n render() {\r\n let title = (this.props.title !== undefined) ? this.props.title : \"Informative Dialog\";\r\n let message = (this.props.message !== undefined) ? this.props.message : \"Informative message\";\r\n let lines = message ? message.split('\\n') : [];\r\n let okBtnName = (this.props.okBtnName !== undefined) ? this.props.okBtnName : \"Ok\";\r\n return (\r\n { this._close() }}\r\n aria-labelledby=\"customized-dialog-title\"\r\n open={this.state.open}\r\n >\r\n { this.handleClose() }}>\r\n {title}\r\n \r\n \r\n {lines.map((line, index) => {\r\n return (\r\n \r\n {line}\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nInformativeDialog.propTypes = {\r\n title: PropTypes.string,\r\n okCB: PropTypes.func,\r\n message: PropTypes.string,\r\n okBtnName: PropTypes.string,\r\n};\r\n\r\nexport default InformativeDialog","/* eslint-disable no-undefined */\r\nimport * as Actions from \"../redux/actions\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component, Fragment } from \"react\";\r\n\r\nimport BitProgressBar from \"../widgets/BitProgressBar\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport Draggable from \"react-draggable\";\r\nimport FButtonPrimary from \"../widgets/FButtonPrimary\";\r\nimport GooglePicker from \"react-google-picker\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport InformativeDialog from \"../commonDialogs/InformativeDialog\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport MuiDialogActions from \"@material-ui/core/DialogActions\";\r\nimport MuiDialogContent from \"@material-ui/core/DialogContent\";\r\nimport MuiDialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Utils from \"../core/Utils\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst DialogTitle = withStyles((theme) => ({\r\n root: {\r\n borderBottom: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n width: \"25vw\",\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n}))((props) => {\r\n const { children, classes } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles(() => ({\r\n root: {\r\n margin: 0,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst Category = withStyles(() => ({\r\n root: {\r\n padding: 0,\r\n flexGrow: 1,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst Progress = withStyles((theme) => ({\r\n root: {\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst DialogActions = withStyles((theme) => ({\r\n root: {\r\n borderTop: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n padding: theme.spacing(1),\r\n },\r\n}))(MuiDialogActions);\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n appState: state.common.appState,\r\n userData: state.common.userProfileData,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\nclass PFileUploadDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n uploadInProgress: false,\r\n uploadedFileCount: 0,\r\n progress: 0,\r\n downloadInProgress: false,\r\n unsupportedFileList: [],\r\n sameFileList: [],\r\n longFileName: [],\r\n };\r\n this.supportedFileFormats = [\r\n \"rvt\",\r\n \"nwd\",\r\n \"nwc\",\r\n \"dwg\",\r\n \"obj\",\r\n \"ifc\",\r\n \"dgn\",\r\n \"stl\",\r\n \"fbx\",\r\n \"iwm\",\r\n ]; //remove .stl as its added for development purpose\r\n this.warningDialogRef = React.createRef();\r\n this.supportedFileFormatDialogRef = React.createRef();\r\n this.unsupportedSameFileDialogRef = React.createRef();\r\n this.longFileNameDialogRef = React.createRef();\r\n this.lowCreditsDialogRef = React.createRef();\r\n this._FileStatusInterval = {};\r\n }\r\n\r\n show() {\r\n this.setState({ open: true });\r\n }\r\n\r\n close() {\r\n if (!this.state.uploadInProgress) {\r\n this.setState({\r\n open: false,\r\n category: \"Select Category\",\r\n selectedFiles: [],\r\n });\r\n }\r\n }\r\n\r\n _openSupportedFileFormatOkDialog() {\r\n this.supportedFileFormatDialogRef.current.show();\r\n }\r\n\r\n _openUnsupportedSameFileOkDialog() {\r\n this.unsupportedSameFileDialogRef.current.show();\r\n }\r\n _openFileNameLongOkDialog() {\r\n this.longFileNameDialogRef.current.show();\r\n }\r\n\r\n _lowCreditsOkDialog() {\r\n this.lowCreditsDialogRef.current.show();\r\n }\r\n\r\n _unsupportedSameFileOkDialogOkCB() {\r\n this.setState({ sameFileList: [] });\r\n this._cancelUpload();\r\n }\r\n _longFileNameOkDialogOkCB() {\r\n this.setState({ longFileName: [] });\r\n this._cancelUpload();\r\n }\r\n _supportedFileFormatDialogOkCB() {\r\n this.setState({ unsupportedFileList: [] });\r\n this._cancelUpload();\r\n }\r\n _lowCreditsDialogOkCB() {\r\n this._cancelUpload();\r\n this.setState({ open: false });\r\n }\r\n\r\n _deleteAndUploadNewFile = () => {\r\n let fileNameToDelete = this.state.selectedFiles[0].name;\r\n let currentProject = this.props.project;\r\n let files = this.props.project.Data.Files;\r\n let projectRegion =\r\n currentProject.Region === undefined ||\r\n currentProject.Region === \"us-east-1\"\r\n ? \"us-east-1\"\r\n : currentProject.Region === \"ca-central-1\"\r\n ? \"ca-central-1\"\r\n : \"\";\r\n\r\n let bucketName =\r\n projectRegion === \"\" || projectRegion === \"us-east-1\"\r\n ? constants[Environment].projectsBucketName.us_east_1\r\n : constants[Environment].projectsBucketName.canada;\r\n\r\n for (const key in files) {\r\n if (files[key].fileName === fileNameToDelete) {\r\n let params = {\r\n Bucket: bucketName,\r\n Key: files[key].fileId,\r\n };\r\n\r\n this.props.appState.AWSDBService.deleteObject(params, true)\r\n .then(() => {\r\n delete currentProject.Data.Files[key];\r\n\r\n //update Project in database and redux store\r\n // this.props.appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: currentProject.Project_Id\r\n // },\r\n // [\"Data.Files\"],\r\n // [currentProject.Data.Files]\r\n // );\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n currentProject,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this.props.updateProject(currentProject);\r\n\r\n //now upload new file\r\n this._uploadFiles();\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n };\r\n\r\n _replaceFileDialogYesCB() {\r\n //First delete previous one and then upload new one\r\n this._deleteAndUploadNewFile();\r\n }\r\n\r\n _replaceFileDialogCancelCB() {\r\n //on replace cancel remove selected file form db\r\n this._cancelUpload();\r\n }\r\n\r\n _select() {\r\n if (this.state.selectedFiles.length === 0) {\r\n return (\r\n \r\n \r\n {\r\n this.onFileSelect(e);\r\n }}\r\n />\r\n \r\n \r\n \r\n OR\r\n \r\n \r\n this._onDriveFileSelect(data)}\r\n onAuthenticate={(token) => this._storeGoogleAuthToken(token)}\r\n onAuthFailed={(data) => console.log(\"on auth failed:\", data)}\r\n multiselect={true}\r\n navHidden={true}\r\n authImmediate={false}\r\n mimeTypes={[\"application/octet-stream\", \"application/acad\"]}\r\n >\r\n \r\n \"Google\r\n   Select from Google Drive\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n _storeGoogleAuthToken(token) {\r\n this.googleAuthToken = token;\r\n }\r\n\r\n _onDriveFileSelect(data) {\r\n if (data.action === \"loaded\") {\r\n this.setState({ open: false });\r\n } else if (data.action === \"picked\") {\r\n this.onFileSelectionFromDrive(data.docs);\r\n this.setState({ open: true });\r\n }\r\n }\r\n\r\n async _getDriveFile(uniqueNameExt, fileId) {\r\n this.setState({ downloadInProgress: true });\r\n const blob = await this._downloadDriveFile(fileId);\r\n this.setState({ downloadInProgress: false });\r\n return new File([blob], uniqueNameExt);\r\n }\r\n\r\n _downloadDriveFile = (fileId) => {\r\n return new Promise((resolve, reject) => {\r\n fetch(\r\n \"https://www.googleapis.com/drive/v3/files/\" + fileId + \"?alt=media\",\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + this.googleAuthToken,\r\n },\r\n }\r\n )\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n return resolve(blob);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n };\r\n\r\n get _driveFileDownloadProgressBar() {\r\n if (this.state.downloadInProgress) {\r\n return (\r\n \r\n \r\n Downloading file from Google drive\r\n \r\n \r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n _getFileUploadErrorMessage() {\r\n let unsupportedFileFormatError =\r\n this.state.unsupportedFileList.length > 0\r\n ? `[ ${this.state.unsupportedFileList} ] \r\n Selected file format is not supported. Supported file formats are .rvt, .nwd, .nwf, .nwc, .sat, .obj, .ipt, .fbx, .iwm`\r\n : ``;\r\n\r\n return `${unsupportedFileFormatError}\r\n Please select appropriate file/s and try again.`;\r\n }\r\n _getFileNameLongErrorMessage() {\r\n let longFileNameError =\r\n this.state.longFileName.length > 0\r\n ? `[ ${this.state.longFileName} ] \r\n File name is too lengthy. Max file length 60 characters only. You can rename the file and try again`\r\n : ``;\r\n return `${longFileNameError}`;\r\n }\r\n _getSameFileNameErrorMessage() {\r\n let sameFileError =\r\n this.state.sameFileList.length > 0\r\n ? `[ ${this.state.sameFileList} ] file/s with same name already present. Please select appropriate file/s and try again.`\r\n : ``;\r\n return `${sameFileError}`;\r\n }\r\n _upload() {\r\n if (this.state.selectedFiles.length > 0) {\r\n return (\r\n \r\n {\r\n this._supportedFileFormatDialogOkCB();\r\n }}\r\n okBtnName=\"Ok\"\r\n ref={this.supportedFileFormatDialogRef}\r\n />\r\n\r\n {\r\n this._unsupportedSameFileOkDialogOkCB();\r\n }}\r\n okBtnName=\"Ok\"\r\n ref={this.unsupportedSameFileDialogRef}\r\n />\r\n\r\n {\r\n this._longFileNameOkDialogOkCB();\r\n }}\r\n okBtnName=\"Ok\"\r\n ref={this.longFileNameDialogRef}\r\n />\r\n\r\n {\r\n this._lowCreditsDialogOkCB();\r\n }}\r\n ref={this.lowCreditsDialogRef}\r\n />\r\n {\r\n this._uploadOrReplaceFile();\r\n }}\r\n >\r\n Upload\r\n \r\n {\r\n this._cancelUpload(e);\r\n }}\r\n >\r\n Cancel\r\n \r\n {this._driveFileDownloadProgressBar}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n _cancelUpload() {\r\n this.setState({\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n sameFileList: [],\r\n unsupportedFileList: [],\r\n });\r\n }\r\n\r\n onFileSelectionFromDrive(docs) {\r\n this.setState({\r\n selectedFiles: docs,\r\n });\r\n }\r\n\r\n onFileSelect(e) {\r\n this.setState({\r\n selectedFiles: Array.from(e.target.files),\r\n });\r\n }\r\n\r\n _onCategorySelected(e) {\r\n this.setState({\r\n category: e.target.value,\r\n });\r\n }\r\n\r\n get selectedFiles() {\r\n let files = \"No file selected\";\r\n let len = this.state.selectedFiles.length;\r\n if (len > 0) {\r\n let filesNames = [];\r\n for (let i = 0; i < len; i++) {\r\n filesNames.push(this.state.selectedFiles[i].name);\r\n }\r\n files = filesNames.join(\", \");\r\n }\r\n return files;\r\n }\r\n\r\n _isSameFilePresent(projectData) {\r\n if (projectData.Data.Files) {\r\n for (let key in projectData.Data.Files) {\r\n if (projectData.Data.Files[key]) {\r\n if (\r\n projectData.Data.Files[key].fileName ===\r\n this.state.selectedFiles[0].name\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n _uploadOrReplaceFile() {\r\n //firstly check if selected files have any error\r\n for (let i = 0; i < this.state.selectedFiles.length; i++) {\r\n const fileName = this.state.selectedFiles[i].name;\r\n const fileExtension = fileName.split(\".\").pop();\r\n if (\r\n this.supportedFileFormats.includes(fileExtension.toLowerCase()) &&\r\n fileName.length <= 60\r\n ) {\r\n let projectData = this.props.project;\r\n if (this._isSameFilePresent(projectData)) {\r\n this.state.sameFileList.push(fileName);\r\n this.setState({\r\n sameFileList: this.state.sameFileList,\r\n });\r\n }\r\n } else if (fileName.length >= 60) {\r\n this.state.longFileName.push(fileName);\r\n this.setState({\r\n longFileName: this.state.longFileName,\r\n });\r\n } else {\r\n this.state.unsupportedFileList.push(fileName);\r\n this.setState({\r\n unsupportedFileList: this.state.unsupportedFileList,\r\n });\r\n }\r\n }\r\n\r\n if (this.state.sameFileList.length > 0) {\r\n this._openUnsupportedSameFileOkDialog();\r\n } else if (this.state.longFileName.length > 0) {\r\n this._openFileNameLongOkDialog();\r\n } else if (this.state.unsupportedFileList.length > 0) {\r\n this._openSupportedFileFormatOkDialog();\r\n } else {\r\n this._uploadFiles();\r\n }\r\n }\r\n\r\n async _uploadFiles() {\r\n for (\r\n let fileIndex = 0;\r\n fileIndex < this.state.selectedFiles.length;\r\n fileIndex++\r\n ) {\r\n this.setState({ uploadInProgress: true });\r\n let ext = this.state.selectedFiles[fileIndex].name.split(\".\");\r\n let name = ext[0].replace(/ +/g, \"\");\r\n let uniqueName = name + \"-\" + Utils.createUniqueIdV2();\r\n let uniqueNameExt =\r\n uniqueName +\r\n \".\" +\r\n this.state.selectedFiles[fileIndex].name.split(\".\").pop();\r\n\r\n //Check is required to know that file is selected from local machine or drive\r\n let file;\r\n if (!this.googleAuthToken) file = this.state.selectedFiles[fileIndex];\r\n //local file\r\n else\r\n file = await this._getDriveFile(\r\n uniqueNameExt,\r\n this.state.selectedFiles[fileIndex].id\r\n ); //drive file\r\n\r\n let projectRegion =\r\n this.props.project.Region === undefined ||\r\n this.props.project.Region === \"us-east-1\"\r\n ? \"us-east-1\"\r\n : this.props.project.Region === \"ca-central-1\"\r\n ? \"ca-central-1\"\r\n : \"\";\r\n\r\n let bucketName =\r\n projectRegion === \"\" || projectRegion === \"us-east-1\"\r\n ? constants[Environment].projectsBucketName.us_east_1\r\n : constants[Environment].projectsBucketName.canada;\r\n let data = {\r\n Key: uniqueNameExt,\r\n BucketName: bucketName,\r\n File: file,\r\n orgId: this.props.appState.Auth._idData[\"custom:OrgId\"],\r\n uploadBy: this.props.userData.email,\r\n DisplayFileName: this.state.selectedFiles[fileIndex].name,\r\n Region: projectRegion,\r\n };\r\n\r\n //upload selected file to s3\r\n let self = this;\r\n const params = {\r\n Key: { Env: Environment },\r\n TableName: \"FlairSettings\",\r\n };\r\n let creditToDeduct;\r\n const fileNameofSelectedFile = self.state.selectedFiles[fileIndex].name;\r\n this.props.appState.AWSDBService.getItem(params).then((setting) => {\r\n const fileExtension = fileNameofSelectedFile.split(\".\").pop();\r\n if (\r\n setting.ComplexJobFiles &&\r\n setting.ComplexJobFiles.includes(fileExtension)\r\n ) {\r\n creditToDeduct = setting.ComplexJobRate;\r\n } else {\r\n creditToDeduct = setting.SimpleJobRate;\r\n }\r\n const subscriptionTableName =\r\n Environment !== \"Production\" ? \"Subscription\" : \"Prod-Subscription\";\r\n const Newparams = {\r\n Key: { orgId: self.props.appState.Auth._idData[\"custom:OrgId\"] },\r\n TableName: subscriptionTableName,\r\n };\r\n let isAllowded;\r\n this.props.appState.AWSDBService.getItem(Newparams).then((subData) => {\r\n if (subData) {\r\n if (subData.credits >= creditToDeduct) {\r\n isAllowded = true;\r\n } else {\r\n isAllowded = false;\r\n }\r\n if (!isAllowded) this._lowCreditsOkDialog();\r\n else {\r\n this.props.appState.AWSDBService.uploadObject(\r\n data,\r\n async (progresss) => {\r\n this.setState({ progress: progresss });\r\n if (progresss === 100) {\r\n let fileData = {\r\n category: self.state.category,\r\n uploadtime: new Date().getTime(),\r\n fileId: uniqueNameExt,\r\n fileName: fileNameofSelectedFile,\r\n Status: \"in progress\",\r\n uploadedBy: self.props.userData.email,\r\n };\r\n\r\n let projectData = self.props.project;\r\n if (projectData.Data.Files) {\r\n projectData.Data.Files[uniqueName] = fileData;\r\n } else {\r\n projectData.Data.Files = {};\r\n projectData.Data.Files[uniqueName] = fileData;\r\n }\r\n\r\n // update in store\r\n self.props.updateProject(projectData);\r\n\r\n self.state.uploadedFileCount++;\r\n self.setState({\r\n uploadedFileCount: self.state.uploadedFileCount,\r\n progress: 0,\r\n uploadInProgress: false,\r\n });\r\n\r\n if (\r\n self.state.selectedFiles.length ===\r\n self.state.uploadedFileCount\r\n ) {\r\n // update in db\r\n // self.props.appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // { Project_Id: self.props.project.Project_Id },\r\n // [\"Data.Files\"],\r\n // [projectData.Data.Files]\r\n // );\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n projectData,\r\n self.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this.props.appState.AWSDBService.saveLoggerDataToS3(fileData.fileId, projectData);\r\n self.setState({\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n uploadedFileCount: 0,\r\n });\r\n self.props.notify({\r\n message: \"File/s uploaded successfully\",\r\n type: \"success\",\r\n });\r\n this.close();\r\n // eslint-disable-next-line prefer-arrow-callback\r\n setTimeout(function() {\r\n self.getTranslation(fileData.fileId);\r\n }, 8000);\r\n } else {\r\n console.log(\"error file not uploaded successfully\");\r\n }\r\n }\r\n }\r\n )\r\n .then((result) => {\r\n console.log(\"file uploaded Successfully\", result);\r\n })\r\n .catch((err) => {\r\n console.log(\r\n \"error while upload the file may be your organization don't have enough Credits to upload \",\r\n err\r\n );\r\n self.props.notify({\r\n message: \"Failed to upload file/s\",\r\n type: \"error\",\r\n });\r\n // self._lowCreditsOkDialog();\r\n this.close();\r\n });\r\n }\r\n } else {\r\n console.log(\"subscription data of organization not found\");\r\n }\r\n });\r\n });\r\n }\r\n }\r\n getTranslation = (fileId) => {\r\n let interval = setInterval(() => {\r\n this._getFileTranslationStatus(fileId);\r\n }, 6000);\r\n this._FileStatusInterval[fileId] = interval;\r\n };\r\n _getFileTranslationStatus(fileId) {\r\n this.props.appState.AWSDBService.getFileTranslationStatus(fileId).then(\r\n (data) => {\r\n let project = this.props.project;\r\n\r\n project.Data.Files[fileId.split(\".\")[0]].Status = data.progress;\r\n\r\n if (data.progress === \"complete\") {\r\n this.props.appState.AWSDBService.saveLoggerDataToS3(fileId, project)\r\n clearInterval(this._FileStatusInterval[fileId]);\r\n }\r\n //update in store\r\n this.props.updateProject(project);\r\n }\r\n );\r\n }\r\n render() {\r\n const { open, category, progress, uploadInProgress } = this.state;\r\n return (\r\n \r\n this.close()}>\r\n Upload File\r\n \r\n \r\n {this._select()}\r\n \r\n \r\n \r\n {\r\n this._onCategorySelected(e);\r\n }}\r\n name=\"category\"\r\n fullWidth\r\n disabled={uploadInProgress}\r\n style={{ marginTop: 8, marginBottom: 8 }}\r\n >\r\n Select Category\r\n Architectural\r\n Structural\r\n MEP\r\n Civil\r\n Other\r\n \r\n \r\n \r\n {this._upload()}\r\n {progress > 0 ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n {\r\n this.close();\r\n }}\r\n >\r\n Close\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\nPFileUploadDialog.propTypes = {\r\n project: propTypes.object,\r\n appState: propTypes.object,\r\n userData: propTypes.object,\r\n updateProject: propTypes.any,\r\n};\r\n\r\nconst FileUploadDialog = connect(mapStateToProps, mapDispatchToProps, null, {\r\n forwardRef: true,\r\n})(PFileUploadDialog);\r\nexport default FileUploadDialog;\r\n","import * as Actions from \"../redux/actions\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component } from \"react\";\r\n\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport DialogActions from \"@material-ui/core/DialogActions\";\r\nimport DialogContent from \"@material-ui/core/DialogContent\";\r\nimport DialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport FButtonPrimary from \"../widgets/FButtonPrimary\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n appState: state.common.appState,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n };\r\n}\r\nclass PImageUploadDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n openDialog: false,\r\n selectedFiles: [],\r\n fileUrl: \"\",\r\n file: \"\",\r\n pictureUrl: \"\", //contains s3 file url\r\n selectedFile: \"\",\r\n };\r\n this._previousPictureUrl = \"\";\r\n }\r\n\r\n show() {\r\n this.setState({ openDialog: true });\r\n }\r\n\r\n close() {\r\n this.setState({\r\n openDialog: false,\r\n selectedFile: \"\",\r\n pictureUrl: \"\",\r\n });\r\n }\r\n\r\n onFileSelect(e) {\r\n this.setState({\r\n selectedFiles: Array.from(e.target.files),\r\n });\r\n }\r\n\r\n _select() {\r\n return (\r\n \r\n \r\n {\r\n this.onFileSelect(e);\r\n }}\r\n />\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n get _selectButtonComponent() {\r\n if (!this.state.selectedFile) {\r\n return (\r\n \r\n {\r\n this._onFileSelect(e);\r\n }}\r\n />\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n async _handleUpload() {\r\n if (this.state.selectedFile !== \"\") {\r\n await this._uploadImage();\r\n }\r\n }\r\n\r\n _uploadImage = () => {\r\n let self = this;\r\n const { project } = this.props;\r\n const { selectedFile } = this.state;\r\n\r\n return new Promise((resolve, reject) => {\r\n let env = \"\";\r\n if (Environment === \"Testing\" || Environment === \"Development\") {\r\n env = \"Dev-Testing\";\r\n } else {\r\n env = Environment;\r\n }\r\n let uniqueNameExt = `Project Thumbnails/${env}/${project.Project_Id}/${selectedFile.name}`;\r\n\r\n let data = {\r\n Key: uniqueNameExt,\r\n BucketName: \"flair-cognito-userdata\",\r\n File: self.state.selectedFile,\r\n };\r\n\r\n //update picture attribute with s3 image path\r\n this.props.appState.AWSDBService.uploadObjectToS3(data)\r\n .then(() => {\r\n self.setState({\r\n selectedFile: \"\",\r\n });\r\n self.props.appState.AWSDBService.updateItem(\r\n constants[Environment].projectsTableName,\r\n {\r\n Project_Id: project.Project_Id,\r\n },\r\n [\"FeatureImagePath\"],\r\n [uniqueNameExt]\r\n );\r\n this.props.notify({\r\n message: \"Image uploaded successfully\",\r\n type: \"success\",\r\n });\r\n this.close();\r\n let params = {\r\n Bucket: constants[Environment].cognitoUserDataBucketName,\r\n Key: uniqueNameExt,\r\n Expires: 86400,\r\n };\r\n self.props.appState.AWSDBService.getS3ObjectPreSignedURL(params).then(\r\n (picURL) => {\r\n project.Data.Thumbnail_URL = picURL;\r\n self.props.updateProject(project);\r\n }\r\n );\r\n })\r\n .catch(() => {\r\n this.props.notify({ message: \"File upload failed\", type: \"error\" });\r\n reject();\r\n this.close();\r\n });\r\n });\r\n };\r\n\r\n _onFileSelect(e) {\r\n this.setState(\r\n {\r\n selectedFile: e.target.files[0],\r\n },\r\n function() {\r\n //Show file locally\r\n let reader = new FileReader();\r\n let self = this;\r\n reader.addEventListener(\r\n \"load\",\r\n () => {\r\n self._previousPictureUrl = self.state.pictureUrl;\r\n self.setState({\r\n pictureUrl: reader.result,\r\n });\r\n },\r\n false\r\n );\r\n\r\n if (this.state.selectedFile) {\r\n reader.readAsDataURL(\r\n new Blob([this.state.selectedFile], {\r\n type: this.state.selectedFile.type,\r\n })\r\n );\r\n }\r\n }\r\n );\r\n let newFile = e.target.files[0];\r\n\r\n let ext = newFile.name.split(\".\").pop();\r\n console.log(\"new file\", newFile);\r\n Object.defineProperty(newFile, \"name\", {\r\n writable: true,\r\n value: this.props.project.Project_Id + \".\" + ext,\r\n });\r\n }\r\n\r\n _getImageURL() {\r\n let imgURL = \"/facility_2.gif\";\r\n if (this.state.pictureUrl !== \"\") {\r\n imgURL = this.state.pictureUrl;\r\n }\r\n\r\n return imgURL;\r\n }\r\n\r\n _thumbnailPic() {\r\n const imgURL = this._getImageURL();\r\n return (\r\n \r\n \"Thumbnail_Building\"\r\n {this._selectButtonComponent}\r\n \r\n );\r\n }\r\n\r\n render() {\r\n return (\r\n \r\n {\" \"}\r\n \r\n \r\n this.close()}\r\n >\r\n Upload Thumbnail Image\r\n \r\n \r\n \r\n \r\n {this._thumbnailPic()}\r\n \r\n \r\n {this._select()}\r\n \r\n \r\n \r\n \r\n {\r\n this._handleUpload();\r\n }}\r\n >\r\n Upload\r\n \r\n {\r\n this.close();\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\nPImageUploadDialog.propTypes = {\r\n classes: propTypes.object,\r\n project: propTypes.object,\r\n history: propTypes.object,\r\n appState: propTypes.object,\r\n notify: propTypes.func,\r\n};\r\n\r\nconst ImageUploadDialog = connect(mapStateToProps, mapDispatchToProps, null, {\r\n forwardRef: true,\r\n})(PImageUploadDialog);\r\nexport default ImageUploadDialog;\r\n","import * as Actions from \"../redux/actions/index\";\r\n\r\nimport { ContextMenu, ContextMenuTrigger } from \"react-contextmenu\";\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component, Fragment } from \"react\";\r\nimport { Typography, withStyles } from \"@material-ui/core\";\r\n\r\nimport AddIcon from \"@material-ui/icons/AddCircle\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport CloudDownload from \"@material-ui/icons/CloudDownload\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport EnhancedTable from \"../widgets/DataTableNew\";\r\nimport FileUploadDialog from \"./FileUploadDialog\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ImageIcon from \"@material-ui/icons/Image\";\r\n//import DeleteOutline from '@material-ui/icons/DeleteOutline';\r\nimport ImageUploadDialog from \"./ImageUploadDialog\";\r\nimport Info from \"@material-ui/icons/Info\";\r\nimport InformativeDialog from \"../commonDialogs/InformativeDialog\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Privileged from \"../widgets/Privileged\";\r\nimport ThreeD from \"@material-ui/icons/ThreeDRotation\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Utils from \"../core/Utils\";\r\nimport WarningDialog from \"../commonDialogs/WarningDialog\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n//import UploadFileDialog from \"./UploadFileDialog\"\r\nvar userRole = \"Viewers\";\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n linkDecoration: {\r\n cursor: \"pointer\",\r\n color: \"#0000ff\",\r\n },\r\n margin: {\r\n marginTop: theme.spacing(0),\r\n marginBottom: theme.spacing(2),\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n },\r\n l_m: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n projects: state.projects.projectList,\r\n appState: state.common.appState,\r\n selectedPointCloudModels: state.selectedPointCloudModels,\r\n userProfileData: state.common.userProfileData,\r\n };\r\n};\r\n\r\nlet downloadList = new Map();\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\nclass PFileListView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedFiles: {},\r\n isTranslationProgressCheckInProgress: false,\r\n allFileSelect: false,\r\n fileDetails: null,\r\n selectedFileData: null,\r\n userRoleData: undefined,\r\n userRoleAdmin: false,\r\n userRoleViewer: false,\r\n isSharedProject: false,\r\n };\r\n this.dialogRef = React.createRef();\r\n //this.fileDialogRef = React.createRef();\r\n this.dialogUploadRef = React.createRef();\r\n this.warningDialogRef = React.createRef();\r\n this.fileDetailsDialogRef = React.createRef();\r\n this.translationInProgressDialogRef = React.createRef();\r\n this._fileIdsNotToDelete = [];\r\n }\r\n componentDidMount() {\r\n const { project } = this.props;\r\n if (project && project.Data) {\r\n if (!this.state.userRoleAdmin && !this.state.userRoleViewer) {\r\n this.getRoleDataFromHeader();\r\n this.getTypeOfProject();\r\n }\r\n }\r\n }\r\n async componentDidUpdate() {\r\n const { project } = this.props;\r\n if (project && project.Data && project.Data.Files) {\r\n const files = project.Data.Files;\r\n for (const key in files) {\r\n if (\r\n files[key].Status !== \"complete\" &&\r\n this.state.isTranslationProgressCheckInProgress === false\r\n ) {\r\n await this._getFileTranslationStatus(files[key].fileId);\r\n }\r\n }\r\n }\r\n if (project && project.Data) {\r\n if (!this.state.userRoleAdmin && !this.state.userRoleViewer) {\r\n this.getRoleDataFromHeader();\r\n }\r\n if (!this.state.isSharedProject) {\r\n this.getTypeOfProject();\r\n }\r\n }\r\n }\r\n getTypeOfProject() {\r\n const { project } = this.props;\r\n if (project.orgId != this.props.appState.Auth._idData[\"custom:OrgId\"]) {\r\n this.setState({ isSharedProject: true });\r\n }\r\n }\r\n componentWillUnmount() {\r\n this.setState({ userRoleViewer: false, userRoleAdmin: false });\r\n }\r\n get _fileColumnName() {\r\n if (this.state.allFileSelect) {\r\n return `BIM Model (All) selected`;\r\n } else if (Object.keys(this.state.selectedFiles).length > 0) {\r\n return `BIM Model (${\r\n Object.keys(this.state.selectedFiles).length\r\n }) selected`;\r\n } else {\r\n return `BIM Model`;\r\n }\r\n }\r\n\r\n get dataColumns() {\r\n const { classes } = this.props;\r\n let dataColumns = [];\r\n dataColumns.push({\r\n id: \"action\",\r\n numeric: false,\r\n disablePadding: true,\r\n label: (\r\n \r\n {\r\n this._onAllFileSelect(e);\r\n }}\r\n />\r\n \r\n ),\r\n });\r\n dataColumns.push({\r\n id: \"fileName\",\r\n numeric: false,\r\n disablePadding: true,\r\n label: (\r\n \r\n {this._fileColumnName}\r\n \r\n ),\r\n });\r\n dataColumns.push({\r\n id: \"status\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: Status,\r\n });\r\n dataColumns.push({\r\n id: \"category\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: Category,\r\n });\r\n return dataColumns;\r\n }\r\n\r\n get _data() {\r\n const { classes, project } = this.props;\r\n let data = [];\r\n\r\n if (project && project.Data && project.Data.Files) {\r\n let files = Object.values(project.Data.Files).sort((a, b) => {\r\n return a.fileName.toLowerCase().localeCompare(b.fileName.toLowerCase());\r\n });\r\n\r\n files.forEach((file) => {\r\n data.push({\r\n action: (\r\n {\r\n this._onFileSelected(e);\r\n }}\r\n value={file.fileId.split(\".\")[0]}\r\n />\r\n ),\r\n fileName: (\r\n {\r\n this._open3DModel(file);\r\n }}\r\n >\r\n {file.fileName}\r\n \r\n ),\r\n status: (\r\n {\r\n this._getFilesInfoString(file);\r\n }}\r\n >\r\n {Utils.capitalizeWord(file.Status)}\r\n \r\n ),\r\n category: (\r\n \r\n {file.category ? file.category : \"Not Defined\"}\r\n \r\n ),\r\n });\r\n });\r\n }\r\n return data;\r\n }\r\n\r\n async _open3DModel(file) {\r\n const { history, project, appState } = this.props;\r\n const selectedPointCloudFiles = this.props.selectedPointCloudModels\r\n .selectedPointCloudModels;\r\n //this is to open multiple files on one of the file name click also\r\n if (\r\n Object.keys(this.state.selectedFiles).length > 1 ||\r\n selectedPointCloudFiles.length > 0\r\n ) {\r\n this._openMultipleFiles();\r\n } else if (file.Status === \"complete\") {\r\n history.push(\r\n \"/project/workspace/\" +\r\n project.Project_Id +\r\n \"/viewer/\" +\r\n Utils.getFileURN(file.fileId)\r\n );\r\n } else if (this.state.isTranslationProgressCheckInProgress) {\r\n this._openTranslationInProgressDialog();\r\n } else {\r\n const fileUploadStatus = await this._getFileTranslationStatus(\r\n file.fileId\r\n );\r\n if (fileUploadStatus === \"complete\") {\r\n //update db\r\n // appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: project.Project_Id\r\n // },\r\n // [\"Data.Files\"],\r\n // [project.Data.Files]\r\n // );\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n //redirect to viewer page as translation is complete and this action is to open 3D model\r\n history.push(\r\n \"/project/workspace/\" +\r\n project.Project_Id +\r\n \"/viewer/\" +\r\n Utils.getFileURN(file.fileId)\r\n );\r\n }\r\n }\r\n }\r\n\r\n getUserInfo(params) {\r\n const { appState, project } = this.props;\r\n appState.AWSDBService.queryAllItems(params)\r\n .then((data) => {\r\n this.setState({ userRoleData: data });\r\n // for (let i = 0; i < this.state.userRoleData.Items.length; i++) {\r\n // if (\r\n // this.state.userRoleData.Items[i].email ===\r\n // this.props.userProfileData.email &&\r\n // this.state.userRoleData.Items[i].role === \"Admins\"\r\n // ) {\r\n // this.setState({ userRoleAdmin: true });\r\n // userRole = \"Admins\";\r\n // break;\r\n // }\r\n // }\r\n if (project.Data.ProjectOwner === this.props.userProfileData.email) {\r\n this.setState({ userRoleAdmin: true });\r\n userRole = \"Admins\";\r\n } else {\r\n userRole = \"Viewers\";\r\n this.setState({ userRoleViewer: true });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n toCheckRoleofUser() {\r\n const { appState } = this.props;\r\n var params = {\r\n Key: { Project_Id: this.props.project.Project_Id },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n this.props.appState.AWSDBService.getItem(params).then((data) => {\r\n var orgID = data.orgId;\r\n var params = {\r\n TableName: constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"owner_orgid = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": orgID,\r\n },\r\n };\r\n this.getUserInfo(params);\r\n });\r\n }\r\n getRoleDataFromHeader() {\r\n for (let index = 0; index < this.props.projects.length; index++) {\r\n const PID = this.props.projects[index].Project_Id;\r\n if (this.props.project.Project_Id == PID) {\r\n var role = this.props.projects[index].Role;\r\n if (role === \"Admins\") {\r\n this.setState({ userRoleAdmin: true });\r\n } else if (role === \"Viewers\") {\r\n this.setState({ userRoleViewer: true });\r\n } else if (role === undefined) {\r\n this.toCheckRoleofUser();\r\n }\r\n }\r\n }\r\n }\r\n async _openMultipleFiles() {\r\n const {\r\n history,\r\n project,\r\n appState,\r\n isPointCloudFileTranslationInProgress,\r\n } = this.props;\r\n let allFilesReady = true;\r\n const fileNames = [];\r\n const selectedFiles = Object.keys(this.state.selectedFiles);\r\n const selectedPointCloudFiles = this.props.selectedPointCloudModels\r\n .selectedPointCloudModels;\r\n if (selectedPointCloudFiles.length > 0 && project.Data.PointCloudFiles) {\r\n for (let i = 0; i < selectedPointCloudFiles.length; i++) {\r\n const files = project.Data.PointCloudFiles;\r\n if (files[selectedPointCloudFiles[i]]) {\r\n const fileId = files[selectedPointCloudFiles[i]].fileId;\r\n\r\n if (files[selectedPointCloudFiles[i]].Status === \"complete\") {\r\n continue;\r\n } else if (isPointCloudFileTranslationInProgress === false) {\r\n const fileUploadStatus = await this.props.pointCloudFileListViewRef._getPointCloudFileTranslationStatus(\r\n fileId\r\n );\r\n if (fileUploadStatus !== \"complete\") {\r\n allFilesReady = false;\r\n this._openTranslationInProgressDialog();\r\n break;\r\n }\r\n\r\n if (\r\n i === selectedPointCloudFiles.length - 1 ||\r\n allFilesReady === false\r\n ) {\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: project.Project_Id\r\n // },\r\n // [\"Data.PointCloudFiles\"],\r\n // [project.Data.PointCloudFiles]\r\n // );\r\n }\r\n }\r\n }\r\n }\r\n if (isPointCloudFileTranslationInProgress) {\r\n allFilesReady = false;\r\n this._openTranslationInProgressDialog();\r\n }\r\n }\r\n\r\n if (selectedFiles.length > 0) {\r\n for (let i = 0; i < selectedFiles.length; i++) {\r\n const files = project.Data.Files;\r\n const fileId = files[selectedFiles[i]].fileId;\r\n\r\n if (files[selectedFiles[i]].Status === \"complete\") {\r\n fileNames.push(fileId);\r\n continue;\r\n } else if (this.state.isTranslationProgressCheckInProgress === false) {\r\n const fileUploadStatus = await this._getFileTranslationStatus(fileId);\r\n if (fileUploadStatus === \"complete\") {\r\n fileNames.push(fileId);\r\n } else {\r\n allFilesReady = false;\r\n this._openTranslationInProgressDialog();\r\n break;\r\n }\r\n\r\n if (i === selectedFiles.length - 1 || allFilesReady === false) {\r\n // appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: project.Project_Id\r\n // },\r\n // [\"Data.Files\"],\r\n // [project.Data.Files]\r\n // );\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n }\r\n }\r\n }\r\n\r\n if (allFilesReady) {\r\n let pathToPush = `/project/workspace/${project.Project_Id}/viewer`;\r\n fileNames.forEach((file) => {\r\n const urn = \"/\" + Utils.getFileURN(file);\r\n pathToPush += urn;\r\n });\r\n history.push(pathToPush);\r\n }\r\n } else {\r\n this.props.notify({\r\n message: \"Please select files first\",\r\n type: \"warning\",\r\n });\r\n }\r\n }\r\n\r\n _getFileTranslationStatus = (fileId) => {\r\n return new Promise((resolve, reject) => {\r\n this.setState({\r\n isTranslationProgressCheckInProgress: true,\r\n });\r\n\r\n //check for translation status by calling api\r\n this.props.appState.AWSDBService.getFileTranslationStatus(fileId)\r\n .then((data) => {\r\n let project = this.props.project;\r\n\r\n project.Data.Files[fileId.split(\".\")[0]].Status = data.progress;\r\n\r\n //update in store\r\n this.props.updateProject(project);\r\n\r\n this.setState({\r\n isTranslationProgressCheckInProgress: false,\r\n });\r\n\r\n resolve(data.progress);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n };\r\n\r\n _deleteFiles = async () => {\r\n let filesToDelete = this.state.selectedFiles;\r\n const { appState, project, notify } = this.props;\r\n let files = project.Data.Files;\r\n var projectId = project.Project_Id;\r\n var isDefaultProject = projectId.includes(\"defaultproject\");\r\n let bucketName =\r\n project.Region === undefined || project.Region === \"us-east-1\"\r\n ? constants[Environment].projectsBucketName.us_east_1\r\n : constants[Environment].projectsBucketName.canada;\r\n await this.getFlairSettingsData();\r\n const FileIdsNotToDelete = this.getFileIdsNotToDelete();\r\n for (const key in files) {\r\n if (Object.keys(filesToDelete).includes(key)) {\r\n let fileIdFound = FileIdsNotToDelete.includes(files[key].fileId);\r\n var params = {\r\n Bucket: bucketName,\r\n Key: files[key].fileId,\r\n };\r\n if (!(isDefaultProject || fileIdFound)) {\r\n appState.AWSDBService.deleteObject(params, true)\r\n .then(() => {\r\n console.log(\"Temp log\", \"Files deleted from all buckets\");\r\n })\r\n .catch((err) => {\r\n console.error(\r\n \"File delete from flair3D S3 bucket or Autodesk bucket failed\",\r\n err\r\n );\r\n })\r\n .finally(() => {\r\n // Delete file entry from db regardless of file delete success from s3\r\n delete project.Data.Files[key];\r\n delete filesToDelete[key];\r\n\r\n if (Object.getOwnPropertyNames(filesToDelete).length === 0) {\r\n //all files are deleted hence update Project in database and redux store\r\n // appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: project.Project_Id\r\n // },\r\n // [\"Data.Files\"],\r\n // [project.Data.Files]\r\n // );\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this.props.updateProject(project);\r\n notify({\r\n message: \"Selected files are deleted\",\r\n type: \"success\",\r\n });\r\n }\r\n });\r\n } else {\r\n delete project.Data.Files[key];\r\n delete filesToDelete[key];\r\n\r\n if (Object.getOwnPropertyNames(filesToDelete).length === 0) {\r\n //all files are deleted hence update Project in database and redux store\r\n // appState.AWSDBService.updateItem(\r\n // constants[Environment].projectsTableName,\r\n // {\r\n // Project_Id: project.Project_Id\r\n // },\r\n // [\"Data.Files\"],\r\n // [project.Data.Files]\r\n // );\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this.props.updateProject(project);\r\n notify({\r\n message: \"Selected files are deleted\",\r\n type: \"success\",\r\n });\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n getFlairSettingsData() {\r\n var params = {\r\n Key: { Env: Environment },\r\n TableName: constants[Environment].settingsTableName,\r\n };\r\n return new Promise((resolve, reject) => {\r\n this.props.appState.AWSDBService.getItem(params)\r\n .then((setting) => {\r\n let count = 0;\r\n setting.DefaultProjectIds.forEach(async (pid, index) => {\r\n params = {\r\n Key: { Project_Id: pid },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n\r\n let project = await this.props.appState.AWSDBService.getItem(\r\n params\r\n );\r\n if (project)\r\n project = await this.props.appState.AWSDBService.getProjectDataFromS3(\r\n project\r\n );\r\n if (project !== undefined && project !== null) {\r\n Object.keys(project.Data.Files).forEach((file) => {\r\n this._fileIdsNotToDelete.push(project.Data.Files[file].fileId);\r\n });\r\n }\r\n count++;\r\n if (setting.DefaultProjectIds.length === count) {\r\n return resolve();\r\n }\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(\"Fail to fetch Credits data from Settings table\", err);\r\n return reject(err);\r\n });\r\n });\r\n }\r\n\r\n getFileIdsNotToDelete() {\r\n return this._fileIdsNotToDelete;\r\n }\r\n\r\n _onFileSelected(e) {\r\n let selectedFiless = this.state.selectedFiles;\r\n if (e.target.checked) {\r\n let newFile = { [e.target.value]: e.target.checked };\r\n selectedFiless = Object.assign(selectedFiless, newFile);\r\n if (Object.keys(selectedFiless).length > 1) {\r\n this.props.notify({\r\n message: \"Now multiple files can be opened in Viewer\",\r\n type: \"success\",\r\n });\r\n }\r\n } else {\r\n delete selectedFiless[e.target.value];\r\n if (\r\n Object.keys(this.props.project.Data.Files).length >\r\n Object.keys(selectedFiless).length\r\n ) {\r\n this.setState({\r\n allFileSelect: false,\r\n });\r\n }\r\n }\r\n if (\r\n Object.keys(this.props.project.Data.Files).length ===\r\n Object.keys(selectedFiless).length\r\n ) {\r\n this.setState({\r\n allFileSelect: true,\r\n });\r\n }\r\n\r\n let details = this._getFilesInfoString(selectedFiless);\r\n\r\n this.setState({\r\n selectedFiles: selectedFiless,\r\n fileDetails: details,\r\n });\r\n }\r\n\r\n _getFilesInfoString(selectedFiles) {\r\n const selectedFilesArr = Object.keys(selectedFiles);\r\n const projectFiles = this.props.project.Data.Files;\r\n let details = \"\";\r\n selectedFilesArr.forEach((selectedFile) => {\r\n const fileDetails = projectFiles[selectedFile];\r\n if (\r\n selectedFilesArr.indexOf(selectedFile) !==\r\n selectedFilesArr.length - 1\r\n ) {\r\n details += `\\nFile Name: ${fileDetails.fileName}\r\n Uploaded At: ${new Date(\r\n fileDetails.uploadtime\r\n ).toLocaleString()}\r\n Category: ${fileDetails.category}\r\n Status: ${Utils.capitalizeWord(fileDetails.Status)}\r\n Uploaded By: ${\r\n fileDetails.uploadedBy ? fileDetails.uploadedBy : \"\"\r\n }\r\n _________________________________________________________________`;\r\n } else {\r\n details += `\\nFile Name: ${fileDetails.fileName}\r\n Uploaded_At: ${new Date(\r\n fileDetails.uploadtime\r\n ).toLocaleString()}\r\n Category: ${fileDetails.category}\r\n Status: ${Utils.capitalizeWord(fileDetails.Status)}\r\n Uploaded By: ${\r\n fileDetails.uploadedBy ? fileDetails.uploadedBy : \"\"\r\n }`;\r\n }\r\n });\r\n\r\n return details;\r\n }\r\n\r\n _onAllFileSelect(e) {\r\n const project = this.props.project;\r\n if (e.target.checked && project && project.Data && project.Data.Files) {\r\n let selectedFiless = {};\r\n const sortedFiles = Object.values(project.Data.Files).sort((a, b) => {\r\n return a.fileName.toLowerCase().localeCompare(b.fileName.toLowerCase());\r\n });\r\n sortedFiles.forEach((file) => {\r\n let newFile = { [file.fileId.split(\".\")[0]]: e.target.checked };\r\n selectedFiless = Object.assign(selectedFiless, newFile);\r\n });\r\n let details = this._getFilesInfoString(selectedFiless);\r\n this.setState({\r\n selectedFiles: selectedFiless,\r\n allFileSelect: true,\r\n fileDetails: details,\r\n });\r\n this.props.notify({\r\n message: \"Now multiple files can be opened in viewer\",\r\n type: \"success\",\r\n });\r\n } else {\r\n this.setState({\r\n selectedFiles: {},\r\n allFileSelect: false,\r\n fileDetails: \"\",\r\n });\r\n }\r\n }\r\n getFile() {\r\n const { project } = this.props;\r\n const { selectedFiles } = this.state;\r\n console.log(\"selectedFile\", selectedFiles);\r\n if (selectedFiles) {\r\n for (let key in project.Data.Files) {\r\n for (let keyy in selectedFiles) {\r\n if (key === keyy) {\r\n this.setState({ selectedFileData: project.Data.Files[key] });\r\n return project.Data.Files[key];\r\n }\r\n }\r\n }\r\n }\r\n }\r\n async _deleteRvt() {\r\n let filedata = this.getFile();\r\n if (filedata) {\r\n this.props.appState.AWSDBService.getForgeToken()\r\n .then(async () => {\r\n const tempUploadresult = await this.props.appState.AWSDBService.getTempUploadUrl(\r\n filedata.fileId\r\n );\r\n console.log(\"get Temp Upload Url result\", tempUploadresult);\r\n const tempDownloadResult = await this.props.appState.AWSDBService.getTempDownloadUrl(\r\n filedata.fileId\r\n );\r\n const wrkItmResult = await this.props.appState.AWSDBService.createWorkItem(\r\n filedata.fileId,\r\n tempDownloadResult.signedUrl,\r\n tempUploadresult.signedUrl\r\n );\r\n console.log(\"create work item\", wrkItmResult);\r\n const resultData = await this.props.appState.AWSDBService.statusOfWorkItem(\r\n wrkItmResult,\r\n filedata.fileId\r\n );\r\n console.log(\"status of workItem\", resultData);\r\n // const getTrnsResult = await this._getFileTranslationStatus(filedata.fileId)\r\n // console.log(\"translation result\", getTrnsResult);\r\n })\r\n .catch(() => {\r\n console.error(\"Failed to get Authentication forge token\");\r\n this.props.appState.Auth.signOut();\r\n });\r\n }\r\n }\r\n\r\n _downloadFile() {\r\n let filesToDownload = this.state.selectedFiles;\r\n let files = this.props.project.Data.Files;\r\n for (const fileId in filesToDownload) {\r\n if (downloadList.has(fileId)) {\r\n this.props.notify({\r\n message:\r\n \"Download already running in background for selcted BIM file.\",\r\n type: \"warning\",\r\n });\r\n break;\r\n }\r\n if (files[fileId]) {\r\n const key = files[fileId].fileId;\r\n\r\n this.props.appState.AWSDBService.downloadFromAdskBucket(key)\r\n .then(async (data) => {\r\n downloadList.set(fileId, \"inprogress\");\r\n this.props.notify({\r\n message: \"Selected BIM file is downloading in background.\",\r\n type: \"info\",\r\n });\r\n request(data.signedUrl, files[fileId].fileName, fileId).catch(\r\n (err) => {\r\n console.error(err);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message: \"Selected BIM file not available for download.\",\r\n type: \"warning\",\r\n });\r\n }\r\n );\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message: \"Error in file download.\",\r\n type: \"warning\",\r\n });\r\n });\r\n }\r\n }\r\n\r\n let request = (path, fileName, fileId) =>\r\n fetch(path)\r\n .then((response) => (response.status !== 404 ? response.blob() : null))\r\n .then((blob) => {\r\n let d = document.createElement(\"a\");\r\n d.className = \"download\";\r\n d.download = fileName;\r\n d.href = URL.createObjectURL(blob);\r\n document.body.appendChild(d);\r\n d.click();\r\n d.parentElement.removeChild(d);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message: fileName + \" downloaded successfully.\",\r\n type: \"success\",\r\n });\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n throw err;\r\n });\r\n }\r\n _openFileImage() {\r\n this.dialogUploadRef.current.show();\r\n }\r\n\r\n _openFileUpload() {\r\n this.dialogRef.current.show();\r\n }\r\n // _openUploadRvt() {\r\n // this.fileDialogRef.current.show();\r\n // }\r\n _openFileDeleteWarningDialog() {\r\n this.warningDialogRef.current.show();\r\n }\r\n\r\n _openTranslationInProgressDialog() {\r\n this.translationInProgressDialogRef.current.show();\r\n }\r\n\r\n _isFileSelected() {\r\n return Object.getOwnPropertyNames(this.state.selectedFiles).length > 0;\r\n }\r\n\r\n _areMultipleFilesSelected() {\r\n return Object.getOwnPropertyNames(this.state.selectedFiles).length > 1;\r\n }\r\n\r\n _isSingleFileSelected() {\r\n return Object.getOwnPropertyNames(this.state.selectedFiles).length === 1;\r\n }\r\n\r\n _yesCB() {\r\n this._deleteFiles();\r\n }\r\n\r\n _openFileDetailsDialog() {\r\n if (Object.keys(this.state.selectedFiles).length > 0) {\r\n this.fileDetailsDialogRef.current.show();\r\n this.forceUpdate();\r\n } else {\r\n this.props.notify({\r\n message: \"Please select model/s first!!\",\r\n type: \"warning\",\r\n });\r\n }\r\n }\r\n\r\n get _commonActionsOnFiles() {\r\n return (\r\n \r\n {/* \r\n \r\n
\r\n { this._deleteRvt(); }}>\r\n \r\n \r\n
\r\n
\r\n
*/}\r\n {this.state.userRoleAdmin ? (\r\n \r\n \r\n
\r\n {\r\n this._openFileImage();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n
\r\n ) : null}\r\n \r\n
\r\n {\r\n this._openMultipleFiles();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n {\r\n this._openFileDetailsDialog();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n {\r\n this._downloadFile();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n get _adminActionsOnFiles() {\r\n return (\r\n \r\n \r\n \r\n {\r\n this._yesCB();\r\n }}\r\n ref={this.warningDialogRef}\r\n />\r\n \r\n \r\n
\r\n {\r\n this._openFileDeleteWarningDialog();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n {\r\n this._openFileUpload();\r\n }}\r\n >\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { classes, appState } = this.props;\r\n return (\r\n \r\n {this.state.isSharedProject ? (\r\n \r\n {this._commonActionsOnFiles}\r\n {this.state.userRoleAdmin ? (\r\n {this._adminActionsOnFiles}\r\n ) : null}\r\n \r\n ) : (\r\n \r\n {this._commonActionsOnFiles}\r\n {this.state.userRoleAdmin ? (\r\n \r\n {this._adminActionsOnFiles}\r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n {this._data && this._data.length > 0 ? (\r\n <>\r\n \r\n {\r\n this._openFileDetailsDialog();\r\n }}\r\n >\r\n View Details\r\n \r\n {\r\n this._openMultipleFiles();\r\n }}\r\n >\r\n View Models\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {\" \"}\r\n No files are uploaded. Click on + button to upload the files.{\" \"}\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\nexport function GetUserRole() {\r\n return userRole;\r\n}\r\nPFileListView.propTypes = {\r\n classes: propTypes.object,\r\n project: propTypes.object,\r\n history: propTypes.object,\r\n appState: propTypes.object,\r\n userProfileData: propTypes.object,\r\n projects: propTypes.array,\r\n notify: propTypes.func,\r\n updateProject: propTypes.any,\r\n selectedPointCloudModels: propTypes.object,\r\n isPointCloudFileTranslationInProgress: propTypes.any,\r\n pointCloudFileListViewRef: propTypes.any,\r\n};\r\n\r\nconst FileListView = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(withStyles(styles)(PFileListView)));\r\nexport default FileListView;\r\n","import * as Actions from \"../redux/actions\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component, Fragment } from \"react\";\r\n\r\nimport BitProgressBar from \"../widgets/BitProgressBar\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport Dialog from \"@material-ui/core/Dialog\";\r\nimport Draggable from \"react-draggable\";\r\nimport FButtonPrimary from \"../widgets/FButtonPrimary\";\r\nimport GooglePicker from \"react-google-picker\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport InformativeDialog from \"../commonDialogs/InformativeDialog\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport MuiDialogActions from \"@material-ui/core/DialogActions\";\r\nimport MuiDialogContent from \"@material-ui/core/DialogContent\";\r\nimport MuiDialogTitle from \"@material-ui/core/DialogTitle\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport Select from \"@material-ui/core/Select\";\r\nimport TextField from \"@material-ui/core/TextField\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport Utils from \"../core/Utils\";\r\nimport WarningDialog from \"../commonDialogs/WarningDialog\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport { ThreeSixty } from \"@material-ui/icons\";\r\n\r\nfunction PaperComponent(props) {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst DialogTitle = withStyles((theme) => ({\r\n root: {\r\n borderBottom: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n width: \"25vw\",\r\n },\r\n closeButton: {\r\n position: \"absolute\",\r\n right: theme.spacing(1),\r\n top: theme.spacing(1),\r\n color: theme.palette.grey[500],\r\n },\r\n}))((props) => {\r\n const { children, classes } = props;\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n});\r\n\r\nconst DialogContent = withStyles(() => ({\r\n root: {\r\n margin: 0,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst Category = withStyles(() => ({\r\n root: {\r\n padding: 0,\r\n flexGrow: 1,\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst Progress = withStyles((theme) => ({\r\n root: {\r\n padding: 0,\r\n marginTop: theme.spacing(2),\r\n },\r\n}))(MuiDialogContent);\r\n\r\nconst DialogActions = withStyles((theme) => ({\r\n root: {\r\n borderTop: `0.1vw solid ${theme.palette.divider}`,\r\n margin: 0,\r\n padding: theme.spacing(1),\r\n },\r\n}))(MuiDialogActions);\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n appState: state.common.appState,\r\n userData: state.common.userProfileData,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\nclass PPointCloudFileUploadDialog extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: false,\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n uploadInProgress: false,\r\n uploadedFileCount: 0,\r\n progress: 0,\r\n downloadInProgress: false,\r\n unsupportedFileList: [],\r\n sameFileList: [],\r\n fileNameToReProcess: [],\r\n };\r\n this.supportedFileFormats = [\"e57\", \"rcs\", \"zip\", \"ptx\", \"ply\"];\r\n this.warningDialogRef = React.createRef();\r\n this.supportedFileFormatDialogRef = React.createRef();\r\n this.unsupportedSameFileDialogRef = React.createRef();\r\n this._pointCloudFileStatusInterval = {};\r\n this.projectRegion =\r\n this.props.project.Region === undefined ||\r\n this.props.project.Region === \"us-east-1\"\r\n ? \"us-east-1\"\r\n : this.props.project.Region === \"ca-central-1\"\r\n ? \"ca-central-1\"\r\n : \"\";\r\n }\r\n\r\n show() {\r\n this.setState({ open: true });\r\n }\r\n\r\n close() {\r\n if (!this.state.uploadInProgress) {\r\n this.setState({\r\n open: false,\r\n category: \"Select Category\",\r\n selectedFiles: [],\r\n });\r\n }\r\n }\r\n\r\n _openSameFileNameWarningDialog() {\r\n this.warningDialogRef.show();\r\n }\r\n\r\n _openSupportedFileFormatOkDialog() {\r\n this.supportedFileFormatDialogRef.show();\r\n }\r\n\r\n _openUnsupportedSameFileOkDialog() {\r\n this.unsupportedSameFileDialogRef.current.show();\r\n }\r\n\r\n _unsupportedSameFileOkDialogOkCB() {\r\n this._cancelUpload();\r\n }\r\n\r\n _supportedFileFormatDialogOkCB() {\r\n this._cancelUpload();\r\n }\r\n\r\n _deleteAndUploadNewFile() {\r\n let fileNameToDelete = this.state.selectedFiles[0].name;\r\n let currentProject = this.props.project;\r\n let files = this.props.project.Data.PointCloudFiles;\r\n\r\n let bucketName =\r\n this.projectRegion === \"\" || this.projectRegion === \"us-east-1\"\r\n ? constants[Environment].projectsBucketNameForPointCloud.us_east_1\r\n : constants[Environment].projectsBucketNameForPointCloud.canada;\r\n let _self = this;\r\n for (const key in files) {\r\n if (files[key].fileName === fileNameToDelete) {\r\n var params = {\r\n Bucket: bucketName,\r\n Key: files[key].fileId,\r\n };\r\n\r\n this.props.appState.AWSDBService.deleteObject(params, false)\r\n .then(() => {\r\n let pointCloudBucketName =\r\n currentProject.Region === undefined ||\r\n currentProject.Region === \"us-east-1\"\r\n ? \"proto-files\"\r\n : \"proto-files-canada\";\r\n let params1 = {\r\n Bucket: pointCloudBucketName,\r\n Prefix: files[key].fileId.split(\".\")[0] + \"/\",\r\n };\r\n\r\n this.props.appState.AWSDBService.deletePointCloudObject(\r\n params1,\r\n false\r\n )\r\n .then(() => {\r\n delete currentProject.Data.PointCloudFiles[key];\r\n\r\n //update Project in database and redux store\r\n // _self.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName,\r\n // {\r\n // 'Project_Id': currentProject.Project_Id\r\n // }, ['Data.PointCloudFiles'], [currentProject.Data.PointCloudFiles]);\r\n _self.props.appState.AWSDBService.saveProjectDataToS3(\r\n currentProject,\r\n _self.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n\r\n _self.props.updateProject(currentProject);\r\n\r\n //now upload new file\r\n this._uploadFiles();\r\n })\r\n .catch(() => {});\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n }\r\n\r\n _replaceFileDialogYesCB() {\r\n //First delete previous one and then upload new one\r\n this._deleteAndUploadNewFile();\r\n }\r\n\r\n _replaceFileDialogCancelCB() {\r\n //on replace cancel remove selected file form db\r\n this._cancelUpload();\r\n }\r\n\r\n _select() {\r\n if (this.state.selectedFiles.length === 0) {\r\n return (\r\n \r\n \r\n {\r\n this.onFileSelect(e);\r\n }}\r\n />\r\n \r\n \r\n \r\n OR\r\n \r\n \r\n this._onDriveFileSelect(data)}\r\n onAuthenticate={(token) => this._storeGoogleAuthToken(token)}\r\n onAuthFailed={(data) => console.log(\"on auth failed:\", data)}\r\n multiselect={true}\r\n navHidden={true}\r\n authImmediate={false}\r\n mimeTypes={[\"application/octet-stream\", \"application/acad\"]}\r\n >\r\n \r\n \"Google\r\n   Select from Google Drive\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n _storeGoogleAuthToken(token) {\r\n this.googleAuthToken = token;\r\n }\r\n\r\n _onDriveFileSelect(data) {\r\n if (data.action === \"loaded\") {\r\n this.setState({ open: false });\r\n } else if (data.action === \"picked\") {\r\n this.onFileSelectionFromDrive(data.docs);\r\n this.setState({ open: true });\r\n }\r\n }\r\n\r\n async _getDriveFile(uniqueNameExt, fileId) {\r\n this.setState({ downloadInProgress: true });\r\n const blob = await this._downloadDriveFile(fileId);\r\n this.setState({ downloadInProgress: false });\r\n return new File([blob], uniqueNameExt);\r\n }\r\n\r\n _downloadDriveFile(fileId) {\r\n let _self = this;\r\n return new Promise((resolve, reject) => {\r\n fetch(\r\n \"https://www.googleapis.com/drive/v3/files/\" + fileId + \"?alt=media\",\r\n {\r\n method: \"GET\",\r\n headers: {\r\n Authorization: \"Bearer \" + _self.googleAuthToken,\r\n },\r\n }\r\n )\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n return resolve(blob);\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n }\r\n\r\n get _driveFileDownloadProgressBar() {\r\n if (this.state.downloadInProgress) {\r\n return (\r\n \r\n \r\n Downloading file from Google drive\r\n \r\n \r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n _getFileUploadErrorMessage() {\r\n let unsupportedFileFormatError =\r\n this.state.unsupportedFileList.length > 0\r\n ? \"{ \" +\r\n this.state.unsupportedFileList +\r\n \" } file/s contains unsupported file format. \\nSupported file formats are .e57, .rcs, .zip, .ptx, .ply\"\r\n : \"\";\r\n let sameFileError =\r\n this.state.sameFileList.length > 0\r\n ? \"{ \" +\r\n this.state.sameFileList +\r\n \" } file/s with same name already present.\"\r\n : \"\";\r\n return `${unsupportedFileFormatError}\r\n ${sameFileError}\r\n Please select appropriate file/s and try again.`;\r\n }\r\n\r\n _upload() {\r\n if (this.state.selectedFiles.length > 0) {\r\n return (\r\n \r\n {\r\n this._replaceFileDialogYesCB();\r\n }}\r\n noCB={() => {\r\n this._replaceFileDialogCancelCB();\r\n }}\r\n ref={this.warningDialogRef}\r\n />\r\n {\r\n this._supportedFileFormatDialogOkCB();\r\n }}\r\n okBtnName=\"Ok\"\r\n ref={this.supportedFileFormatDialogRef}\r\n />\r\n {\r\n this._unsupportedSameFileOkDialogOkCB();\r\n }}\r\n okBtnName=\"Ok\"\r\n ref={this.unsupportedSameFileDialogRef}\r\n />\r\n {\r\n this._uploadOrReplaceFile();\r\n }}\r\n >\r\n Upload\r\n \r\n {\r\n this._cancelUpload(e);\r\n }}\r\n >\r\n Cancel\r\n \r\n {this._driveFileDownloadProgressBar}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n _cancelUpload() {\r\n this.setState({\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n sameFileList: [],\r\n unsupportedFileList: [],\r\n });\r\n }\r\n\r\n onFileSelectionFromDrive(docs) {\r\n this.setState({\r\n selectedFiles: docs,\r\n });\r\n }\r\n\r\n onFileSelect(e) {\r\n this.setState({\r\n selectedFiles: Array.from(e.target.files),\r\n });\r\n }\r\n\r\n _onCategorySelected(e) {\r\n this.setState({\r\n category: e.target.value,\r\n });\r\n }\r\n\r\n get selectedFiles() {\r\n let files = \"No file selected\";\r\n let len = this.state.selectedFiles.length;\r\n if (len > 0) {\r\n let filesNames = [];\r\n for (let i = 0; i < len; i++) {\r\n filesNames.push(this.state.selectedFiles[i].name);\r\n }\r\n files = filesNames.join(\", \");\r\n }\r\n return files;\r\n }\r\n\r\n _isSameFilePresent(projectData) {\r\n if (projectData.Data.PointCloudFiles !== undefined) {\r\n for (var key in projectData.Data.PointCloudFiles) {\r\n if (projectData.Data.PointCloudFiles[key]) {\r\n if (\r\n projectData.Data.PointCloudFiles[key].fileName ===\r\n this.state.selectedFiles[0].name\r\n ) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n _uploadOrReplaceFile() {\r\n //firstly check if selected files have any error\r\n for (let i = 0; i < this.state.selectedFiles.length; i++) {\r\n const fileExtension = this.state.selectedFiles[i].name.split(\".\").pop();\r\n if (this.supportedFileFormats.indexOf(fileExtension.toLowerCase()) >= 0) {\r\n let projectData = this.props.project;\r\n if (this._isSameFilePresent(projectData)) {\r\n this.state.sameFileList.push(this.state.selectedFiles[i].name);\r\n this.setState({\r\n sameFileList: this.state.sameFileList,\r\n });\r\n }\r\n } else {\r\n this.state.unsupportedFileList.push(this.state.selectedFiles[i].name);\r\n this.setState({\r\n unsupportedFileList: this.state.unsupportedFileList,\r\n });\r\n }\r\n }\r\n\r\n if (\r\n this.state.unsupportedFileList.length > 0 ||\r\n this.state.sameFileList.length > 0\r\n ) {\r\n this._openUnsupportedSameFileOkDialog();\r\n } else {\r\n this._uploadFiles();\r\n }\r\n }\r\n\r\n async _uploadFiles() {\r\n for (\r\n let fileIndex = 0;\r\n fileIndex < this.state.selectedFiles.length;\r\n fileIndex++\r\n ) {\r\n this.setState({ uploadInProgress: true });\r\n\r\n let uniqueName = this.props.project.Project_Id + Utils.createUniqueIdV2();\r\n let uniqueNameExt =\r\n uniqueName +\r\n \".\" +\r\n this.state.selectedFiles[fileIndex].name.split(\".\").pop();\r\n //Check is required to know that file is selected from local machine or drive\r\n let file = undefined;\r\n if (!this.googleAuthToken) file = this.state.selectedFiles[fileIndex];\r\n //local file\r\n else\r\n file = await this._getDriveFile(\r\n uniqueNameExt,\r\n this.state.selectedFiles[fileIndex].id\r\n ); //drive file\r\n\r\n let bucketName =\r\n this.projectRegion === \"\" || this.projectRegion === \"us-east-1\"\r\n ? constants[Environment].projectsBucketNameForPointCloud.us_east_1\r\n : constants[Environment].projectsBucketNameForPointCloud.canada;\r\n let data = {\r\n Key: uniqueNameExt,\r\n BucketName: bucketName,\r\n File: file,\r\n orgId: this.props.appState.Auth._idData[\"custom:OrgId\"],\r\n };\r\n if (data.File.size === 0) {\r\n this.state.uploadedFileCount++;\r\n this.setState({\r\n uploadedFileCount: this.state.uploadedFileCount,\r\n progress: 0,\r\n uploadInProgress: false,\r\n });\r\n if (this.state.selectedFiles.length === this.state.uploadedFileCount) {\r\n this.setState({\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n uploadedFileCount: 0,\r\n });\r\n this.close();\r\n }\r\n this.props.notify({\r\n message: \"Selected file is empty\",\r\n type: \"warning\",\r\n });\r\n } else {\r\n //upload selected file to s3\r\n let self = this;\r\n this.props.appState.AWSDBService.uploadPointCloudObject(\r\n data,\r\n async (progress) => {\r\n this.setState({ progress: progress });\r\n if (progress === 100 && self.state.selectedFiles[fileIndex]) {\r\n let fileData = {\r\n category: self.state.category,\r\n uploadtime: new Date().getTime(),\r\n fileId: uniqueNameExt,\r\n fileName: self.state.selectedFiles[fileIndex].name,\r\n Status: \"in progress\",\r\n uploadedBy: self.props.userData.email,\r\n };\r\n\r\n let projectData = self.props.project;\r\n if (projectData.Data.PointCloudFiles) {\r\n projectData.Data.PointCloudFiles[uniqueName] = fileData;\r\n } else {\r\n projectData.Data.PointCloudFiles = {};\r\n projectData.Data.PointCloudFiles[uniqueName] = fileData;\r\n }\r\n\r\n // update in store\r\n self.props.updateProject(projectData);\r\n\r\n self.state.uploadedFileCount++;\r\n self.setState({\r\n uploadedFileCount: self.state.uploadedFileCount,\r\n progress: 0,\r\n uploadInProgress: false,\r\n });\r\n\r\n if (\r\n self.state.selectedFiles.length === self.state.uploadedFileCount\r\n ) {\r\n // update in db\r\n // self.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName,\r\n // { 'Project_Id': self.props.project.Project_Id }, ['Data.PointCloudFiles'], [projectData.Data.PointCloudFiles]\r\n // );\r\n self.props.appState.AWSDBService.saveProjectDataToS3(\r\n self.props.project,\r\n self.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n self.setState({\r\n selectedFiles: [],\r\n category: \"Select Category\",\r\n uploadedFileCount: 0,\r\n });\r\n this.close();\r\n }\r\n this.props.notify({\r\n message: \"Point cloud models translation is in progress\",\r\n type: \"info\",\r\n });\r\n setTimeout(function() {\r\n self.downloadPointCloudFileOnServer(fileData.fileId);\r\n }, 3000);\r\n }\r\n }\r\n );\r\n }\r\n }\r\n }\r\n\r\n downloadPointCloudFileOnServer = (fileId) => {\r\n fetch(\r\n // \"http://localhost:8086/getpointcloudfilefroms3?filename=\" + fileId +\r\n // \"®ion=\" +\r\n // this.projectRegion,\r\n \"https://5s9s2mxem7.execute-api.us-east-1.amazonaws.com/dev2/getpointcloudfilefroms3?filename=\" +\r\n fileId +\r\n \"®ion=\" +\r\n this.projectRegion,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n if (data.progress === \"in progress\") {\r\n let interval = setInterval(() => {\r\n this._getPointCloudFileTranslationStatus(fileId);\r\n }, 6000);\r\n this._pointCloudFileStatusInterval[fileId] = interval;\r\n } else if (data.progress === \"complete\") {\r\n let project = this.props.project;\r\n project.Data.PointCloudFiles[fileId.split(\".\")[0]].Status =\r\n data.progress;\r\n this.props.updateProject(project);\r\n // this.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n } else if (data.progress === \"error\") {\r\n console.log(\"There is error in processing file\");\r\n this.openProcessForFileConversion(fileId);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n });\r\n };\r\n\r\n _getPointCloudFileTranslationStatus(fileId) {\r\n let _self = this;\r\n fetch(\r\n // \"http://localhost:8086/getpointcloudfilestatus?filename=\" + fileId,\r\n \"https://5s9s2mxem7.execute-api.us-east-1.amazonaws.com/dev2/getpointcloudfilestatus?filename=\" +\r\n fileId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n let project = _self.props.project;\r\n project.Data.PointCloudFiles[fileId.split(\".\")[0]].Status =\r\n data.progress;\r\n //update in store\r\n _self.props.updateProject(project);\r\n if (data.progress === \"complete\") {\r\n clearInterval(_self._pointCloudFileStatusInterval[fileId]);\r\n // _self.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n _self.props.appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n _self.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n _self.props.notify({\r\n message: \"Point cloud model/s are ready to view\",\r\n type: \"success\",\r\n });\r\n } else if (data.progress === \"error\") {\r\n clearInterval(_self._pointCloudFileStatusInterval[fileId]);\r\n _self.openProcessForFileConversion(fileId);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n });\r\n }\r\n\r\n openProcessForFileConversion(fileId) {\r\n const { fileNameToReProcess } = this.state;\r\n let flag = false;\r\n fileNameToReProcess.map((iterator) => {\r\n if (iterator.fileId === fileId) {\r\n flag = true;\r\n if (iterator.fileReProcessCount !== 2) {\r\n ++iterator.fileReProcessCount;\r\n iterator.retry = true;\r\n this.setState({ fileNameToReProcess });\r\n } else {\r\n fileNameToReProcess.pop(iterator);\r\n this.setState({ retry: false, fileNameToReProcess });\r\n this.props.PointCloudFilesList._deleteFiles({\r\n [fileId.split(\".\")[0]]: true,\r\n });\r\n }\r\n }\r\n return null;\r\n });\r\n\r\n if (!flag) {\r\n fileNameToReProcess.push({\r\n fileId: fileId,\r\n fileReProcessCount: 1,\r\n retry: true,\r\n });\r\n this.setState({ fileNameToReProcess });\r\n }\r\n }\r\n\r\n handleRemovePointCloudFile(fileId) {\r\n const { fileNameToReProcess } = this.state;\r\n\r\n fileNameToReProcess.map((iterator) => {\r\n if (iterator.fileId === fileId && iterator.retry) {\r\n iterator.retry = false;\r\n }\r\n return null;\r\n });\r\n this.setState({ fileNameToReProcess });\r\n this.props.PointCloudFilesList._deleteFiles({\r\n [fileId.split(\".\")[0]]: true,\r\n });\r\n }\r\n\r\n reProcessForFileConversion(fileId) {\r\n const { fileNameToReProcess } = this.state;\r\n\r\n fileNameToReProcess.map((iterator) => {\r\n if (iterator.fileId === fileId && iterator.retry) {\r\n iterator.retry = false;\r\n this.downloadPointCloudFileOnServer(iterator.fileId);\r\n }\r\n return null;\r\n });\r\n this.setState({ fileNameToReProcess });\r\n }\r\n\r\n render() {\r\n const {\r\n open,\r\n category,\r\n progress,\r\n uploadInProgress,\r\n fileNameToReProcess,\r\n } = this.state;\r\n return (\r\n
\r\n \r\n this.close()}\r\n >\r\n Upload File\r\n \r\n \r\n {this._select()}\r\n \r\n \r\n \r\n {\r\n this._onCategorySelected(e);\r\n }}\r\n name=\"category\"\r\n fullWidth\r\n disabled={uploadInProgress}\r\n style={{ marginTop: 8, marginBottom: 8 }}\r\n >\r\n Select Category\r\n Architectural\r\n Structural\r\n MEP\r\n Civil\r\n Other\r\n \r\n \r\n \r\n {this._upload()}\r\n {progress > 0 ? (\r\n \r\n \r\n \r\n \r\n \r\n ) : null}\r\n \r\n \r\n {\r\n this.close();\r\n }}\r\n >\r\n Close\r\n \r\n \r\n \r\n {fileNameToReProcess.map((fileData) => (\r\n
\r\n \r\n this.close()}\r\n >\r\n There is error in processing file. Please retry.\r\n \r\n \r\n {\r\n this.reProcessForFileConversion(fileData.fileId);\r\n }}\r\n >\r\n Retry\r\n \r\n {\r\n this.handleRemovePointCloudFile(fileData.fileId);\r\n }}\r\n >\r\n Remove File\r\n \r\n \r\n \r\n
\r\n ))}\r\n
\r\n );\r\n }\r\n}\r\nPPointCloudFileUploadDialog.propTypes = {\r\n project: propTypes.object,\r\n appState: propTypes.object,\r\n notify: propTypes.func,\r\n};\r\n\r\nconst PointCloudFileUploadDialog = connect(\r\n mapStateToProps,\r\n mapDispatchToProps,\r\n null,\r\n { forwardRef: true }\r\n)(PPointCloudFileUploadDialog);\r\nexport default PointCloudFileUploadDialog;\r\n","/* eslint-disable no-undefined */\r\nimport * as Actions from \"../redux/actions/index\";\r\n\r\nimport { ContextMenu, ContextMenuTrigger } from \"react-contextmenu\";\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component, Fragment } from \"react\";\r\nimport { Typography, withStyles } from \"@material-ui/core\";\r\n\r\nimport AddIcon from \"@material-ui/icons/AddCircle\";\r\nimport Checkbox from \"@material-ui/core/Checkbox\";\r\nimport DeleteIcon from \"@material-ui/icons/Delete\";\r\nimport CloudDownload from \"@material-ui/icons/CloudDownload\";\r\nimport EnhancedTable from \"../widgets/DataTableNew\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport Info from \"@material-ui/icons/Info\";\r\nimport InformativeDialog from \"../commonDialogs/InformativeDialog\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport PointCloudFileUploadDialog from \"./PointCloudFileUploadDialog\";\r\nimport Privileged from \"../widgets/Privileged\";\r\nimport ThreeD from \"@material-ui/icons/ThreeDRotation\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Utils from \"../core/Utils\";\r\nimport WarningDialog from \"../commonDialogs/WarningDialog\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nconst styles = (theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n linkDecoration: {\r\n cursor: \"pointer\",\r\n color: \"#0000ff\",\r\n },\r\n margin: {\r\n marginTop: theme.spacing(0),\r\n marginBottom: theme.spacing(2),\r\n marginLeft: theme.spacing(2),\r\n marginRight: theme.spacing(2),\r\n },\r\n l_m: {\r\n marginLeft: theme.spacing(2),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n projects: state.projects.projectList,\r\n appState: state.common.appState,\r\n userProfileData: state.common.userProfileData,\r\n };\r\n};\r\n\r\nlet downloadList = new Map();\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n setSelectedPointCloudModels: (pointCloudModels) =>\r\n dispatch(Actions.setSelectedPointCloudModels(pointCloudModels)),\r\n };\r\n}\r\n\r\nclass PPointCloudFileListView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n selectedPointCloudFiles: {},\r\n isTranslationProgressCheckInProgress: false,\r\n allFileSelect: false,\r\n fileDetails: null,\r\n userRoleData: undefined,\r\n userRoleAdmin: false,\r\n userRoleViewer: false,\r\n isSharedProject: false,\r\n };\r\n this.dialogRef = React.createRef();\r\n this.dialogUploadRef = React.createRef();\r\n this.warningDialogRef = React.createRef();\r\n this.fileDetailsDialogRef = React.createRef();\r\n this.translationInProgressDialogRef = React.createRef();\r\n }\r\n\r\n componentDidMount() {\r\n const { pointCloudFileListViewRef } = this.props;\r\n const { project } = this.props;\r\n pointCloudFileListViewRef(this);\r\n if (project && project.Data) {\r\n if (!this.state.userRoleAdmin && !this.state.userRoleViewer) {\r\n this.getRoleDataFromHeader();\r\n this.getTypeOfProject();\r\n }\r\n }\r\n }\r\n async componentDidUpdate() {\r\n const { project } = this.props;\r\n if (project && project.Data) {\r\n if (!this.state.userRoleAdmin && !this.state.userRoleViewer) {\r\n this.getRoleDataFromHeader();\r\n }\r\n if (!this.state.isSharedProject) {\r\n this.getTypeOfProject();\r\n }\r\n }\r\n }\r\n getTypeOfProject() {\r\n const { project } = this.props;\r\n if (project.orgId != this.props.appState.Auth._idData[\"custom:OrgId\"]) {\r\n this.setState({ isSharedProject: true });\r\n }\r\n }\r\n getUserInfo(params) {\r\n const { appState, project } = this.props;\r\n appState.AWSDBService.queryAllItems(params)\r\n .then((data) => {\r\n this.setState({ userRoleData: data });\r\n // for (let i = 0; i < this.state.userRoleData.Items.length; i++) {\r\n // if (\r\n // this.state.userRoleData.Items[i].email ===\r\n // this.props.userProfileData.email &&\r\n // this.state.userRoleData.Items[i].role === \"Admins\"\r\n // ) {\r\n // this.setState({ userRoleAdmin: true });\r\n // break;\r\n // }\r\n // }\r\n if (project.Data.ProjectOwner === this.props.userProfileData.email) {\r\n this.setState({ userRoleAdmin: true });\r\n } else {\r\n this.setState({ userRoleViewer: true });\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n toCheckRoleofUser() {\r\n const { appState } = this.props;\r\n var params = {\r\n Key: { Project_Id: this.props.project.Project_Id },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n let projectName = this.props.appState.AWSDBService.getItem(params).then(\r\n (data) => {\r\n var orgID = data.orgId;\r\n var params = {\r\n TableName: constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"owner_orgid = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": orgID,\r\n },\r\n };\r\n const listOfExistingOrgUsers = this.getUserInfo(params);\r\n }\r\n );\r\n }\r\n getRoleDataFromHeader() {\r\n for (let index = 0; index < this.props.projects.length; index++) {\r\n const PID = this.props.projects[index].Project_Id;\r\n if (this.props.project.Project_Id == PID) {\r\n var role = this.props.projects[index].Role;\r\n if (role === \"Admins\") {\r\n this.setState({ userRoleAdmin: true });\r\n } else if (role === \"Viewers\") {\r\n this.setState({ userRoleViewer: true });\r\n } else if (role === undefined) {\r\n var params = {\r\n Key: { Project_Id: this.props.project.Project_Id },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n let projectName = this.props.appState.AWSDBService.getItem(\r\n params\r\n ).then((data) => {\r\n var orgID = data.orgId;\r\n var params = {\r\n TableName: constants[Environment].existingSharedUserDataTable,\r\n ScanIndexForward: false,\r\n IndexName: \"orgId-Creation_Date-index\",\r\n KeyConditionExpression: \"owner_orgid = :dummyValue\",\r\n ExpressionAttributeValues: {\r\n \":dummyValue\": orgID,\r\n },\r\n };\r\n this.getUserInfo(params);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // componentWillUnmount() {\r\n // const { pointCloudFileListViewRef } = this.props;\r\n // pointCloudFileListViewRef(undefined);\r\n // }\r\n toCheckRoleofUser() {\r\n for (let index = 0; index < this.props.projects.length; index++) {\r\n if (\r\n this.props.project.Project_Id === this.props.projects[index].Project_Id\r\n ) {\r\n var role = this.props.projects[index].Role;\r\n if (role === \"Admins\") {\r\n this.setState({ userRoleAdmin: true });\r\n } else {\r\n this.setState({ userRoleViewer: true });\r\n }\r\n }\r\n }\r\n }\r\n get _fileColumnName() {\r\n if (this.state.allFileSelect) {\r\n return `Point Cloud Model (All) selected`;\r\n } else if (Object.keys(this.state.selectedPointCloudFiles).length > 0) {\r\n return `Point Cloud Model (${\r\n Object.keys(this.state.selectedPointCloudFiles).length\r\n }) selected`;\r\n } else {\r\n return `Point Cloud Model`;\r\n }\r\n }\r\n\r\n get dataColumns() {\r\n const { classes } = this.props;\r\n let dataColumns = [];\r\n dataColumns.push({\r\n id: \"action\",\r\n numeric: false,\r\n disablePadding: true,\r\n label: (\r\n \r\n {\r\n this._onAllFileSelect(e);\r\n }}\r\n />\r\n \r\n ),\r\n });\r\n dataColumns.push({\r\n id: \"fileName\",\r\n numeric: false,\r\n disablePadding: true,\r\n label: (\r\n \r\n {this._fileColumnName}\r\n \r\n ),\r\n });\r\n dataColumns.push({\r\n id: \"status\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: Status,\r\n });\r\n dataColumns.push({\r\n id: \"category\",\r\n numeric: false,\r\n disablePadding: false,\r\n label: Category,\r\n });\r\n return dataColumns;\r\n }\r\n\r\n get _data() {\r\n const { classes, project } = this.props;\r\n let data = [];\r\n\r\n if (project && project.Data && project.Data.PointCloudFiles) {\r\n let files = project.Data.PointCloudFiles;\r\n for (const key in files) {\r\n if (files[key]) {\r\n const file = files[key];\r\n\r\n data.push({\r\n action: (\r\n {\r\n this._onFileSelected(e);\r\n }}\r\n value={key}\r\n />\r\n ),\r\n fileName: (\r\n {\r\n this._open3DModel(file);\r\n }}\r\n >\r\n {file.fileName}\r\n \r\n ),\r\n status: (\r\n {\r\n this._getFilesInfoString(file);\r\n }}\r\n >\r\n {Utils.capitalizeWord(file.Status)}\r\n \r\n ),\r\n category: (\r\n \r\n {file.category ? file.category : \"Not Defined\"}\r\n \r\n ),\r\n });\r\n }\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n async _open3DModel(file) {\r\n const { history, project, appState } = this.props;\r\n //this is to open multiple files on one of the file name click also\r\n if (Object.keys(this.state.selectedPointCloudFiles).length > 1) {\r\n let selectedPointCloudFiles = Object.keys(\r\n this.state.selectedPointCloudFiles\r\n );\r\n this.props.setSelectedPointCloudModels(selectedPointCloudFiles);\r\n this._openMultipleFiles();\r\n } else if (file.Status === \"complete\") {\r\n const selectedPointCloudFilesArr = [file.fileId.split(\".\")[0]];\r\n this.props.setSelectedPointCloudModels(selectedPointCloudFilesArr);\r\n history.push(\r\n \"/project/workspace/\" + project.Project_Id + \"/viewer/\" + file.fileId\r\n );\r\n } else if (this.state.isTranslationProgressCheckInProgress) {\r\n this._openTranslationInProgressDialog();\r\n } else {\r\n const fileUploadStatus = await this._getPointCloudFileTranslationStatus(\r\n file.fileId\r\n );\r\n if (fileUploadStatus) {\r\n //update db\r\n // appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n //redirect to viewer page as translation is complete and this action is to open 3D model\r\n history.push(\r\n \"/project/workspace/\" + project.Project_Id + \"/viewer/\" + file.fileId\r\n );\r\n }\r\n }\r\n }\r\n\r\n async _openMultipleFiles() {\r\n const { history, project, appState } = this.props;\r\n let allFilesReady = true;\r\n const fileNames = [];\r\n const selectedPointCloudFiles = Object.keys(\r\n this.state.selectedPointCloudFiles\r\n );\r\n if (selectedPointCloudFiles.length > 0) {\r\n for (let i = 0; i < selectedPointCloudFiles.length; i++) {\r\n const files = project.Data.PointCloudFiles;\r\n const fileId = files[selectedPointCloudFiles[i]].fileId;\r\n\r\n if (files[selectedPointCloudFiles[i]].Status === \"complete\") {\r\n fileNames.push(fileId);\r\n continue;\r\n } else if (this.state.isTranslationProgressCheckInProgress === false) {\r\n const fileUploadStatus = await this._getPointCloudFileTranslationStatus(\r\n fileId\r\n );\r\n if (fileUploadStatus === \"complete\") {\r\n fileNames.push(fileId);\r\n } else {\r\n allFilesReady = false;\r\n this._openTranslationInProgressDialog();\r\n break;\r\n }\r\n\r\n if (\r\n i === selectedPointCloudFiles.length - 1 ||\r\n allFilesReady === false\r\n ) {\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n }\r\n }\r\n }\r\n if (this.state.isTranslationProgressCheckInProgress) {\r\n allFilesReady = false;\r\n this._openTranslationInProgressDialog();\r\n }\r\n\r\n if (allFilesReady) {\r\n let pathToPush = `/project/workspace/${project.Project_Id}/viewer`;\r\n fileNames.forEach((file) => {\r\n const urn = \"/\" + file;\r\n pathToPush += urn;\r\n });\r\n history.push(pathToPush);\r\n }\r\n } else {\r\n this.props.notify({\r\n message: \"Please select model/s first\",\r\n type: \"warning\",\r\n });\r\n }\r\n }\r\n\r\n _getPointCloudFileTranslationStatus = (fileId) => {\r\n this.setState({\r\n isTranslationProgressCheckInProgress: true,\r\n });\r\n const { onPointCloudFileListViewStateChange } = this.props;\r\n onPointCloudFileListViewStateChange(true);\r\n\r\n fetch(\r\n // \"http://localhost:8086/getpointcloudfilestatus?filename=\" + fileId,\r\n \"https://5s9s2mxem7.execute-api.us-east-1.amazonaws.com/dev2/getpointcloudfilestatus?filename=\" +\r\n fileId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n let project = this.props.project;\r\n project.Data.PointCloudFiles[fileId.split(\".\")[0]].Status =\r\n data.progress;\r\n //update in store\r\n this.props.updateProject(project);\r\n\r\n if (data.progress === \"complete\") {\r\n this.setState({\r\n isTranslationProgressCheckInProgress: false,\r\n });\r\n onPointCloudFileListViewStateChange(false);\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // this.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n } else if (data.progress === \"error\") {\r\n this.dialogRef.current.openProcessForFileConversion(fileId);\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n });\r\n };\r\n\r\n _deleteFiles = (fileId) => {\r\n let filesToDelete = this.state.selectedPointCloudFiles;\r\n if (fileId) filesToDelete = fileId;\r\n const { appState, project, notify } = this.props;\r\n let files = project.Data.PointCloudFiles;\r\n let bucketName =\r\n project.Region === undefined || project.Region === \"us-east-1\"\r\n ? constants[Environment].projectsBucketNameForPointCloud.us_east_1\r\n : constants[Environment].projectsBucketNameForPointCloud.canada;\r\n for (const key in filesToDelete) {\r\n if (files[key]) {\r\n let params = {\r\n Bucket: bucketName,\r\n Key: files[key].fileId,\r\n };\r\n\r\n appState.AWSDBService.deleteObject(params, false)\r\n .then(() => {\r\n let pointCloudBucketName =\r\n project.Region === undefined || project.Region === \"us-east-1\"\r\n ? \"proto-files\"\r\n : \"proto-files-canada\";\r\n let params1 = {\r\n Bucket: pointCloudBucketName,\r\n Prefix: files[key].fileId.split(\".\")[0] + \"/\",\r\n };\r\n\r\n appState.AWSDBService.deletePointCloudObject(params1, false)\r\n .then(() => {\r\n delete project.Data.PointCloudFiles[key];\r\n delete filesToDelete[key];\r\n let thumbnail = project.FeatureImagePath;\r\n let thumbnailName = null;\r\n if (\r\n project.FeatureImagePath !== undefined &&\r\n project.FeatureImagePath !== null\r\n ) {\r\n thumbnailName = thumbnail.split(\"/\");\r\n thumbnailName = thumbnailName[thumbnailName.length - 1];\r\n }\r\n\r\n if (\r\n project.FeatureImagePath !== undefined &&\r\n project.FeatureImagePath !== null &&\r\n thumbnailName === key + \".png\"\r\n ) {\r\n let params2 = {\r\n Bucket: \"flair-cognito-userdata\",\r\n\r\n Key: project.FeatureImagePath,\r\n };\r\n appState.AWSDBService.deleteObject(params2, false)\r\n .then(() => {\r\n delete project.FeatureImagePath;\r\n // delete project.Data.Thumbnail_URL;\r\n project.Data.Thumbnail_URL = \"/facility_2.gif\";\r\n\r\n if (\r\n project.Data.Files &&\r\n Object.keys(project.Data.Files).length > 0\r\n ) {\r\n let fileData =\r\n project.Data.Files[\r\n Object.keys(project.Data.Files)[0]\r\n ];\r\n if (fileData.Status === \"complete\") {\r\n Utils.getThumbnailImageURL(fileData.fileId)\r\n .then((url) => {\r\n //Add thumbnail url in project and update project in store\r\n project.Data.Thumbnail_URL = url;\r\n })\r\n .catch(() => {\r\n project.Data.Thumbnail_URL = \"/facility_2.gif\";\r\n });\r\n }\r\n }\r\n\r\n if (\r\n Object.getOwnPropertyNames(filesToDelete).length === 0\r\n ) {\r\n //all files are deleted hence update Project in database and redux store\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // appState.AWSDBService.updateItem(constants[Environment].projectsTableName,\r\n // {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n if (fileId === undefined)\r\n notify({\r\n message: \"Selected files are deleted\",\r\n type: \"success\",\r\n });\r\n else\r\n notify({\r\n message:\r\n \"There is error in processing file. Please upload correct format file.\",\r\n type: \"warning\",\r\n });\r\n }\r\n appState.AWSDBService.updateItem(\r\n constants[Environment].projectsTableName,\r\n {\r\n Project_Id: project.Project_Id,\r\n },\r\n [\"FeatureImagePath\"],\r\n [null]\r\n );\r\n\r\n this.props.updateProject(project);\r\n })\r\n .catch(() => {});\r\n } else {\r\n if (Object.getOwnPropertyNames(filesToDelete).length === 0) {\r\n //all files are deleted hence update Project in database and redux store\r\n appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // appState.AWSDBService.updateItem(constants[Environment].projectsTableName,\r\n // {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n\r\n this.props.updateProject(project);\r\n if (fileId === undefined)\r\n notify({\r\n message: \"Selected files are deleted\",\r\n type: \"success\",\r\n });\r\n else\r\n notify({\r\n message:\r\n \"There is error in processing file. Please upload correct format file.\",\r\n type: \"warning\",\r\n });\r\n }\r\n }\r\n })\r\n .catch(() => {});\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n };\r\n\r\n _onFileSelected(e) {\r\n let selectedPointCloudFiles = this.state.selectedPointCloudFiles;\r\n this.setState({\r\n isTranslationProgressCheckInProgress: false,\r\n });\r\n if (e.target.checked) {\r\n let newFile = { [e.target.value]: e.target.checked };\r\n selectedPointCloudFiles = Object.assign(selectedPointCloudFiles, newFile);\r\n if (Object.keys(selectedPointCloudFiles).length > 1) {\r\n this.props.notify({\r\n message: \"Now multiple files can be opened in Viewer\",\r\n type: \"success\",\r\n });\r\n }\r\n } else {\r\n delete selectedPointCloudFiles[e.target.value];\r\n if (\r\n Object.keys(this.props.project.Data.PointCloudFiles).length >\r\n Object.keys(selectedPointCloudFiles).length\r\n ) {\r\n this.setState({\r\n allFileSelect: false,\r\n });\r\n }\r\n }\r\n if (\r\n Object.keys(this.props.project.Data.PointCloudFiles).length ===\r\n Object.keys(selectedPointCloudFiles).length\r\n ) {\r\n this.setState({\r\n allFileSelect: true,\r\n });\r\n }\r\n\r\n let details = this._getFilesInfoString(selectedPointCloudFiles);\r\n\r\n this.setState({\r\n selectedPointCloudFiles: selectedPointCloudFiles,\r\n fileDetails: details,\r\n });\r\n const selectedPointCloudFilesArr = Object.keys(selectedPointCloudFiles);\r\n this.props.setSelectedPointCloudModels(selectedPointCloudFilesArr);\r\n }\r\n\r\n _getFilesInfoString(selectedPointCloudFiles) {\r\n const selectedPointCloudFilesArr = Object.keys(selectedPointCloudFiles);\r\n const projectFiles = this.props.project.Data.PointCloudFiles;\r\n let details = \"\";\r\n if (projectFiles !== undefined)\r\n selectedPointCloudFilesArr.forEach((selectedFile) => {\r\n const fileDetails = projectFiles[selectedFile];\r\n if (\r\n selectedPointCloudFilesArr.indexOf(selectedFile) !==\r\n selectedPointCloudFilesArr.length - 1\r\n ) {\r\n details += `\\nFile Name: ${fileDetails.fileName}\r\n Uploaded At: ${new Date(\r\n fileDetails.uploadtime\r\n ).toLocaleString()}\r\n Category: ${fileDetails.category}\r\n Status: ${Utils.capitalizeWord(fileDetails.Status)}\r\n Uploaded By: ${\r\n fileDetails.uploadedBy ? fileDetails.uploadedBy : \"\"\r\n }\r\n _________________________________________________________________`;\r\n } else {\r\n details += `\\nFile Name: ${fileDetails.fileName}\r\n Uploaded_At: ${new Date(\r\n fileDetails.uploadtime\r\n ).toLocaleString()}\r\n Category: ${fileDetails.category}\r\n Status: ${Utils.capitalizeWord(fileDetails.Status)}\r\n Uploaded By: ${\r\n fileDetails.uploadedBy ? fileDetails.uploadedBy : \"\"\r\n }`;\r\n }\r\n });\r\n\r\n return details;\r\n }\r\n\r\n _onAllFileSelect(e) {\r\n const project = this.props.project;\r\n let selectedPointCloudFiles = {};\r\n if (\r\n e.target.checked &&\r\n project &&\r\n project.Data &&\r\n project.Data.PointCloudFiles\r\n ) {\r\n const files = Object.keys(project.Data.PointCloudFiles);\r\n files.forEach((file) => {\r\n let newFile = { [file]: e.target.checked };\r\n selectedPointCloudFiles = Object.assign(\r\n selectedPointCloudFiles,\r\n newFile\r\n );\r\n });\r\n let details = this._getFilesInfoString(selectedPointCloudFiles);\r\n this.setState({\r\n selectedPointCloudFiles: selectedPointCloudFiles,\r\n allFileSelect: true,\r\n fileDetails: details,\r\n });\r\n this.props.notify({\r\n message: \"Now multiple files can be opened in viewer\",\r\n type: \"success\",\r\n });\r\n } else {\r\n this.setState({\r\n selectedPointCloudFiles: {},\r\n allFileSelect: false,\r\n fileDetails: \"\",\r\n });\r\n }\r\n const selectedPointCloudFilesArr = Object.keys(selectedPointCloudFiles);\r\n this.props.setSelectedPointCloudModels(selectedPointCloudFilesArr);\r\n }\r\n\r\n _openFileImage() {\r\n this.dialogUploadRef.current.show();\r\n }\r\n\r\n _openFileUpload() {\r\n this.dialogRef.current.show();\r\n }\r\n\r\n _openFileDeleteWarningDialog() {\r\n this.warningDialogRef.current.show();\r\n }\r\n\r\n _openTranslationInProgressDialog() {\r\n this.translationInProgressDialogRef.current.show();\r\n }\r\n\r\n _isFileSelected() {\r\n return (\r\n Object.getOwnPropertyNames(this.state.selectedPointCloudFiles).length > 0\r\n );\r\n }\r\n\r\n _areMultipleFilesSelected() {\r\n return (\r\n Object.getOwnPropertyNames(this.state.selectedPointCloudFiles).length > 1\r\n );\r\n }\r\n\r\n _isSingleFileSelected() {\r\n return (\r\n Object.getOwnPropertyNames(this.state.selectedPointCloudFiles).length ===\r\n 1\r\n );\r\n }\r\n\r\n _yesCB() {\r\n this._deleteFiles();\r\n }\r\n\r\n _openFileDetailsDialog() {\r\n if (Object.keys(this.state.selectedPointCloudFiles).length > 0) {\r\n this.fileDetailsDialogRef.current.show();\r\n this.forceUpdate();\r\n } else {\r\n this.props.notify({\r\n message: \"Please select Files First\",\r\n type: \"warning\",\r\n });\r\n }\r\n }\r\n\r\n _downloadFile = () => {\r\n let filesToDownload = this.state.selectedPointCloudFiles;\r\n let files = this.props.project.Data.PointCloudFiles;\r\n\r\n let request = (path, fileName, fileId) =>\r\n fetch(path)\r\n .then((response) => (response.status !== 404 ? response.blob() : null))\r\n .then((blob) => {\r\n let d = document.createElement(\"a\");\r\n d.className = \"download\";\r\n d.download = fileName;\r\n d.href = URL.createObjectURL(blob);\r\n document.body.appendChild(d);\r\n d.click();\r\n d.parentElement.removeChild(d);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message: fileName + \" downloaded successfully.\",\r\n type: \"success\",\r\n });\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n throw err;\r\n });\r\n\r\n for (const fileId in filesToDownload) {\r\n if (downloadList.has(fileId)) {\r\n this.props.notify({\r\n message:\r\n \"Download already running in background for selcted point cloud file.\",\r\n type: \"warning\",\r\n });\r\n break;\r\n }\r\n if (files[fileId]) {\r\n const key = files[fileId].fileId;\r\n let bucketName =\r\n this.props.project.Region === undefined ||\r\n this.props.project.Region === \"us-east-1\"\r\n ? constants[Environment].projectsBucketNameForPointCloud.us_east_1\r\n : constants[Environment].projectsBucketNameForPointCloud.canada;\r\n let params = {\r\n Bucket: bucketName,\r\n Key: key,\r\n Expires: 864000,\r\n };\r\n this.props.appState.AWSDBService.getS3ObjectPreSignedURL(params)\r\n .then((fileURL) => {\r\n downloadList.set(fileId, \"inprogress\");\r\n this.props.notify({\r\n message:\r\n \"Selected point cloud file is downloading in background.\",\r\n type: \"info\",\r\n });\r\n request(fileURL, files[fileId].fileName, fileId).catch((err) => {\r\n console.error(err);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message:\r\n \"Selected point cloud file not available for download.\",\r\n type: \"warning\",\r\n });\r\n });\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n downloadList.delete(fileId);\r\n this.props.notify({\r\n message: \"Error in file download.\",\r\n type: \"warning\",\r\n });\r\n });\r\n }\r\n }\r\n };\r\n\r\n get _commonActionsOnFiles() {\r\n return (\r\n \r\n \r\n
\r\n {\r\n this._openMultipleFiles();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n {\r\n this._openFileDetailsDialog();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n {\r\n this._downloadFile();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n get _adminActionsOnFiles() {\r\n return (\r\n \r\n \r\n {\r\n this._yesCB();\r\n }}\r\n ref={this.warningDialogRef}\r\n />\r\n \r\n \r\n
\r\n {\r\n this._openFileDeleteWarningDialog();\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n \r\n {\r\n this._openFileUpload();\r\n }}\r\n >\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n render() {\r\n const { classes, appState } = this.props;\r\n\r\n return (\r\n \r\n {this.state.isSharedProject ? (\r\n \r\n {this._commonActionsOnFiles}\r\n {this.state.userRoleAdmin ? (\r\n {this._adminActionsOnFiles}\r\n ) : null}\r\n \r\n ) : (\r\n \r\n {this._commonActionsOnFiles}\r\n {this.state.userRoleAdmin ? (\r\n \r\n {this._adminActionsOnFiles}\r\n \r\n ) : null}\r\n \r\n )}\r\n \r\n {this._data && this._data.length > 0 ? (\r\n <>\r\n \r\n {\r\n this._openFileDetailsDialog();\r\n }}\r\n >\r\n View Details\r\n \r\n {\r\n this._openMultipleFiles();\r\n }}\r\n >\r\n View Files\r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {\" \"}\r\n No files are uploaded. Click on + button to upload the point cloud\r\n files.{\" \"}\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nPPointCloudFileListView.propTypes = {\r\n classes: propTypes.object,\r\n projects: propTypes.array,\r\n project: propTypes.object,\r\n history: propTypes.object,\r\n appState: propTypes.object,\r\n notify: propTypes.func,\r\n userProfileData: propTypes.object,\r\n setSelectedPointCloudModels: propTypes.func,\r\n pointCloudFileListViewRef: propTypes.any,\r\n};\r\n\r\nconst PointCloudFileListView = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(withStyles(styles)(PPointCloudFileListView)));\r\nexport default PointCloudFileListView;\r\n","import * as Actions from \"../redux/actions/index\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\nimport React, { Component } from \"react\";\r\n\r\nimport FTextField from \"../widgets/FTextField\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport { connect } from \"react-redux\";\r\nimport propTypes from \"prop-types\";\r\nimport sizeMe from \"react-sizeme\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n appState: state.common.appState,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n updateProject: (project) => dispatch(Actions.updateProject(project)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\nclass PProjectWorkspaceActionView extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n name: \"\",\r\n description: \"\",\r\n };\r\n }\r\n\r\n /**\r\n * Handle onBlur event from project name field\r\n * @param {object} e\r\n */\r\n _onNameSet(e) {\r\n if (e.target.value === \"\") {\r\n this.setState({\r\n name: this.props.project.Data.ProjectName,\r\n });\r\n return;\r\n }\r\n\r\n if (this.props.project.Data.ProjectName !== e.target.value) {\r\n if (e.target.value) {\r\n //update project in store\r\n let _project = this.props.project;\r\n _project.Project_Name = e.target.value.toLowerCase();\r\n _project.Data.ProjectName = e.target.value;\r\n this.props.updateProject(_project);\r\n //update project in DB\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n _project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this._updateProjectInDB([\"Project_Name\"], [e.target.value]);\r\n this.props.notify({ message: \"Project Name Updated\", type: \"success\" });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle onBlur event from description field\r\n * @param {object} e\r\n */\r\n _onDescriptionSet(e) {\r\n //code to save project description\r\n if (\r\n this.props.project &&\r\n this.props.project.Data.Description !== e.target.value\r\n ) {\r\n //update project in store\r\n const description = e.target.value ? e.target.value : \" \";\r\n let _project = this.props.project;\r\n _project.Data.Description = description;\r\n this.props.updateProject(_project);\r\n //update project in DB\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n _project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n // this._updateProjectInDB(['Data.Description'], [description]);\r\n this.props.notify({\r\n message: \"Project Description Updated\",\r\n type: \"success\",\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle Name change event\r\n * @param {object} e\r\n */\r\n _onNameChange(e) {\r\n this.setState({ name: e.target.value });\r\n }\r\n\r\n /**\r\n * Handle description change event\r\n * @param {object} e\r\n */\r\n _onDescriptionChange(e) {\r\n this.setState({ description: e.target.value });\r\n }\r\n\r\n /**\r\n *\r\n * @param {string[]} attributes\r\n * @param {string[]} values\r\n */\r\n _updateProjectInDB(attributes, values) {\r\n let keyVal = {\r\n Project_Id: this.props.project.Project_Id,\r\n };\r\n\r\n this.props.appState.AWSDBService.updateItem(\r\n constants[Environment].projectsTableName,\r\n keyVal,\r\n attributes,\r\n values\r\n )\r\n .then(() => {\r\n //console.log('Project updated successfully');\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n });\r\n }\r\n\r\n /**\r\n * Render project workspace component\r\n */\r\n render() {\r\n let { name, description } = this.state;\r\n const { project, appState } = this.props;\r\n\r\n if (project && project.Data) {\r\n name = name === \"\" ? project.Data.ProjectName : name;\r\n description = description === \"\" ? project.Data.Description : description;\r\n }\r\n\r\n const isTextFieldDisabled = appState.Auth.isViewer();\r\n\r\n return (\r\n
\r\n \r\n {\r\n this._onNameSet(e);\r\n }}\r\n onChange={(e) => {\r\n this._onNameChange(e);\r\n }}\r\n disabled={isTextFieldDisabled}\r\n />\r\n \r\n \r\n {\r\n this._onDescriptionSet(e);\r\n }}\r\n onChange={(e) => {\r\n this._onDescriptionChange(e);\r\n }}\r\n disabled={isTextFieldDisabled}\r\n />\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nPProjectWorkspaceActionView.propTypes = {\r\n appState: propTypes.object,\r\n project: propTypes.object,\r\n updateProject: propTypes.func,\r\n notify: propTypes.func,\r\n};\r\n\r\nconst ProjectWorkspaceActionView = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(sizeMe({ monitorHeight: true })(withRouter(PProjectWorkspaceActionView)));\r\nexport default ProjectWorkspaceActionView;\r\n","import * as Actions from \"../redux/actions/index\";\r\n\r\nimport { Environment, constants } from \"../config\";\r\nimport { Hidden, withStyles } from \"@material-ui/core\";\r\nimport React, { Component } from \"react\";\r\n\r\nimport FGridListTile from \"../widgets/FGridListTile\";\r\nimport FTileImage from \"../widgets/FTileImage\";\r\nimport FileListView from \"./FileListView\";\r\nimport PointCloudFileListView from \"../pointCloud/PointCloudFileListView\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Paper from \"@material-ui/core/Paper\";\r\nimport ProjectWorkspaceActionView from \"./ProjectWorkspaceActionView\";\r\nimport PropTypes from \"prop-types\";\r\nimport Utils from \"../core/Utils\";\r\nimport { connect } from \"react-redux\";\r\nimport { withRouter } from \"react-router-dom\";\r\n\r\nconst styles = (theme) => ({\r\n r_m: {\r\n marginRight: theme.spacing(2),\r\n },\r\n t_m: {\r\n marginTop: theme.spacing(2),\r\n },\r\n b_m: {\r\n marginBottom: theme.spacing(2),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n project: state.projects.currentProject,\r\n appState: state.common.appState,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n openProject: (projectData) => dispatch(Actions.openProject(projectData)),\r\n updateProject: (projectData) =>\r\n dispatch(Actions.updateProject(projectData)),\r\n projectWorkspaceActionViewResize: (size) =>\r\n dispatch(Actions.projectWorkspaceActionViewResize(size)),\r\n notify: (data) => dispatch(Actions.notify(data)),\r\n };\r\n}\r\n\r\n// eslint-disable-next-line camelcase\r\nclass P_ProjectWorkspace extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.height = undefined;\r\n this._fileStatusInterval = {};\r\n this._pointCloudFileStatusInterval = {};\r\n this.state = {\r\n thumbnailUrl: \"/facility_2.gif\",\r\n isTranslationProgressCheckInProgress: false,\r\n };\r\n }\r\n changePointCloudFileListViewState = (updatedPointCloudFileListViewState) =>\r\n this.setState({\r\n isTranslationProgressCheckInProgress: updatedPointCloudFileListViewState,\r\n });\r\n componentDidMount() {\r\n this._getProject();\r\n const pid = Utils.lastPath();\r\n if (pid) {\r\n let projectInList = Utils.findProjectInList(pid);\r\n if (\r\n projectInList &&\r\n projectInList.Data &&\r\n projectInList.Data.Thumbnail_URL\r\n ) {\r\n this.setState({ thumbnailUrl: projectInList.Data.Thumbnail_URL });\r\n }\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n const { project } = this.props;\r\n if (\r\n project &&\r\n this._currentProject &&\r\n project.Data.Thumbnail_URL !== this._currentProject.Data.Thumbnail_URL\r\n ) {\r\n this._currentProject = JSON.parse(JSON.stringify(project));\r\n this.setState({ thumbnailUrl: project.Data.Thumbnail_URL });\r\n }\r\n }\r\n\r\n _getProject() {\r\n const pid = Utils.lastPath();\r\n const params = {\r\n Key: { Project_Id: pid },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n let self = this;\r\n this.props.appState.AWSDBService.getItem(params)\r\n .then(async (project) => {\r\n if (project) {\r\n project = await self.props.appState.AWSDBService.getProjectDataFromS3(\r\n project\r\n );\r\n self.props.openProject(project);\r\n self._getFileStatus();\r\n if (project.FeatureImagePath) {\r\n let params = {\r\n Bucket: constants[Environment].cognitoUserDataBucketName,\r\n Key: project.FeatureImagePath,\r\n Expires: 86400,\r\n };\r\n self.props.appState.AWSDBService.getS3ObjectPreSignedURL(\r\n params\r\n ).then((picURL) => {\r\n self.setState({ thumbnailUrl: picURL });\r\n project.Data.Thumbnail_URL = picURL;\r\n });\r\n } else {\r\n if (\r\n self.state.thumbnailUrl === \"/facility_2.gif\" &&\r\n project.Data.Files &&\r\n Object.keys(project.Data.Files).length > 0\r\n ) {\r\n let fileData =\r\n project.Data.Files[Object.keys(project.Data.Files)[0]];\r\n if (fileData.Status === \"complete\") {\r\n Utils.getThumbnailImageURL(fileData.fileId)\r\n .then((url) => {\r\n self.setState({ thumbnailUrl: url });\r\n //Add thumbnail url in project and update project in store\r\n project.Data.Thumbnail_URL = url;\r\n })\r\n .catch(() => {\r\n self.setState({ thumbnailUrl: \"/facility_2.gif\" });\r\n });\r\n }\r\n }\r\n }\r\n self.props.updateProject(project);\r\n self._currentProject = JSON.parse(JSON.stringify(project));\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n _getFileStatus() {\r\n let project = this.props.project;\r\n if (project.Data && project.Data.Files) {\r\n let files = project.Data.Files;\r\n for (const key in files) {\r\n // eslint-disable-next-line no-prototype-builtins\r\n if (files[key]) {\r\n const file = files[key];\r\n if (file.Status !== \"complete\") {\r\n let interval = setInterval(() => {\r\n this._getFileTranslationStatus(file.fileId);\r\n }, 1000);\r\n this._fileStatusInterval[file.fileId] = interval;\r\n }\r\n }\r\n }\r\n }\r\n if (project.Data && project.Data.PointCloudFiles) {\r\n let files = project.Data.PointCloudFiles;\r\n for (const key in files) {\r\n // eslint-disable-next-line no-prototype-builtins\r\n if (files[key]) {\r\n const file = files[key];\r\n if (file.Status !== \"complete\") {\r\n let pointcloudinterval = setInterval(() => {\r\n this._getPointCloudFileTranslationStatus(file.fileId);\r\n }, 5000);\r\n this._pointCloudFileStatusInterval[\r\n file.fileId\r\n ] = pointcloudinterval;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n _getFileTranslationStatus(fileId) {\r\n let _self = this;\r\n _self.props.appState.AWSDBService.getFileTranslationStatus(fileId)\r\n .then((data) => {\r\n let project = _self.props.project;\r\n project.Data.Files[fileId.split(\".\")[0]].Status = data.progress;\r\n\r\n _self.props.updateProject(project);\r\n\r\n if (data.progress === \"complete\") {\r\n clearInterval(_self._fileStatusInterval[fileId]);\r\n // _self.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.Files'], [project.Data.Files]);\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n }\r\n })\r\n .catch(() => {});\r\n }\r\n\r\n _getPointCloudFileTranslationStatus = (fileId) => {\r\n fetch(\r\n // \"http://localhost:8086/getpointcloudfilestatus?filename=\" + fileId,\r\n \"https://5s9s2mxem7.execute-api.us-east-1.amazonaws.com/dev2/getpointcloudfilestatus?filename=\" +\r\n fileId,\r\n {\r\n method: \"GET\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n }\r\n )\r\n .then((result) => result.json())\r\n .then((data) => {\r\n let project = this.props.project;\r\n project.Data.PointCloudFiles[fileId.split(\".\")[0]].Status =\r\n data.progress;\r\n //update in store\r\n this.props.updateProject(project);\r\n if (data.progress === \"complete\") {\r\n clearInterval(this._pointCloudFileStatusInterval[fileId]);\r\n // this.props.appState.AWSDBService.updateItem(constants[Environment].projectsTableName, {\r\n // 'Project_Id': project.Project_Id\r\n // }, ['Data.PointCloudFiles'], [project.Data.PointCloudFiles]);\r\n this.props.appState.AWSDBService.saveProjectDataToS3(\r\n project,\r\n this.props.appState.Auth._idData[\"custom:OrgId\"]\r\n );\r\n this.props.notify({\r\n message: \"Point cloud model/s are ready to view\",\r\n type: \"success\",\r\n });\r\n } else if (data.progress === \"error\") {\r\n clearInterval(this._pointCloudFileStatusInterval[fileId]);\r\n this.pointCloudFileListViewRef.dialogRef.current.openProcessForFileConversion(\r\n fileId\r\n );\r\n }\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n });\r\n };\r\n\r\n render() {\r\n if (\r\n this.props.appState &&\r\n this.props.appState.Auth &&\r\n this.props.appState.Auth.isSignedIn\r\n ) {\r\n let { classes } = this.props;\r\n return (\r\n \r\n \r\n \r\n this.props.projectWorkspaceActionViewResize(size)\r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n (this.pointCloudFileListViewRef = ref)\r\n }\r\n />\r\n \r\n \r\n );\r\n }\r\n }\r\n}\r\n\r\nP_ProjectWorkspace.propTypes = {\r\n appState: PropTypes.object,\r\n classes: PropTypes.object,\r\n project: PropTypes.object,\r\n projectWorkspaceActionViewResize: PropTypes.func,\r\n notify: PropTypes.func,\r\n};\r\n\r\nconst ProjectWorkspace = connect(\r\n mapStateToProps,\r\n mapDispatchToProps\r\n)(withRouter(withStyles(styles)(P_ProjectWorkspace)));\r\nexport default ProjectWorkspace;\r\n","import * as Actions from \"./redux/actions/index\";\r\n\r\nimport { Environment, constants } from \"./config\";\r\nimport { MuiThemeProvider, createMuiTheme } from \"@material-ui/core\";\r\nimport React, { Component, Suspense } from \"react\";\r\nimport {\r\n Redirect,\r\n Route,\r\n BrowserRouter as Router,\r\n Switch,\r\n} from \"react-router-dom\";\r\n\r\nimport AWSService from \"./core/Aws\";\r\nimport Auth from \"./core/Auth\";\r\nimport FSnackbar from \"./widgets/FSnackBar\";\r\nimport Footer from \"./Footer\";\r\nimport Grid from \"@material-ui/core/Grid\";\r\nimport Header from \"./Header\";\r\nimport ProjectWorkspace from \"./project/ProjectWorkspace\";\r\nimport PropTypes from \"prop-types\";\r\nimport Utils from \"./core/Utils\";\r\nimport { connect } from \"react-redux\";\r\nimport { SnackbarProvider } from \"notistack\";\r\nimport Slide from \"@material-ui/core/Slide\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\nconst Settings = React.lazy(() => import(\"./account/Settings\"));\r\nconst ProjectList = React.lazy(() => import(\"./projectSettings/ProjectList\"));\r\nconst ProjectCharts = React.lazy(() => import(\"./analytics/userAnalytics\"));\r\nconst CreateProject = React.lazy(() => import(\"./project/NewProject\"));\r\nconst Viewer = React.lazy(() => import(\"./viewer/Viewer\"));\r\nconst Timeliner = React.lazy(() => import(\"./4DPlayback/Timeliner\"));\r\nconst FAQ = React.lazy(() => import(\"./account/FAQ\"));\r\nconst Subscription = React.lazy(() => import(\"./account/Subscription\"));\r\nconst Dashboard = React.lazy(() => import(\"./dashboard/Dashboard\"));\r\nconst UserList = React.lazy(() => import(\"./users/UserList\"));\r\nconst UsageHisoty = React.lazy(() => import(\"./analytics/usageHistory\"));\r\n\r\nconst theme = createMuiTheme({\r\n palette: {\r\n primary: {\r\n main: \"#3872ca\",\r\n },\r\n secondary: {\r\n main: \"rgb(255, 255, 255)\",\r\n },\r\n },\r\n});\r\n\r\nconst styles2 = () => ({\r\n margin: {\r\n margin: theme.spacing(2),\r\n },\r\n m_t: {\r\n marginTop: theme.spacing(6),\r\n },\r\n});\r\n\r\nconst mapStateToProps = (state) => {\r\n return {\r\n appState: state.common.appState,\r\n componentSizes: state.componentSizes,\r\n selectedPointCloudModels: state.selectedPointCloudModels,\r\n isPublicURL: state.common.isPublicURL,\r\n project: state.projects.currentProject,\r\n };\r\n};\r\n\r\nfunction mapDispatchToProps(dispatch) {\r\n return {\r\n headerResize: (size) => dispatch(Actions.headerResize(size)),\r\n footerResize: (size) => dispatch(Actions.footerResize(size)),\r\n windowResize: (size) => dispatch(Actions.windowResize(size)),\r\n signIn: (appState) => dispatch(Actions.signIn(appState)),\r\n closeProject: () => dispatch(Actions.closeProject()),\r\n cleanupProjectStore: () => dispatch(Actions.cleanupProjectStore()),\r\n setPublicURL: (payload) => dispatch(Actions.setPublicURL(payload)),\r\n addProjectsToList: (projects) =>\r\n dispatch(Actions.addProjectsToList(projects)),\r\n };\r\n}\r\n\r\nclass PApp extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.height = 0;\r\n this.publicUrl = window.location.href;\r\n this.public = false;\r\n }\r\n\r\n handleWindowResize() {\r\n this.props.windowResize({\r\n width: window.innerWidth,\r\n height: window.innerHeight - 50,\r\n });\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"resize\", () => this.handleWindowResize());\r\n }\r\n\r\n async componentDidMount() {\r\n //clean store for thumbnail url\r\n this.props.cleanupProjectStore();\r\n //window resize\r\n window.addEventListener(\"resize\", () => this.handleWindowResize());\r\n\r\n //code for checking public urls\r\n if (this.publicUrl.indexOf(\"/public\") > -1) {\r\n /**\r\n * For URL shortening\r\n */\r\n // this.checkEncodedURL();\r\n let linkIsInDB = await Utils.checkInDatabase(this.publicUrl);\r\n if (linkIsInDB) {\r\n this.props.setPublicURL(true);\r\n this.public = true;\r\n } else {\r\n this.props.setPublicURL(false);\r\n }\r\n } else {\r\n this.props.setPublicURL(false);\r\n }\r\n\r\n //Below code is commented for public home page work\r\n if (!constants[Environment].ShowHomePage) {\r\n const _self = this;\r\n if (!_self.props.isPublicURL) {\r\n /**\r\n * For URL shortening\r\n */\r\n // if (window.location.href.indexOf(\"/viewer\") > -1) {\r\n // this.checkEncodedURL();\r\n // }\r\n const auth = new Auth(\r\n (_auth) => {\r\n if (_auth) {\r\n _self.props.signIn({\r\n Auth: _auth,\r\n AWSDBService: new AWSService(_auth),\r\n });\r\n }\r\n },\r\n () => {\r\n _self.props.signIn(undefined);\r\n }\r\n );\r\n auth.signIn();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * For URL shortening\r\n */\r\n checkEncodedURL() {\r\n let params = {\r\n Key: { Project_Id: Utils.getProjectId() },\r\n TableName: constants[Environment].projectsTableName,\r\n };\r\n\r\n Utils.batchGetItems(params)\r\n .then(async (data) => {\r\n if (data) {\r\n let projectData = data;\r\n if (data.StorageLink) {\r\n projectData = await Utils.getProjectDataFromS3Projects(data);\r\n let fileURNs = Utils.getURNsFromCurrentURL();\r\n let newURL = window.location.href.split(\"viewer/\")[0];\r\n newURL += \"viewer\";\r\n let redirectToNew = false;\r\n fileURNs.forEach((urn) => {\r\n Object.values(projectData.Data.Files).forEach((files) => {\r\n if (files.fileId.includes(urn)) {\r\n let completeName =\r\n \"urn:adsk.objects:os.object:flair-projects/\" + files.fileId;\r\n completeName = btoa(completeName);\r\n if (completeName.includes(\"=\"))\r\n completeName = completeName.slice(\r\n 0,\r\n completeName.indexOf(\"=\")\r\n );\r\n redirectToNew = true;\r\n newURL += \"/\" + completeName;\r\n }\r\n });\r\n });\r\n if (redirectToNew) {\r\n window.location.href = newURL;\r\n }\r\n }\r\n }\r\n })\r\n .catch((err) => {\r\n console.log(\"Error getting project data: \", err);\r\n });\r\n }\r\n\r\n dashboard() {\r\n if (this.props.isPublicURL) {\r\n return null;\r\n }\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Dashboard\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n manageUsers() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Manage Users\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n newProject() {\r\n document.title = \"Flair3D - New Project\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n settings() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Profile\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n FAQ() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - FAQS\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n subscription() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - subscription\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n analytics() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Analytics\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n usageHisoty() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Credit-Usage\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n projectWorkspace() {\r\n document.title = \"Flair3D - Project Workspace\";\r\n return ;\r\n }\r\n\r\n viewer() {\r\n const urns = Utils.getURNsFromCurrentURL();\r\n let extension = null;\r\n\r\n if (urns)\r\n extension = urns[0]\r\n .split(\".\")\r\n .slice(1)\r\n .join(\".\");\r\n // const pointCloudFiles = Utils.getPointCloudFiles(); selectedPointCloudModels={pointCloudFiles}\r\n document.title = \"Flair3D - Viewer\";\r\n return (\r\n }>\r\n {extension === null || extension === \"\" ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n }\r\n\r\n manageProjects() {\r\n this.props.closeProject();\r\n document.title = \"Flair3D - Manage Projects\";\r\n return (\r\n }>\r\n \r\n \r\n );\r\n }\r\n\r\n _updateHeight() {\r\n this.height = 0;\r\n const cs = this.props.componentSizes;\r\n if (cs) {\r\n let w = Window;\r\n let d = document;\r\n let e = d.documentElement;\r\n let g = d.getElementsByTagName(\"body\")[0];\r\n\r\n const wsHeight = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n //const wsHeight = cs.windowSize ? cs.windowSize.height : window.innerHeight;\r\n if (cs.headerSize && cs.footerSize) {\r\n this.height = wsHeight - cs.headerSize.height - cs.footerSize.height;\r\n }\r\n // Check whether timeliner div is ON or OFF\r\n let ganttChartDiv = document.getElementById(\"timeliner\");\r\n if (ganttChartDiv !== null && ganttChartDiv.style.display === \"block\") {\r\n this.heightForForgeViewer = (this.height * 70) / 100;\r\n } else {\r\n this.heightForForgeViewer = this.height;\r\n }\r\n }\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n\r\n let flairRoute = window.location.pathname;\r\n let redirectUrl = undefined;\r\n if (\r\n flairRoute &&\r\n flairRoute.indexOf(\"/viewer/\") > -1 &&\r\n window.localStorage.getItem(\"flairUrl\") !== \"redirected\"\r\n ) {\r\n redirectUrl = window.location.href;\r\n }\r\n\r\n if (\r\n (this.props.appState &&\r\n this.props.appState.Auth &&\r\n this.props.appState.Auth.isSignedIn) ||\r\n this.props.isPublicURL === true\r\n ) {\r\n let link = window.localStorage.getItem(\"flairUrl\");\r\n if (link && link !== \"redirected\") {\r\n window.localStorage.setItem(\"flairUrl\", \"redirected\");\r\n window.location.href = link;\r\n return null;\r\n }\r\n window.localStorage.setItem(\"flairUrl\", \"\");\r\n\r\n this._updateHeight();\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n
this.props.headerResize(size)} />\r\n
\r\n \r\n \r\n\r\n \r\n this.dashboard()} />\r\n this.newProject()}\r\n />\r\n this.projectWorkspace()}\r\n />\r\n this.viewer()}\r\n />\r\n this.viewer()}\r\n />\r\n this.manageProjects()}\r\n />\r\n this.settings()} />\r\n this.subscription()}\r\n />\r\n this.FAQ()} />\r\n this.analytics()}\r\n />\r\n this.usageHisoty()}\r\n />\r\n this.manageUsers()}\r\n />\r\n \r\n \r\n \r\n