{"version":3,"sources":["styles/assets/collectionCards/card0.svg","styles/assets/collectionCards/card1.svg","styles/assets/collectionCards/card2.svg","styles/assets/loginBackgrounds/loginBackground0.jpg","../node_modules/moment/locale sync /^/.//.*$","components/AddThing.js","components/Sidebar.js","components/SidebarHeader.js","styles/assets/background-logo.svg","components/things/ChangeCollection.js","components/things/flows/FlowManifestDialog/FlowManifestDialog.tsx","components/things/flows/FlowsDialog.js","components/things/GroupDialog.js","components/things/ManageCards.js","components/things/RenameThing.js","components/things/ThingInfo.js","components/things/UnpairThing.js","components/MainBodyHeader.js","ThingFetcher.js","CollectionFetcher.js","styles/assets/logo.svg","components/collections/CollectionsHeader.js","components/collections/CollectionInfo.js","components/collections/CustomizeCollection.js","components/collections/DeleteCollection.js","components/collections/LeaveCollection.js","components/collections/ChangeOwner.js","components/collections/ChangeRole.js","components/collections/InviteUser.js","components/collections/RevokeInvite.js","components/collections/RevokeTransfer.js","components/collections/StopSharing.js","components/collections/ShareCollection.js","components/collections/CollectionCard.js","components/collections/PendingShares.js","components/collections/PendingTransfers.js","components/collections/CollectionsBody.js","components/collections/CreateCollection.js","components/reports/CreateReport/components/ChipInput/ChipInput.tsx","components/reports/CreateReport/CreateReport.tsx","Reports.js","components/data/DatePicker.js","components/data/SeriesList.js","components/data/Plot.js","DataLab.js","Collections.js","UserFetcher.js","AuthenticatedApp.js","styles/assets/unauthenticated-logo.svg","styles/assets/mobile-unauthenticated-logo.svg","App.js","i18n.js","index.js","styles/assets/collectionCards sync nonrecursive //.(png|jpe?g|svg)$","styles/assets/loginBackgrounds sync nonrecursive //.(png|jpe?g|svg)$"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","sleep","ms","Promise","setTimeout","prevThingDetailsOpen","graphql","gql","name","withTranslation","Component","state","qrOpen","manualCodeOpen","thingDetailsOpen","cameraPermission","qrLoaded","dialogClosing","redirect","isPairCodeValid","pairCode","test","pairThing","collectionId","a","t","props","thingName","process","setState","pairLoading","PairThing","variables","substring","length","close","message","codeError","toLowerCase","isCameraAuthorized","navigator","mediaDevices","enumerateDevices","error","componentWillReceiveProps","nextProps","this","open","nameEmpty","codeEmpty","window","cordova","plugins","diagnostic","requestCameraAuthorization","successCallback","status","permissionStatus","GRANTED","errorCallback","externalStorage","render","qrError","REACT_APP_THING_NAME","textColor","REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR","location","hash","split","search","address","Redirect","push","to","hidden","title","textButton","textButtonFunction","noHorizontalPadding","fullScreen","List","ListItem","button","style","paddingLeft","getNotchHeight","paddingRight","onClick","disabled","ListItemIcon","SvgIcon","width","height","viewBox","d","ListItemText","primary","color","noVerticalPadding","typographyStyle","onFullScreenChanged","Typography","variant","className","textAlign","marginTop","marginBottom","marginLeft","marginRight","visibility","showViewFinder","onError","onScan","onLoad","objectFit","facingMode","chooseDeviceId","_","allDevices","deviceId","containedButton","containedButtonFunction","collection","containedButtonLoading","containedButtonDisabled","replace","TextField","label","required","value","helperText","onChange","event","target","onKeyPress","key","InputLabelProps","shrink","InputProps","endAdornment","InputAdornment","position","IconButton","tabIndex","size","mergedArray","secondaryBackgroundColor","REACT_APP_SECONDARY_BACKGROUND_COLOR","textOnMainBackgroundColor","textOnSecondaryBackgroundColor","REACT_APP_TEXT_ON_SECONDARY_BACKGROUND_COLOR","lightColor","REACT_APP_LIGHT_COLOR","mainColor","REACT_APP_MAIN_COLOR","foldersEnabled","REACT_APP_SIDEBAR_FOLDERS_ENABLED","textOnMainColor","REACT_APP_TEXT_ON_MAIN_COLOR","lightContrastColor","REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS","textOnLightContrastColor","REACT_APP_TEXT_ON_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS","withStyles","theme","borderRadius","backgroundColor","mobileSearch","tinyColor","setAlpha","toRgbString","searchIcon","pointerEvents","display","alignItems","justifyContent","inputRoot","input","padding","transition","transitions","create","dialOpen","typeList","addThingOpen","lessThan1080","greaterThan560","fabWidth","queryMore","locked","collectionData","thingCount","fetchMoreLoading","fetchMore","offset","things","limit","updateQuery","prev","fetchMoreResult","newThings","sort","b","searchMore","searchText","filter","regexMatch","updateDimensions","innerWidth","document","getElementById","clientWidth","setFabWidth","componentDidMount","addEventListener","debounce","isMobile","getBrightness","StatusBar","styleLightContent","styleDefault","componentWillUnmount","removeEventListener","loading","refetch","classes","thingsName","sidebarContent","paddingTop","querystringify","parse","thing","starredThings","concat","StyledEngineProvider","injectFirst","ThemeProvider","MuiListItem","secondaryAction","includes","overflow","overscrollBehaviorY","subheader","onScroll","scrollTop","clientHeight","scrollHeight","Link","selectedThing","selectedCollection","textDecoration","selected","margin","collectionThing","starred","indexOf","startsWith","ListItemAvatar","Avatar","toUpperCase","inset","group","whiteSpace","textOverflow","cursor","ListItemSecondaryAction","createTheme","adaptV4Theme","overrides","MuiBadge","colorPrimary","Badge","badgeContent","notificationCount","invisible","LinearProgress","top","backgroundRepeat","backgroundSize","background","maxWidth","InputBase","placeholder","root","searchThings","Zoom","in","userData","user","isRoleAtLeast","myRole","emailIsVerified","onEntered","Fab","snackbarOpen","right","bottom","transform","zIndex","left","AddThing","client","Divider","orientation","SidebarHeader","goToCollections","mobile","collectionName","gridArea","paddingBottom","lineHeight","newCollection","changeCollection","ChangeCollection","optimisticResponse","__typename","thingCollection","collections","RadioGroup","FormControlLabel","control","Radio","AndButton","styled","Button","borderColor","toHex8String","mode","thingId","useState","setName","setNameEmpty","localId","Date","now","conditions","setConditions","actions","setActions","intervalDuration","setIntervalDuration","intervalDurationEmpty","setIntervalDurationEmpty","intervalUnit","setIntervalUnit","useTranslation","useLazyQuery","getVariables","data","useMutation","createFlow","updateFlow","useEffect","find","comparison","type","content","disableMaxHeight","TransitionGroup","valueEmpty","index","Collapse","indexToRemove","DeleteOutlined","newConditions","findIndex","idToFind","select","visualization","minThreshold","maxThreshold","MenuItem","isNullish","conditionIndex","fullWidth","contentEmpty","newActions","stringAllowedValues","floatAllowedValues","min","max","parseFloat","flows","variable","text","options","createFlowOpen","createFlowMode","deleteFlowOpen","anchorEl","showDeleteLoading","handleBackButton","backStackIndex","backStack","handleMenuClose","deleteFlow","thingData","selectedFlow","textOnBackgroundColor","REACT_APP_MAIN_BACKGROUND_COLOR","errorColor","REACT_APP_ERROR_COLOR","listItemStyle","minHeight","noDialogContent","DialogContent","flow","secondary","generateNaturalLanguageList","operator","Math","abs","action","currentTarget","isContainedButtonRed","Menu","onClose","anchorOrigin","vertical","horizontal","transformOrigin","PaperProps","TransitionProps","onEnter","noWrap","FlowManifestDialog","groups","createGroupOpen","showLoading","groupEmpty","groupError","assignGroup","mutate","__typegroup","thingGroup","dialogContent","constructor","super","hasReceivedOpen","ManageCardsContent","variableCount","newVariables","changeVisibilityMutation","ChangeVisibility","subscribeToMore","subscriptionData","variableCreated","variableUpdated","variableDeleted","thingUpdated","online","MuiIconButton","MuiCheckbox","Checkbox","disableRipple","checked","rename","Rename","selectable","overflowX","firmware","fromNow","moment","utc","createdAt","updatedAt","unpairThingMutation","setUnpairThingOpen","deselectThing","setUnpairThingLoading","reset","mutation","unpairThing","unpairThingOpen","unpairThingLoading","showConfirm","setShowConfirm","showCopy","setShowCopy","copyRan","setCopyRan","setShowLoading","showDownload","setShowDownload","downloadRan","setDownloadRan","setReset","Igloo","localStorage","getItem","JSON","account","token","clipboard","copy","clipboardCopy","timeout","enter","exit","downloadText","svg2png","query","qrCode","trim","encoding","format","CircularProgress","fill","palette","main","Switch","textOnSecondaryColor","REACT_APP_TEXT_ON_SECONDARY_COLOR","showNotifications","REACT_APP_SHOW_NOTIFICATIONS","infoOpen","unpairOpen","renameOpen","changeCollectionOpen","goToThings","drawerOpen","manageCardsOpen","groupDialogOpen","handleMenuOpen","mix","flowsEnabled","REACT_APP_ENABLE_FLOWS","notchStyle","toggleQuietMode","muted","ToggleQuietMode","toggleStarred","ToggleStarred","quietMode","xmlns","hiddenVariableCount","manageFlowsOpen","setOpen","ThingInfo","UnpairThing","SwipeableDrawer","anchor","onOpen","disableBackdropTransition","disableDiscovery","disableSwipeToOpen","redirectTo","drawer","changeDrawerState","hiddenNotifications","showHiddenNotifications","openSnackBar","tempRedirect","backgroundImage","setRedirect","AppBar","boxShadow","backgroundLogo","appName","REACT_APP_NAME","showMainHidden","slideIndex","areSettingsOpen","oldState","changeShowHiddenState","showHidden","isCardFullScreen","copyMessageOpen","thingPaired","some","starredThing","thingDeleted","thingUnpaired","thingMoved","self","redirectToCollections","overflowY","selectThing","thingsSearchText","logOut","gridTemplateRows","lessThan900","enableDataLab","REACT_APP_ENABLE_DATA_LAB","enableReports","REACT_APP_ENABLE_REPORTS","homeIcon","REACT_APP_HOME_ICON","homeName","REACT_APP_HOME_NAME","tabStyle","textTransform","opacity","minWidth","showTabs","src","logo","alt","draggable","Tabs","TabIndicatorProps","Tab","icon","dangerouslySetInnerHTML","__html","pathname","points","float","changeAccount","changeBearer","isOpen","picture","nameError","require","images","values","reduce","acc","next","REACT_APP_COLLECTION_NAME","onChangeIndex","default","image","deleteCollectionMutation","DeleteCollection","deleteCollection","REACT_APP_THINGS_NAME","leaveCollection","LeaveCollection","stopSharing","ownerName","REACT_APP_OWNER_NAME","email","emailEmpty","changeOwner","isEmailValid","emailError","changePendingRole","role","ChangePendingRole","menuTarget","pendingShare","pending","changeRole","selectedUserType","inviteUser","auth","shareCollection","recipient","selectOpen","adminName","REACT_APP_ADMIN_NAME","editorName","REACT_APP_EDITOR_NAME","viewerName","REACT_APP_VIEWER_NAME","MuiMenu","list","MuiSelect","SelectProps","revokeInvite","RevokeInvite","revokePendingShare","RevokePendingTransfer","revokePendingTransfer","profileIconColors","showStopSharingLoading","StopSharing","stopSharingCollection","stopSharingOpen","ChangeRole","newRole","handleBackButton2","backStackIndex2","handleMenuClose2","anchorEl2","inviteUserOpen","changeRoleOpen","changeOwnerOpen","revokeTransferOpen","selectedUserForChangeRoleDialog","server","bearer","revokeInviteOpen","ShareContent","openInviteUser","openChangeRole","openStopSharing","openChangeOwner","openRevokeTransfer","openMenu","openPendingMenu","setMenuTarget","setSelectedUser","editorOffset","editorLimit","pendingEditorOffset","pendingEditorLimit","viewerOffset","viewerLimit","pendingViewerOffset","pendingViewerLimit","shareData","editorCount","editors","newEditors","pendingEditorShareCount","pendingEditorShares","newPendingEditorShares","viewerCount","viewers","newViewers","pendingViewerShareCount","pendingViewerShares","newPendingViewerShares","getInitials","string","names","initials","editor","pendingShareDeclined","viewer","newEditorShares","newViewerShares","pendingShareRevoked","userLeftCollection","pendingShareAcceptedSubscription","pendingShareAccepted","adminsName","REACT_APP_ADMINS_NAME","editorsName","REACT_APP_EDITORS_NAME","viewersName","REACT_APP_VIEWERS_NAME","subheaderStyle","ListSubheader","owner","fields","onDelete","privateCloud","profileIconColor","pendingTransfer","RemoveCircleOutline","admins","pendingAdminShares","item","toggleFavorite","favorite","ToggleFavorite","deleteOpen","shareOpen","Paper","elevation","ButtonBase","focusRipple","Toolbar","borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius","leaveOpen","CollectionInfo","PendingSharesContent","AcceptPendingShare","pendingShares","DeclinePendingShare","pendingSharesData","pendingShareCount","newShares","pendingShareCreatedSubscription","newPendingShares","pendingShareCreated","pendingShareDeclinedSubscription","pendingShareRevokedSubscription","sender","unverified","AcceptPendingTransfer","pendingTransfers","DeclinePendingTransfer","pendingTransfersData","pendingTransferCount","newTransfers","newPendingTransfers","pendingTransferCreated","pendingTransferDeclinedSubscription","pendingTransferDeclined","pendingTransferRevokedSubscription","pendingTransferRevoked","pendingTransferAcceptedSubscription","pendingTransferAccepted","collectionCount","newCollections","createOpen","pendingSharesOpen","pendingTransfersOpen","collectionsName","yourCollectionsList","errorScreen","justify","fontSize","PendingTransfers","createCollectionMutation","CreateCollection","createCollection","floor","random","menuItemStyle","mainBackgroundColor","setBlocks","variableIds","SelectDisplayProps","IconComponent","multiple","renderValue","thingIndex","Chip","variableIndex","blocks","block","every","flatMap","array","sx","indeterminate","series","metrics","useMoveButtons","selectedDraggable","setSelectedDraggable","dragDirection","setDragDirection","api","preDrag","tryGetLock","snapLift","moveUp","moveDown","drop","selectedBlock","dropBlock","propertyName","createReport","setLoading","setError","reportTitle","fetch","method","headers","body","stringify","ok","CreateReport","setCollectionId","setReportTitle","reportTitleEmpty","setReportTitleEmpty","greaterThanSm","useMediaQuery","breakpoints","up","addButtonStyle","seriesThings","idToRemove","metricThings","containedButtonError","onDragUpdate","destination","source","droppableId","fromIndex","toIndex","element","splice","reorderBlocks","sensors","innerRef","droppableProps","ref","draggableId","toString","draggableProps","direction","multiline","rows","ChipInput","disableUndo","ButtonGroup","x","y","StyledBadge","badge","cellStyle","reportCount","reports","newReports","setDownloaded","updateReport","downloaded","reportCreated","report","reportUpdated","reportDeleted","Table","stickyHeader","TableHead","TableRow","TableCell","TableBody","Array","producer","downloadUrl","Skeleton","timestamp","isSame","isSameOrAfter","subtract","isBefore","charAt","slice","align","component","download","href","startDate","endDate","setDates","refetchSeries","seriesCount","CustomDateRangePickerDay","DateRangePickerDay","isHighlighting","outsideCurrentMonth","MobileDateRangePicker","disableHighlightToday","allowSameDateSelection","renderInput","startProps","endProps","setItem","selectedVariables","startOf","endOf","inputVariant","inputFormat","dateFormat","cancelText","okText","DialogProps","invalidDateMessage","showToolbar","renderDay","dateRangePickerDayProps","Keyframes","toCss","cssObject","accumulator","cssKey","v","cssValue","join","seriesData","floatSeriesVariableCount","floatSeriesVariables","newFloatSeriesVariables","checkIfScrollable","seriesList","loadingVariables","setSelectedVariables","expandedThings","setExpandedThings","allSeries","shownUnits","isInDrawer","fetchSeries","seriesUser","REACT_APP_SERIES_COLORS","seriesColors","loadingUnits","Set","unitOfMeasurement","disableTypography","variableId","variableName","nodeCount","_0","_50","_100","disablePadding","selectedVariableId","animationName","animationDuration","animationIterationCount","darken","unitConversion","lengthAndMass","temperature","withRouter","lessThan1200","crosshairValues","leftLabelWidth","rightLabelWidth","checkIfNoData","shownSeries","nodes","setSnackbarOpen","unlisten","history","listen","computeLabelWidth","computeTextWidth","canvas","createElement","getContext","measureText","enableAnimation","shownTimestamps","shownNodesByUnit","firstUnit","secondUnit","forEach","undefined","xDomain","yDomain","xType","onMouseLeave","onTouchEnd","dontCheckIfEmpty","minValue","maxValue","node","floatSeriesVariable","animation","getNull","roundToPrecision","valueConversion","precision","curve","strokeStyle","stroke","strokeWidth","onNearestX","all","tickTotal","attr","attrAxis","tickSize","tickFormat","date","timeFormat","getTickFormat","line","ticks","convertedValue","roundedValue","toPrecision","enableY","highlightWidth","highlightHeight","onBrushEnd","range","crosshairText","reverse","result","crosshairElement","fontWeight","isJSON","fetchedIntervals","newStartDate","newEndDate","startTimestamp","endTimestamp","floatSeriesVariableWithNodeCounts","limitNodeCount","offsetNodeCount","then","response","Papa","newSeries","floatSeriesVariableCreated","floatSeriesVariableUpdated","floatSeriesVariableDeleted","userError","userLoading","userRefetch","seriesError","seriesLoading","seriesRefetch","DatePicker","expandedThingsFunction","selectedVariablesFunction","searchMoreLoading","settingsOpen","createReportOpen","createCollectionOpen","transitionDuration","duration","enteringScreen","leavingScreen","collectionsHeader","searchCollections","collectionsSearchText","collectionRoute","Route","path","exact","snackBarHidden","dataLabRoute","reportRoute","routes","Box","borderBottom","isReadable","containerStyle","forceUpdate","transitionDelay","flags","reportSendingEnabled","unmountOnExit","Snackbar","reason","autoHideDuration","acceptPrivacyPolicyOpen","changeLanguage","language","ChangeLanguage","userLanguage","collectionCreated","collectionUpdated","collectionDeletedSubscription","collectionDeleted","userDeletedSubscription","userId","pendingShareDeleted","metadata","privacyPolicyAccepted","privacyPolicyVersion","updateLocale","i18n","week","dow","firstDayOfTheWeek","requireConsent","CollectionFetcher","changeEmail","changeEmailBearer","changeAuthenticationBearer","deleteUserBearer","manageAccessTokensBearer","AuthenticatedApp","wsLink","WebSocketLink","uri","reconnect","connectionParams","Authorization","httpLink","HttpLink","errorLink","networkError","graphQLErrors","requestLink","getMainDefinition","kind","operation","link","ApolloLink","from","fragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","ApolloClient","cache","InMemoryCache","backgroundColorByHexString","ApolloProvider","setupWebPush","sendSubscriptionToServer","subscription","endpoint","newEndpointList","serverUrl","credentials","authorization","referrer","serviceWorker","register","swReg","pushManager","getSubscription","applicationServerKey","base64String","base64","repeat","rawData","atob","outputArray","Uint8Array","i","charCodeAt","urlB64ToUint8Array","subscribe","userVisibleOnly","useTheme","down","App","setOnline","preventDefault","Backbutton","goBack","sessionStorage","importAll","loggedOut","loginEmail","loginEmailError","loginPassword","signupEmail","signupEmailError","signupPassword","connection","Connection","NONE","show","overlaysWebView","deleted","currentAccountList","currentUser","webPushUnsubscribe","redirectToHidden","unauthenticatedLogo","mobileUnauthenticatedLogo","loginBackgrounds","version","isAccountSwitcher","isLogin","setHiddenRedirect","isSignup","isRecovery","use","initReactI18next","init","resources","en","it","lng","fallbackLng","debug","ns","defaultNS","interpolation","escapeValue","formatSeparator","react","wait","bindI18n","bindStore","nsMode","HybridRouter","HashRouter","BrowserRouter","startApp","ReactDOM","LocalizationProvider","dateAdapter","DateAdapter","I18nextProvider"],"mappings":"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","file":"static/js/main.75fdf0e2.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/card0.d9184f1b.svg\";","export default __webpack_public_path__ + \"static/media/card1.0b221568.svg\";","export default __webpack_public_path__ + \"static/media/card2.834f6dbd.svg\";","export default __webpack_public_path__ + \"static/media/loginBackground0.bdccbca8.jpg\";","var map = {\n\t\"./af\": 693,\n\t\"./af.js\": 693,\n\t\"./ar\": 694,\n\t\"./ar-dz\": 695,\n\t\"./ar-dz.js\": 695,\n\t\"./ar-kw\": 696,\n\t\"./ar-kw.js\": 696,\n\t\"./ar-ly\": 697,\n\t\"./ar-ly.js\": 697,\n\t\"./ar-ma\": 698,\n\t\"./ar-ma.js\": 698,\n\t\"./ar-sa\": 699,\n\t\"./ar-sa.js\": 699,\n\t\"./ar-tn\": 700,\n\t\"./ar-tn.js\": 700,\n\t\"./ar.js\": 694,\n\t\"./az\": 701,\n\t\"./az.js\": 701,\n\t\"./be\": 702,\n\t\"./be.js\": 702,\n\t\"./bg\": 703,\n\t\"./bg.js\": 703,\n\t\"./bm\": 704,\n\t\"./bm.js\": 704,\n\t\"./bn\": 705,\n\t\"./bn-bd\": 706,\n\t\"./bn-bd.js\": 706,\n\t\"./bn.js\": 705,\n\t\"./bo\": 707,\n\t\"./bo.js\": 707,\n\t\"./br\": 708,\n\t\"./br.js\": 708,\n\t\"./bs\": 709,\n\t\"./bs.js\": 709,\n\t\"./ca\": 710,\n\t\"./ca.js\": 710,\n\t\"./cs\": 711,\n\t\"./cs.js\": 711,\n\t\"./cv\": 712,\n\t\"./cv.js\": 712,\n\t\"./cy\": 713,\n\t\"./cy.js\": 713,\n\t\"./da\": 714,\n\t\"./da.js\": 714,\n\t\"./de\": 715,\n\t\"./de-at\": 716,\n\t\"./de-at.js\": 716,\n\t\"./de-ch\": 717,\n\t\"./de-ch.js\": 717,\n\t\"./de.js\": 715,\n\t\"./dv\": 718,\n\t\"./dv.js\": 718,\n\t\"./el\": 719,\n\t\"./el.js\": 719,\n\t\"./en-au\": 720,\n\t\"./en-au.js\": 720,\n\t\"./en-ca\": 721,\n\t\"./en-ca.js\": 721,\n\t\"./en-gb\": 509,\n\t\"./en-gb.js\": 509,\n\t\"./en-ie\": 722,\n\t\"./en-ie.js\": 722,\n\t\"./en-il\": 723,\n\t\"./en-il.js\": 723,\n\t\"./en-in\": 724,\n\t\"./en-in.js\": 724,\n\t\"./en-nz\": 725,\n\t\"./en-nz.js\": 725,\n\t\"./en-sg\": 726,\n\t\"./en-sg.js\": 726,\n\t\"./eo\": 727,\n\t\"./eo.js\": 727,\n\t\"./es\": 728,\n\t\"./es-do\": 729,\n\t\"./es-do.js\": 729,\n\t\"./es-mx\": 730,\n\t\"./es-mx.js\": 730,\n\t\"./es-us\": 731,\n\t\"./es-us.js\": 731,\n\t\"./es.js\": 728,\n\t\"./et\": 732,\n\t\"./et.js\": 732,\n\t\"./eu\": 733,\n\t\"./eu.js\": 733,\n\t\"./fa\": 734,\n\t\"./fa.js\": 734,\n\t\"./fi\": 735,\n\t\"./fi.js\": 735,\n\t\"./fil\": 736,\n\t\"./fil.js\": 736,\n\t\"./fo\": 737,\n\t\"./fo.js\": 737,\n\t\"./fr\": 738,\n\t\"./fr-ca\": 739,\n\t\"./fr-ca.js\": 739,\n\t\"./fr-ch\": 740,\n\t\"./fr-ch.js\": 740,\n\t\"./fr.js\": 738,\n\t\"./fy\": 741,\n\t\"./fy.js\": 741,\n\t\"./ga\": 742,\n\t\"./ga.js\": 742,\n\t\"./gd\": 743,\n\t\"./gd.js\": 743,\n\t\"./gl\": 744,\n\t\"./gl.js\": 744,\n\t\"./gom-deva\": 745,\n\t\"./gom-deva.js\": 745,\n\t\"./gom-latn\": 746,\n\t\"./gom-latn.js\": 746,\n\t\"./gu\": 747,\n\t\"./gu.js\": 747,\n\t\"./he\": 748,\n\t\"./he.js\": 748,\n\t\"./hi\": 749,\n\t\"./hi.js\": 749,\n\t\"./hr\": 750,\n\t\"./hr.js\": 750,\n\t\"./hu\": 751,\n\t\"./hu.js\": 751,\n\t\"./hy-am\": 752,\n\t\"./hy-am.js\": 752,\n\t\"./id\": 753,\n\t\"./id.js\": 753,\n\t\"./is\": 754,\n\t\"./is.js\": 754,\n\t\"./it\": 755,\n\t\"./it-ch\": 756,\n\t\"./it-ch.js\": 756,\n\t\"./it.js\": 755,\n\t\"./ja\": 757,\n\t\"./ja.js\": 757,\n\t\"./jv\": 758,\n\t\"./jv.js\": 758,\n\t\"./ka\": 759,\n\t\"./ka.js\": 759,\n\t\"./kk\": 760,\n\t\"./kk.js\": 760,\n\t\"./km\": 761,\n\t\"./km.js\": 761,\n\t\"./kn\": 762,\n\t\"./kn.js\": 762,\n\t\"./ko\": 763,\n\t\"./ko.js\": 763,\n\t\"./ku\": 764,\n\t\"./ku.js\": 764,\n\t\"./ky\": 765,\n\t\"./ky.js\": 765,\n\t\"./lb\": 766,\n\t\"./lb.js\": 766,\n\t\"./lo\": 767,\n\t\"./lo.js\": 767,\n\t\"./lt\": 768,\n\t\"./lt.js\": 768,\n\t\"./lv\": 769,\n\t\"./lv.js\": 769,\n\t\"./me\": 770,\n\t\"./me.js\": 770,\n\t\"./mi\": 771,\n\t\"./mi.js\": 771,\n\t\"./mk\": 772,\n\t\"./mk.js\": 772,\n\t\"./ml\": 773,\n\t\"./ml.js\": 773,\n\t\"./mn\": 774,\n\t\"./mn.js\": 774,\n\t\"./mr\": 775,\n\t\"./mr.js\": 775,\n\t\"./ms\": 776,\n\t\"./ms-my\": 777,\n\t\"./ms-my.js\": 777,\n\t\"./ms.js\": 776,\n\t\"./mt\": 778,\n\t\"./mt.js\": 778,\n\t\"./my\": 779,\n\t\"./my.js\": 779,\n\t\"./nb\": 780,\n\t\"./nb.js\": 780,\n\t\"./ne\": 781,\n\t\"./ne.js\": 781,\n\t\"./nl\": 782,\n\t\"./nl-be\": 783,\n\t\"./nl-be.js\": 783,\n\t\"./nl.js\": 782,\n\t\"./nn\": 784,\n\t\"./nn.js\": 784,\n\t\"./oc-lnc\": 785,\n\t\"./oc-lnc.js\": 785,\n\t\"./pa-in\": 786,\n\t\"./pa-in.js\": 786,\n\t\"./pl\": 787,\n\t\"./pl.js\": 787,\n\t\"./pt\": 788,\n\t\"./pt-br\": 789,\n\t\"./pt-br.js\": 789,\n\t\"./pt.js\": 788,\n\t\"./ro\": 790,\n\t\"./ro.js\": 790,\n\t\"./ru\": 791,\n\t\"./ru.js\": 791,\n\t\"./sd\": 792,\n\t\"./sd.js\": 792,\n\t\"./se\": 793,\n\t\"./se.js\": 793,\n\t\"./si\": 794,\n\t\"./si.js\": 794,\n\t\"./sk\": 795,\n\t\"./sk.js\": 795,\n\t\"./sl\": 796,\n\t\"./sl.js\": 796,\n\t\"./sq\": 797,\n\t\"./sq.js\": 797,\n\t\"./sr\": 798,\n\t\"./sr-cyrl\": 799,\n\t\"./sr-cyrl.js\": 799,\n\t\"./sr.js\": 798,\n\t\"./ss\": 800,\n\t\"./ss.js\": 800,\n\t\"./sv\": 801,\n\t\"./sv.js\": 801,\n\t\"./sw\": 802,\n\t\"./sw.js\": 802,\n\t\"./ta\": 803,\n\t\"./ta.js\": 803,\n\t\"./te\": 804,\n\t\"./te.js\": 804,\n\t\"./tet\": 805,\n\t\"./tet.js\": 805,\n\t\"./tg\": 806,\n\t\"./tg.js\": 806,\n\t\"./th\": 807,\n\t\"./th.js\": 807,\n\t\"./tk\": 808,\n\t\"./tk.js\": 808,\n\t\"./tl-ph\": 809,\n\t\"./tl-ph.js\": 809,\n\t\"./tlh\": 810,\n\t\"./tlh.js\": 810,\n\t\"./tr\": 811,\n\t\"./tr.js\": 811,\n\t\"./tzl\": 812,\n\t\"./tzl.js\": 812,\n\t\"./tzm\": 813,\n\t\"./tzm-latn\": 814,\n\t\"./tzm-latn.js\": 814,\n\t\"./tzm.js\": 813,\n\t\"./ug-cn\": 815,\n\t\"./ug-cn.js\": 815,\n\t\"./uk\": 816,\n\t\"./uk.js\": 816,\n\t\"./ur\": 817,\n\t\"./ur.js\": 817,\n\t\"./uz\": 818,\n\t\"./uz-latn\": 819,\n\t\"./uz-latn.js\": 819,\n\t\"./uz.js\": 818,\n\t\"./vi\": 820,\n\t\"./vi.js\": 820,\n\t\"./x-pseudo\": 821,\n\t\"./x-pseudo.js\": 821,\n\t\"./yo\": 822,\n\t\"./yo.js\": 822,\n\t\"./zh-cn\": 823,\n\t\"./zh-cn.js\": 823,\n\t\"./zh-hk\": 824,\n\t\"./zh-hk.js\": 824,\n\t\"./zh-mo\": 825,\n\t\"./zh-mo.js\": 825,\n\t\"./zh-tw\": 826,\n\t\"./zh-tw.js\": 826\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1465;","import React, { Component } from \"react\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport QrReader from \"react-qr-scanner\";\nimport TextField from \"@mui/material/TextField\";\nimport IconButton from \"@mui/material/IconButton\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\nimport Typography from \"@mui/material/Typography\";\nimport { Redirect } from \"react-router-dom\";\nimport { GenericDialog, getNotchHeight } from \"@igloocloud/igloosharedui\";\nimport { withTranslation } from \"react-i18next\";\n\nconst sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nlet prevThingDetailsOpen;\n\nexport default graphql(\n gql`\n mutation PairThing($pairCode: String!, $name: String!, $collectionId: ID!) {\n pairThing(pairCode: $pairCode, name: $name, collectionId: $collectionId) {\n id\n }\n }\n `,\n {\n name: \"PairThing\",\n }\n)(\n withTranslation()(\n class PairThing extends Component {\n state = {\n qrOpen: false,\n manualCodeOpen: false,\n thingDetailsOpen: false,\n cameraPermission: true,\n qrLoaded: false,\n dialogClosing: false,\n redirect: \"\",\n name: \"\",\n code: \"\",\n };\n\n isPairCodeValid = (pairCode) =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}-[0-9a-f]{16}$/i.test(\n pairCode\n );\n\n pairThing = async (pairCode, name, collectionId) => {\n const { t } = this.props;\n const { REACT_APP_THING_NAME: thingName } = process.env;\n\n if (this.isPairCodeValid(pairCode)) {\n try {\n this.setState({ pairLoading: true });\n\n await this.props.PairThing({\n variables: {\n pairCode,\n name,\n collectionId,\n },\n });\n\n this.setState({\n manualCodeOpen: false,\n thingDetailsOpen: false,\n redirect: (\n \"/?collection=\" +\n collectionId +\n \"&thing=\" +\n pairCode\n ).substring(\n 0,\n (\"/?collection=\" + collectionId + \"&thing=\" + pairCode).length -\n 17\n ),\n });\n\n this.props.close();\n this.setState({ dialogClosing: true });\n } catch (e) {\n if (\n e.message === \"GraphQL error: pairCode is not correct\" ||\n e.message === \"GraphQL error: This ID is not valid\" ||\n e.message === \"GraphQL error: pairCode not valid\"\n ) {\n this.setState({ codeError: t`Enter a valid code` });\n } else if (\n e.message ===\n \"GraphQL error: The requested resource does not exist\"\n ) {\n this.setState({\n codeError: t(\n `This ${\n thingName ? thingName.toLowerCase() : \"thing\"\n } does not exist`\n ),\n });\n } else if (\n e.message === \"GraphQL error: This thing has already been paired\"\n ) {\n this.setState({\n codeError: t(\n `${thingName ? thingName : \"Thing\"} already paired`\n ),\n });\n } else if (\n e.message ===\n \"GraphQL error: This thing has a producer that is not allowed for users on this private cloud\"\n ) {\n this.setState({\n codeError: t(\n `You're not allowed to pair this ${\n thingName ? thingName.toLowerCase() : \"thing\"\n }`\n ),\n });\n } else {\n this.setState({ codeError: \"Error\" });\n }\n } finally {\n this.setState({ pairLoading: false });\n }\n }\n };\n\n componentWillReceiveProps(nextProps) {\n if (this.props.open !== nextProps.open && nextProps.open) {\n this.setState({\n name: \"\",\n nameEmpty: \"\",\n code: \"\",\n codeEmpty: \"\",\n codeError: \"\",\n dialogClosing: false,\n });\n\n if (window.cordova) {\n window.cordova.plugins.diagnostic.requestCameraAuthorization({\n successCallback: (status) =>\n this.setState({\n cameraPermission:\n status ===\n window.cordova.plugins.diagnostic.permissionStatus.GRANTED,\n }),\n errorCallback: () => this.setState({ cameraPermission: false }),\n externalStorage: false,\n });\n }\n }\n }\n\n isCameraAuthorized = () => {\n try {\n navigator.mediaDevices.enumerateDevices();\n\n return true;\n } catch (error) {\n return false;\n }\n };\n\n render() {\n const { open, close, t } = this.props;\n const {\n thingDetailsOpen,\n pairLoading,\n cameraPermission,\n qrError,\n qrLoaded,\n dialogClosing,\n code,\n } = this.state;\n const {\n REACT_APP_THING_NAME: thingName,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n } = process.env;\n\n if (\n this.state.redirect &&\n this.state.redirect !==\n (window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search)\n ) {\n const address = this.state.redirect;\n this.setState({ redirect: \"\" });\n return <Redirect push to={address} />;\n }\n\n if (prevThingDetailsOpen !== thingDetailsOpen && thingDetailsOpen) {\n this.setState({\n name: \"\",\n nameEmpty: false,\n codeError: \"\",\n });\n }\n\n prevThingDetailsOpen = thingDetailsOpen;\n\n return (\n <>\n <GenericDialog\n open={open}\n hidden={\n this.state.qrOpen ||\n this.state.manualCodeOpen ||\n this.state.thingDetailsOpen\n }\n close={() => {\n close();\n this.setState({ dialogClosing: true });\n }}\n title={t(\n `Pair a ${thingName ? thingName.toLowerCase() : \"thing\"}`\n )}\n textButton={t`Close`}\n textButtonFunction={() => {\n close();\n this.setState({ dialogClosing: true });\n }}\n noHorizontalPadding\n >\n {({ fullScreen }) => (\n <List>\n <ListItem\n button\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n onClick={() => {\n if (window.cordova) {\n window.cordova.plugins.diagnostic.requestCameraAuthorization(\n {\n successCallback: (status) => {\n if (\n status ===\n window.cordova.plugins.diagnostic\n .permissionStatus.GRANTED\n ) {\n this.setState({\n qrOpen: true,\n qrError: false,\n qrLoaded: false,\n });\n } else {\n this.setState({ cameraPermission: false });\n }\n },\n errorCallback: () =>\n this.setState({ cameraPermission: false }),\n externalStorage: false,\n }\n );\n } else {\n this.setState({\n qrOpen: true,\n qrError: false,\n qrLoaded: false,\n });\n }\n }}\n disabled={\n (this.props.open &&\n (window.cordova\n ? !cameraPermission\n : !this.isCameraAuthorized())) ||\n (!cameraPermission && dialogClosing)\n }\n >\n <ListItemIcon>\n <SvgIcon>\n <svg\n style={{ width: \"24px\", height: \"24px\" }}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M4,4H10V10H4V4M20,4V10H14V4H20M14,15H16V13H14V11H16V13H18V11H20V13H18V15H20V18H18V20H16V18H13V20H11V16H14V15M16,15V18H18V15H16M4,20V14H10V20H4M6,6V8H8V6H6M16,6V8H18V6H16M6,16V18H8V16H6M4,11H6V13H4V11M9,11H13V15H11V13H9V11M11,6H13V10H11V6M2,2V6H0V2A2,2 0 0,1 2,0H6V2H2M22,0A2,2 0 0,1 24,2V6H22V2H18V0H22M2,18V22H6V24H2A2,2 0 0,1 0,22V18H2M22,22V18H24V22A2,2 0 0,1 22,24H18V22H22Z\" />\n </svg>\n </SvgIcon>\n </ListItemIcon>\n <ListItemText\n primary={\n <font style={{ color: textColor }}>\n {t`Scan QR code`}\n </font>\n }\n />\n </ListItem>\n <ListItem\n button\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n onClick={() => {\n this.setState({\n manualCodeOpen: true,\n code: \"\",\n codeEmpty: false,\n codeError: false,\n name: \"\",\n nameEmpty: false,\n });\n }}\n >\n <ListItemIcon>\n <SvgIcon>\n <svg\n style={{ width: \"24px\", height: \"24px\" }}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M17,7H22V17H17V19A1,1 0 0,0 18,20H20V22H17.5C16.95,22 16,21.55 16,21C16,21.55 15.05,22 14.5,22H12V20H14A1,1 0 0,0 15,19V5A1,1 0 0,0 14,4H12V2H14.5C15.05,2 16,2.45 16,3C16,2.45 16.95,2 17.5,2H20V4H18A1,1 0 0,0 17,5V7M2,7H13V9H4V15H13V17H2V7M20,15V9H17V15H20Z\" />\n </svg>\n </SvgIcon>\n </ListItemIcon>\n <ListItemText\n primary={\n <font style={{ color: textColor }}>\n {t`Insert code manually`}\n </font>\n }\n />\n </ListItem>\n </List>\n )}\n </GenericDialog>\n <GenericDialog\n open={this.state.qrOpen}\n close={() => this.setState({ qrOpen: false })}\n title={t`Scan QR code`}\n textButton={t`Close`}\n textButtonFunction={() => this.setState({ qrOpen: false })}\n noVerticalPadding\n noHorizontalPadding\n typographyStyle={{ height: \"100%\" }}\n onFullScreenChanged={() => this.setState({ qrLoaded: false })}\n >\n {qrError || (window.cordova && !cameraPermission) ? (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n textAlign: \"center\",\n marginTop: \"32px\",\n marginBottom: \"16px\",\n color: textColor,\n marginLeft: getNotchHeight(\"left\"),\n marginRight: getNotchHeight(\"right\"),\n }}\n >\n {t`Something went wrong`}\n </Typography>\n ) : (\n <div\n style={{\n visibility: qrLoaded ? \"visible\" : \"collapse\",\n }}\n >\n <QrReader\n showViewFinder={false}\n onError={() => this.setState({ qrError: true })}\n onScan={(code) => {\n if (code) {\n this.setState({\n qrOpen: false,\n code,\n thingDetailsOpen: true,\n codeEmpty: false,\n codeError: \"\",\n });\n }\n }}\n onLoad={async () => {\n if (window.cordova) await sleep(500);\n\n this.setState({ qrLoaded: true });\n }}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n facingMode=\"rear\"\n chooseDeviceId={(_, allDevices) =>\n allDevices[\n allDevices.length > 4 ? 4 : allDevices.length - 1\n ].deviceId\n }\n />\n </div>\n )}\n </GenericDialog>\n <GenericDialog\n open={this.state.manualCodeOpen && !this.state.thingDetailsOpen}\n close={() => this.setState({ manualCodeOpen: false })}\n title={t`Insert code manually`}\n textButton={t`Close`}\n textButtonFunction={() =>\n this.setState({ manualCodeOpen: false })\n }\n containedButton={t`Pair`}\n containedButtonFunction={() =>\n this.pairThing(\n this.state.code,\n this.state.name,\n this.props.collection\n )\n }\n containedButtonLoading={pairLoading}\n containedButtonDisabled={\n !this.state.name.replace(/\\s/g, \"\").length ||\n pairLoading ||\n (!this.isPairCodeValid(code) && code)\n }\n >\n <TextField\n id=\"add-thing-code\"\n label={t`Code`}\n required\n value={this.state.code}\n variant=\"outlined\"\n error={\n this.state.codeEmpty ||\n this.state.codeError ||\n (!this.isPairCodeValid(code) && code)\n }\n helperText={\n this.state.codeEmpty\n ? t`This field is required`\n : !this.isPairCodeValid(code) && code\n ? t`Enter a valid code`\n : this.state.codeError || \" \"\n }\n onChange={(event) =>\n this.setState({\n code: event.target.value,\n codeEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n codeError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (\n event.key === \"Enter\" &&\n this.state.code.replace(/\\s/g, \"\").length &&\n this.state.name.replace(/\\s/g, \"\").length\n ) {\n this.pairThing(\n this.state.code,\n this.state.name,\n this.props.collection\n );\n this.setState({ thingDetailsOpen: false });\n }\n }}\n style={{\n width: \"100%\",\n marginBottom: \"16px\",\n }}\n InputLabelProps={this.state.code ? { shrink: true } : {}}\n InputProps={{\n endAdornment: this.state.code && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n code: \"\",\n codeEmpty: true,\n codeError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n <TextField\n id=\"manual-pair-thing-name\"\n label={t`Name`}\n required\n value={this.state.name}\n variant=\"outlined\"\n error={this.state.nameEmpty || this.state.name.length > 256}\n helperText={\n this.state.name.length > 256\n ? t`Use fewer characters`\n : this.state.nameEmpty\n ? t`This field is required`\n : \" \"\n }\n onChange={(event) =>\n this.setState({\n name: event.target.value,\n nameEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n })\n }\n onKeyPress={(event) => {\n if (\n event.key === \"Enter\" &&\n this.state.code.replace(/\\s/g, \"\").length &&\n this.state.name.replace(/\\s/g, \"\").length &&\n this.state.name.length <= 256\n ) {\n this.pairThing(\n this.state.code,\n this.state.name,\n this.props.collection\n );\n this.setState({ thingDetailsOpen: false });\n }\n }}\n style={{\n width: \"100%\",\n }}\n InputLabelProps={this.state.name ? { shrink: true } : {}}\n InputProps={{\n endAdornment: this.state.name && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n name: \"\",\n nameEmpty: true,\n codeError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n <GenericDialog\n open={this.state.thingDetailsOpen}\n close={() => this.setState({ thingDetailsOpen: false })}\n title={t`Choose a name`}\n textButton={t`Close`}\n textButtonFunction={() =>\n this.setState({\n thingDetailsOpen: false,\n qrOpen: true,\n qrLoaded: false,\n })\n }\n containedButton={t`Pair`}\n containedButtonFunction={() =>\n this.pairThing(\n this.state.code,\n this.state.name,\n this.props.collection\n )\n }\n containedButtonLoading={pairLoading}\n containedButtonDisabled={\n !this.state.name.replace(/\\s/g, \"\").length ||\n this.state.codeError ||\n pairLoading\n }\n >\n <TextField\n id=\"qr-pair-thing-name\"\n label={t`Name`}\n required\n value={this.state.name}\n variant=\"outlined\"\n error={this.state.nameEmpty || this.state.codeError}\n helperText={\n this.state.nameEmpty\n ? t`This field is required`\n : this.state.codeError\n ? this.state.codeError\n : \" \"\n }\n onChange={(event) =>\n this.setState({\n name: event.target.value,\n nameEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n codeError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (\n event.key === \"Enter\" &&\n !this.state.nameEmpty &&\n !this.state.codeError\n ) {\n this.pairThing(\n this.state.code,\n this.state.name,\n this.props.collection\n );\n }\n }}\n style={{\n width: \"100%\",\n }}\n InputLabelProps={this.state.name ? { shrink: true } : {}}\n InputProps={{\n endAdornment: this.state.name && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n name: \"\",\n nameEmpty: true,\n codeError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n </>\n );\n }\n }\n )\n);\n","import {\n CenteredSpinner,\n debounce,\n ErrorScreen,\n getNotchHeight,\n isRoleAtLeast,\n theme,\n} from \"@igloocloud/igloosharedui\";\nimport Add from \"@mui/icons-material/Add\";\nimport SearchIcon from \"@mui/icons-material/Search\";\nimport Star from \"@mui/icons-material/Star\";\nimport Avatar from \"@mui/material/Avatar\";\nimport Badge from \"@mui/material/Badge\";\nimport Divider from \"@mui/material/Divider\";\nimport Fab from \"@mui/material/Fab\";\nimport InputBase from \"@mui/material/InputBase\";\nimport LinearProgress from \"@mui/material/LinearProgress\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemAvatar from \"@mui/material/ListItemAvatar\";\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\";\nimport { adaptV4Theme, createTheme } from \"@mui/material/styles\";\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\";\nimport Typography from \"@mui/material/Typography\";\nimport Zoom from \"@mui/material/Zoom\";\nimport withStyles from \"@mui/styles/withStyles\";\nimport querystringify from \"querystringify\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport { Link, Redirect } from \"react-router-dom\";\nimport tinyColor from \"tinycolor2\";\nimport AddThing from \"./AddThing\";\n\nlet mergedArray = [];\n\nconst {\n REACT_APP_SECONDARY_BACKGROUND_COLOR: secondaryBackgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnMainBackgroundColor,\n REACT_APP_TEXT_ON_SECONDARY_BACKGROUND_COLOR: textOnSecondaryBackgroundColor,\n REACT_APP_LIGHT_COLOR: lightColor,\n REACT_APP_MAIN_COLOR: mainColor,\n REACT_APP_SIDEBAR_FOLDERS_ENABLED: foldersEnabled,\n REACT_APP_TEXT_ON_MAIN_COLOR: textOnMainColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n REACT_APP_TEXT_ON_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: textOnLightContrastColor,\n} = process.env;\n\nexport default withTranslation()(\n withStyles((theme) => ({\n search: {\n position: \"relative\",\n borderRadius: 18,\n width: \"calc(100% - 32px)\",\n backgroundColor: secondaryBackgroundColor,\n \"&:hover\": {\n \"&:!disabled\": {\n backgroundColor: secondaryBackgroundColor,\n },\n },\n },\n mobileSearch: {\n position: \"relative\",\n borderRadius: 18,\n width: \"calc(100% - 32px)\",\n backgroundColor: tinyColor(textOnMainBackgroundColor)\n .setAlpha(0.05)\n .toRgbString(),\n \"&:hover\": {\n \"&:!disabled\": {\n backgroundColor: tinyColor(textOnMainBackgroundColor)\n .setAlpha(0.05)\n .toRgbString(),\n },\n },\n },\n searchIcon: {\n width: \"48px\",\n height: \"100%\",\n position: \"absolute\",\n pointerEvents: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n inputRoot: {\n color: textOnMainBackgroundColor,\n width: \"100%\",\n },\n input: {\n height: \"100%\",\n padding: \"8px 8px 8px 48px\",\n transition: theme.transitions.create(\"width\"),\n color: textOnMainBackgroundColor,\n },\n }))(\n class Sidebar extends Component {\n state = {\n dialOpen: false,\n typeList: [],\n hidden: false,\n addThingOpen: false,\n lessThan1080: false,\n greaterThan560: false,\n fabWidth: null,\n };\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.collectionData.collection.thingCount > mergedArray.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.collectionData.fetchMore({\n variables: {\n offset: this.props.collectionData.collection.things.length,\n limit:\n this.props.collectionData.collection.thingCount -\n this.props.collectionData.collection.things.length >=\n 20\n ? 20\n : this.props.collectionData.collection.thingCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newThings = [\n ...prev.collection.things,\n ...fetchMoreResult.collection.things,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n }\n };\n\n searchMore = async (searchText) => {\n if (\n !this.searchMore.locked &&\n this.props.collectionData.collection.thingCount > mergedArray.length\n ) {\n this.searchMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n\n await this.props.collectionData.fetchMore({\n variables: {\n filter: { name: { regexMatch: \"(?i)\" + searchText } },\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newThings = [\n ...prev.collection.things,\n ...fetchMoreResult.collection.things,\n ];\n\n return {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.searchMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n }\n };\n\n updateDimensions = () => {\n if (window.innerWidth < 1080) {\n this.setState({ lessThan1080: true });\n } else {\n this.setState({ lessThan1080: false });\n }\n\n if (window.innerWidth > 560) {\n !this.state.greaterThan560 && this.setState({ greaterThan560: true });\n } else {\n this.state.greaterThan560 && this.setState({ greaterThan560: false });\n }\n\n if (\n document.getElementById(\"thingFab\") &&\n document.getElementById(\"thingFab\").clientWidth !==\n this.props.fabWidth\n ) {\n this.props.setFabWidth(\n document.getElementById(\"thingFab\").clientWidth\n );\n }\n };\n\n componentDidMount() {\n this.updateDimensions();\n window.addEventListener(\"resize\", debounce(this.updateDimensions));\n\n if (this.props.isMobile && window.cordova) {\n if (\n tinyColor(\n process.env.REACT_APP_MAIN_BACKGROUND_COLOR\n ).getBrightness() <= 128\n ) {\n window.StatusBar.styleLightContent();\n } else {\n window.StatusBar.styleDefault();\n }\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", debounce(this.updateDimensions));\n }\n\n render() {\n const {\n collectionData: { error, loading, collection, refetch },\n classes,\n isMobile,\n t,\n } = this.props;\n const { fetchMoreLoading } = this.state;\n const thingsName = process.env.REACT_APP_THINGS_NAME || \"Things\";\n\n let sidebarContent = \"\";\n\n if (loading) {\n sidebarContent = (\n <CenteredSpinner\n style={{\n height: \"calc(100% - 96px)\",\n paddingTop: \"32px\",\n }}\n />\n );\n }\n\n if (error) {\n if (\n error.message === \"GraphQL error: This ID is not valid\" ||\n error.message ===\n \"GraphQL error: The requested resource does not exist\"\n ) {\n if (\n querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n ) {\n // if a thing is selected the sidebar keeps loading, waiting for the thing to redirect the user\n sidebarContent = (\n <CenteredSpinner\n style={{\n height: \"calc(100% - 96px)\",\n paddingTop: \"32px\",\n }}\n />\n );\n } else {\n // if there's no collection with the id in the url and no thing is selected, the user gets redirected\n return <Redirect to=\"/\" />;\n }\n } else {\n sidebarContent = (\n <div>\n <ErrorScreen\n refetch={() =>\n refetch({\n id: querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection,\n offset: 0,\n limit: 20,\n filter: {},\n })\n }\n error={error}\n />\n </div>\n );\n }\n }\n if (collection) {\n mergedArray = foldersEnabled\n ? collection.things\n : collection.starredThings.concat(collection.things);\n\n sidebarContent = (\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={theme(process.env, {\n MuiListItem: {\n secondaryAction: {\n paddingLeft:\n \"calc(\" + getNotchHeight(\"left\") + \" + 16px)\",\n paddingRight:\n \"calc(\" + getNotchHeight(\"right\") + \" + 16px)\",\n },\n },\n })}\n >\n {mergedArray.filter((thing) =>\n this.props.searchText\n ? thing.name\n .toLowerCase()\n .includes(this.props.searchText.toLowerCase())\n : true\n ).length === 0 && !fetchMoreLoading ? (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n textAlign: \"center\",\n marginTop: \"32px\",\n marginBottom: \"32px\",\n color: isMobile\n ? textOnMainBackgroundColor\n : textOnSecondaryBackgroundColor,\n }}\n >\n {t(\"No \" + thingsName.toLowerCase())}\n </Typography>\n ) : (\n <List\n style={{\n padding: \"0\",\n height:\n \"calc(100% - 64px - \" +\n (isMobile ? getNotchHeight(\"top\") : \"0px\") +\n \")\",\n overflow: \"auto\",\n overscrollBehaviorY: \"contain\",\n }}\n subheader={<li />}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore();\n }}\n >\n {mergedArray\n .filter((thing) =>\n this.props.searchText\n ? thing.name\n .toLowerCase()\n .includes(this.props.searchText.toLowerCase())\n : true\n )\n .map((thing) => (\n <Link\n to={\n this.props.selectedThing !== thing.id\n ? \"/?collection=\" +\n this.props.selectedCollection +\n \"&thing=\" +\n thing.id\n : \"/?collection=\" + this.props.selectedCollection\n }\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <ListItem\n button\n className=\"notSelectable\"\n selected={this.props.selectedThing === thing.id}\n key={thing.id}\n style={{\n width: isMobile ? \"100%\" : \"calc(100% - 16px)\",\n height: \"56px\",\n margin: isMobile ? \"0px\" : \"4px 8px\",\n borderRadius: isMobile ? \"\" : \"8px\",\n color:\n this.props.selectedThing === thing.id\n ? tinyColor(\n lightContrastColor || lightColor\n ).setAlpha(0.15)\n : null,\n backgroundColor:\n this.props.selectedThing === thing.id\n ? tinyColor(\n lightContrastColor || lightColor\n ).setAlpha(0.15)\n : null,\n }}\n >\n {!foldersEnabled &&\n (!mergedArray\n .filter((thing) =>\n this.props.searchText\n ? thing.name\n .toLowerCase()\n .includes(\n this.props.searchText.toLowerCase()\n )\n : true\n )\n .filter(\n (collectionThing) => collectionThing.starred\n )\n .map((collectionThing) => collectionThing.id)\n .indexOf(thing.id) ? (\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor: \"transparent\",\n color: lightContrastColor || lightColor,\n }}\n >\n <Star />\n </Avatar>\n </ListItemAvatar>\n ) : (\n //checks if thing is the first to start with its initial\n !mergedArray\n .filter(\n (collectionThing) =>\n !collectionThing.starred &&\n collectionThing.name\n .toLowerCase()\n .startsWith(thing.name[0].toLowerCase())\n )\n .filter((thing) =>\n this.props.searchText\n ? thing.name\n .toLowerCase()\n .includes(\n this.props.searchText.toLowerCase()\n )\n : true\n )\n .map((collectionThing) => collectionThing.id)\n .indexOf(thing.id) && (\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor: \"transparent\",\n color: lightContrastColor || lightColor,\n }}\n >\n {thing.name[0].toUpperCase()}\n </Avatar>\n </ListItemAvatar>\n )\n ))}\n <ListItemText\n inset={\n foldersEnabled\n ? thing.group\n : !mergedArray\n .filter(\n (collectionThing) =>\n !collectionThing.starred &&\n collectionThing.name\n .toLowerCase()\n .startsWith(\n thing.name[0].toLowerCase()\n )\n )\n .filter((thing) =>\n this.props.searchText\n ? thing.name\n .toLowerCase()\n .includes(\n this.props.searchText.toLowerCase()\n )\n : true\n )\n .map(\n (collectionThing) => collectionThing.id\n )\n .indexOf(thing.id)\n ? false\n : !!mergedArray\n .filter(\n (collectionThing) =>\n collectionThing.starred\n )\n .map(\n (collectionThing) => collectionThing.id\n )\n .indexOf(thing.id)\n }\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor: \"pointer\",\n }}\n primary={\n <font\n style={{\n color:\n this.props.selectedThing === thing.id\n ? tinyColor(\n lightContrastColor || mainColor\n )\n : null,\n }}\n >\n {thing.name}\n </font>\n }\n />\n <Link\n to={\n this.props.selectedThing !== thing.id\n ? \"/?collection=\" +\n this.props.selectedCollection +\n \"&thing=\" +\n thing.id\n : \"/?collection=\" +\n this.props.selectedCollection\n }\n >\n <ListItemSecondaryAction\n style={{ cursor: \"pointer\", height: \"20px\" }}\n >\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={createTheme(\n adaptV4Theme({\n overrides: {\n MuiBadge: {\n colorPrimary: {\n backgroundColor:\n lightContrastColor || mainColor,\n },\n },\n },\n })\n )}\n >\n <Badge\n badgeContent={\n <font\n style={{\n color:\n textOnLightContrastColor ||\n textOnMainColor,\n }}\n >\n {thing.notificationCount}\n </font>\n }\n invisible={!thing.notificationCount}\n color=\"primary\"\n className=\"notSelectable\"\n style={{\n marginTop: \"-1px\",\n marginRight: \"24px\",\n }}\n />\n </ThemeProvider>\n </StyledEngineProvider>\n </ListItemSecondaryAction>\n </Link>\n </ListItem>\n </Link>\n ))}\n </List>\n )}\n {this.state.fetchMoreLoading && (\n <LinearProgress\n style={\n this.props.isMobile\n ? { position: \"absolute\", top: 0, width: \"100%\" }\n : { marginTop: \"-4px\" }\n }\n />\n )}\n </ThemeProvider>\n </StyledEngineProvider>\n );\n }\n\n return (\n <>\n <div\n style={{\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\",\n width: \"100%\",\n height: \"100%\",\n }}\n >\n <div\n style={{\n background: isMobile\n ? process.env.REACT_APP_MAIN_BACKGROUND_COLOR\n : \"transparent\",\n height: \"100%\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n height: \"64px\",\n paddingTop: this.props.isMobile ? getNotchHeight(\"top\") : 0,\n paddingLeft: getNotchHeight(\"left\"),\n paddingRight: this.props.isMobile\n ? getNotchHeight(\"right\")\n : 0,\n }}\n >\n <div\n className={isMobile ? classes.mobileSearch : classes.search}\n style={{\n width: \"calc(100% - 32px)\",\n margin: \"14.5px auto\",\n maxWidth: \"352px\",\n }}\n >\n <div className={classes.searchIcon}>\n <SearchIcon\n style={{\n color: tinyColor(textOnMainBackgroundColor)\n .setAlpha(\n !collection ||\n (foldersEnabled\n ? collection.things &&\n !collection.things.length\n : collection.things &&\n collection.starredThings &&\n !collection.things.length &&\n !collection.starredThings.length)\n ? 0.54\n : 1\n )\n .toRgbString(),\n }}\n />\n </div>\n <InputBase\n placeholder={t`Search`}\n className=\"notSelectable\"\n classes={{\n root: classes.inputRoot,\n input: classes.input,\n }}\n value={this.props.searchText}\n onChange={(event) => {\n const {\n target: { value },\n } = event;\n\n this.props.searchThings(value);\n this.searchMore(value);\n }}\n disabled={\n !collection ||\n (foldersEnabled\n ? collection.things && !collection.things.length\n : collection.things &&\n collection.starredThings &&\n !collection.things.length &&\n !collection.starredThings.length)\n }\n />\n </div>\n </div>\n {sidebarContent}\n </div>\n </div>\n {collection && (\n <>\n <Zoom\n in={\n this.props.userData.user &&\n isRoleAtLeast(\n this.props.collectionData.collection.myRole,\n \"ADMIN\"\n ) &&\n (this.props.userData.user.emailIsVerified ||\n mergedArray.length === 0)\n }\n onEntered={() =>\n this.props.setFabWidth(\n document.getElementById(\"thingFab\").clientWidth\n )\n }\n >\n <Fab\n variant={\n this.state.greaterThan560 && this.props.isMobile\n ? \"extended\"\n : \"round\"\n }\n id=\"thingFab\"\n color=\"secondary\"\n style={\n this.props.isMobile\n ? this.props.snackbarOpen\n ? {\n position: \"absolute\",\n right:\n \"calc(16px + \" + getNotchHeight(\"right\") + \")\",\n bottom:\n \"calc(36px + env(safe-area-inset-bottom))\",\n transform: \"translate3d(0, -64px, 0)\",\n zIndex: 1200,\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n }\n : {\n position: \"absolute\",\n right:\n \"calc(16px + \" + getNotchHeight(\"right\") + \")\",\n bottom:\n \"calc(36px + env(safe-area-inset-bottom))\",\n zIndex: 1200,\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n }\n : this.state.lessThan1080\n ? {\n position: \"absolute\",\n left: \"calc(max(33vw, 300px) - 72px)\",\n bottom: \"calc(16px + env(safe-area-inset-bottom))\",\n zIndex: 1200,\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n }\n : {\n position: \"absolute\",\n left: \"288px\",\n bottom: \"calc(16px + env(safe-area-inset-bottom))\",\n zIndex: 1200,\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n }\n }\n onClick={() => this.setState({ addThingOpen: true })}\n >\n <Add\n style={\n this.state.greaterThan560 && this.props.isMobile\n ? {\n marginRight: \"8px\",\n }\n : {}\n }\n />\n {this.state.greaterThan560 &&\n this.props.isMobile &&\n t`Thing`}\n </Fab>\n </Zoom>\n <AddThing\n open={this.state.addThingOpen}\n close={() => this.setState({ addThingOpen: false })}\n userData={this.props.userData}\n collection={collection.id}\n client={this.props.client}\n />\n </>\n )}\n <Divider orientation=\"vertical\" />\n </>\n );\n }\n }\n )\n);\n","import { getNotchHeight, isRoleAtLeast } from \"@igloocloud/igloosharedui\";\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Typography from \"@mui/material/Typography\";\nimport { Component } from \"react\";\nimport { Link, Redirect } from \"react-router-dom\";\nimport tinyColor from \"tinycolor2\";\n\nexport default class SidebarHeader extends Component {\n state = {\n goToCollections: false,\n };\n\n componentDidMount() {\n if (!this.props.mobile && window.cordova) {\n if (tinyColor(process.env.REACT_APP_MAIN_COLOR).getBrightness() <= 128) {\n window.StatusBar.styleLightContent();\n } else {\n window.StatusBar.styleDefault();\n }\n }\n }\n\n render() {\n const { mobile, collectionName, myRole, fabWidth, emailIsVerified } =\n this.props;\n const {\n REACT_APP_MAIN_COLOR: mainColor,\n REACT_APP_LIGHT_COLOR: lightColor,\n REACT_APP_TEXT_ON_MAIN_COLOR: color,\n } = process.env;\n\n return (\n <div\n className=\"sidebarHeader notSelectable\"\n style={{\n color,\n display: \"flex\",\n alignItems: \"center\",\n gridArea: \"sidebarHeader\",\n backgroundColor: mainColor,\n zIndex: 1000,\n maxWidth: \"100vw\",\n height: \"64px\",\n paddingTop: mobile ? 0 : getNotchHeight(\"top\"),\n paddingLeft: getNotchHeight(\"left\"),\n paddingRight: getNotchHeight(\"right\"),\n paddingBottom: mobile ? \"env(safe-area-inset-bottom)\" : 0,\n }}\n >\n <Link\n to=\"\"\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <IconButton\n style={{\n color,\n marginLeft: \"8px\",\n }}\n onClick={() => this.setState({ goToCollections: true })}\n size=\"large\"\n >\n <ArrowBack />\n </IconButton>\n </Link>\n <Typography\n variant=\"h5\"\n style={{\n cursor: \"default\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n color,\n lineHeight: \"64px\",\n marginLeft: \"8px\",\n marginRight: \"8px\",\n width: mobile\n ? this.props.fabWidth\n ? \"calc(100% - \" + (this.props.fabWidth + 80) + \"px)\"\n : \"calc(100% - 136px)\"\n : \"calc(100% - 64px)\",\n }}\n >\n {\n (!emailIsVerified || !isRoleAtLeast(myRole, \"ADMIN\") || fabWidth) &&\n collectionName //waits for fab to appear\n }\n </Typography>\n {lightColor === mainColor && !mobile && (\n <div\n style={{\n width: \"2px\",\n height: \"48px\",\n backgroundColor: tinyColor(color).setAlpha(0.25).toRgbString(),\n borderRadius: \"1px\",\n }}\n />\n )}\n {this.state.goToCollections && <Redirect push to=\"/\" />}\n </div>\n );\n }\n}\n","export default __webpack_public_path__ + \"static/media/background-logo.e02054f7.svg\";","import { graphql } from \"@apollo/react-hoc\";\nimport { GenericDialog, isRoleAtLeast } from \"@igloocloud/igloosharedui\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport gql from \"graphql-tag\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\n\nexport default graphql(\n gql`\n mutation ChangeCollection($id: ID!, $collectionId: ID!) {\n moveThing(thingId: $id, newCollectionId: $collectionId) {\n id\n }\n }\n `,\n {\n name: \"ChangeCollection\",\n }\n)(\n withTranslation()(\n class ChangeCollection extends Component {\n state = { newCollection: \"\" };\n\n changeCollection = (value) => {\n this.props.ChangeCollection({\n variables: {\n id: this.props.thing.id,\n collectionId: value,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n thing: {\n __typename: this.props.thing.__typename,\n id: this.props.thing.id,\n collectionId: value,\n },\n },\n });\n };\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.thingCollection) {\n this.setState({\n newCollection: this.props.thingCollection,\n });\n }\n }\n\n render() {\n const { open, close, collections, t } = this.props;\n const { REACT_APP_THING_NAME: thingName } = process.env;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(`Move ${thingName ? thingName.toLowerCase() : \"thing\"}`)}\n textButton={t`Close`}\n textButtonFunction={close}\n >\n <RadioGroup\n onChange={(_, value) => {\n this.setState({ newCollection: value });\n this.changeCollection(value);\n }}\n value={this.state.newCollection}\n >\n {collections?.map((collection) => (\n <FormControlLabel\n control={<Radio color=\"primary\" />}\n value={collection.id}\n label={collection.name}\n className=\"notSelectable\"\n disabled={!isRoleAtLeast(collection.myRole, \"OWNER\")}\n key={collection.id}\n />\n ))}\n </RadioGroup>\n </GenericDialog>\n );\n }\n }\n )\n);\n","import { gql, useLazyQuery, useMutation } from \"@apollo/client\";\nimport { GenericDialog, isNullish } from \"@igloocloud/igloosharedui\";\nimport { DeleteOutlined } from \"@mui/icons-material\";\nimport {\n Button,\n Collapse,\n IconButton,\n MenuItem,\n TextField,\n Typography,\n} from \"@mui/material\";\nimport { styled } from \"@mui/system\";\nimport { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { TransitionGroup } from \"react-transition-group\";\nimport {\n Action,\n ActionType,\n Comparison,\n Condition,\n FloatComparison,\n IntervalUnit,\n Props,\n} from \"./FlowManifestDialog.types\";\nimport tinyColor from \"tinycolor2\";\n\nconst AndButton = styled(Button)({\n \"&.MuiButton-outlinedInherit\": {\n borderColor: tinyColor(process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR)\n .setAlpha(0.26)\n .toHex8String(),\n \"&:hover\": {\n borderColor: tinyColor(\n process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR\n )\n .setAlpha(0.87)\n .toHex8String(),\n },\n },\n});\n\nexport default ({ open, close, mode, thingId }: Props) => {\n const [name, setName] = useState<string>(\"\");\n const [nameEmpty, setNameEmpty] = useState<boolean>(false);\n const [conditions, setConditions] = useState<Condition[]>([\n { localId: Date.now() },\n ]);\n const [actions, setActions] = useState<Action[]>([{ localId: Date.now() }]);\n const [intervalDuration, setIntervalDuration] = useState<number>(null);\n const [intervalDurationEmpty, setIntervalDurationEmpty] =\n useState<boolean>(null);\n const [intervalUnit, setIntervalUnit] = useState<IntervalUnit>(\"hours\");\n\n const { t }: { t: (string) => string } = useTranslation();\n\n const [getVariables, { loading, error, data }] = useLazyQuery(\n gql`\n query ($id: ID!, $limit: NaturalNumber!, $offset: NaturalNumber) {\n thing(id: $id) {\n id\n variableCount\n variables(limit: $limit, offset: $offset, sortBy: index) {\n __typename\n id\n name\n ... on StringVariable {\n stringAllowedValues: allowedValues\n }\n ... on FloatVariable {\n floatAllowedValues: allowedValues\n min\n max\n }\n ... on FloatSeriesVariable {\n minThreshold\n maxThreshold\n visualization\n }\n }\n }\n }\n `,\n { variables: { id: thingId, limit: 20, offset: 0 } }\n );\n const [createFlow] = useMutation(gql`\n mutation createFlow(\n $thingId: ID!\n $name: String!\n $minInterval: Int!\n $manifest: Json!\n ) {\n updateCollection(\n id: $id\n developerOnly: false\n name: $name\n minInterval: $minInterval\n manifest: $manifest\n ) {\n id\n muted\n }\n }\n `);\n const [updateFlow] = useMutation(gql`\n mutation updateFlow(\n $thingId: ID!\n $name: String!\n $minInterval: Int!\n $manifest: Json!\n ) {\n updateCollection(\n id: $id\n developerOnly: false\n name: $name\n minInterval: $minInterval\n manifest: $manifest\n ) {\n id\n muted\n }\n }\n `);\n\n useEffect(() => {\n if (open) {\n setName(\"\");\n setNameEmpty(false);\n setConditions([{ localId: Date.now() }]);\n setActions([{ localId: Date.now() }]);\n setIntervalDuration(null);\n setIntervalDurationEmpty(false);\n setIntervalUnit(\"hours\");\n\n getVariables();\n }\n }, [open]);\n\n const {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnMainBackgroundColor,\n }: {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: string;\n } = process.env;\n\n return (\n <GenericDialog\n title={mode === \"create\" ? t`Create flow` : t`Edit flow`}\n open={open}\n close={close}\n containedButton={mode === \"create\" ? t`Create` : t`Edit`}\n containedButtonFunction={() =>\n mode === \"create\" ? createFlow() : updateFlow()\n }\n containedButtonDisabled={\n !name ||\n !conditions.find(\n ({ id, comparison, value }) =>\n data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ) &&\n (id &&\n (data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"BooleanVariable\" ||\n data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"FileVariable\")\n ? value\n : data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"ImpulseVariable\" ||\n (comparison && value))\n ) ||\n !actions.find(\n ({ type, content }) =>\n //TODO: add conditions for variable actions\n type && (type === \"sendNotification\" ? content : null)\n ) ||\n !intervalDuration\n }\n textButton={t`Close`}\n textButtonFunction={close}\n disableMaxHeight\n >\n <TextField\n value={name}\n onChange={(event) => {\n setName(event.target.value);\n setNameEmpty(event.target.value === \"\");\n }}\n error={nameEmpty}\n label={t`Name`}\n variant=\"outlined\"\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={name ? { shrink: true } : {}}\n />\n <TransitionGroup>\n {conditions.map(\n ({ id, comparison, value, valueEmpty, localId }, index) => (\n <Collapse key={\"condition-\" + localId}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n marginBottom: \"16px\",\n height: \"48px\",\n }}\n >\n <Typography\n variant=\"h6\"\n style={{\n width:\n conditions.length === 1 ? \"100%\" : \"calc(100% - 48px)\",\n margin: 0,\n }}\n >\n {index === 0 ? t`If` : t`And`}\n </Typography>\n {conditions.length === 1 ? null : (\n <IconButton\n onClick={() =>\n setConditions((conditions) =>\n conditions.filter(\n (_, indexToRemove) => indexToRemove !== index\n )\n )\n }\n size=\"large\"\n >\n <DeleteOutlined />\n </IconButton>\n )}\n </div>\n <TextField\n value={id}\n onChange={(event) => {\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].id = event.target.value;\n\n return newConditions;\n });\n }}\n label={t`Variable`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={id ? { shrink: true } : {}}\n >\n {data?.thing.variables.map(\n ({\n id,\n name,\n __typename,\n visualization,\n minThreshold,\n maxThreshold,\n }) => [\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value={id}\n key={\"create-flow-dialog-variable-list-\" + id}\n >\n {(__typename === \"FloatSeriesVariable\"\n ? t`The last node of` + \" \"\n : \"\") +\n name +\n \" \" +\n (__typename === \"ImpulseVariable\"\n ? t`triggers`\n : t`is`)}\n </MenuItem>,\n __typename === \"FloatSeriesVariable\" &&\n visualization !== \"windDirection\" &&\n (!isNullish(minThreshold) ||\n !isNullish(maxThreshold)) && (\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value={\"threshold-\" + id}\n key={\"create-flow-dialog-variable-list-\" + id}\n >\n {t`The last node of` +\n \" \" +\n name +\n \" \" +\n t`is outside the thresholds`}\n </MenuItem>\n ),\n ]\n )}\n </TextField>\n <Collapse key={\"condition-options-\" + localId} in={!!id}>\n {data?.thing.variables.find(\n ({ id }) => id === id.replace(\"threshold-\", \"\")\n ) &&\n (data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"FloatVariable\" ||\n (data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"FloatSeriesVariable\" &&\n !id.startsWith(\"threshold-\")) ? (\n <>\n <TextField\n value={comparison}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].comparison = event.target\n .value as FloatComparison;\n\n return newConditions;\n })\n }\n label={t`Operator`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"calc(100% - 160px)\",\n marginBottom: \"24px\",\n marginRight: \"16px\",\n }}\n InputLabelProps={comparison ? { shrink: true } : {}}\n >\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"equal\"\n key=\"equal\"\n >\n {t`Equal to`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"notEqual\"\n key=\"notEqual\"\n >\n {t`Not equal to`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"greaterThan\"\n key=\"greaterThan\"\n >\n {t`Greater than`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"greaterThanOrEqual\"\n key=\"greaterThanOrEqual\"\n >\n {t`Greater than or equal to`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"lessThan\"\n key=\"lessThan\"\n >\n {t`Less than`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"lessThanOrEqual\"\n key=\"lessThanOrEqual\"\n >\n {t`Less than or equal to`}\n </MenuItem>\n </TextField>\n <TextField\n label={t`Value`}\n type=\"number\"\n value={value}\n variant=\"outlined\"\n required\n error={valueEmpty}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n const conditionIndex: number =\n newConditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n );\n\n newConditions[conditionIndex].value =\n event.target.value;\n\n newConditions[conditionIndex].valueEmpty =\n event.target.value.replace(/\\s/g, \"\") === \"\";\n\n return newConditions;\n })\n }\n style={{\n width: \"144px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n />\n </>\n ) : id.startsWith(\"threshold-\") &&\n !isNullish(\n data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).minThreshold\n ) &&\n !isNullish(\n data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).maxThreshold\n ) ? (\n <TextField\n value={value}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n return newConditions;\n })\n }\n label={t`Threshold`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n >\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"minThreshold\"\n key={localId + \"-min-threshold\"}\n >\n {t`Lower`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"maxThreshold\"\n key={localId + \"-max-threshold\"}\n >\n {t`Upper`}\n </MenuItem>\n </TextField>\n ) : data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"StringVariable\" ? (\n <>\n <TextField\n value={comparison}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].comparison = event.target\n .value as FloatComparison;\n\n return conditions;\n })\n }\n label={t`Operator`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"144px\",\n marginBottom: \"24px\",\n marginRight: \"16px\",\n }}\n InputLabelProps={comparison ? { shrink: true } : {}}\n >\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"equal\"\n key=\"equal\"\n >\n {t`Equal to`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"notEqual\"\n key=\"notEqual\"\n >\n {t`Not equal to`}\n </MenuItem>\n </TextField>\n <TextField\n label={t`Value`}\n value={value}\n variant=\"outlined\"\n required\n error={valueEmpty}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n const conditionIndex: number =\n newConditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n );\n\n newConditions[conditionIndex].value =\n event.target.value;\n\n newConditions[conditionIndex].valueEmpty =\n event.target.value.replace(/\\s/g, \"\") === \"\";\n\n return newConditions;\n })\n }\n style={{\n width: \"calc(100% - 160px)\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n />\n </>\n ) : data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"BooleanVariable\" ? (\n <TextField\n value={value}\n onChange={(event) => {\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n return newConditions;\n });\n }}\n label={t`Value`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n >\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"isTrue\"\n key=\"isTrue\"\n >\n {t`True`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"isFalse\"\n key=\"isFalse\"\n >\n {t`False`}\n </MenuItem>\n </TextField>\n ) : data?.thing.variables.find(\n ({ id }) => id === id?.replace(\"threshold-\", \"\")\n ).__typename === \"FileVariable\" ? (\n <TextField\n value={value}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n return newConditions;\n })\n }\n label={t`Value`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n >\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"isEmpty\"\n key=\"isEmpty\"\n >\n {t`Empty`}\n </MenuItem>\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value=\"isNotEmpty\"\n key=\"isNotEmpty\"\n >\n {t`Not empty`}\n </MenuItem>\n </TextField>\n ) : null)}\n </Collapse>\n </Collapse>\n )\n )}\n <AndButton\n color=\"inherit\"\n variant=\"outlined\"\n fullWidth\n onClick={() =>\n setConditions((conditions) => [\n ...conditions,\n { localId: Date.now() },\n ])\n }\n style={{ marginBottom: \"16px\" }}\n >\n {t`And` + \"...\"}\n </AndButton>\n {actions.map(\n (\n { localId, type, content, contentEmpty, value, valueEmpty },\n index\n ) => (\n <Collapse key={\"action-\" + localId}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n marginBottom: \"16px\",\n height: \"48px\",\n }}\n >\n <Typography\n variant=\"h6\"\n style={{\n width:\n conditions.length === 1 ? \"100%\" : \"calc(100% - 48px)\",\n margin: 0,\n }}\n >\n {index === 0 ? t`Then` : t`And`}\n </Typography>\n {actions.length === 1 ? null : (\n <IconButton\n onClick={() =>\n setActions((actions) =>\n actions.filter(\n (_, indexToRemove) => indexToRemove !== index\n )\n )\n }\n size=\"large\"\n >\n <DeleteOutlined />\n </IconButton>\n )}\n </div>\n <TextField\n value={type}\n onChange={(event) =>\n setActions((actions) => {\n const newActions = actions;\n\n newActions[\n actions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].type = event.target.value as ActionType;\n\n return newActions;\n })\n }\n label={t`Type`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={type ? { shrink: true } : {}}\n >\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"notification\"\n key={\"create-flow-dialog-action-list-notification\"}\n >\n {t`Send a notification`}\n </MenuItem>\n {data?.thing.variables.map(({ id, name, __typename }) => [\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value={\"update-\" + id}\n key={\"create-flow-dialog-action-list-update-\" + id}\n >\n {t`Set` + \" \" + name + \" \" + t`to`}\n </MenuItem>,\n __typename === \"FloatVariable\" ? (\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value={\"increment-\" + id}\n key={\"create-flow-dialog-action-list-increment-\" + id}\n >\n {t`Increase` + \" \" + name}\n </MenuItem>\n ) : (\n __typename === \"BooleanVariable\" && (\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value={\"negate-\" + id}\n key={\"create-flow-dialog-action-list-negate-\" + id}\n >\n {t`Negate` + \" \" + name}\n </MenuItem>\n )\n ),\n ])}\n </TextField>\n <Collapse\n key={\"action-options-\" + localId}\n in={type && !type.startsWith(\"negate-\")}\n >\n {type === \"sendNotification\" ? (\n <TextField\n key={\"action-notification-text-\" + localId}\n value={content}\n onChange={(event) =>\n setActions((actions) => {\n const newActions = actions;\n\n newActions[\n actions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].content = event.target.value;\n\n newActions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].contentEmpty =\n event.target.value.replace(/\\s/g, \"\") === \"\";\n\n return newActions;\n })\n }\n error={contentEmpty}\n label={t`Text`}\n variant=\"outlined\"\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={content ? { shrink: true } : {}}\n />\n ) : data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.__typename === \"BooleanVariable\" ? (\n <TextField\n key={\"action-boolean-value-\" + localId}\n value={value}\n onChange={(event) =>\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n return newConditions;\n })\n }\n label={t`Value`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n >\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"isTrue\"\n key=\"isTrue\"\n >\n {t`True`}\n </MenuItem>\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"isFalse\"\n key=\"isFalse\"\n >\n {t`False`}\n </MenuItem>\n </TextField>\n ) : data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.stringAllowedValues ||\n data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.floatAllowedValues ? (\n <TextField\n key={\"action-allowed-values-\" + localId}\n value={value}\n onChange={(event) => {\n setConditions((conditions) => {\n const newConditions = conditions;\n\n newConditions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n return newConditions;\n });\n }}\n label={t`Value`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n >\n {(\n data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.stringAllowedValues ||\n data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.floatAllowedValues\n ).map((value) => (\n <MenuItem\n style={{\n color: textOnMainBackgroundColor,\n }}\n value={value}\n key={\"action-allowed-values-\" + localId + \"-\" + value}\n >\n {value}\n </MenuItem>\n ))}\n </TextField>\n ) : data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind === type?.substring(type.indexOf(\"-\") + 1)\n )?.__typename === \"FloatVariable\" ? (\n <TextField\n key={\"action-float-value-\" + localId}\n label={t`Value`}\n type=\"number\"\n value={value}\n variant=\"outlined\"\n required\n error={valueEmpty}\n onChange={(event) =>\n setActions((actions) => {\n const { min, max }: { min: number; max: number } =\n data?.thing.variables.find(\n ({ id: idToFind }) =>\n idToFind ===\n type?.substring(type.indexOf(\"-\") + 1)\n );\n const newActions = actions;\n\n newActions[\n newActions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n newActions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].valueEmpty =\n event.target.value.replace(/\\s/g, \"\") === \"\" ||\n (type.startsWith(\"update-\") &&\n max &&\n parseFloat(event.target.value) > max) ||\n (min && parseFloat(event.target.value) < min);\n\n return newActions;\n })\n }\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n />\n ) : (\n <TextField\n key={\"action-float-value-\" + localId}\n label={t`Value`}\n type=\"text\"\n value={value}\n variant=\"outlined\"\n required\n error={valueEmpty}\n onChange={(event) =>\n setActions((actions) => {\n const newActions = actions;\n\n newActions[\n newActions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].value = event.target.value;\n\n newActions[\n conditions.findIndex(\n ({ localId: idToFind }) => idToFind === localId\n )\n ].valueEmpty =\n event.target.value.replace(/\\s/g, \"\") === \"\";\n\n return newActions;\n })\n }\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n InputLabelProps={value ? { shrink: true } : {}}\n />\n )}\n </Collapse>\n </Collapse>\n )\n )}\n <AndButton\n color=\"inherit\"\n variant=\"outlined\"\n fullWidth\n onClick={() =>\n setActions((actions) => [...actions, { localId: Date.now() }])\n }\n style={{ marginBottom: \"16px\" }}\n >\n {t`And` + \"...\"}\n </AndButton>\n </TransitionGroup>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n marginBottom: \"16px\",\n height: \"48px\",\n }}\n >\n <Typography\n variant=\"h6\"\n style={{\n width: conditions.length === 1 ? \"100%\" : \"calc(100% - 48px)\",\n margin: 0,\n }}\n >\n {t`At most every`}\n </Typography>\n </div>\n <TextField\n label={t`Duration`}\n type=\"number\"\n value={intervalDuration}\n variant=\"outlined\"\n required\n error={intervalDurationEmpty}\n onChange={(event) => {\n setIntervalDuration(parseFloat(event.target.value));\n setIntervalDurationEmpty(\n event.target.value.replace(/\\s/g, \"\") === \"\"\n );\n }}\n style={{\n width: \"calc(50% - 8px)\",\n }}\n InputLabelProps={intervalDuration ? { shrink: true } : {}}\n />\n <TextField\n value={intervalUnit}\n onChange={(event) =>\n setIntervalUnit(event.target.value as IntervalUnit)\n }\n label={t`Unit`}\n variant=\"outlined\"\n select\n required\n style={{\n width: \"calc(50% - 8px)\",\n marginLeft: \"16px\",\n marginBottom: \"16px\",\n }}\n InputLabelProps={intervalUnit ? { shrink: true } : {}}\n >\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"minutes\"\n key=\"interval-unit-minutes\"\n >\n {t`Minutes`}\n </MenuItem>\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"hours\"\n key=\"interval-unit-hours\"\n >\n {t`Hours`}\n </MenuItem>\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"days\"\n key=\"interval-unit-days\"\n >\n {t`Days`}\n </MenuItem>\n <MenuItem\n style={{ color: textOnMainBackgroundColor }}\n value=\"months\"\n key=\"interval-unit-months\"\n >\n {t`Months`}\n </MenuItem>\n </TextField>\n </GenericDialog>\n );\n};\n","import { graphql } from \"@apollo/react-hoc\";\nimport {\n CenteredSpinner,\n ErrorScreen,\n generateNaturalLanguageList,\n GenericDialog,\n getNotchHeight,\n isNullish,\n} from \"@igloocloud/igloosharedui\";\nimport Add from \"@mui/icons-material/Add\";\nimport Create from \"@mui/icons-material/Create\";\nimport Delete from \"@mui/icons-material/Delete\";\nimport MoreVert from \"@mui/icons-material/MoreVert\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport IconButton from \"@mui/material/IconButton\";\nimport LinearProgress from \"@mui/material/LinearProgress\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Typography from \"@mui/material/Typography\";\nimport gql from \"graphql-tag\";\nimport { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport tinyColor from \"tinycolor2\";\nimport FlowManifestDialog from \"./FlowManifestDialog\";\n\nconst flows = [\n {\n id: \"12345678-abcd-1234-abcd-1234567890ab\",\n name: \"Superamento potenza contrattuale\",\n conditions: [\n {\n variable: {\n id: \"f9476c22-cad8-4715-9cc9-02b520624274\",\n name: \"Pulsante\",\n __typename: \"ImpulseVariable\",\n },\n },\n ],\n actions: [{ type: \"notification\", text: \"Potenza sopra soglia\" }],\n },\n];\n\nexport default withTranslation()(\n graphql(\n gql`\n query ($limit: NaturalNumber!, $offset: NaturalNumber, $id: ID!) {\n thing(id: $id) {\n id\n flowCount\n flows(limit: $limit, offset: $offset) {\n id\n name\n }\n }\n }\n `,\n {\n name: \"thingData\",\n options: ({ id }) => ({\n variables: {\n offset: 0,\n limit: 20,\n id,\n },\n }),\n }\n )(\n class FlowsDialog extends Component {\n state = {\n fetchMoreLoading: false,\n createFlowOpen: false,\n createFlowMode: null,\n deleteFlowOpen: false,\n anchorEl: null,\n showDeleteLoading: false,\n };\n\n handleBackButton = () => {\n if (this.state.backStackIndex === window.backStack) {\n this.handleMenuClose();\n }\n };\n\n handleMenuClose = () => {\n this.setState({ anchorEl: null });\n\n if (window.cordova) {\n this.setState({ backStackIndex: 0 });\n\n --window.backStack;\n\n document.removeEventListener(\"backbutton\", this.handleBackButton);\n }\n };\n\n queryMore = () => {\n //TODO: add lazy loading\n };\n\n deleteFlow = async (id) => {\n try {\n this.setState({ showDeleteLoading: true });\n\n //TODO: add mutation\n } finally {\n this.setState({ showDeleteLoading: false });\n }\n };\n\n render() {\n const { open, close, t, fullScreen, thingData } = this.props;\n const {\n fetchMoreLoading,\n createFlowOpen,\n createFlowMode,\n deleteFlowOpen,\n anchorEl,\n selectedFlow,\n showDeleteLoading,\n } = this.state;\n const {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnBackgroundColor,\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_ERROR_COLOR: errorColor,\n } = process.env;\n\n const listItemStyle = {\n paddingLeft:\n \"calc(16px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(16px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n minHeight: \"48px\", //makes ListItem as tall as IconButton to solve scrolling issues\n };\n\n return (\n <>\n <GenericDialog\n title={t`Manage flows`}\n open={open && !createFlowOpen && !deleteFlowOpen}\n close={close}\n textButton={t`Close`}\n textButtonFunction={close}\n noHorizontalPadding\n noDialogContent\n maxWidth=\"sm\"\n >\n {thingData.error ? (\n <ErrorScreen\n refetch={() =>\n thingData.refetch({\n variables: { offset: 0, limit: 20 },\n })\n }\n error={thingData.error}\n />\n ) : thingData.loading ? (\n <DialogContent style={{ padding: 0, height: \"100%\" }}>\n <CenteredSpinner style={{ padding: \"8px 0\" }} />\n </DialogContent>\n ) : (\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore();\n }}\n >\n <List\n style={{\n width: \"100%\",\n textOverflow: \"ellipsis\",\n padding: 0,\n }}\n >\n <ListItem\n button\n style={listItemStyle}\n onClick={() =>\n this.setState({\n createFlowOpen: true,\n createFlowMode: \"create\",\n intervalDuration: null,\n intervalUnit: \"minutes\",\n conditions: [{ localId: Date.now() }],\n actions: [{ localId: Date.now() }],\n })\n }\n >\n <ListItemIcon>\n <Add />\n </ListItemIcon>\n <ListItemText\n primary={\n <font\n style={{ color: textColor }}\n >{t`New flow`}</font>\n }\n />\n </ListItem>\n {flows.map((flow) => (\n <ListItem\n key={\"flows-dialog-list-\" + flow.id}\n style={listItemStyle}\n >\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {flow.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textColor)\n .setAlpha(0.54)\n .toRgbString(),\n whiteSpace: \"normal\",\n }}\n >\n {t`If` +\n \" \" +\n generateNaturalLanguageList(\n flow.conditions.map(\n ({ variable, operator, value }) =>\n (variable.__typename ===\n \"FloatSeriesVariable\"\n ? t(\"The last node of\").toLowerCase() +\n \" \"\n : \"\") +\n variable.name.toLowerCase() +\n \" \" +\n (variable.__typename === \"ImpulseVariable\"\n ? t`triggers`\n : variable.__typename ===\n \"FloatSeriesVariable\" &&\n operator === \"threshold\"\n ? value === \"upper\"\n ? t`is over the upper threshold`\n : value === \"lower\"\n ? t`is under the lower threshold`\n : t`is outside the thresholds`\n : variable.__typename === \"FileVariable\"\n ? operator === \"isEmpty\"\n ? t`is empty`\n : t`is not empty`\n : (variable.__typename ===\n \"BooleanVariable\"\n ? t`is`\n : operator === \"equalTo\"\n ? t`is equal to`\n : operator === \"greaterThan\"\n ? t`is greater than`\n : operator ===\n \"greaterThanOrEqualTo\"\n ? t`is greater than or equal to`\n : operator === \"lessThan\"\n ? t`is less than`\n : operator === \"lessThanOrEqualTo\"\n ? t`is less than or equal to`\n : operator === \"includes\"\n ? `includes`\n : t`is not equal to`) +\n \" \" +\n (variable.__typename ===\n \"BooleanVariable\"\n ? value\n ? t`true`\n : t`false`\n : value))\n ),\n t\n ) +\n t`, then` +\n \" \" +\n generateNaturalLanguageList(\n flow.actions\n .map(({ type, text, variable, value }) =>\n type === \"notification\"\n ? t`send notification` + ` \"${text}\"`\n : type === \"update\"\n ? t`set` +\n \" \" +\n variable.name.toLowerCase() +\n \" \" +\n t`to` +\n \" \" +\n value\n : type === \"increment\"\n ? (value >= 0\n ? t`decrease`\n : t`increase`) +\n \" \" +\n variable.name.toLowerCase() +\n \" \" +\n t`by` +\n \" \" +\n Math.abs(value)\n : type === \"negate\"\n ? t`negate` +\n \" \" +\n variable.name.toLowerCase()\n : null\n )\n .filter((action) => !isNullish(action)),\n t\n )}\n </font>\n }\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n marginRight: \"48px\",\n }}\n inset\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) =>\n this.setState({\n anchorEl: event.currentTarget,\n selectedFlow: flow,\n })\n }\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n ))}\n </List>\n {fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n )}\n </GenericDialog>\n\n <GenericDialog\n open={deleteFlowOpen}\n close={() => this.setState({ deleteFlowOpen: false })}\n title={t`Delete flow`}\n textButton={t`Close`}\n textButtonFunction={() =>\n this.setState({ deleteFlowOpen: false })\n }\n containedButton={t`Delete`}\n containedButtonFunction={() => this.deleteFlow(selectedFlow.id)}\n containedButtonLoading={showDeleteLoading}\n containedButtonDisabled={showDeleteLoading}\n isContainedButtonRed\n >\n {t`Be careful, this flow will be deleted permanently`}.\n </GenericDialog>\n <Menu\n anchorEl={anchorEl}\n open={anchorEl}\n onClose={() => this.handleMenuClose()}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n style: {\n backgroundColor,\n },\n }}\n TransitionProps={{\n onEnter: () => {\n if (window.cordova) {\n this.setState({ backStackIndex: ++window.backStack });\n\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton\n );\n }\n },\n }}\n >\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({\n createFlowOpen: true,\n createFlowMode: \"edit\",\n intervalDuration: null,\n intervalUnit: \"minutes\",\n conditions: [{ localId: Date.now() }],\n actions: [{ localId: Date.now() }],\n });\n }}\n >\n <ListItemIcon>\n <Create />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Edit`}\n </Typography>\n </MenuItem>\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ deleteFlowOpen: true });\n }}\n >\n <ListItemIcon>\n <Delete style={{ color: errorColor }} />\n </ListItemIcon>\n <Typography\n variant=\"inherit\"\n noWrap\n style={{ color: errorColor }}\n >\n {t`Delete`}\n </Typography>\n </MenuItem>\n </Menu>\n <FlowManifestDialog\n mode={createFlowMode}\n open={createFlowOpen}\n close={() => this.setState({ createFlowOpen: false })}\n thingId={thingData.thing?.id}\n />\n </>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport LinearProgress from \"@mui/material/LinearProgress\";\nimport TextField from \"@mui/material/TextField\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport IconButton from \"@mui/material/IconButton\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport CreateNewFolder from \"@mui/icons-material/CreateNewFolder\";\nimport Folder from \"@mui/icons-material/Folder\";\nimport { GenericDialog, getNotchHeight } from \"@igloocloud/igloosharedui\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\n\nconst groups = [\"Room 1\", \"Room 2\"];\n\nexport default graphql(\n gql`\n mutation assignGroup($id: ID!, $group: String) {\n updateThing(id: $id, group: $group) {\n id\n group\n }\n }\n `\n)(\n withTranslation()(\n class GroupDialog extends Component {\n state = {\n fetchMoreLoading: false,\n createGroupOpen: false,\n showLoading: false,\n group: \"\",\n groupEmpty: null,\n groupError: null,\n };\n\n assignGroup = async (id, group) => {\n const { mutate } = this.props;\n this.setState({ showLoading: true });\n\n try {\n await mutate({\n variables: {\n id,\n group,\n },\n optimisticResponse: {\n __typegroup: \"Mutation\",\n collection: {\n __typename: \"thing\",\n id,\n group,\n },\n },\n });\n\n this.setState({ createGroupOpen: false });\n } catch (e) {\n this.setState({ groupError: \"Error\" });\n } finally {\n this.setState({ showLoading: false });\n }\n };\n\n render() {\n const { open, close, t, thingGroup, fullScreen, id } = this.props;\n const {\n fetchMoreLoading,\n createGroupOpen,\n group,\n groupEmpty,\n groupError,\n showLoading,\n } = this.state;\n const { REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor } =\n process.env;\n\n const listItemStyle = {\n paddingLeft:\n \"calc(16px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(16px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n };\n\n return (\n <>\n <GenericDialog\n title={thingGroup ? t`Change group` : t`Add to a group`}\n open={open && !createGroupOpen}\n close={close}\n textButton={t`Close`}\n textButtonFunction={close}\n noHorizontalPadding\n noDialogContent\n >\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore();\n }}\n >\n <List\n style={{\n width: \"100%\",\n textOverflow: \"ellipsis\",\n padding: 0,\n }}\n >\n <ListItem\n button\n style={listItemStyle}\n onClick={() =>\n this.setState({\n createGroupOpen: true,\n group: \"\",\n groupEmpty: null,\n groupError: null,\n })\n }\n >\n <ListItemIcon>\n <CreateNewFolder />\n </ListItemIcon>\n <ListItemText\n primary={\n <font style={{ color: textColor }}>{t`New group`}</font>\n }\n />\n </ListItem>\n <ListItem\n style={listItemStyle}\n button\n selected={!thingGroup}\n onClick={() => this.assignGroup(id, \"\")}\n >\n <ListItemIcon>\n <SvgIcon>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n <path d=\"M10,4L12,6H20A2,2 0 0,1 22,8V18A2,2 0 0,1 20,20H4C2.89,20 2,19.1 2,18V6C2,4.89 2.89,4 4,4H10M12.46,10.88L14.59,13L12.46,15.12L13.88,16.54L16,14.41L18.12,16.54L19.54,15.12L17.41,13L19.54,10.88L18.12,9.46L16,11.59L13.88,9.46L12.46,10.88Z\" />\n </svg>\n </SvgIcon>\n </ListItemIcon>\n <ListItemText\n primary={\n <font style={{ color: textColor }}>{t`No group`}</font>\n }\n />\n </ListItem>\n {groups.map((group) => (\n <ListItem\n key={\"group-dialog-list-\" + group}\n style={listItemStyle}\n button\n selected={group === thingGroup}\n onClick={() => this.assignGroup(id, group)}\n >\n <ListItemIcon>\n <Folder />\n </ListItemIcon>\n <ListItemText\n primary={\n <font style={{ color: textColor }}>{group}</font>\n }\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n marginRight: \"16px\",\n }}\n />\n </ListItem>\n ))}\n </List>\n {fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n </GenericDialog>\n <GenericDialog\n title={t`Create group`}\n open={createGroupOpen}\n close={() => this.setState({ createGroupOpen: false })}\n containedButtonDisabled={!group || showLoading}\n containedButton={t`Create`}\n containedButtonFunction={() => this.assignGroup(id, group)}\n containedButtonLoading={showLoading}\n textButton={t`Close`}\n textButtonFunction={() =>\n this.setState({ createGroupOpen: false })\n }\n >\n <TextField\n label={t`Group`}\n value={group}\n variant=\"outlined\"\n error={groupEmpty || groupError || group.length > 256}\n helperText={\n group.length > 256\n ? t`Use fewer characters`\n : groupEmpty\n ? t`This field is required`\n : groupError || \" \"\n }\n onChange={(event) =>\n this.setState({\n group: event.target.value,\n groupEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n groupError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (event.key === \"Enter\" && group && group.length <= 256)\n this.assignGroup(id, group);\n }}\n style={{\n width: \"100%\",\n marginBottom: \"16px\",\n }}\n InputLabelProps={group ? { shrink: true } : {}}\n InputProps={{\n endAdornment: group && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n group: \"\",\n groupEmpty: true,\n groupError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n </>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\";\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\";\nimport { createTheme, adaptV4Theme } from \"@mui/material/styles\";\n\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport {\n GenericDialog,\n ErrorScreen,\n CenteredSpinner,\n getNotchHeight,\n} from \"@igloocloud/igloosharedui\";\nimport LinearProgress from \"@mui/material/LinearProgress\";\nimport IsOnline from \"is-online-component\";\nimport gql from \"graphql-tag\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport { withTranslation } from \"react-i18next\";\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\";\n\nconst VARIABLE_LIMIT = 20;\n\nconst {\n REACT_APP_LIGHT_COLOR: lightColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n} = process.env;\n\nlet dialogContent = null;\n\nexport default withTranslation()(\n class ManageCards extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n hasReceivedOpen: false,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.open !== this.props.open && nextProps.open) {\n this.setState({ hasReceivedOpen: true });\n }\n }\n\n render() {\n const { open, close, t } = this.props;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t`Choose which cards to see`}\n textButton={t`Close`}\n textButtonFunction={close}\n noHorizontalPadding\n noDialogContent\n >\n {this.state.hasReceivedOpen && <ManageCardsContent {...this.props} />}\n </GenericDialog>\n );\n }\n }\n);\n\nconst ManageCardsContent = graphql(\n gql`\n mutation ChangeVisibility($id: ID!, $hidden: Boolean) {\n updateVariable(id: $id, hidden: $hidden) {\n id\n hidden\n }\n }\n `,\n {\n name: \"ChangeVisibility\",\n }\n)(\n graphql(\n gql`\n query ($limit: NaturalNumber!, $offset: NaturalNumber, $id: ID!) {\n thing(id: $id) {\n id\n variableCount\n variables(limit: $limit, offset: $offset, sortBy: index) {\n id\n index\n hidden\n name\n thing {\n id\n }\n }\n }\n }\n `,\n {\n name: \"thingData\",\n options: ({ id }) => ({\n variables: { offset: 0, limit: VARIABLE_LIMIT, id },\n }),\n }\n )(\n class ManageCardsDialogContent extends Component {\n constructor(props) {\n super(props);\n\n this.state = { fetchMoreLoading: false };\n }\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.thingData.thing.variableCount >\n this.props.thingData.thing.variables.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.thingData.fetchMore({\n variables: {\n offset: this.props.thingData.thing.variables.length,\n limit:\n this.props.thingData.thing.variableCount -\n this.props.thingData.thing.variables.length >=\n 20\n ? 20\n : this.props.thingData.thing.variableCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newVariables = [\n ...prev.thing.variables,\n ...fetchMoreResult.thing.variables,\n ].sort((a, b) =>\n a.index > b.index ? 1 : a.index < b.index ? -1 : 0\n );\n\n return {\n thing: {\n ...prev.thing,\n variables: newVariables,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n }\n };\n\n changeVisibilityMutation = (variable) => {\n this.props.ChangeVisibility({\n variables: {\n id: variable.id,\n hidden: !variable.hidden,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n variable: {\n __typename: variable.__typename,\n id: variable.id,\n hidden: !variable.hidden,\n },\n },\n });\n };\n\n componentDidMount() {\n this.props.thingData.refetch();\n\n this.props.thingData.subscribeToMore({\n document: gql`\n subscription ($thingId: ID) {\n variableCreated(thingId: $thingId) {\n id\n index\n hidden\n name\n thing {\n id\n }\n }\n }\n `,\n variables: {\n thingId: this.props.id,\n },\n updateQuery: (prev, { subscriptionData }) => {\n if (\n !subscriptionData.data ||\n subscriptionData.data.variableCreated.thing.id !== prev.thing.id\n ) {\n return prev;\n }\n\n const newVariables = [\n ...prev.thing.variables,\n subscriptionData.data.variableCreated,\n ].sort((a, b) =>\n a.index > b.index ? 1 : a.index === b.index ? 0 : -1\n );\n\n return {\n thing: {\n ...prev.thing,\n variables: newVariables,\n },\n };\n },\n });\n\n this.props.thingData.subscribeToMore({\n document: gql`\n subscription ($thingId: ID) {\n variableUpdated(thingId: $thingId) {\n id\n index\n hidden\n name\n thing {\n id\n }\n }\n }\n `,\n variables: {\n thingId: this.props.id,\n },\n updateQuery: (prev, { subscriptionData }) => {\n if (\n !subscriptionData.data ||\n subscriptionData.data.variableUpdated.thing.id !== prev.thing.id\n ) {\n return prev;\n }\n\n const newVariables = [\n ...prev.thing.variables.filter(\n (variable) =>\n variable.id !== subscriptionData.data.variableUpdated.id\n ),\n subscriptionData.data.variableUpdated,\n ].sort((a, b) =>\n a.index > b.index ? 1 : a.index === b.index ? 0 : -1\n );\n\n return {\n thing: {\n ...prev.thing,\n variables: newVariables,\n },\n };\n },\n });\n\n this.props.thingData.subscribeToMore({\n document: gql`\n subscription ($thingId: ID) {\n variableDeleted(thingId: $thingId)\n }\n `,\n variables: {\n thingId: this.props.id,\n },\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newVariables = prev.thing.variables.filter(\n (variable) =>\n variable.id !== subscriptionData.data.variableDeleted\n );\n\n return {\n thing: {\n ...prev.thing,\n variables: newVariables,\n },\n };\n },\n });\n\n this.props.thingData.subscribeToMore({\n document: gql`\n subscription ($id: ID, $limit: NaturalNumber!) {\n thingUpdated(id: $id) {\n id\n variables(limit: $limit) {\n id\n index\n hidden\n name\n thing {\n id\n }\n }\n }\n }\n `,\n variables: {\n id: this.props.id,\n limit:\n this.props.thingData.thing?.variables.length || VARIABLE_LIMIT,\n },\n updateQuery: (prev, { subscriptionData }) => ({\n thing: {\n ...prev.thing,\n variables: subscriptionData.data.thingUpdated.variables.sort(\n (a, b) => (a.index > b.index ? 1 : a.index < b.index ? -1 : 0)\n ),\n },\n }),\n });\n }\n\n render() {\n const {\n thingData: { loading, error, thing, refetch, id },\n fullScreen,\n } = this.props;\n\n if (loading)\n dialogContent = (\n <div\n style={{\n height: \"100%\",\n marginLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n marginRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n >\n <CenteredSpinner />\n </div>\n );\n\n if (error)\n dialogContent = (\n <div\n style={{\n height: \"100%\",\n marginLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n marginRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n >\n <ErrorScreen\n refetch={() =>\n refetch({\n variables: { offset: 0, limit: 20, id },\n })\n }\n error={error}\n />\n </div>\n );\n\n if (thing)\n dialogContent = (\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore();\n }}\n >\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.thingData.refetch();\n }\n }}\n />\n <List style={{ height: \"100%\", padding: \"0\" }}>\n {thing.variables.map((variable) => (\n <ListItem\n key={variable.id}\n button\n style={{\n cursor: \"pointer\",\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n onClick={() => this.changeVisibilityMutation(variable)}\n >\n <ListItemIcon>\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={createTheme(\n adaptV4Theme({\n overrides: {\n MuiIconButton: {\n colorPrimary: {\n \"&:hover\": {\n backgroundColor: \"transparent\",\n },\n },\n },\n MuiCheckbox: {\n colorPrimary: {\n \"&$checked\": {\n color: lightContrastColor || lightColor,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n },\n },\n },\n },\n },\n })\n )}\n >\n <Checkbox\n color=\"primary\"\n tabIndex={-1}\n disableRipple\n checked={!variable.hidden}\n />\n </ThemeProvider>\n </StyledEngineProvider>\n </ListItemIcon>\n <ListItemText\n primary={variable.name}\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor: \"pointer\",\n }}\n />\n </ListItem>\n ))}\n </List>\n {this.state.fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n );\n\n return dialogContent;\n }\n }\n )\n);\n","import React, { Component } from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport Clear from \"@mui/icons-material/Clear\"\nimport TextField from \"@mui/material/TextField\"\nimport InputAdornment from \"@mui/material/InputAdornment\"\nimport IconButton from \"@mui/material/IconButton\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { withTranslation } from \"react-i18next\"\n\nexport default graphql(\n gql`\n mutation Rename($id: ID!, $name: String) {\n updateThing(id: $id, name: $name) {\n id\n name\n }\n }\n `,\n {\n name: \"Rename\",\n }\n)(\n withTranslation()(\n class RenameThing extends Component {\n state = { name: \"\", nameEmpty: false, loading: false }\n\n rename = async () => {\n this.setState({ loading: true })\n\n await this.props.Rename({\n variables: {\n id: this.props.thing.id,\n name: this.state.name,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n thing: {\n __typename: this.props.thing.__typename,\n id: this.props.thing.id,\n name: this.state.name,\n },\n },\n })\n\n this.props.close()\n\n this.setState({ loading: false })\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.open && !this.props.open) {\n this.setState({ name: this.props.thing.name, nameEmpty: \"\" })\n }\n }\n\n render() {\n const { open, close, t } = this.props\n const { loading } = this.state\n const { REACT_APP_THING_NAME: thingName } = process.env\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(`Rename ${thingName?.toLowerCase() || \"thing\"}`)}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Rename`}\n containedButtonDisabled={\n !this.state.name.replace(/\\s/g, \"\").length || loading\n }\n containedButtonFunction={this.rename}\n containedButtonLoading={loading}\n >\n <TextField\n id=\"rename-thing\"\n label={t`Name`}\n value={this.state.name}\n variant=\"outlined\"\n error={this.state.nameEmpty || this.state.name.length > 256}\n helperText={\n this.state.name.length > 256\n ? t`Too long`\n : this.state.nameEmpty\n ? t`This field is required`\n : \" \"\n }\n onChange={(event) =>\n this.setState({\n name: event.target.value,\n nameEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n })\n }\n onKeyPress={(event) => {\n if (event.key === \"Enter\" && !this.state.nameEmpty)\n this.rename()\n }}\n style={{\n width: \"100%\",\n }}\n InputLabelProps={this.state.name ? { shrink: true } : {}}\n InputProps={{\n endAdornment: this.state.name && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({ name: \"\", nameEmpty: true })\n }\n tabIndex=\"-1\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n )\n }\n }\n )\n)\n","import React from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport moment from \"moment\"\nimport Moment from \"react-moment\"\nimport { withTranslation } from \"react-i18next\"\n\nconst { REACT_APP_THING_NAME: thingName } = process.env\n\nexport default withTranslation()(({ open, close, thing, t }) => (\n <GenericDialog\n open={open}\n close={close}\n title={t(`${thingName || \"Thing\"} information`)}\n textButton={t`Close`}\n textButtonFunction={close}\n selectable\n typographyStyle={{ overflowX: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n <b>{t`Type` + \": \"}</b>\n {thing.type}\n {thing.firmware && (\n <>\n <br />\n <b>{t`Firmware` + \": \"}</b>\n {thing.firmware}\n </>\n )}\n <br />\n <b>{t`Created` + \": \"}</b>\n <Moment fromNow>\n {moment.utc(thing.createdAt.split(\".\")[0], \"YYYY-MM-DDTh:mm:ss\")}\n </Moment>\n <br />\n <b>{t`Last seen` + \": \"}</b>\n {thing.online ? (\n t`now`\n ) : (\n <Moment fromNow>\n {moment.utc(thing.updatedAt.split(\".\")[0], \"YYYY-MM-DDTh:mm:ss\")}\n </Moment>\n )}\n <br />\n <b>{t`ID` + \": \"}</b> {thing.id}\n </GenericDialog>\n))\n","import React, { useState } from \"react\"\nimport { GenericDialog, getNotchHeight } from \"@igloocloud/igloosharedui\"\nimport Igloo from \"@igloocloud/igloo.js\"\nimport { svg2png } from \"svg-png-converter\"\nimport CircularProgress from \"@mui/material/CircularProgress\"\nimport SvgIcon from \"@mui/material/SvgIcon\"\nimport clipboardCopy from \"clipboard-copy\"\nimport Zoom from \"@mui/material/Zoom\"\nimport List from \"@mui/material/List\"\nimport ListItem from \"@mui/material/ListItem\"\nimport ListItemText from \"@mui/material/ListItemText\"\nimport ListItemIcon from \"@mui/material/ListItemIcon\"\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\"\nimport Switch from \"@mui/material/Switch\"\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\"\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\"\nimport { createTheme, adaptV4Theme } from \"@mui/material/styles\"\nimport { downloadText } from \"download.js\"\nimport { withTranslation } from \"react-i18next\"\n\nconst sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))\n\nconst unpairThingMutation = async (\n setUnpairThingOpen,\n deselectThing,\n close,\n id,\n client,\n setUnpairThingLoading,\n reset\n) => {\n try {\n setUnpairThingLoading(true)\n\n await client.mutation.unpairThing({ id, reset })\n\n deselectThing()\n setUnpairThingOpen(false)\n close()\n } catch (e) {\n setUnpairThingLoading(false)\n }\n}\n\nexport default withTranslation()(({ open, close, thing, deselectThing, t }) => {\n const [unpairThingOpen, setUnpairThingOpen] = useState(false)\n const [unpairThingLoading, setUnpairThingLoading] = useState(false)\n const [showConfirm, setShowConfirm] = useState(false)\n const [showCopy, setShowCopy] = useState(true)\n const [copyRan, setCopyRan] = useState(false)\n const [showLoading, setShowLoading] = useState(false)\n const [showDownload, setShowDownload] = useState(true)\n const [downloadRan, setDownloadRan] = useState(false)\n const [reset, setReset] = useState(true)\n\n const {\n REACT_APP_THING_NAME: thingName,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n REACT_APP_MAIN_COLOR: mainColor,\n } = process.env\n\n const client = new Igloo(\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\",\n localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/graphql\"\n : `https://v1.igloo.ooo/graphql`\n )\n\n return (\n <>\n <GenericDialog\n open={open}\n hidden={unpairThingOpen}\n close={close}\n title={t`Back up code` + (window.cordova ? \"\" : \" \" + t`and QR`)}\n textButton={t`Close`}\n textButtonFunction={() => {\n close()\n setUnpairThingOpen(false)\n }}\n containedButton={t`Next`}\n containedButtonFunction={() => {\n setReset(true)\n setUnpairThingOpen(true)\n }}\n noHorizontalPadding\n >\n {({ fullScreen }) => (\n <>\n <div\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n >\n {t(\n `You may want to save this ${\n thingName ? thingName.toLowerCase() : \"thing\"\n }'s code`\n ) +\n \" \" +\n (window.cordova ? \"\" : t`and QR` + \" \") +\n t`before you unpair it, so here` +\n \" \" +\n (window.cordova ? t`it is` : t`they are`)}\n !\n </div>\n <div\n style={{\n marginTop: \"16px\",\n marginBottom: \"8px\",\n textAlign: \"center\",\n width: \"100%\",\n }}\n >\n <List>\n <ListItem\n button\n onClick={async () => {\n if (thing) {\n if (window.cordova) {\n window.cordova.plugins.clipboard.copy(thing.pairCode)\n } else {\n clipboardCopy(thing.pairCode)\n }\n\n //this way the zoom animation isn't shown when the dialog opens\n setCopyRan(true)\n\n setShowCopy(false)\n setShowConfirm(true)\n await sleep(1000)\n setShowConfirm(false)\n setShowCopy(true)\n }\n }}\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n >\n <ListItemIcon>\n {showConfirm && (\n <Zoom in={showConfirm}>\n <SvgIcon style={{ margin: \"0 8px\" }}>\n <svg\n style={{\n width: \"24px\",\n height: \"24px\",\n color: textColor,\n }}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\" />\n </svg>\n </SvgIcon>\n </Zoom>\n )}\n {showCopy && (\n <Zoom\n in={showCopy}\n timeout={\n copyRan\n ? { enter: 225, exit: 255 }\n : { enter: 0, exit: 0 }\n }\n >\n <SvgIcon style={{ margin: \"0 8px\" }}>\n <svg\n style={{\n width: \"24px\",\n height: \"24px\",\n color: textColor,\n }}\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z\" />\n </svg>\n </SvgIcon>\n </Zoom>\n )}\n </ListItemIcon>\n <ListItemText\n style={{\n cursor: \"pointer\",\n }}\n >\n {t`Copy code`}\n </ListItemText>\n </ListItem>\n {!window.cordova && (\n <ListItem\n button\n onClick={async () => {\n //this way the zoom animation isn't shown when the dialog opens\n setDownloadRan(true)\n setShowDownload(false)\n setShowLoading(true)\n\n await downloadText(\n process.env.REACT_APP_NAME +\n \" - \" +\n thing.name +\n \".jpeg\",\n await svg2png({\n input: (\n await client.query.thing(thing.id).qrCode\n ).trim(),\n encoding: \"buffer\",\n format: \"jpeg\",\n })\n )\n\n await sleep(1000)\n\n setShowLoading(false)\n setShowDownload(true)\n }}\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n }}\n >\n <ListItemIcon>\n {showLoading && (\n <CircularProgress\n size={24}\n color=\"primary\"\n style={{\n position: \"absolute\",\n top: \"50%\",\n marginTop: -12,\n marginLeft: \"8px\",\n }}\n />\n )}\n {showDownload && (\n <Zoom\n in={showDownload}\n timeout={\n downloadRan\n ? { enter: 225, exit: 255 }\n : { enter: 0, exit: 0 }\n }\n >\n <SvgIcon style={{ margin: \"0 8px\" }}>\n <svg\n style={{\n width: \"24px\",\n height: \"24px\",\n color: textColor,\n }}\n viewBox=\"0 0 24 24\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>\n </SvgIcon>\n </Zoom>\n )}\n </ListItemIcon>\n <ListItemText\n style={{\n cursor: \"pointer\",\n }}\n >\n {t`Download QR code`}\n </ListItemText>\n </ListItem>\n )}\n </List>\n </div>\n </>\n )}\n </GenericDialog>\n <GenericDialog\n open={unpairThingOpen}\n close={() => setUnpairThingOpen(false)}\n title={t`Unpair thing`}\n textButton={t`Close`}\n textButtonFunction={() => setUnpairThingOpen(false)}\n containedButton={t`Unpair`}\n containedButtonFunction={() =>\n unpairThingMutation(\n setUnpairThingOpen,\n deselectThing,\n close,\n thing.id,\n client,\n setUnpairThingLoading,\n reset\n )\n }\n containedButtonLoading={unpairThingLoading}\n containedButtonDisabled={unpairThingLoading}\n isContainedButtonRed\n >\n {t`Be careful, ` + thing?.name + \" \" + t`will be unpaired` + \".\"}\n <List\n style={{\n padding: 0,\n marginTop: \"16px\",\n }}\n >\n <ListItem\n style={{\n marginTop: \"-3px\",\n marginBottom: \"13px\",\n paddingLeft: 0,\n }}\n >\n <ListItemText primary={t`Reset thing`} />\n <ListItemSecondaryAction style={{ right: \"-8px\" }}>\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={createTheme(\n adaptV4Theme({\n palette: {\n primary: {\n main: lightContrastColor || mainColor,\n },\n },\n })\n )}\n >\n <Switch\n checked={reset}\n onChange={(event) => setReset(event.target.checked)}\n />\n </ThemeProvider>\n </StyledEngineProvider>\n </ListItemSecondaryAction>\n </ListItem>\n </List>\n </GenericDialog>\n </>\n )\n})\n","import { graphql } from \"@apollo/react-hoc\";\nimport {\n getNotchHeight,\n isRoleAtLeast,\n NotificationDrawer,\n} from \"@igloocloud/igloosharedui\";\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\nimport Create from \"@mui/icons-material/Create\";\nimport Folder from \"@mui/icons-material/Folder\";\nimport Info from \"@mui/icons-material/Info\";\nimport LinkOff from \"@mui/icons-material/LinkOff\";\nimport MoreVert from \"@mui/icons-material/MoreVert\";\nimport Notifications from \"@mui/icons-material/Notifications\";\nimport NotificationsNone from \"@mui/icons-material/NotificationsNone\";\nimport NotificationsOff from \"@mui/icons-material/NotificationsOff\";\nimport Star from \"@mui/icons-material/Star\";\nimport StarBorder from \"@mui/icons-material/StarBorder\";\nimport SwapHoriz from \"@mui/icons-material/SwapHoriz\";\nimport Visibility from \"@mui/icons-material/Visibility\";\nimport Badge from \"@mui/material/Badge\";\nimport Divider from \"@mui/material/Divider\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport SwipeableDrawer from \"@mui/material/SwipeableDrawer\";\nimport Typography from \"@mui/material/Typography\";\nimport gql from \"graphql-tag\";\nimport querystringify from \"querystringify\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport { Link, Redirect } from \"react-router-dom\";\nimport tinyColor from \"tinycolor2\";\nimport ChangeCollection from \"./things/ChangeCollection\";\nimport FlowsDialog from \"./things/flows/FlowsDialog\";\nimport GroupDialog from \"./things/GroupDialog\";\nimport ManageCards from \"./things/ManageCards\";\nimport RenameThing from \"./things/RenameThing\";\nimport ThingInfo from \"./things/ThingInfo\";\nimport UnpairThing from \"./things/UnpairThing\";\n\nconst {\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_TEXT_ON_SECONDARY_COLOR: textOnSecondaryColor,\n REACT_APP_SHOW_NOTIFICATIONS: showNotifications,\n} = process.env;\n\nexport default withTranslation()(\n graphql(\n gql`\n mutation ToggleQuietMode($id: ID!, $muted: Boolean) {\n updateThing(id: $id, muted: $muted) {\n id\n muted\n }\n }\n `,\n {\n name: \"ToggleQuietMode\",\n }\n )(\n graphql(\n gql`\n mutation ToggleStarred($id: ID!, $starred: Boolean) {\n updateThing(id: $id, starred: $starred) {\n id\n starred\n }\n }\n `,\n {\n name: \"ToggleStarred\",\n }\n )(\n class MainBodyHeader extends Component {\n state = {\n infoOpen: false,\n unpairOpen: false,\n renameOpen: false,\n changeCollectionOpen: false,\n goToThings: false,\n drawerOpen: false,\n manageCardsOpen: false,\n groupDialogOpen: false,\n backStackIndex: 0,\n };\n\n handleMenuOpen = (event) => {\n if (window.cordova && this.props.isMobile) {\n if (\n tinyColor.mix(backgroundColor, \"#00000088\").getBrightness() <= 128\n ) {\n window.StatusBar.styleLightContent();\n } else {\n window.StatusBar.styleDefault();\n }\n }\n\n this.setState({ anchorEl: event ? event.currentTarget : true });\n };\n\n handleBackButton = () => {\n if (this.state.backStackIndex === window.backStack) {\n this.handleMenuClose();\n }\n };\n\n handleMenuClose = () => {\n if (window.cordova && this.props.isMobile) {\n if (tinyColor(backgroundColor).getBrightness() <= 128) {\n window.StatusBar.styleLightContent();\n } else {\n window.StatusBar.styleDefault();\n }\n }\n\n this.setState({ anchorEl: null });\n\n if (window.cordova) {\n this.setState({ backStackIndex: 0 });\n\n --window.backStack;\n\n document.removeEventListener(\"backbutton\", this.handleBackButton);\n }\n };\n\n render() {\n const {\n data: { thing },\n isMobile,\n t,\n } = this.props;\n const { drawerOpen, groupDialogOpen } = this.state;\n const {\n REACT_APP_SIDEBAR_FOLDERS_ENABLED: foldersEnabled,\n REACT_APP_THING_NAME: thingName,\n REACT_APP_ENABLE_FLOWS: flowsEnabled,\n } = process.env;\n\n const notchStyle = {\n paddingLeft:\n \"calc(16px + \" +\n (isMobile ? getNotchHeight(\"left\") : \"0px\") +\n \")\",\n paddingRight:\n \"calc(16px + \" +\n (isMobile ? getNotchHeight(\"right\") : \"0px\") +\n \")\",\n };\n\n const mainColor = isMobile\n ? process.env.REACT_APP_MAIN_COLOR\n : process.env.REACT_APP_LIGHT_COLOR;\n const textOnMainColor = isMobile\n ? process.env.REACT_APP_TEXT_ON_MAIN_COLOR\n : process.env.REACT_APP_TEXT_ON_LIGHT_COLOR;\n const textOnBackgroundColor =\n process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR;\n const errorColor = process.env.REACT_APP_ERROR_COLOR;\n\n const toggleQuietMode = (muted) => {\n this.props.ToggleQuietMode({\n variables: {\n id: thing.id,\n muted,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n thing: {\n id: thing.id,\n muted,\n __typename: \"Thing\",\n },\n },\n });\n };\n\n const toggleStarred = (starred) => {\n this.props.ToggleStarred({\n variables: {\n id: thing.id,\n starred,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n thing: {\n id: thing.id,\n starred,\n __typename: \"Thing\",\n },\n },\n });\n };\n\n let content = () =>\n thing && (\n <>\n <MenuItem\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ infoOpen: true });\n }}\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n >\n <ListItemIcon>\n <Info />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Information`}\n </Typography>\n </MenuItem>\n <Divider className=\"notSelectable\" />\n {showNotifications &&\n (thing.muted ? (\n <MenuItem\n className=\"notSelectable\"\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n onClick={() => {\n toggleQuietMode(false);\n\n this.handleMenuClose();\n }}\n disabled={\n this.props.userData.user &&\n this.props.userData.user.quietMode\n }\n >\n <ListItemIcon>\n <Notifications />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Unmute`}\n </Typography>\n </MenuItem>\n ) : (\n <MenuItem\n className=\"notSelectable\"\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n onClick={() => {\n toggleQuietMode(true);\n this.handleMenuClose();\n }}\n disabled={\n this.props.userData.user &&\n this.props.userData.user.quietMode\n }\n >\n <ListItemIcon>\n <NotificationsOff />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Mute`}\n </Typography>\n </MenuItem>\n ))}\n {foldersEnabled ? (\n <MenuItem\n className=\"notSelectable\"\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n onClick={() => {\n this.setState({ groupDialogOpen: true });\n\n this.handleMenuClose();\n }}\n >\n <ListItemIcon>\n <SvgIcon>\n {thing.group ? (\n <Folder />\n ) : (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill=\"#000000\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z\" />\n </svg>\n )}\n </SvgIcon>\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {thing.group ? t`Change group` : t`Add to a group`}\n </Typography>\n </MenuItem>\n ) : (\n <MenuItem\n className=\"notSelectable\"\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n onClick={() => {\n toggleStarred(!thing.starred);\n this.handleMenuClose();\n }}\n disabled={\n this.props.collectionData.collection &&\n this.props.collectionData.collection.starredThings\n .length >= 5 &&\n !thing.starred\n }\n >\n <ListItemIcon>\n {thing.starred ? <StarBorder /> : <Star />}\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {thing.starred ? t`Unstar` : t`Star`}\n </Typography>\n </MenuItem>\n )}\n <Divider className=\"notSelectable\" />\n <MenuItem\n className=\"notSelectable\"\n style={{\n color: textOnBackgroundColor,\n ...notchStyle,\n paddingBottom: !isRoleAtLeast(thing.myRole, \"EDITOR\")\n ? isMobile\n ? \"calc(6px + env(safe-area-inset-bottom))\"\n : \"\"\n : \"\",\n }}\n disabled={!thing.variableCount && !thing.hiddenVariableCount}\n onClick={() => {\n this.setState({ manageCardsOpen: true });\n this.handleMenuClose();\n }}\n >\n <ListItemIcon>\n <Visibility />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Toggle cards`}\n </Typography>\n </MenuItem>\n {isRoleAtLeast(thing.myRole, \"ADMIN\") && flowsEnabled && (\n <MenuItem\n className=\"notSelectable\"\n style={{\n color: textOnBackgroundColor,\n ...notchStyle,\n paddingBottom: !isRoleAtLeast(thing.myRole, \"EDITOR\")\n ? isMobile\n ? \"calc(6px + env(safe-area-inset-bottom))\"\n : \"\"\n : \"\",\n }}\n onClick={() => {\n this.setState({ manageFlowsOpen: true });\n this.handleMenuClose();\n }}\n disabled={\n !thing.variableCount && !thing.hiddenVariableCount\n }\n >\n <ListItemIcon>\n <SvgIcon>\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M17 7L22 12L17 17V13.25H12V10.75H17V7ZM8.25 10.75C7.5625 10.75 7 11.3125 7 12C7 12.6875 7.5625 13.25 8.25 13.25C8.9375 13.25 9.5 12.6875 9.5 12C9.5 11.3125 8.9375 10.75 8.25 10.75ZM3.25 10.75C2.5625 10.75 2 11.3125 2 12C2 12.6875 2.5625 13.25 3.25 13.25C3.9375 13.25 4.5 12.6875 4.5 12C4.5 11.3125 3.9375 10.75 3.25 10.75Z\"\n fill=\"black\"\n />\n </svg>\n </SvgIcon>\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Manage flows`}\n </Typography>\n </MenuItem>\n )}\n <Divider className=\"notSelectable\" />\n {isRoleAtLeast(thing.myRole, \"OWNER\") && (\n <MenuItem\n className=\"notSelectable\"\n style={{ color: textOnBackgroundColor, ...notchStyle }}\n onClick={() => {\n this.setState({ changeCollectionOpen: true });\n this.handleMenuClose();\n }}\n disabled={\n !(\n this.props.collections &&\n this.props.collections.length > 1\n )\n }\n >\n <ListItemIcon>\n <SwapHoriz />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t(\n \"Move \" +\n (thingName ? thingName.toLowerCase() : \"thing\")\n )}\n </Typography>\n </MenuItem>\n )}\n {isRoleAtLeast(thing.myRole, \"ADMIN\") && (\n <>\n <MenuItem\n className=\"notSelectable\"\n style={{\n color: textOnBackgroundColor,\n ...notchStyle,\n }}\n onClick={() => {\n this.setState({ renameOpen: true });\n this.handleMenuClose();\n }}\n >\n <ListItemIcon>\n <Create />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Rename`}\n </Typography>\n </MenuItem>\n <MenuItem\n className=\"notSelectable\"\n style={{\n color: textOnBackgroundColor,\n ...notchStyle,\n paddingBottom: isMobile\n ? \"calc(6px + env(safe-area-inset-bottom))\"\n : \"\",\n }}\n onClick={() => {\n this.setState({ unpairOpen: true });\n this.handleMenuClose();\n }}\n >\n <ListItemIcon>\n <LinkOff style={{ color: errorColor }} />\n </ListItemIcon>\n <Typography\n variant=\"inherit\"\n noWrap\n style={{ color: errorColor }}\n >\n {t`Unpair`}\n </Typography>\n </MenuItem>\n </>\n )}\n </>\n );\n\n return (\n <>\n <div\n className=\"notSelectable\"\n style={{\n color: textOnMainColor,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: \"64px\",\n paddingTop: isMobile ? 0 : getNotchHeight(\"top\"),\n gridArea: isMobile ? \"header\" : \"mainBodyHeader\",\n backgroundColor: mainColor,\n zIndex: \"1000\",\n paddingLeft: isMobile ? getNotchHeight(\"left\") : 0,\n paddingRight: getNotchHeight(\"right\"),\n paddingBottom: isMobile ? \"env(safe-area-inset-bottom)\" : 0,\n }}\n >\n {isMobile && (\n <Link\n to={\n \"/?collection=\" +\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection\n }\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <IconButton\n style={{\n color: textOnMainColor,\n margin: \"0 8px\",\n }}\n size=\"large\"\n >\n <ArrowBack />\n </IconButton>\n </Link>\n )}\n <Typography\n variant=\"h5\"\n style={{\n cursor: \"default\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n lineHeight: \"64px\",\n width: \"100%\",\n marginLeft: isMobile ? \"\" : \"16px\",\n }}\n >\n {thing?.name}\n </Typography>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n marginRight: \"8px\",\n }}\n >\n {showNotifications && (\n <IconButton\n onClick={() => this.setState({ drawerOpen: true })}\n style={{ color: textOnMainColor }}\n size=\"large\"\n >\n <Badge\n badgeContent={\n <font style={{ color: textOnSecondaryColor }}>\n {thing?.notificationCount}\n </font>\n }\n color=\"secondary\"\n invisible={!thing?.notificationCount}\n >\n {thing?.notificationCount ? (\n <Notifications />\n ) : (\n <NotificationsNone />\n )}\n </Badge>\n </IconButton>\n )}\n {showNotifications && (\n <NotificationDrawer\n open={drawerOpen}\n setOpen={(drawerOpen) => this.setState({ drawerOpen })}\n thingId={this.props.thingId}\n notificationCount={thing?.notificationCount}\n />\n )}\n <IconButton\n onClick={this.handleMenuOpen}\n disabled={!thing?.id}\n style={{\n color: tinyColor(textOnMainColor)\n .setAlpha(thing?.id ? 1 : 0.54)\n .toRgbString(),\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </div>\n </div>\n {thing?.id && thing.createdAt && thing.updatedAt && (\n <ThingInfo\n open={this.state.infoOpen}\n close={() => this.setState({ infoOpen: false })}\n thing={thing}\n />\n )}\n {thing?.id && this.props.userData && (\n <ChangeCollection\n open={this.state.changeCollectionOpen}\n close={() => this.setState({ changeCollectionOpen: false })}\n userData={this.props.userData}\n thing={thing}\n thingCollection={thing.collection.id}\n collections={this.props.collections}\n />\n )}\n {thing?.name && (\n <RenameThing\n open={this.state.renameOpen}\n close={() => this.setState({ renameOpen: false })}\n thing={thing}\n />\n )}\n {thing?.id && (\n <ManageCards\n open={this.state.manageCardsOpen}\n close={() => this.setState({ manageCardsOpen: false })}\n id={thing.id}\n />\n )}\n {thing && (\n <GroupDialog\n open={groupDialogOpen}\n close={() => this.setState({ groupDialogOpen: false })}\n id={thing.id}\n thingGroup={thing.group}\n />\n )}\n {thing && (\n <FlowsDialog\n open={this.state.manageFlowsOpen}\n close={() => this.setState({ manageFlowsOpen: false })}\n id={thing.id}\n />\n )}\n <UnpairThing\n open={this.state.unpairOpen}\n close={() => this.setState({ unpairOpen: false })}\n client={this.props.client}\n thing={thing}\n deselectThing={() => this.setState({ goToThings: true })}\n />\n {thing &&\n (this.props.isMobile ? (\n <SwipeableDrawer\n variant=\"temporary\"\n anchor=\"bottom\"\n open={this.state.anchorEl}\n onOpen={this.handleMenuOpen}\n onClose={this.handleMenuClose}\n disableBackdropTransition={false}\n disableDiscovery\n disableSwipeToOpen\n PaperProps={{\n style: {\n backgroundColor,\n },\n }}\n >\n {content(false)}\n </SwipeableDrawer>\n ) : (\n <Menu\n id=\"main-body-header-menu\"\n anchorEl={this.state.anchorEl}\n open={this.state.anchorEl}\n onClose={this.handleMenuClose}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n style: {\n backgroundColor,\n },\n }}\n TransitionProps={{\n onEnter: () => {\n if (window.cordova) {\n this.setState({ backStackIndex: ++window.backStack });\n\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton\n );\n }\n },\n }}\n >\n {content(true)}\n </Menu>\n ))}\n {this.state.goToThings && (\n <Redirect\n to={\n \"/?collection=\" +\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection\n }\n />\n )}\n </>\n );\n }\n }\n )\n )\n);\n","import { graphql } from \"@apollo/react-hoc\";\nimport { getNotchHeight, MainBody } from \"@igloocloud/igloosharedui\";\nimport AppBar from \"@mui/material/AppBar\";\nimport gql from \"graphql-tag\";\nimport IsOnline from \"is-online-component\";\nimport { Component } from \"react\";\nimport { Redirect } from \"react-router-dom\";\nimport MainBodyHeader from \"./components/MainBodyHeader\";\nimport backgroundLogo from \"./styles/assets/background-logo.svg\";\n\nexport default graphql(\n gql`\n query ($id: ID!, $offset: NaturalNumber, $limit: NaturalNumber!) {\n thing(id: $id) {\n id\n pairCode\n name\n online\n collection {\n id\n }\n muted\n type\n firmware\n starred\n updatedAt\n createdAt\n myRole\n qrCode\n notificationCount(filter: { read: false })\n variableCount(filter: { hidden: false })\n hiddenVariableCount: variableCount(filter: { hidden: true })\n variables(\n limit: $limit\n offset: $offset\n sortBy: index\n filter: { hidden: false }\n ) {\n id\n index\n hidden\n name\n updatedAt\n createdAt\n myRole\n editableBy\n thing {\n id\n }\n ... on FloatVariable {\n floatValue: value\n precision\n min\n max\n unitOfMeasurement\n visualization\n floatAllowedValues: allowedValues\n }\n ... on StringVariable {\n stringVariable: value\n maxCharacters\n stringAllowedValues: allowedValues\n visualization\n }\n ... on BooleanVariable {\n boolValue: value\n visualization\n }\n ... on ImpulseVariable {\n impulseValue: value\n visualization\n content\n }\n ... on FileVariable {\n fileValue: value\n fileName\n visualization\n maxSize\n }\n ... on LayoutVariable {\n floorCount\n visualization\n maxSize\n }\n ... on FloatSeriesVariable {\n min\n max\n minThreshold\n maxThreshold\n precision\n shownNodes\n storedNodes\n nodeCount\n visualization\n lastNode {\n id\n }\n }\n }\n }\n }\n `,\n {\n name: \"thingData\",\n options: ({ thingId }) => ({\n variables: {\n id: thingId,\n offset: 0,\n limit: 20,\n },\n }),\n }\n)(\n class ThingFetcher extends Component {\n state = {\n redirectTo: \"\",\n };\n\n render() {\n const {\n userData,\n collectionData,\n thingData,\n drawer,\n changeDrawerState,\n hiddenNotifications,\n showHiddenNotifications,\n collections,\n isMobile,\n selectedThing,\n client,\n openSnackBar,\n thingId,\n } = this.props;\n const { redirectTo } = this.state;\n\n if (redirectTo) {\n const tempRedirect = redirectTo;\n this.setState({ redirectTo: \"\" });\n\n return <Redirect to={tempRedirect} />;\n }\n\n return (\n <>\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.thingData.refetch();\n }\n }}\n />\n {isMobile ? (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n backgroundImage: \"unset\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\",\n }}\n >\n <MainBody\n collectionData={collectionData}\n thingData={thingData}\n setRedirect={(redirectTo) => this.setState({ redirectTo })}\n mobile\n />\n <AppBar\n position=\"sticky\"\n style={{\n boxShadow:\n \"0px -2px 4px -1px rgba(0,0,0,0.2), 0px -4px 5px 0px rgba(0,0,0,0.14), 0px -1px 10px 0px rgba(0,0,0,0.12)\",\n }}\n >\n <MainBodyHeader\n key=\"mainBodyHeader\"\n drawer={drawer}\n changeDrawerState={changeDrawerState}\n hiddenNotifications={hiddenNotifications}\n showHiddenNotifications={showHiddenNotifications}\n collectionData={collectionData}\n collections={collections}\n isMobile={isMobile}\n userData={userData}\n client={client}\n data={thingData}\n thingId={thingId}\n />\n </AppBar>\n </div>\n ) : (\n <>\n {selectedThing !== null ? (\n <MainBodyHeader\n thingId={thingId}\n key=\"mainBodyHeader\"\n drawer={drawer}\n changeDrawerState={changeDrawerState}\n hiddenNotifications={hiddenNotifications}\n showHiddenNotifications={showHiddenNotifications}\n openSnackBar={openSnackBar}\n collectionData={collectionData}\n collections={collections}\n userData={userData}\n client={client}\n data={thingData}\n />\n ) : (\n <div\n style={{\n gridArea: \"mainBodyHeader\",\n backgroundColor: process.env.REACT_APP_LIGHT_COLOR,\n paddingTop: getNotchHeight(\"top\"),\n }}\n key=\"mainBodyHeader\"\n />\n )}\n {selectedThing !== null ? (\n <>\n <MainBody\n collectionData={collectionData}\n userData={userData}\n thingData={thingData}\n setRedirect={(redirectTo) => this.setState({ redirectTo })}\n />\n </>\n ) : (\n <>\n <div\n style={{\n background: process.env.REACT_APP_MAIN_BACKGROUND_COLOR,\n }}\n className=\"mainBody\"\n >\n <div\n className=\"mainBodyBG\"\n style={{\n backgroundImage: \"url(\" + backgroundLogo + \")\",\n width: \"100%\",\n height: \"100%\",\n }}\n />\n </div>\n </>\n )}\n </>\n )}\n </>\n );\n }\n }\n);\n","import React, { Component } from \"react\";\nimport Sidebar from \"./components/Sidebar\";\nimport SidebarHeader from \"./components/SidebarHeader\";\nimport \"./styles/App.css\";\nimport \"./styles/MobileApp.css\";\nimport \"./styles/Cards.css\";\nimport backgroundLogo from \"./styles/assets/background-logo.svg\";\nimport { Redirect } from \"react-router-dom\";\nimport querystringify from \"querystringify\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport { gql } from \"@apollo/client\";\nimport Helmet from \"react-helmet\";\nimport IsOnline from \"is-online-component\";\nimport AppBar from \"@mui/material/AppBar\";\nimport ThingFetcher from \"./ThingFetcher\";\nimport { getNotchHeight } from \"@igloocloud/igloosharedui\";\nimport tinyColor from \"tinycolor2\";\n\nconst {\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_LIGHT_COLOR: lightColor,\n REACT_APP_NAME: appName,\n REACT_APP_SIDEBAR_FOLDERS_ENABLED: foldersEnabled,\n} = process.env;\n\nexport default graphql(\n foldersEnabled\n ? gql`\n query (\n $id: ID!\n $offset: NaturalNumber\n $filter: ThingFilter\n $limit: NaturalNumber!\n ) {\n collection(id: $id) {\n id\n name\n myRole\n thingCount\n uniqueFirmwares\n things(\n filter: $filter\n sortBy: name\n sortDirection: ASCENDING\n limit: $limit\n offset: $offset\n ) {\n id\n index\n name\n online\n type\n firmware\n createdAt\n updatedAt\n notificationCount(filter: { read: false })\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n }\n }\n `\n : gql`\n query (\n $id: ID!\n $offset: NaturalNumber\n $filter: [ThingFilter!]\n $limit: NaturalNumber!\n ) {\n collection(id: $id) {\n id\n name\n myRole\n thingCount\n uniqueFirmwares\n starredThings: things(\n filter: { starred: true }\n sortBy: name\n sortDirection: ASCENDING\n limit: 5\n ) {\n id\n index\n name\n online\n type\n firmware\n createdAt\n updatedAt\n starred\n notificationCount(filter: { read: false })\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n things(\n filter: { starred: false, AND: $filter }\n sortBy: name\n sortDirection: ASCENDING\n limit: $limit\n offset: $offset\n ) {\n id\n index\n name\n online\n type\n firmware\n createdAt\n updatedAt\n starred\n notificationCount(filter: { read: false })\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n }\n }\n `,\n {\n name: \"collectionData\",\n options: ({ collectionId }) => ({\n variables: {\n id: collectionId,\n offset: 0,\n limit: 20,\n filter: {},\n },\n }),\n }\n)(\n class Main extends Component {\n state = {\n drawer: false,\n showMainHidden: false,\n hiddenNotifications: false,\n slideIndex: 0,\n areSettingsOpen: false,\n fabWidth: 0,\n };\n\n changeDrawerState = () => {\n if (!this.state.areSettingsOpen)\n this.setState((oldState) => ({\n drawer: !oldState.drawer,\n }));\n };\n\n constructor() {\n super();\n\n this.state = {\n showHidden: false,\n isCardFullScreen: false,\n drawer: false,\n copyMessageOpen: false,\n deselectThing: false,\n slideIndex: 0,\n };\n }\n\n changeShowHiddenState = () =>\n this.setState((oldState) => ({\n showMainHidden: !oldState.showMainHidden,\n }));\n\n showHiddenNotifications = () =>\n this.setState((oldState) => ({\n hiddenNotifications: !oldState.hiddenNotifications,\n }));\n\n componentDidMount() {\n this.props.collectionData.refetch();\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription ($collectionId: ID) {\n thingUpdated(collectionId: $collectionId) {\n id\n index\n name\n online\n type\n firmware\n createdAt\n updatedAt\n starred\n collection {\n id\n }\n notificationCount(filter: { read: false })\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: (prev, { subscriptionData }) => {\n if (\n !subscriptionData.data ||\n subscriptionData.data.thingUpdated.collection.id !==\n prev.collection.id\n ) {\n return prev;\n }\n\n if (subscriptionData.data.thingUpdated.starred && !foldersEnabled) {\n const starredThings = [\n ...prev.collection.starredThings.filter(\n (thing) => thing.id !== subscriptionData.data.thingUpdated.id\n ),\n subscriptionData.data.thingUpdated,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n const things = [\n ...prev.collection.things.filter(\n (thing) => thing.id !== subscriptionData.data.thingUpdated.id\n ),\n ];\n\n return {\n collection: {\n ...prev.collection,\n starredThings,\n things,\n },\n };\n } else {\n const things = [\n ...prev.collection.things.filter(\n (thing) => thing.id !== subscriptionData.data.thingUpdated.id\n ),\n subscriptionData.data.thingUpdated,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return foldersEnabled\n ? {\n collection: {\n ...prev.collection,\n things,\n },\n }\n : {\n collection: {\n ...prev.collection,\n starredThings: prev.collection.starredThings.filter(\n (thing) =>\n thing.id !== subscriptionData.data.thingUpdated.id\n ),\n things,\n },\n };\n }\n },\n });\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription ($collectionId: ID) {\n thingPaired(collectionId: $collectionId) {\n id\n collection {\n id\n }\n index\n name\n online\n type\n firmware\n createdAt\n updatedAt\n starred\n notificationCount(filter: { read: false })\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: (prev, { subscriptionData }) => {\n if (\n !subscriptionData.data ||\n subscriptionData.data.thingPaired.collection.id !==\n prev.collection.id ||\n prev.collection.starredThings?.some(\n (thing) => thing.id === subscriptionData.data.thingPaired.id\n ) ||\n prev.collection.things.some(\n (thing) => thing.id === subscriptionData.data.thingPaired.id\n )\n ) {\n return prev;\n }\n\n const newThings =\n subscriptionData.data.thingPaired.starred && !foldersEnabled\n ? [\n ...prev.collection.starredThings,\n subscriptionData.data.thingPaired,\n ]\n : [...prev.collection.things, subscriptionData.data.thingPaired];\n\n newThings.sort(function (a, b) {\n if (a.name.toLowerCase() < b.name.toLowerCase()) {\n return -1;\n }\n if (a.name.toLowerCase() > b.name.toLowerCase()) {\n return 1;\n }\n return 0;\n });\n\n return subscriptionData.data.thingPaired.starred && !foldersEnabled\n ? {\n collection: {\n ...prev.collection,\n starredThings: newThings,\n },\n }\n : {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n },\n });\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription ($collectionId: ID) {\n thingDeleted(collectionId: $collectionId)\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newThings =\n !foldersEnabled &&\n prev.collection.starredThings.some(\n (starredThing) =>\n starredThing.id === subscriptionData.data.thingDeleted\n )\n ? prev.collection.starredThings.filter(\n (starredThing) =>\n starredThing.id !== subscriptionData.data.thingDeleted\n )\n : prev.collection.things.filter(\n (thing) => thing.id !== subscriptionData.data.thingDeleted\n );\n\n return !foldersEnabled &&\n prev.collection.starredThings.some(\n (starredThing) =>\n starredThing.id === subscriptionData.data.thingDeleted\n )\n ? {\n collection: {\n ...prev.collection,\n starredThing: newThings,\n },\n }\n : {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n },\n });\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription ($collectionId: ID) {\n thingUnpaired(collectionId: $collectionId)\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newThings =\n !foldersEnabled &&\n prev.collection.starredThings.some(\n (starredThing) =>\n starredThing.id === subscriptionData.data.thingUnpaired\n )\n ? prev.collection.starredThings.filter(\n (starredThing) =>\n starredThing.id !== subscriptionData.data.thingUnpaired\n )\n : prev.collection.things.filter(\n (thing) => thing.id !== subscriptionData.data.thingUnpaired\n );\n\n return !foldersEnabled &&\n prev.collection.starredThings.some(\n (starredThing) =>\n starredThing.id === subscriptionData.data.thingUnpaired\n )\n ? {\n collection: {\n ...prev.collection,\n starredThings: newThings,\n },\n }\n : {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n },\n });\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription ($collectionId: ID) {\n thingMoved(collectionId: $collectionId) {\n id\n index\n name\n online\n type\n createdAt\n updatedAt\n notificationCount(filter: { read: false })\n collection {\n id\n }\n lastReadNotification: lastNotification(filter: { read: true }) {\n id\n }\n lastUnreadNotification: lastNotification(\n filter: { read: false }\n ) {\n id\n content\n read\n }\n }\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n if (\n this.props.collectionId ===\n subscriptionData.data.thingMoved.collection.id\n ) {\n const newThings = [\n ...prev.collection.things,\n subscriptionData.data.thingMoved,\n ].filter(\n (thing, index, self) =>\n index === self.findIndex((self) => self.id === thing.id)\n );\n\n newThings.sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n } else if (this.props.collectionId === prev.collection.id) {\n const newThings = prev.collection.things\n .filter(\n (thing) => thing.id !== subscriptionData.data.thingMoved.id\n )\n .sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n collection: {\n ...prev.collection,\n things: newThings,\n },\n };\n }\n },\n });\n\n this.props.collectionData.subscribeToMore({\n document: gql`\n subscription {\n collectionDeleted\n }\n `,\n variables: { collectionId: this.props.collectionId },\n updateQuery: () => this.setState({ redirectToCollections: true }),\n });\n }\n\n render() {\n const {\n collectionData: { error, collection },\n } = this.props;\n const { REACT_APP_FULLSCREEN_BODY_BACKGROUND: fullscreenBackground } =\n process.env;\n\n if (error) {\n if (\n error.message ===\n \"GraphQL error: You are not allowed to perform this operation\"\n ) {\n this.setState({ redirectToCollections: true });\n }\n }\n\n if (this.state.redirectTo) {\n this.setState({ redirectTo: \"\" });\n }\n\n if (this.state.deselectThing) {\n this.setState({ deselectThing: false });\n }\n\n return (\n <>\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.collectionData.refetch();\n }\n }}\n />\n <Helmet>\n <title>\n {collection\n ? collection.things.filter(\n (thing) =>\n thing.id ===\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n )[0]\n ? appName +\n \" - \" +\n collection.things.filter(\n (thing) =>\n thing.id ===\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n )[0].name\n : appName + \" - \" + collection.name\n : appName}\n </title>\n </Helmet>\n {this.props.mobile ? (\n <div\n className=\"mobileMain\"\n style={{\n overflowY: \"hidden\",\n }}\n >\n {this.props.selectedThing == null ? (\n <>\n <div\n key=\"sidebar\"\n style={{\n backgroundColor: \"transparent\",\n height: \"calc(100% - 64px - env(safe-area-inset-bottom))\",\n overflowY: \"hidden\",\n }}\n >\n <Sidebar\n selectThing={(id) => {\n this.props.selectThing(id);\n this.setState({ drawer: false });\n }}\n selectedThing={this.props.selectedThing}\n changeDrawerState={this.changeDrawerState}\n isMobile\n collectionData={this.props.collectionData}\n selectedCollection={this.props.collectionId}\n searchThings={this.props.searchThings}\n searchText={this.props.thingsSearchText}\n snackbarOpen={this.props.snackbarOpen}\n userData={this.props.userData}\n client={this.props.client}\n fabWidth={this.state.fabWidth}\n setFabWidth={(fabWidth) => this.setState({ fabWidth })}\n />\n </div>\n <AppBar\n position=\"sticky\"\n style={{\n boxShadow:\n \"0px -2px 4px -1px rgba(0,0,0,0.2), 0px -4px 5px 0px rgba(0,0,0,0.14), 0px -1px 10px 0px rgba(0,0,0,0.12)\",\n backgroundColor,\n }}\n >\n <SidebarHeader\n logOut={this.props.logOut}\n key=\"sidebarHeader\"\n collectionName={\n this.props.collectionData.collection?.name\n }\n myRole={this.props.collectionData.collection?.myRole}\n snackbarOpen={this.props.snackbarOpen}\n mobile\n fabWidth={this.state.fabWidth}\n />\n </AppBar>\n </>\n ) : (\n <ThingFetcher\n changeDrawerState={this.changeDrawerState}\n thingId={this.props.selectedThing}\n drawer={this.state.drawer}\n showHidden={this.state.showMainHidden}\n changeShowHiddenState={this.changeShowHiddenState}\n hiddenNotifications={this.state.hiddenNotifications}\n showHiddenNotifications={this.showHiddenNotifications}\n collectionData={this.props.collectionData}\n isMobile\n logOut={this.props.logOut}\n collections={this.props.collections}\n userData={this.props.userData}\n client={this.props.client}\n />\n )}\n </div>\n ) : (\n <div\n className=\"main\"\n style={{\n gridTemplateRows:\n \"[start] calc(64px + \" +\n getNotchHeight(\"top\") +\n \") [mid] auto [end]\",\n backgroundRepeat: \"no-repeat\",\n backgroundSize: \"cover\",\n }}\n >\n <div className=\"invisibleHeader\" key=\"invisibleHeader\" />\n <SidebarHeader\n logOut={this.props.logOut}\n key=\"sidebarHeader\"\n collectionName={this.props.collectionData.collection?.name}\n myRole={this.props.collectionData.collection?.myRole}\n emailIsVerified={this.props.userData.user?.emailIsVerified}\n fabWidth={this.state.fabWidth}\n />\n <div\n className=\"sidebar\"\n key=\"sidebar\"\n style={{\n background: \"transparent\",\n display: \"flex\",\n }}\n >\n <Sidebar\n selectThing={(id) => {\n this.props.selectThing(id);\n this.setState({ drawer: false });\n }}\n selectedThing={this.props.selectedThing}\n changeDrawerState={this.changeDrawerState}\n collectionData={this.props.collectionData}\n selectedCollection={this.props.collectionId}\n searchThings={this.props.searchThings}\n searchText={this.props.thingsSearchText}\n userData={this.props.userData}\n client={this.props.client}\n fabWidth={this.state.fabWidth}\n setFabWidth={(fabWidth) => this.setState({ fabWidth })}\n />\n </div>\n {this.props.selectedThing !== null ? (\n <ThingFetcher\n changeDrawerState={this.changeDrawerState}\n drawer={this.state.drawer}\n thingId={this.props.selectedThing}\n showHidden={this.state.showMainHidden}\n changeShowHiddenState={this.changeShowHiddenState}\n hiddenNotifications={this.state.hiddenNotifications}\n showHiddenNotifications={this.showHiddenNotifications}\n collectionData={this.props.collectionData}\n isMobile={false}\n logOut={this.props.logOut}\n collections={this.props.collections}\n userData={this.props.userData}\n client={this.props.client}\n />\n ) : (\n <>\n <div\n style={{\n gridArea: \"mainBodyHeader\",\n backgroundColor: lightColor,\n }}\n key=\"mainBodyHeader\"\n />\n <div style={{ backgroundColor }} className=\"mainBody\">\n <div\n className=\"mainBodyBG\"\n style={{\n backgroundImage: \"url(\" + backgroundLogo + \")\",\n ...(fullscreenBackground\n ? {\n backgroundSize: \"contain\",\n backgroundPosition: \"bottom\",\n }\n : {}),\n width: \"100%\",\n height: \"100%\",\n }}\n />\n </div>\n </>\n )}\n </div>\n )}\n {this.state.redirectTo && collection && (\n <Redirect\n push\n to={\n \"/?collection=\" +\n collection.id +\n \"&thing=\" +\n this.state.redirectTo\n }\n />\n )}\n {this.state.deselectThing && collection && (\n <Redirect push to={\"/?collection=\" + collection.id} />\n )}\n {this.state.redirectToCollections && <Redirect push to=\"/\" />}\n </>\n );\n }\n }\n);\n","export default __webpack_public_path__ + \"static/media/logo.7bc58b86.svg\";","import React, { Component } from \"react\";\nimport AppBar from \"@mui/material/AppBar\";\nimport logo from \"../../styles/assets/logo.svg\";\nimport {\n AccountPopover,\n getNotchHeight,\n debounce,\n} from \"@igloocloud/igloosharedui\";\nimport { Redirect } from \"react-router-dom\";\nimport tinyColor from \"tinycolor2\";\nimport { withTranslation } from \"react-i18next\";\nimport Home from \"@mui/icons-material/Home\";\nimport Tabs from \"@mui/material/Tabs\";\nimport Tab from \"@mui/material/Tab\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport Assignment from \"@mui/icons-material/Assignment\";\nimport { Link } from \"react-router-dom\";\n\nconst { REACT_APP_MAIN_COLOR: mainColor } = process.env;\n\nexport default withTranslation()(\n class CollectionsHeader extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n redirectTo: \"\",\n lessThan900: null,\n };\n }\n\n updateDimensions = () => {\n if (window.innerWidth < 900) {\n this.setState({ lessThan900: true });\n } else {\n this.setState({ lessThan900: false });\n }\n };\n\n componentDidMount() {\n this.updateDimensions();\n window.addEventListener(\"resize\", debounce(this.updateDimensions));\n\n if (!this.props.mobile && window.cordova) {\n if (tinyColor(mainColor).getBrightness() <= 128) {\n window.StatusBar.styleLightContent();\n } else {\n window.StatusBar.styleDefault();\n }\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", debounce(this.updateDimensions));\n }\n\n render() {\n const { mobile, t } = this.props;\n const { lessThan900 } = this.state;\n const {\n REACT_APP_TEXT_ON_MAIN_COLOR: textColor,\n REACT_APP_ENABLE_DATA_LAB: enableDataLab,\n REACT_APP_ENABLE_REPORTS: enableReports,\n REACT_APP_HOME_ICON: homeIcon,\n REACT_APP_HOME_NAME: homeName,\n } = process.env;\n\n const tabStyle = (selected) => ({\n color: selected ? textColor : tinyColor(textColor).setAlpha(0.54),\n textTransform: \"capitalize\",\n opacity: selected ? 1 : 0.54,\n height: \"64px\",\n minHeight: \"unset\",\n minWidth:\n lessThan900 && enableDataLab && enableReports ? \"128px\" : \"192px\",\n });\n\n const showTabs = enableDataLab || enableReports;\n\n return (\n <AppBar\n position=\"sticky\"\n style={{\n paddingTop: mobile ? 0 : getNotchHeight(\"top\"),\n paddingLeft: getNotchHeight(\"left\"),\n paddingRight: getNotchHeight(\"right\"),\n paddingBottom: mobile ? \"env(safe-area-inset-bottom)\" : \"\",\n boxShadow: mobile\n ? \"0px -2px 4px -1px rgba(0,0,0,0.2), 0px -4px 5px 0px rgba(0,0,0,0.14), 0px -1px 10px 0px rgba(0,0,0,0.12)\"\n : null,\n }}\n >\n <div\n className=\"sidebarHeader notSelectable\"\n style={{\n color: process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR,\n display: \"flex\",\n alignItems: \"center\",\n height: \"64px\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ width: \"72px\", height: \"56px\" }}>\n <img\n src={logo}\n alt=\"Igloo logo\"\n className=\"notSelectable\"\n draggable=\"false\"\n style={{ marginLeft: \"16px\", height: \"100%\" }}\n />\n </div>\n {!mobile && showTabs && (\n <Tabs\n TabIndicatorProps={{\n style: {\n display: \"none\",\n },\n }}\n >\n <Link\n to=\"/\"\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <Tab\n icon={\n homeIcon ? (\n <SvgIcon>\n <svg dangerouslySetInnerHTML={{ __html: homeIcon }} />\n </SvgIcon>\n ) : (\n <Home />\n )\n }\n label={t(homeName || \"Home\")}\n style={tabStyle(window.location.pathname === \"/\")}\n />\n </Link>\n {enableDataLab && (\n <Link\n to=\"/data\"\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <Tab\n icon={\n <SvgIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enable-background=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <g>\n <path d=\"M21,8c-1.45,0-2.26,1.44-1.93,2.51l-3.55,3.56c-0.3-0.09-0.74-0.09-1.04,0l-2.55-2.55C12.27,10.45,11.46,9,10,9 c-1.45,0-2.27,1.44-1.93,2.52l-4.56,4.55C2.44,15.74,1,16.55,1,18c0,1.1,0.9,2,2,2c1.45,0,2.26-1.44,1.93-2.51l4.55-4.56 c0.3,0.09,0.74,0.09,1.04,0l2.55,2.55C12.73,16.55,13.54,18,15,18c1.45,0,2.27-1.44,1.93-2.52l3.56-3.55 C21.56,12.26,23,11.45,23,10C23,8.9,22.1,8,21,8z\" />\n <polygon points=\"15,9 15.94,6.93 18,6 15.94,5.07 15,3 14.08,5.07 12,6 14.08,6.93\" />\n <polygon points=\"3.5,11 4,9 6,8.5 4,8 3.5,6 3,8 1,8.5 3,9\" />\n </g>\n </g>\n </svg>\n </SvgIcon>\n }\n label={t`Data Lab`}\n style={tabStyle(\n window.location.pathname.startsWith(\"/data\")\n )}\n to=\"/data\"\n />\n </Link>\n )}\n {enableReports && (\n <Link\n to=\"/reports\"\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <Tab\n icon={<Assignment />}\n label={t`Reports`}\n style={tabStyle(\n window.location.pathname.startsWith(\"/reports\")\n )}\n to=\"/reports\"\n />\n </Link>\n )}\n </Tabs>\n )}\n <div\n style={\n this.props.mobile\n ? {\n padding: \"0\",\n marginLeft: \"auto\",\n marginRight: \"12px\",\n float: \"right\",\n }\n : {\n padding: \"0\",\n marginLeft: \"20px\", //makes the button 72px wide, thus keeping the search bar centered\n marginRight: \"12px\",\n float: \"right\",\n }\n }\n >\n <AccountPopover\n logOut={this.props.logOut}\n changeAccount={this.props.changeAccount}\n changeBearer={this.props.changeBearer}\n setOpen={this.props.setOpen}\n isOpen={this.props.isOpen}\n user={this.props.userData}\n setRedirect={(redirectTo) => this.setState({ redirectTo })}\n />\n </div>\n </div>\n {this.state.redirectTo && <Redirect to={this.state.redirectTo} />}\n </AppBar>\n );\n }\n }\n);\n","import React from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport moment from \"moment\"\nimport Moment from \"react-moment\"\nimport { withTranslation } from \"react-i18next\"\n\nconst { REACT_APP_COLLECTION_NAME: collectionName } = process.env\n\nexport default withTranslation()(({ open, close, collection, t }) => (\n <GenericDialog\n open={open}\n close={close}\n title={t((collectionName || \"Collection\") + \" information\")}\n textButton={t`Close`}\n textButtonFunction={close}\n selectable\n typographyStyle={{ overflowX: \"hidden\", textOverflow: \"ellipsis\" }}\n >\n <b>{t`Created` + \": \"}</b>\n <Moment fromNow>\n {moment.utc(collection.createdAt.split(\".\")[0], \"YYYY-MM-DDTh:mm:ss\")}\n </Moment>\n <br />\n <b>{t`Last updated` + \": \"}</b>\n <Moment fromNow>\n {moment.utc(collection.updatedAt.split(\".\")[0], \"YYYY-MM-DDTh:mm:ss\")}\n </Moment>\n <br />\n <b>{t`ID` + \": \"}</b> {collection.id}\n </GenericDialog>\n))\n","import React, { Component } from \"react\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\nimport tinyColor from \"tinycolor2\";\nimport Button from \"@mui/material/Button\";\nimport TextField from \"@mui/material/TextField\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport KeyboardArrowLeft from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRight from \"@mui/icons-material/KeyboardArrowRight\";\nimport SwipeableViews from \"react-swipeable-views\";\nimport { GenericDialog } from \"@igloocloud/igloosharedui\";\nimport { withTranslation } from \"react-i18next\";\n\nexport default graphql(\n gql`\n mutation Rename($id: ID!, $name: String, $picture: NaturalNumber) {\n updateCollection(id: $id, name: $name, picture: $picture) {\n id\n name\n picture\n }\n }\n `,\n {\n name: \"Rename\",\n }\n)(\n withTranslation()(\n class CustomizeCollection extends Component {\n constructor(props) {\n super(props);\n\n const importAll = (require) =>\n require.keys().reduce((acc, next) => {\n acc[next.replace(\"./\", \"\")] = require(next);\n return acc;\n }, {});\n\n this.images = Object.values(\n importAll(\n require.context(\n \"../../styles/assets/collectionCards\",\n false,\n /\\.(png|jpe?g|svg)$/\n )\n )\n );\n\n this.state = {\n name: \"\",\n nameEmpty: false,\n nameError: \"\",\n slideIndex: 0,\n };\n }\n\n rename = async () => {\n this.setState({ showLoading: true });\n\n try {\n await this.props.Rename({\n variables: {\n id: this.props.collection.id,\n name: this.state.name,\n picture: this.state.slideIndex,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n collection: {\n __typename: this.props.collection.__typename,\n id: this.props.collection.id,\n name: this.state.name,\n picture: this.state.slideIndex,\n },\n },\n });\n\n this.props.close();\n } catch (e) {\n this.setState({ nameError: \"Error\" });\n } finally {\n this.setState({ showLoading: false });\n }\n };\n\n componentDidMount() {\n this.setState({\n slideIndex: this.props.collection.picture,\n });\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.open !== nextProps.open && nextProps.open) {\n this.setState({\n nameEmpty: false,\n name: nextProps.collection.name,\n nameError: \"\",\n });\n }\n }\n\n render() {\n const { open, close, t } = this.props;\n const { showLoading } = this.state;\n const {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n } = process.env;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(\n \"Customize \" + (collectionName?.toLowerCase() || \"collection\")\n )}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Customize`}\n containedButtonFunction={this.rename}\n containedButtonDisabled={\n !this.state.name.replace(/\\s/g, \"\").length ||\n this.state.name.length > 256 ||\n showLoading\n }\n containedButtonLoading={showLoading}\n >\n <TextField\n id=\"customize-collection-name\"\n label={t`Name`}\n value={this.state.name}\n variant=\"outlined\"\n error={\n this.state.nameEmpty ||\n this.state.nameError ||\n this.state.name.length > 256\n }\n helperText={\n this.state.name.length > 256\n ? t`Use fewer characters`\n : this.state.nameEmpty\n ? t`This field is required`\n : this.state.nameError || \" \"\n }\n onChange={(event) =>\n this.setState({\n name: event.target.value,\n nameEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n nameError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (\n event.key === \"Enter\" &&\n this.state.name &&\n this.state.name.length <= 256\n )\n this.rename();\n }}\n style={{\n width: \"100%\",\n marginBottom: \"16px\",\n }}\n InputLabelProps={this.state.name ? { shrink: true } : {}}\n InputProps={{\n endAdornment: this.state.name && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n name: \"\",\n nameEmpty: true,\n nameError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n <SwipeableViews\n index={this.state.slideIndex % this.images.length}\n onChangeIndex={(value) => {\n this.setState({\n slideIndex: value,\n });\n }}\n style={{\n width: \"100%\",\n }}\n >\n {this.images.map(({ default: image }, index) => (\n <img\n src={image}\n key={\"collection-image-\" + index}\n alt=\"Collection\"\n className=\"notSelectable\"\n draggable=\"false\"\n style={{\n width: \"100%\",\n }}\n />\n ))}\n </SwipeableViews>\n <div>\n <Button\n size=\"small\"\n onClick={() =>\n this.setState((oldState) => ({\n slideIndex: oldState.slideIndex - 1,\n }))\n }\n disabled={this.state.slideIndex === 0}\n style={{\n color: tinyColor(textColor)\n .setAlpha(this.state.slideIndex === 0 ? 0.54 : 1)\n .toRgbString(),\n }}\n >\n <KeyboardArrowLeft />\n {t`Back`}\n </Button>\n <Button\n size=\"small\"\n onClick={() =>\n this.setState((oldState) => ({\n slideIndex: oldState.slideIndex + 1,\n }))\n }\n disabled={this.state.slideIndex === this.images.length - 1}\n style={{\n float: \"right\",\n marginRight: \"0\",\n marginLeft: \"auto\",\n color: tinyColor(textColor)\n .setAlpha(\n this.state.slideIndex === this.images.length - 1\n ? 0.54\n : 1\n )\n .toRgbString(),\n }}\n >\n {t`Next`}\n <KeyboardArrowRight />\n </Button>\n </div>\n </GenericDialog>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { withTranslation } from \"react-i18next\"\n\nexport default graphql(\n gql`\n mutation DeleteCollection($id: ID!) {\n deleteCollection(id: $id)\n }\n `,\n {\n name: \"DeleteCollection\",\n }\n)(\n withTranslation()(\n class DeleteCollection extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n showLoading: false,\n }\n }\n\n deleteCollectionMutation = async () => {\n this.setState({ showLoading: true })\n\n await this.props.DeleteCollection({\n variables: {\n id: this.props.collection.id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n deleteCollection: {\n id: this.props.collection.id,\n },\n },\n })\n\n this.setState({ showLoading: false })\n\n this.props.close()\n }\n\n render() {\n const { open, close, collection, t } = this.props\n const { showLoading } = this.state\n const {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_THINGS_NAME: thingsName,\n } = process.env\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(\n \"Delete \" + (collectionName?.toLowerCase() || \"collection\")\n )}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Delete`}\n containedButtonFunction={this.deleteCollectionMutation}\n containedButtonLoading={showLoading}\n containedButtonDisabled={showLoading}\n isContainedButtonRed\n >\n {t`Be careful, ` +\n collection?.name +\n \" \" +\n t`will be deleted permanently` +\n \". \" +\n t(\n `Note that by deleting a ${\n collectionName?.toLowerCase() || \"collection\"\n }, all of its ${\n thingsName?.toLowerCase() || \"things\"\n } will be unpaired`\n ) +\n \".\"}\n </GenericDialog>\n )\n }\n }\n )\n)\n","import React, { Component } from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { withTranslation } from \"react-i18next\"\n\nexport default graphql(\n gql`\n mutation LeaveCollection($id: ID!) {\n leaveCollection(id: $id)\n }\n `,\n {\n name: \"LeaveCollection\",\n }\n)(\n withTranslation()(\n class LeaveCollection extends Component {\n constructor(props) {\n super(props)\n this.state = {\n showLoading: false,\n }\n }\n\n leaveCollection = async () => {\n this.setState({ showLoading: true })\n\n await this.props.LeaveCollection({\n variables: {\n id: this.props.collection.id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n stopSharing: {\n id: this.props.collection.id,\n __typename: \"Collection\",\n },\n },\n })\n\n this.setState({ showLoading: false })\n\n this.props.close()\n }\n\n render() {\n const { open, close, collection, t } = this.props\n const { showLoading } = this.state\n const { REACT_APP_COLLECTION_NAME: collectionName } = process.env\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(\n \"Leave \" + (collectionName?.toLowerCase() || \"collection\")\n )}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Leave`}\n containedButtonFunction={this.leaveCollection}\n containedButtonLoading={showLoading}\n containedButtonDisabled={showLoading}\n >\n {t`Are you sure you want to leave` + \" \" + collection.name + \"?\"}\n </GenericDialog>\n )\n }\n }\n )\n)\n","import React, { Component } from \"react\";\nimport { GenericDialog, isEmailValid } from \"@igloocloud/igloosharedui\";\nimport TextField from \"@mui/material/TextField\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport gql from \"graphql-tag\";\nimport { withTranslation } from \"react-i18next\";\n\nconst {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_OWNER_NAME: ownerName,\n} = process.env;\n\nexport default withTranslation()(\n class ChangeOwner extends Component {\n state = { email: \"\", emailEmpty: false };\n\n changeOwner = async () => {\n const { t } = this.props;\n const { email } = this.state;\n\n if (isEmailValid(email)) {\n try {\n this.setState({ showLoading: true });\n\n await this.props.client.mutate({\n mutation: gql`\n mutation ($collectionId: ID!, $email: String!) {\n transferCollection(collectionId: $collectionId, email: $email) {\n id\n }\n }\n `,\n variables: {\n collectionId: this.props.collectionId,\n email: this.state.email,\n },\n });\n\n this.props.close();\n } catch (e) {\n if (\n e.message ===\n \"GraphQL error: This account doesn't exist, check the email passed\"\n ) {\n this.setState({ emailError: t`This account doesn't exist` });\n } else if (\n e.message ===\n \"GraphQL error: You already are the owner of this collection\"\n ) {\n this.setState({\n emailError: t`This is you`,\n });\n } else if (\n e.message ===\n \"GraphQL error: The user already has a role on this collection\"\n ) {\n this.setState({\n emailError: t(\n (collectionName || \"Collection\") + \" already shared\"\n ),\n });\n } else if (\n e.message === \"GraphQL error: There is already a pending transfer\"\n ) {\n this.setState({\n emailError: t`This user already has a pending transfer`,\n });\n } else {\n this.setState({\n emailError: t`Error`,\n });\n }\n }\n\n this.setState({ showLoading: false });\n }\n };\n\n componentWillReceiveProps(nextProps) {\n if (this.props.open !== nextProps.open && nextProps.open) {\n this.setState({\n emailEmpty: false,\n emailError: false,\n email: \"\",\n });\n }\n }\n\n render() {\n const { open, close, t } = this.props;\n const { showLoading, email, emailError, emailEmpty } = this.state;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(\"Change \" + ownerName)}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t(\"Change \" + (ownerName.toLowerCase() || \"owner\"))}\n containedButtonFunction={this.changeOwner}\n containedButtonLoading={showLoading}\n containedButtonDisabled={\n !email.replace(/\\s/g, \"\").length ||\n emailError ||\n showLoading ||\n (!isEmailValid(email) && email)\n }\n >\n <TextField\n id=\"owner-email\"\n label={t(`New ${ownerName.toLowerCase() || \"owner\"} email`)}\n type=\"email\"\n value={email}\n variant=\"outlined\"\n error={emailEmpty || emailError || (!isEmailValid(email) && email)}\n helperText={\n emailEmpty\n ? t`This field is required`\n : !isEmailValid(email) && email\n ? t`Enter a valid email`\n : emailError || \" \"\n }\n onChange={(event) =>\n this.setState({\n email: event.target.value,\n emailEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n emailError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (event.key === \"Enter\" && !emailEmpty) this.changeOwner();\n }}\n style={{\n width: \"100%\",\n }}\n InputLabelProps={email ? { shrink: true } : {}}\n InputProps={{\n endAdornment: email && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n email: \"\",\n emailEmpty: true,\n emailError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n );\n }\n }\n);\n","import React, { Component } from \"react\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport Radio from \"@mui/material/Radio\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport { GenericDialog } from \"@igloocloud/igloosharedui\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\nimport { withTranslation } from \"react-i18next\";\n\nexport default graphql(\n gql`\n mutation changePendingRole($id: ID!, $role: Role!) {\n pendingShare(id: $id, role: $role) {\n id\n }\n }\n `,\n {\n name: \"ChangePendingRole\",\n }\n)(\n withTranslation()(\n class ChangeRole extends Component {\n constructor(props) {\n super(props);\n\n this.state = { value: null };\n }\n\n changePendingRole = (role) => {\n this.props.ChangePendingRole({\n variables: {\n id: this.props.menuTarget.id,\n role: role.toUpperCase(),\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingShare: {\n id: this.props.menuTarget.id,\n role: role.toUpperCase(),\n __typename: \"PendingShare\",\n },\n },\n });\n };\n\n render() {\n const { t } = this.props;\n\n return (\n <GenericDialog\n open={this.props.open}\n close={this.props.close}\n title={t`Change role`}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n >\n <RadioGroup\n onChange={(event) => {\n this.setState({ value: event.target.value });\n this.props.pending\n ? this.changePendingRole(event.target.value)\n : this.props.changeRole(event.target.value);\n }}\n value={this.state.value || this.props.selectedUserType}\n >\n <FormControlLabel\n value=\"admin\"\n control={<Radio color=\"primary\" />}\n label={t`Admin`}\n className=\"notSelectable\"\n />\n <FormControlLabel\n value=\"editor\"\n control={<Radio color=\"primary\" />}\n label={t`Editor`}\n className=\"notSelectable\"\n />\n <FormControlLabel\n value=\"viewer\"\n control={<Radio color=\"primary\" />}\n label={t`Viewer`}\n className=\"notSelectable\"\n />\n </RadioGroup>\n </GenericDialog>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\nimport { GenericDialog, isEmailValid } from \"@igloocloud/igloosharedui\";\nimport Igloo from \"@igloocloud/igloo.js\";\nimport TextField from \"@mui/material/TextField\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\";\nimport { createTheme, adaptV4Theme } from \"@mui/material/styles\";\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\";\n\nimport { withTranslation } from \"react-i18next\";\n\nconst {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnBackgroundColor,\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n} = process.env;\n\nexport default graphql(\n gql`\n mutation shareCollection(\n $collectionId: ID!\n $email: String!\n $role: Role!\n ) {\n shareCollection(collectionId: $collectionId, email: $email, role: $role) {\n id\n }\n }\n `,\n {\n name: \"shareCollection\",\n }\n)(\n withTranslation()(\n class InviteUser extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n email: \"\",\n auth: \"editor\",\n selectOpen: false,\n backStackIndex: 0,\n };\n this.client = new Igloo(\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\",\n localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/graphql\"\n : `https://v1.igloo.ooo/graphql`\n );\n }\n\n inviteUser = async () => {\n const { t } = this.props;\n const { email, auth } = this.state;\n\n if (isEmailValid(email)) {\n try {\n this.setState({ showLoading: true });\n\n await this.props.shareCollection({\n variables: {\n collectionId: this.props.collectionId,\n email,\n role: auth.toUpperCase(),\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingShare: {\n collection: { id: this.props.collectionId },\n recipient: {\n email,\n role: auth.toUpperCase(),\n },\n __typename: \"PendingShare\",\n },\n },\n });\n\n this.props.close();\n } catch (e) {\n if (\n e.message ===\n \"GraphQL error: This user already has a role on this collection\"\n ) {\n this.setState({\n emailError: t(\n (collectionName || \"Collection\") + \" already shared\"\n ),\n });\n } else if (\n e.message ===\n \"GraphQL error: This account doesn't exist, check the email passed\"\n ) {\n this.setState({ emailError: t`This account doesn't exist` });\n } else if (\n e.message ===\n \"GraphQL error: You can't share an collection with yourself\"\n ) {\n this.setState({\n emailError: t`This is you`,\n });\n } else if (\n e.message === \"GraphQL error: There is already a pending share\"\n ) {\n this.setState({\n emailError: t(\n (collectionName || \"Collection\") + \" already shared\"\n ),\n });\n } else if (\n e.message === \"GraphQL error: There is already a pending transfer\"\n ) {\n this.setState({\n emailError: t`This user already has a pending transfer`,\n });\n } else {\n this.setState({\n emailError: t`Error`,\n });\n }\n }\n\n this.setState({ showLoading: false });\n }\n };\n\n componentWillReceiveProps(nextProps) {\n if (this.props.open !== nextProps.open && nextProps.open) {\n this.setState({\n emailEmpty: false,\n emailError: false,\n email: \"\",\n auth: \"admin\",\n });\n }\n }\n\n handleBackButton = () => {\n if (window.backStack === this.state.backStackIndex) {\n this.handleMenuClose();\n }\n };\n\n handleMenuClose = () => {\n this.setState({ selectOpen: false });\n\n if (window.cordova) {\n document.removeEventListener(\"backbutton\", this.handleBackButton);\n\n this.setState({ backStackIndex: 0 });\n --window.backStack;\n }\n };\n\n render() {\n const { open, close, t } = this.props;\n const { showLoading, auth, email, emailError, emailEmpty, selectOpen } =\n this.state;\n const {\n REACT_APP_ADMIN_NAME: adminName,\n REACT_APP_EDITOR_NAME: editorName,\n REACT_APP_VIEWER_NAME: viewerName,\n } = process.env;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t`Send an invite`}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Invite`}\n containedButtonFunction={this.inviteUser}\n containedButtonDisabled={\n !email.replace(/\\s/g, \"\").length ||\n emailError ||\n showLoading ||\n (!isEmailValid(email) && email)\n }\n containedButtonLoading={showLoading}\n >\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={createTheme(\n adaptV4Theme({\n overrides: {\n MuiMenu: {\n list: {\n padding: 0,\n backgroundColor,\n },\n },\n MuiSelect: {\n select: { color: textOnBackgroundColor },\n icon: { color: textOnBackgroundColor },\n },\n },\n })\n )}\n >\n <TextField\n value={auth}\n onChange={(event) =>\n this.setState({\n selectOpen: false,\n auth: event.target.value,\n })\n }\n variant=\"outlined\"\n select\n required\n style={{\n width: \"100%\",\n marginBottom: \"24px\",\n }}\n label={t`Role`}\n InputLabelProps={auth ? { shrink: true } : {}}\n SelectProps={{\n open: selectOpen,\n onOpen: () => {\n this.setState({ selectOpen: true });\n\n if (window.cordova) {\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton\n );\n\n this.setState({ backStackIndex: ++window.backStack });\n }\n },\n onClose: this.handleMenuClose,\n }}\n >\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n value=\"admin\"\n >\n {t(adminName || \"Admin\")}\n </MenuItem>\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n value=\"editor\"\n >\n {t(editorName || \"Editor\")}\n </MenuItem>\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n value=\"viewer\"\n >\n {t(viewerName || \"Viewer\")}\n </MenuItem>\n </TextField>\n </ThemeProvider>\n </StyledEngineProvider>\n <TextField\n id=\"invite-user-email\"\n label={t`Email`}\n type=\"email\"\n value={email}\n variant=\"outlined\"\n error={\n emailEmpty || emailError || (!isEmailValid(email) && email)\n }\n helperText={\n emailEmpty\n ? t`This field is required`\n : !isEmailValid(email) && email\n ? t`Enter a valid email`\n : emailError || \" \"\n }\n onChange={(event) =>\n this.setState({\n email: event.target.value,\n emailEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n emailError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (event.key === \"Enter\" && !emailEmpty) this.inviteUser();\n }}\n style={{\n width: \"100%\",\n }}\n InputLabelProps={email ? { shrink: true } : {}}\n InputProps={{\n endAdornment: email && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n email: \"\",\n emailEmpty: true,\n emailError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </GenericDialog>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport { withTranslation } from \"react-i18next\"\n\nexport default graphql(\n gql`\n mutation RevokeInvite($id: ID!) {\n revokePendingShare(id: $id)\n }\n `,\n {\n name: \"RevokeInvite\",\n }\n)(\n withTranslation()(\n class RevokeInvite extends Component {\n constructor(props) {\n super(props)\n\n this.state = { showLoading: false }\n }\n\n revokeInvite = async () => {\n this.setState({ showLoading: true })\n\n await this.props.RevokeInvite({\n variables: {\n id: this.props.menuTarget.id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n revokePendingShare: {\n id: this.props.menuTarget.id,\n __typename: \"PendingShare\",\n },\n },\n })\n\n this.setState({ showLoading: false })\n\n this.props.close()\n }\n\n render() {\n const { t } = this.props\n\n return (\n <GenericDialog\n open={this.props.open}\n close={this.props.close}\n title={t`Revoke invite`}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n isContainedButtonRed\n containedButton={t`Revoke`}\n containedButtonFunction={this.revokeInvite}\n containedButtonLoading={this.state.showLoading}\n containedButtonDisabled={this.state.showLoading}\n >\n {t`Are you sure you want to revoke your invite to ` +\n (this.props.menuTarget &&\n this.props.menuTarget.recipient &&\n this.props.menuTarget.recipient.name) +\n \"?\"}\n </GenericDialog>\n )\n }\n }\n )\n)\n","import React, { Component } from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { withTranslation } from \"react-i18next\"\n\nexport default graphql(\n gql`\n mutation RevokePendingTransfer($id: ID!) {\n revokePendingTransfer(id: $id)\n }\n `,\n {\n name: \"RevokePendingTransfer\",\n }\n)(\n withTranslation()(\n class RevokeTransfer extends Component {\n constructor(props) {\n super(props)\n\n this.state = { showLoading: false }\n }\n\n revokeInvite = async () => {\n this.setState({ showLoading: true })\n\n try {\n await this.props.RevokePendingTransfer({\n variables: {\n id: this.props.menuTarget.id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n revokePendingTransfer: {\n id: this.props.menuTarget.id,\n __typename: \"PendingTransfer\",\n },\n },\n })\n\n this.setState({ showLoading: false })\n\n this.props.close()\n } catch (e) {\n this.setState({ showLoading: false })\n }\n }\n\n render() {\n const { t } = this.props\n\n return (\n <GenericDialog\n open={this.props.open}\n close={this.props.close}\n title={t`Revoke invite`}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n isContainedButtonRed\n containedButton={t`Revoke`}\n containedButtonFunction={this.revokeInvite}\n containedButtonLoading={this.state.showLoading}\n containedButtonDisabled={this.state.showLoading}\n >\n {t`Are you sure you want to revoke your invite to ` +\n (this.props.menuTarget &&\n this.props.menuTarget.recipient &&\n this.props.menuTarget.recipient.name) +\n \"?\"}\n </GenericDialog>\n )\n }\n }\n )\n)\n","import React from \"react\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport { withTranslation } from \"react-i18next\"\n\nconst { REACT_APP_COLLECTION_NAME: collectionName } = process.env\n\nexport default withTranslation()(\n ({ t, open, close, stopSharing, showLoading, menuTarget }) => (\n <GenericDialog\n open={open}\n close={close}\n title={t`Stop sharing`}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Stop sharing`}\n containedButtonFunction={stopSharing}\n containedButtonLoading={showLoading}\n containedButtonDisabled={showLoading}\n isContainedButtonRed\n >\n {t(\n \"Are you sure you want to stop sharing this \" +\n (collectionName?.toLowerCase() || \"collection\") +\n \" with \"\n ) +\n menuTarget?.name +\n \"?\"}\n </GenericDialog>\n )\n)\n","import { graphql } from \"@apollo/react-hoc\";\nimport {\n CenteredSpinner,\n ErrorScreen,\n GenericDialog,\n getNotchHeight,\n isRoleAtLeast,\n} from \"@igloocloud/igloosharedui\";\nimport Igloo, { User } from \"@igloocloud/react-igloo\";\nimport { RemoveCircleOutline, SwapHoriz } from \"@mui/icons-material\";\nimport Edit from \"@mui/icons-material/Edit\";\nimport MoreVert from \"@mui/icons-material/MoreVert\";\nimport PersonAdd from \"@mui/icons-material/PersonAdd\";\nimport RemoveCircle from \"@mui/icons-material/RemoveCircle\";\nimport Avatar from \"@mui/material/Avatar\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport IconButton from \"@mui/material/IconButton\";\nimport LinearProgress from \"@mui/material/LinearProgress\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemAvatar from \"@mui/material/ListItemAvatar\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Typography from \"@mui/material/Typography\";\nimport gql from \"graphql-tag\";\nimport IsOnline from \"is-online-component\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport tinyColor from \"tinycolor2\";\nimport ChangeOwner from \"./ChangeOwner\";\nimport ChangeRole from \"./ChangeRole\";\nimport InviteUser from \"./InviteUser\";\nimport RevokeInvite from \"./RevokeInvite\";\nimport RevokeTransfer from \"./RevokeTransfer\";\nimport StopSharing from \"./StopSharing\";\n\nlet dialogContent = null;\n\nconst errorColor = process.env.REACT_APP_ERROR_COLOR;\nconst backgroundColor = process.env.REACT_APP_MAIN_BACKGROUND_COLOR;\nconst textOnBackgroundColor =\n process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR;\nconst profileIconColors = JSON.parse(process.env.REACT_APP_PROFILE_ICON_COLORS);\n\nexport default graphql(\n gql`\n mutation StopSharing($email: String!, $collectionId: ID!) {\n stopSharingCollection(email: $email, collectionId: $collectionId) {\n id\n }\n }\n `,\n {\n name: \"StopSharing\",\n }\n)(\n graphql(\n gql`\n mutation ChangeRole($email: String, $collectionId: ID!, $newRole: Role!) {\n changeRole(\n email: $email\n collectionId: $collectionId\n newRole: $newRole\n ) {\n id\n }\n }\n `,\n {\n name: \"ChangeRole\",\n }\n )(\n withTranslation()(\n class ShareCollection extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n anchorEl: null,\n hasReceivedOpen: false,\n inviteUserOpen: false,\n changeRoleOpen: false,\n stopSharingOpen: false,\n changeOwnerOpen: false,\n revokeTransferOpen: false,\n selectedUserForChangeRoleDialog: \"\",\n backStackIndex: 0,\n backStackIndex2: 0,\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.open !== this.props.open && nextProps.open) {\n this.setState({ hasReceivedOpen: true });\n }\n }\n\n stopSharing = async () => {\n this.setState({ showStopSharingLoading: true });\n\n await this.props.StopSharing({\n variables: {\n collectionId: this.props.collection.id,\n email: this.state.menuTarget.email,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n stopSharingCollection: {\n id: this.props.collection.id,\n email: this.state.menuTarget.email,\n __typename: \"Collection\",\n },\n },\n });\n\n this.setState({\n stopSharingOpen: false,\n showStopSharingLoading: false,\n });\n };\n\n changeRole = (role) => {\n this.props.ChangeRole({\n variables: {\n newRole: role.toUpperCase(),\n collectionId: this.props.collection.id,\n email: this.state.menuTarget.email,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n shareCollection: {\n id: this.props.collection.id,\n email: this.state.menuTarget.email,\n newRole: role.toUpperCase(),\n __typename: \"Collection\",\n },\n },\n });\n };\n\n handleBackButton = () => {\n if (this.state.backStackIndex === window.backStack) {\n this.handleMenuClose();\n }\n };\n\n handleMenuClose = () => {\n this.setState({ anchorEl: null });\n\n if (window.cordova) {\n this.setState({ backStackIndex: 0 });\n\n --window.backStack;\n\n document.removeEventListener(\"backbutton\", this.handleBackButton);\n }\n };\n\n handleBackButton2 = () => {\n if (this.state.backStackIndex2 === window.backStack) {\n this.handleMenuClose2();\n }\n };\n\n handleMenuClose2 = () => {\n this.setState({ anchorEl2: null });\n\n if (window.cordova) {\n this.setState({ backStackIndex2: 0 });\n\n --window.backStack;\n\n document.removeEventListener(\"backbutton\", this.handleBackButton2);\n }\n };\n\n render() {\n const { t } = this.props;\n const { REACT_APP_COLLECTION_NAME: collectionName } = process.env;\n\n return (\n <Igloo\n server={\n localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") + localStorage.getItem(\"server\")\n : `https://v1.igloo.ooo`\n }\n bearer={\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\"\n }\n >\n <GenericDialog\n open={this.props.open}\n hidden={\n this.state.inviteUserOpen ||\n this.state.changeRoleOpen ||\n this.state.stopSharingOpen ||\n this.state.changeOwnerOpen ||\n this.state.revokeInviteOpen ||\n this.state.revokeTransferOpen\n }\n close={this.props.close}\n title={t(\n \"Share \" + (collectionName?.toLowerCase() || \"collection\")\n )}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n noDialogContent\n >\n {this.state.hasReceivedOpen && (\n <ShareContent\n collection={this.props.collection}\n userData={this.props.userData}\n client={this.props.client}\n openInviteUser={() =>\n this.setState({ inviteUserOpen: true })\n }\n openChangeRole={() =>\n this.setState({ changeRoleOpen: true, pending: false })\n }\n openStopSharing={() =>\n this.setState({ stopSharingOpen: true })\n }\n openChangeOwner={() =>\n this.setState({ changeOwnerOpen: true })\n }\n openRevokeTransfer={() =>\n this.setState({ revokeTransferOpen: true })\n }\n openMenu={(anchorEl) => this.setState({ anchorEl })}\n openPendingMenu={(anchorEl2) =>\n this.setState({ anchorEl2 })\n }\n setMenuTarget={(menuTarget) =>\n this.setState({ menuTarget })\n }\n setSelectedUser={(selectedUserForChangeRoleDialog) =>\n this.setState({ selectedUserForChangeRoleDialog })\n }\n t={t}\n />\n )}\n <Menu\n anchorEl={this.state.anchorEl}\n open={this.state.anchorEl}\n onClose={() => this.handleMenuClose()}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n style: { backgroundColor },\n }}\n TransitionProps={{\n onEnter: () => {\n if (window.cordova) {\n this.setState({ backStackIndex: ++window.backStack });\n\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton\n );\n }\n },\n }}\n >\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ changeRoleOpen: true });\n }}\n >\n <ListItemIcon>\n <Edit />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Change role`}\n </Typography>\n </MenuItem>\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ stopSharingOpen: true });\n }}\n >\n <ListItemIcon>\n <RemoveCircle style={{ color: errorColor }} />\n </ListItemIcon>\n <Typography\n variant=\"inherit\"\n noWrap\n style={{ color: errorColor }}\n >\n {t`Stop sharing`}\n </Typography>\n </MenuItem>\n </Menu>\n <Menu\n anchorEl={this.state.anchorEl2}\n open={this.state.anchorEl2}\n onClose={() => this.handleMenuClose2()}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n style: { backgroundColor },\n }}\n TransitionProps={{\n onEnter: () => {\n if (window.cordova) {\n this.setState({ backStackIndex2: ++window.backStack });\n\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton2\n );\n }\n },\n }}\n >\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose2();\n\n this.setState({ changeRoleOpen: true, pending: true });\n }}\n >\n <ListItemIcon>\n <Edit />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Change role`}\n </Typography>\n </MenuItem>\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose2();\n\n this.setState({ revokeInviteOpen: true });\n }}\n >\n <ListItemIcon>\n <RemoveCircle style={{ color: errorColor }} />\n </ListItemIcon>\n <Typography\n variant=\"inherit\"\n noWrap\n style={{ color: errorColor }}\n >\n {t`Revoke invite`}\n </Typography>\n </MenuItem>\n </Menu>\n </GenericDialog>\n <RevokeInvite\n open={this.state.revokeInviteOpen}\n close={() => this.setState({ revokeInviteOpen: false })}\n menuTarget={this.state.menuTarget}\n />\n <StopSharing\n open={this.state.stopSharingOpen}\n close={() => this.setState({ stopSharingOpen: false })}\n stopSharing={this.stopSharing}\n menuTarget={this.state.menuTarget}\n showLoading={this.state.showStopSharingLoading}\n />\n <ChangeRole\n open={this.state.changeRoleOpen}\n close={() => this.setState({ changeRoleOpen: false })}\n changeRole={this.changeRole}\n selectedUserType={this.state.selectedUserForChangeRoleDialog}\n menuTarget={this.state.menuTarget}\n pending={this.state.pending}\n />\n <ChangeOwner\n open={this.state.changeOwnerOpen}\n close={() => this.setState({ changeOwnerOpen: false })}\n client={this.props.client}\n collectionId={this.props.collection.id}\n />\n <InviteUser\n open={this.state.inviteUserOpen}\n close={() => this.setState({ inviteUserOpen: false })}\n client={this.props.client}\n collectionId={this.props.collection.id}\n />\n <RevokeTransfer\n open={this.state.revokeTransferOpen}\n close={() => this.setState({ revokeTransferOpen: false })}\n menuTarget={this.state.menuTarget}\n />\n </Igloo>\n );\n }\n }\n )\n )\n);\n\nconst ShareContent = graphql(\n gql`\n query (\n $id: ID!\n $editorOffset: NaturalNumber\n $editorLimit: NaturalNumber!\n $pendingEditorOffset: NaturalNumber\n $pendingEditorLimit: NaturalNumber!\n $viewerOffset: NaturalNumber\n $viewerLimit: NaturalNumber!\n $pendingViewerOffset: NaturalNumber\n $pendingViewerLimit: NaturalNumber!\n ) {\n collection(id: $id) {\n id\n myRole\n pendingTransfer {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n pendingAdminShareCount: pendingShareCount(filter: { role: ADMIN })\n pendingAdminShares: pendingShares(\n offset: $pendingEditorOffset\n limit: $pendingEditorLimit\n filter: { role: ADMIN }\n ) {\n id\n role\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n pendingEditorShareCount: pendingShareCount(filter: { role: EDITOR })\n pendingEditorShares: pendingShares(\n offset: $pendingEditorOffset\n limit: $pendingEditorLimit\n filter: { role: EDITOR }\n ) {\n id\n role\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n pendingViewerShareCount: pendingShareCount(filter: { role: VIEWER })\n pendingViewerShares: pendingShares(\n offset: $pendingViewerOffset\n limit: $pendingViewerLimit\n filter: { role: VIEWER }\n ) {\n id\n role\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n owner {\n id\n email\n name\n profileIconColor\n }\n adminCount\n admins(offset: $editorOffset, limit: $editorLimit) {\n id\n email\n name\n profileIconColor\n }\n editorCount\n editors(offset: $editorOffset, limit: $editorLimit) {\n id\n email\n name\n profileIconColor\n }\n viewerCount\n viewers(offset: $viewerOffset, limit: $viewerLimit) {\n id\n email\n name\n profileIconColor\n }\n }\n }\n `,\n {\n name: \"shareData\",\n options: ({ collection }) => ({\n variables: {\n editorOffset: 0,\n editorLimit: 20,\n pendingEditorOffset: 0,\n pendingEditorLimit: 20,\n viewerOffset: 0,\n viewerLimit: 20,\n pendingViewerOffset: 0,\n pendingViewerLimit: 20,\n id: collection.id,\n },\n }),\n }\n)(\n class ShareDialogContent extends Component {\n constructor(props) {\n super(props);\n\n this.state = { fetchMoreLoading: false };\n }\n\n componentDidMount() {\n this.props.shareData.refetch();\n\n this.props.shareData.subscribeToMore({\n document: gql`\n subscription {\n pendingShareDeclined\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n return {\n collection: {\n ...prev.collection,\n pendingEditorShares: prev.collection.pendingEditorShares.filter(\n (editor) =>\n editor.id !== subscriptionData.data.pendingShareDeclined\n ),\n pendingViewerShares: prev.collection.pendingViewerShares.filter(\n (viewer) =>\n viewer.id !== subscriptionData.data.pendingShareDeclined\n ),\n },\n };\n },\n });\n\n this.props.shareData.subscribeToMore({\n document: gql`\n subscription {\n collectionUpdated {\n id\n pendingTransfer {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n }\n }\n `,\n });\n\n this.props.shareData.subscribeToMore({\n document: gql`\n subscription {\n pendingShareCreated {\n id\n role\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n if (subscriptionData.data.pendingShare.role === \"EDITOR\") {\n const newEditorShares = [\n ...prev.collection.pendingEditorShares,\n subscriptionData.data.pendingShare,\n ];\n\n return {\n collection: {\n ...prev.collection,\n pendingEditorShares: newEditorShares,\n },\n };\n }\n\n if (subscriptionData.data.pendingShare.role === \"VIEWER\") {\n const newViewerShares = [\n ...prev.collection.pendingViewerShares,\n subscriptionData.data.pendingShare,\n ];\n\n return {\n collection: {\n ...prev.collection,\n pendingViewerShares: newViewerShares,\n },\n };\n }\n },\n });\n\n this.props.shareData.subscribeToMore({\n document: gql`\n subscription {\n pendingShareRevoked\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n return {\n collection: {\n ...prev.collection,\n editors: prev.collection.editors.filter(\n (editor) =>\n editor.id !== subscriptionData.data.pendingShareRevoked\n ),\n viewers: prev.collection.viewers.filter(\n (viewer) =>\n viewer.id !== subscriptionData.data.pendingShareRevoked\n ),\n },\n };\n },\n });\n\n this.props.shareData.subscribeToMore({\n document: gql`\n subscription {\n userLeftCollection {\n user {\n id\n }\n collection {\n id\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n if (\n subscriptionData.data.userLeftCollection.collection.id !==\n prev.collection.id\n ) {\n return prev;\n }\n\n return {\n collection: {\n ...prev.collection,\n editors: prev.collection.editors.filter(\n (editor) =>\n editor.id !== subscriptionData.data.userLeftCollection.user.id\n ),\n viewer: prev.collection.viewers.filter(\n (viewer) =>\n viewer.id !== subscriptionData.data.userLeftCollection.user.id\n ),\n },\n };\n },\n });\n\n const pendingShareAcceptedSubscription = gql`\n subscription {\n pendingShareAccepted {\n id\n role\n recipient {\n id\n profileIconColor\n name\n email\n }\n }\n }\n `;\n\n this.props.shareData.subscribeToMore({\n document: pendingShareAcceptedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n return {\n collection: {\n ...prev.collection,\n editors:\n subscriptionData.data.pendingShareAccepted.role === \"EDITOR\"\n ? [\n ...prev.collection.editors,\n subscriptionData.data.pendingShareAccepted.recipient,\n ]\n : prev.collection.editors,\n pendingEditorShares: prev.collection.pendingEditorShares.filter(\n (editor) =>\n editor.id !== subscriptionData.data.pendingShareAccepted.id\n ),\n viewers:\n subscriptionData.data.pendingShareAccepted.role === \"VIEWER\"\n ? [\n ...prev.collection.viewers,\n subscriptionData.data.pendingShareAccepted.recipient,\n ]\n : prev.collection.viewers,\n pendingViewerShares: prev.collection.pendingViewerShares.filter(\n (viewer) =>\n viewer.id !== subscriptionData.data.pendingShareAccepted.id\n ),\n },\n };\n },\n });\n }\n\n queryMore = async () => {\n if (!this.queryMore.locked) {\n //EDITORS\n if (\n this.props.shareData.collection.editorCount >\n this.props.shareData.collection.editors.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.shareData.fetchMore({\n variables: {\n offset: this.props.shareData.collection.editors.length,\n limit:\n this.props.shareData.collection.editorCount -\n this.props.shareData.collection.editors.length >=\n 20\n ? 20\n : this.props.shareData.collection.editorCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newEditors = [\n ...prev.collection.editors,\n ...fetchMoreResult.collection.editors,\n ];\n\n return {\n collection: {\n ...prev.collection,\n editors: newEditors,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n } else {\n //PENDING EDITORS\n if (\n this.props.shareData.collection.pendingEditorShareCount >\n this.props.shareData.collection.pendingEditorShares.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.shareData.fetchMore({\n variables: {\n offset:\n this.props.shareData.collection.pendingEditorShares.length,\n limit:\n this.props.shareData.collection.pendingEditorShareCount -\n this.props.shareData.collection.pendingEditorShares\n .length >=\n 20\n ? 20\n : this.props.shareData.collection\n .pendingEditorShareCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newPendingEditorShares = [\n ...prev.collection.pendingEditorShares,\n ...fetchMoreResult.collection.pendingEditorShares,\n ];\n\n return {\n collection: {\n ...prev.collection,\n editors: newPendingEditorShares,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n } else {\n //VIEWERS\n if (\n this.props.shareData.collection.viewerCount >\n this.props.shareData.collection.viewers.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.shareData.fetchMore({\n variables: {\n offset: this.props.shareData.collection.viewers.length,\n limit:\n this.props.shareData.collection.viewerCount -\n this.props.shareData.collection.viewers.length >=\n 20\n ? 20\n : this.props.shareData.collection.viewerCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newViewers = [\n ...prev.collection.viewers,\n ...fetchMoreResult.collection.viewers,\n ];\n\n return {\n collection: {\n ...prev.collection,\n editors: newViewers,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n } else {\n if (\n this.props.shareData.collection.pendingViewerShareCount >\n this.props.shareData.collection.pendingViewerShares.length\n ) {\n this.queryMore.locked = true;\n\n try {\n this.setState({ fetchMoreLoading: true });\n await this.props.shareData.fetchMore({\n variables: {\n offset:\n this.props.shareData.collection.pendingViewerShares\n .length,\n limit:\n this.props.shareData.collection\n .pendingViewerShareCount -\n this.props.shareData.collection.pendingViewerShares\n .length >=\n 20\n ? 20\n : this.props.shareData.collection\n .pendingViewerShareCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newPendingViewerShares = [\n ...prev.collection.pendingViewerShares,\n ...fetchMoreResult.collection.pendingViewerShares,\n ];\n\n return {\n collection: {\n ...prev.collection,\n editors: newPendingViewerShares,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.queryMore.locked = false;\n\n return { fetchMoreLoading: false };\n });\n }\n }\n }\n }\n }\n }\n };\n\n getInitials = (string) => {\n if (string) {\n let names = string.trim().split(\" \"),\n initials = names[0].substring(0, 1).toUpperCase();\n\n if (names.length > 1) {\n initials += names[names.length - 1].substring(0, 1).toUpperCase();\n }\n return initials;\n }\n };\n\n render() {\n const {\n shareData: { loading, error, collection, refetch },\n fullScreen,\n t,\n } = this.props;\n\n const {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_OWNER_NAME: ownerName,\n REACT_APP_ADMINS_NAME: adminsName,\n REACT_APP_EDITORS_NAME: editorsName,\n REACT_APP_VIEWERS_NAME: viewersName,\n } = process.env;\n\n const subheaderStyle = {\n paddingLeft: fullScreen\n ? \"calc(16px + \" + getNotchHeight(\"left\") + \")\"\n : \"16px\",\n paddingRight: fullScreen\n ? \"calc(16px + \" + getNotchHeight(\"right\") + \")\"\n : \"16px\",\n };\n\n const listItemStyle = {\n paddingLeft: fullScreen\n ? \"calc(24px + \" + getNotchHeight(\"left\") + \")\"\n : \"24px\",\n paddingRight: fullScreen\n ? \"calc(24px + \" + getNotchHeight(\"right\") + \")\"\n : \"24px\",\n };\n\n if (loading)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <CenteredSpinner />\n </div>\n );\n\n if (error)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <ErrorScreen\n refetch={() =>\n refetch({\n editorOffset: 0,\n editorLimit: 20,\n pendingEditorOffset: 0,\n pendingEditorLimit: 20,\n viewerOffset: 0,\n viewerLimit: 20,\n pendingViewerOffset: 0,\n pendingViewerLimit: 20,\n id: collection.id,\n })\n }\n error={error}\n />\n </div>\n );\n\n if (collection)\n dialogContent = (\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore();\n }}\n >\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.shareData.refetch();\n }\n }}\n />\n <List subheader={<li />} style={{ height: \"100%\", padding: \"0\" }}>\n {isRoleAtLeast(collection.myRole, \"ADMIN\") && (\n <ListItem\n button\n onClick={() => this.props.openInviteUser()}\n style={listItemStyle}\n >\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor: \"transparent\",\n }}\n >\n <PersonAdd\n style={{\n color: textColor,\n }}\n />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {t`Send an invite`}\n </font>\n }\n />\n </ListItem>\n )}\n <li key=\"Owner\">\n <ul style={{ padding: \"0\" }}>\n <ListSubheader\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.54)\n .toRgbString(),\n backgroundColor,\n cursor: \"default\",\n ...subheaderStyle,\n }}\n className=\"notSelectable defaultCursor\"\n >\n {t`Owner`}\n </ListSubheader>\n <User\n id={collection.owner.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => refetch()}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={collection.owner.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : collection.owner.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : collection.owner.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : collection.owner.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {this.props.userData.user.email ===\n (data?.email || collection.owner.email)\n ? t`You`\n : data\n ? data.name\n : collection.owner.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || collection.owner.email)\n ? \"\"\n : data\n ? data.email\n : collection.owner.email}\n </font>\n }\n />\n {this.props.userData.user.email ===\n ((data && data.email) || collection.owner.email) && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={this.props.openChangeOwner}\n size=\"large\"\n >\n <SwapHoriz />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n {isRoleAtLeast(collection.myRole, \"ADMIN\") &&\n collection.pendingTransfer && (\n <User\n id={collection.pendingTransfer.recipient.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => refetch()}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem\n key={collection.pendingTransfer.id}\n style={listItemStyle}\n >\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : collection.pendingTransfer.recipient\n .profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : collection.pendingTransfer.recipient\n .profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data\n ? data.name\n : collection.pendingTransfer.recipient.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {this.props.userData.user.email ===\n (data?.email ||\n collection.pendingTransfer.recipient.email)\n ? t`You`\n : data\n ? data.name\n : collection.pendingTransfer.recipient.name}\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {\" (\" + t`pending` + \")\"}\n </font>\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {data\n ? data.email\n : collection.pendingTransfer.recipient\n .email}\n </font>\n }\n />\n {(collection.myRole === \"EDITOR\" ||\n collection.myRole === \"OWNER\") && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.setMenuTarget(\n collection.pendingTransfer\n );\n this.props.openRevokeTransfer();\n }}\n size=\"large\"\n >\n <RemoveCircleOutline />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n )}\n </ul>\n </li>\n {((collection.admins && collection.admins[0]) ||\n (collection.pendingAdminShares &&\n collection.pendingAdminShares[0])) && (\n <li>\n <ul style={{ padding: \"0\" }}>\n <ListSubheader\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.54)\n .toRgbString(),\n backgroundColor,\n cursor: \"default\",\n ...subheaderStyle,\n }}\n >\n {t(adminsName || \"Admins\")}\n </ListSubheader>\n {collection.admins &&\n collection.admins[0] &&\n collection.admins.map((item) => (\n <User\n id={item.id}\n key={item.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => refetch()}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={item.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : item.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? t`You`\n : (data && data.name) || item.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? \"\"\n : (data && data.email) || item.email}\n </font>\n }\n />\n {isRoleAtLeast(collection.myRole, \"ADMIN\") &&\n this.props.userData.user.email !==\n ((data && data.email) || item.email) && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.openMenu(\n event.currentTarget\n );\n this.props.setMenuTarget(item);\n this.props.setSelectedUser(\"editor\");\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n ))}\n {collection.pendingAdminShares &&\n collection.pendingAdminShares[0] &&\n collection.pendingAdminShares.map((item) => (\n <User\n key={\"pending-admin-share-\" + item.id}\n id={item.recipient.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => {\n refetch();\n }}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={item.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.recipient.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.recipient.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : item.recipient.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {data ? data.name : item.recipient.name}\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {\" (\" + t`pending` + \")\"}\n </font>\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {data ? data.email : item.recipient.email}\n </font>\n }\n />\n {isRoleAtLeast(collection.myRole, \"ADMIN\") && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.setMenuTarget(item);\n this.props.setSelectedUser(\"editor\");\n this.props.openPendingMenu(\n event.currentTarget\n );\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n ))}\n </ul>\n </li>\n )}\n {((collection.editors && collection.editors[0]) ||\n (collection.pendingEditorShares &&\n collection.pendingEditorShares[0])) && (\n <li>\n <ul style={{ padding: \"0\" }}>\n <ListSubheader\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.54)\n .toRgbString(),\n backgroundColor,\n cursor: \"default\",\n ...subheaderStyle,\n }}\n >\n {t(editorsName || \"Editors\")}\n </ListSubheader>\n {collection.editors &&\n collection.editors[0] &&\n collection.editors.map((item) => (\n <User\n id={item.id}\n key={item.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => refetch()}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={item.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : item.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? t`You`\n : (data && data.name) || item.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? \"\"\n : (data && data.email) || item.email}\n </font>\n }\n />\n {isRoleAtLeast(collection.myRole, \"ADMIN\") &&\n this.props.userData.user.email !==\n ((data && data.email) || item.email) && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.openMenu(\n event.currentTarget\n );\n this.props.setMenuTarget(item);\n this.props.setSelectedUser(\"editor\");\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n ))}\n </ul>\n </li>\n )}\n {((collection.viewers && collection.viewers[0]) ||\n (collection.pendingViewerShares &&\n collection.pendingViewerShares[0])) && (\n <li>\n <ul style={{ padding: \"0\" }}>\n <ListSubheader\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.54)\n .toRgbString(),\n backgroundColor,\n cursor: \"default\",\n ...subheaderStyle,\n }}\n >\n {t(viewersName || \"Viewers\")}\n </ListSubheader>\n {collection.viewers &&\n collection.viewers[0] &&\n collection.viewers.map((item) => (\n <User\n key={item.id}\n id={item.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => refetch()}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={item.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : item.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? t`You`\n : (data && data.name) || item.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {this.props.userData.user.email ===\n ((data && data.email) || item.email)\n ? \"\"\n : (data && data.email) || item.email}\n </font>\n }\n />\n {isRoleAtLeast(collection.myRole, \"ADMIN\") &&\n this.props.userData.user.email !==\n ((data && data.email) || item.email) && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.openMenu(\n event.currentTarget\n );\n this.props.setMenuTarget(item);\n this.props.setSelectedUser(\"viewer\");\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n ))}\n {collection.pendingViewerShares &&\n collection.pendingViewerShares[0] &&\n collection.pendingViewerShares.map((item) => (\n <User\n key={\"pending-viewer-share-\" + item.id}\n id={item.recipient.id}\n fields={[\"profileIconColor\", \"name\", \"email\"]}\n onDelete={() => {\n refetch();\n }}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ data }) => (\n <ListItem key={item.id} style={listItemStyle}>\n <ListItemAvatar>\n <Avatar\n style={{\n backgroundColor:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.recipient.profileIconColor) %\n profileIconColors.length\n ][0],\n color:\n profileIconColors[\n (data\n ? data.profileIconColor\n : item.recipient.profileIconColor) %\n profileIconColors.length\n ][1],\n }}\n >\n {this.getInitials(\n data ? data.name : item.recipient.name\n )}\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {data ? data.name : item.recipient.name}\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {\" (\" + t`pending` + \")\"}\n </font>\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textOnBackgroundColor)\n .setAlpha(0.72)\n .toRgbString(),\n }}\n >\n {data ? data.email : item.recipient.email}\n </font>\n }\n />\n {isRoleAtLeast(collection.myRole, \"ADMIN\") && (\n <ListItemSecondaryAction>\n <IconButton\n onClick={(event) => {\n this.props.setMenuTarget(item);\n this.props.setSelectedUser(\"viewer\");\n this.props.openPendingMenu(\n event.currentTarget\n );\n }}\n size=\"large\"\n >\n <MoreVert />\n </IconButton>\n </ListItemSecondaryAction>\n )}\n </ListItem>\n )}\n </User>\n ))}\n </ul>\n </li>\n )}\n </List>\n {this.state.fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n );\n\n return dialogContent;\n }\n }\n);\n","import { graphql } from \"@apollo/react-hoc\";\nimport { isRoleAtLeast } from \"@igloocloud/igloosharedui\";\nimport Create from \"@mui/icons-material/Create\";\nimport Delete from \"@mui/icons-material/Delete\";\nimport Info from \"@mui/icons-material/Info\";\nimport MoreVert from \"@mui/icons-material/MoreVert\";\nimport Notifications from \"@mui/icons-material/Notifications\";\nimport NotificationsOff from \"@mui/icons-material/NotificationsOff\";\nimport RemoveCircle from \"@mui/icons-material/RemoveCircle\";\nimport Share from \"@mui/icons-material/Share\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport Divider from \"@mui/material/Divider\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Paper from \"@mui/material/Paper\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport Typography from \"@mui/material/Typography\";\nimport gql from \"graphql-tag\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport { Link } from \"react-router-dom\";\nimport CollectionInfo from \"./CollectionInfo\";\nimport CustomizeCollection from \"./CustomizeCollection\";\nimport DeleteCollection from \"./DeleteCollection\";\nimport LeaveCollection from \"./LeaveCollection\";\nimport ShareCollection from \"./ShareCollection\";\n\nconst {\n REACT_APP_SHOW_NOTIFICATIONS: showNotifications,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnBackgroundColor,\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_ERROR_COLOR: errorColor,\n} = process.env;\n\nexport default graphql(\n gql`\n mutation ToggleQuietMode($id: ID!, $muted: Boolean) {\n updateCollection(id: $id, muted: $muted) {\n id\n muted\n }\n }\n `,\n {\n name: \"ToggleQuietMode\",\n }\n)(\n withTranslation()(\n class CollectionCard extends Component {\n constructor(props) {\n super(props);\n\n const importAll = (require) =>\n require.keys().reduce((acc, next) => {\n acc[next.replace(\"./\", \"\")] = require(next);\n return acc;\n }, {});\n\n this.images = Object.values(\n importAll(\n require.context(\n \"../../styles/assets/collectionCards\",\n false,\n /\\.(png|jpe?g|svg)$/\n )\n )\n );\n\n this.state = {\n deleteOpen: false,\n renameOpen: false,\n shareOpen: false,\n anchorEl: null,\n backStackIndex: 0,\n };\n }\n\n toggleFavorite = (favorite) =>\n this.props.ToggleFavorite({\n variables: {\n id: this.props.collection.id,\n favorite,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n collection: {\n id: this.props.collection.id,\n favorite,\n __typename: \"Collection\",\n },\n },\n });\n\n toggleQuietMode = (muted) =>\n this.props.ToggleQuietMode({\n variables: {\n id: this.props.collection.id,\n muted,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n collection: {\n id: this.props.collection.id,\n muted,\n __typename: \"Collection\",\n },\n },\n });\n\n handleBackButton = () => {\n if (this.state.backStackIndex === window.backStack) {\n this.handleMenuClose();\n }\n };\n\n handleMenuClose = () => {\n this.setState({ anchorEl: null });\n\n if (window.cordova) {\n this.setState({ backStackIndex: 0 });\n\n --window.backStack;\n\n document.removeEventListener(\"backbutton\", this.handleBackButton);\n }\n };\n\n render() {\n const { collection, t } = this.props;\n\n return (\n <>\n <Paper\n style={{\n backgroundColor,\n width: \"100%\",\n height: \"100%\",\n }}\n tabIndex=\"-1\"\n elevation={5}\n >\n <div style={{ padding: \"8px\", textAlign: \"right\" }}>\n <IconButton\n onClick={(event) =>\n this.setState({ anchorEl: event.currentTarget })\n }\n style={{ zIndex: 10, color: textColor }}\n size=\"large\"\n >\n {/*makes the IconButton appear over the ButtonBase*/}\n <MoreVert />\n </IconButton>\n </div>\n <Link\n to={\"/?collection=\" + this.props.collection.id}\n style={{\n textDecoration: \"none\",\n color: \"unset\",\n }}\n >\n <ButtonBase\n focusRipple\n style={{\n borderRadius: \"4px\",\n textAlign: \"left\",\n marginTop: \"-64px\",\n zIndex: 0, //makes the ButtonBase appear under the IconButton, making it clickable\n width: \"100%\",\n }}\n >\n <div style={{ height: \"192px\", width: \"100%\" }}>\n <Toolbar\n style={{\n height: \"64px\",\n paddingLeft: \"0\",\n paddingRight: \"0\",\n }}\n >\n <div\n style={{\n borderTopLeftRadius: \"4px\",\n borderTopRightRadius: \"4px\",\n paddingLeft: \"16px\",\n width: \"calc(100% - 16px)\",\n }}\n >\n <Typography\n variant=\"h6\"\n className=\"notSelectable\"\n style={{\n color: textColor,\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n lineHeight: \"64px\",\n width: \"calc(100% - 56px)\",\n }}\n >\n {this.props.collection.name}\n </Typography>\n </div>\n </Toolbar>\n <img\n src={\n this.images[collection.picture % this.images.length]\n .default\n }\n alt=\"Collection\"\n className=\"notSelectable\"\n draggable=\"false\"\n style={{\n width: \"100%\",\n height: \"128px\",\n borderBottomLeftRadius: \"4px\",\n borderBottomRightRadius: \"4px\",\n objectFit: \"cover\",\n }}\n />\n </div>\n </ButtonBase>\n </Link>\n </Paper>\n <Menu\n id=\"collection-card-menu\"\n anchorEl={this.state.anchorEl}\n open={this.state.anchorEl}\n onEnter={() => {\n if (window.cordova) {\n this.setState({ backStackIndex: ++window.backStack });\n\n document.addEventListener(\n \"backbutton\",\n this.handleBackButton\n );\n }\n }}\n onClose={() => this.handleMenuClose()}\n anchorOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"right\",\n }}\n PaperProps={{\n style: {\n backgroundColor,\n },\n }}\n >\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ infoOpen: true });\n }}\n >\n <ListItemIcon>\n <Info />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Information`}\n </Typography>\n </MenuItem>\n <Divider />\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ shareOpen: true });\n }}\n disabled={\n !(\n this.props.userData.user &&\n this.props.userData.user.emailIsVerified\n )\n }\n >\n <ListItemIcon>\n <Share />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Share`}\n </Typography>\n </MenuItem>\n {!isRoleAtLeast(this.props.collection.myRole, \"OWNER\") && (\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ leaveOpen: true });\n }}\n >\n <ListItemIcon>\n <RemoveCircle />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Leave`}\n </Typography>\n </MenuItem>\n )}\n {showNotifications && (\n <>\n <Divider />\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.toggleQuietMode(\n this.props.collection.muted ? false : true\n );\n }}\n disabled={\n this.props.userData.user &&\n this.props.userData.user.quietMode\n }\n >\n <ListItemIcon>\n {this.props.collection.muted ? (\n <Notifications />\n ) : (\n <NotificationsOff />\n )}\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {this.props.collection.muted ? t`Unmute` : t`Mute`}\n </Typography>\n </MenuItem>\n </>\n )}\n {isRoleAtLeast(this.props.collection.myRole, \"ADMIN\") && (\n <>\n <Divider />\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ renameOpen: true });\n }}\n >\n <ListItemIcon>\n <Create />\n </ListItemIcon>\n <Typography variant=\"inherit\" noWrap>\n {t`Customize`}\n </Typography>\n </MenuItem>\n </>\n )}\n {isRoleAtLeast(this.props.collection.myRole, \"ADMIN\") && (\n <MenuItem\n style={{ color: textOnBackgroundColor }}\n onClick={() => {\n this.handleMenuClose();\n\n this.setState({ deleteOpen: true });\n }}\n >\n <ListItemIcon>\n <Delete style={{ color: errorColor }} />\n </ListItemIcon>\n <Typography\n variant=\"inherit\"\n noWrap\n style={{ color: errorColor }}\n >\n {t`Delete`}\n </Typography>\n </MenuItem>\n )}\n </Menu>\n <CollectionInfo\n open={this.state.infoOpen}\n close={() => this.setState({ infoOpen: false })}\n collection={this.props.collection}\n />\n <CustomizeCollection\n open={this.state.renameOpen}\n close={() => this.setState({ renameOpen: false })}\n collection={this.props.collection}\n />\n <DeleteCollection\n open={this.state.deleteOpen}\n close={() => this.setState({ deleteOpen: false })}\n collection={this.props.collection}\n />\n <ShareCollection\n open={this.state.shareOpen}\n close={() => this.setState({ shareOpen: false })}\n collection={this.props.collection}\n userData={this.props.userData}\n client={this.props.client}\n />\n <LeaveCollection\n open={this.state.leaveOpen}\n close={() => this.setState({ leaveOpen: false })}\n collection={this.props.collection}\n userData={this.props.userData}\n />\n </>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport tinyColor from \"tinycolor2\"\nimport IsOnline from \"is-online-component\"\nimport DialogContent from \"@mui/material/DialogContent\"\nimport List from \"@mui/material/List\"\nimport ListItem from \"@mui/material/ListItem\"\nimport ListItemText from \"@mui/material/ListItemText\"\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\"\nimport IconButton from \"@mui/material/IconButton\"\nimport {\n CenteredSpinner,\n ErrorScreen,\n getNotchHeight,\n} from \"@igloocloud/igloosharedui\"\nimport Done from \"@mui/icons-material/Done\"\nimport Close from \"@mui/icons-material/Close\"\nimport LinearProgress from \"@mui/material/LinearProgress\"\nimport { GenericDialog } from \"@igloocloud/igloosharedui\"\nimport Igloo, { User, Collection } from \"@igloocloud/react-igloo\"\nimport { withTranslation } from \"react-i18next\"\n\nlet dialogContent = null\n\nexport default withTranslation()(\n class PendingShares extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n hasReceivedOpen: false,\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.open !== this.props.open && nextProps.open) {\n this.setState({ hasReceivedOpen: true })\n }\n }\n\n render() {\n const { t } = this.props\n\n return (\n <Igloo\n server={\n localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") + localStorage.getItem(\"server\")\n : `https://v1.igloo.ooo`\n }\n bearer={\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\"\n }\n >\n <GenericDialog\n title={t`Pending share requests`}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n noHorizontalPadding\n noDialogContent\n {...this.props}\n >\n {({ fullScreen }) =>\n this.state.hasReceivedOpen && (\n <PendingSharesContent {...this.props} fullScreen={fullScreen} />\n )\n }\n </GenericDialog>\n </Igloo>\n )\n }\n }\n)\n\nconst PendingSharesContent = graphql(\n gql`\n query ($limit: NaturalNumber!, $offset: NaturalNumber) {\n user {\n id\n pendingShareCount\n pendingShares(limit: $limit, offset: $offset) {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n name\n }\n }\n }\n }\n `,\n {\n name: \"pendingSharesData\",\n options: { variables: { offset: 0, limit: 20 } },\n }\n)(\n graphql(\n gql`\n mutation AcceptPendingShare($id: ID!) {\n acceptPendingShare(id: $id) {\n id\n }\n }\n `,\n {\n name: \"AcceptPendingShare\",\n }\n )(\n graphql(\n gql`\n mutation DeclinePendingShare($id: ID!) {\n declinePendingShare(id: $id)\n }\n `,\n {\n name: \"DeclinePendingShare\",\n }\n )(\n class PendingSharesDialogContent extends Component {\n constructor(props) {\n super(props)\n\n this.state = { fetchMoreLoading: false }\n }\n\n AcceptPendingShare = (id) =>\n this.props.AcceptPendingShare({\n variables: {\n id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingShares: {\n id,\n __typename: \"PendingShares\",\n },\n },\n })\n\n DeclinePendingShare = (id) =>\n this.props.DeclinePendingShare({\n variables: {\n id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingShares: {\n id,\n __typename: \"PendingShares\",\n },\n },\n })\n\n componentDidMount() {\n this.props.pendingSharesData.refetch()\n\n const pendingShareCreatedSubscription = gql`\n subscription {\n pendingShareCreated {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n name\n }\n }\n }\n `\n\n this.props.pendingSharesData.subscribeToMore({\n document: pendingShareCreatedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingShares = [\n ...prev.user.pendingShares,\n subscriptionData.data.pendingShareCreated,\n ]\n\n return {\n user: {\n ...prev.user,\n pendingShares: newPendingShares,\n },\n }\n },\n })\n\n this.props.pendingSharesData.subscribeToMore({\n document: gql`\n subscription {\n pendingShareUpdated {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n name\n }\n }\n }\n `,\n })\n\n const pendingShareDeclinedSubscription = gql`\n subscription {\n pendingShareDeclined\n }\n `\n\n this.props.pendingSharesData.subscribeToMore({\n document: pendingShareDeclinedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingShares = prev.user.pendingShares.filter(\n (pendingShare) =>\n pendingShare.id !== subscriptionData.data.pendingShareDeclined\n )\n\n return {\n user: {\n ...prev.user,\n pendingShares: newPendingShares,\n },\n }\n },\n })\n\n const pendingShareRevokedSubscription = gql`\n subscription {\n pendingShareRevoked\n }\n `\n\n this.props.pendingSharesData.subscribeToMore({\n document: pendingShareRevokedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingShares = prev.user.pendingShares.filter(\n (pendingShare) =>\n pendingShare.id !== subscriptionData.data.pendingShareRevoked\n )\n\n return {\n user: {\n ...prev.user,\n pendingShares: newPendingShares,\n },\n }\n },\n })\n\n const pendingShareAcceptedSubscription = gql`\n subscription {\n pendingShareAccepted {\n id\n }\n }\n `\n\n this.props.pendingSharesData.subscribeToMore({\n document: pendingShareAcceptedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingShares = prev.user.pendingShares.filter(\n (pendingShare) =>\n pendingShare.id !==\n subscriptionData.data.pendingShareAccepted.id\n )\n\n return {\n user: {\n ...prev.user,\n pendingShares: newPendingShares,\n },\n }\n },\n })\n }\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.pendingSharesData.user.pendingShareCount >\n this.props.pendingSharesData.user.pendingShares.length\n ) {\n this.queryMore.locked = true\n\n try {\n this.setState({ fetchMoreLoading: true })\n await this.props.pendingSharesData.fetchMore({\n variables: {\n offset:\n this.props.pendingSharesData.user.pendingShares.length,\n limit:\n this.props.pendingSharesData.user.pendingShareCount -\n this.props.pendingSharesData.user.pendingShares.length >=\n 20\n ? 20\n : this.props.pendingSharesData.user.pendingShareCount %\n 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev\n }\n\n const newShares = [\n ...prev.user.pendingShares,\n ...fetchMoreResult.user.pendingShares,\n ]\n\n return {\n user: {\n ...prev.user,\n pendingShares: newShares,\n },\n }\n },\n })\n } finally {\n this.setState(() => {\n this.queryMore.locked = false\n\n return { fetchMoreLoading: false }\n })\n }\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (\n nextProps.open &&\n !nextProps.pendingSharesData.user?.pendingShares[0]\n ) {\n this.props.close()\n }\n }\n\n render() {\n const {\n pendingSharesData: { error, loading, user, refetch },\n fullScreen,\n t,\n } = this.props\n\n const textColor = process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR\n\n if (loading)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <CenteredSpinner />\n </div>\n )\n\n if (error)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <ErrorScreen\n refetch={() =>\n refetch({\n variables: {\n limit: 20,\n offset: 0,\n },\n })\n }\n error={error}\n />\n </div>\n )\n\n if (user)\n dialogContent = (\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore()\n }}\n >\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.pendingSharesData.refetch()\n }\n }}\n />\n <List\n style={{\n width: \"100%\",\n textOverflow: \"ellipsis\",\n padding: 0,\n }}\n >\n {user.pendingShares.map((pendingShare) => (\n <Collection\n id={pendingShare.collection.id}\n key={pendingShare.collection.id}\n fields={[\"name\"]}\n >\n {({ collectionData }) => (\n <User\n id={pendingShare.sender.id}\n fields={[\"name\"]}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ userData }) => (\n <ListItem\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen\n ? getNotchHeight(\"left\")\n : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen\n ? getNotchHeight(\"right\")\n : \"0px\") +\n \")\",\n }}\n key={pendingShare.id}\n >\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {collectionData\n ? collectionData.name\n : pendingShare.collection.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textColor)\n .setAlpha(0.54)\n .toRgbString(),\n }}\n >\n {t`Sent by ` +\n (userData\n ? userData.name\n : pendingShare.sender.name)}\n </font>\n }\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() =>\n this.AcceptPendingShare(pendingShare.id)\n }\n disabled={this.props.unverified}\n size=\"large\">\n <Done />\n </IconButton>\n <IconButton\n onClick={() =>\n this.DeclinePendingShare(pendingShare.id)\n }\n size=\"large\">\n <Close />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n )}\n </User>\n )}\n </Collection>\n ))}\n </List>\n {this.state.fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n )\n\n return dialogContent\n }\n }\n )\n )\n)\n","import React, { Component } from \"react\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport tinyColor from \"tinycolor2\"\nimport IsOnline from \"is-online-component\"\nimport { GenericDialog, ErrorScreen } from \"@igloocloud/igloosharedui\"\nimport DialogContent from \"@mui/material/DialogContent\"\nimport List from \"@mui/material/List\"\nimport ListItem from \"@mui/material/ListItem\"\nimport ListItemText from \"@mui/material/ListItemText\"\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\"\nimport IconButton from \"@mui/material/IconButton\"\nimport Done from \"@mui/icons-material/Done\"\nimport Close from \"@mui/icons-material/Close\"\nimport LinearProgress from \"@mui/material/LinearProgress\"\nimport { CenteredSpinner, getNotchHeight } from \"@igloocloud/igloosharedui\"\nimport Igloo, { User, Collection } from \"@igloocloud/react-igloo\"\nimport { withTranslation } from \"react-i18next\"\n\nlet dialogContent = null\n\nexport default withTranslation()(\n class PendingTransfer extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n hasReceivedOpen: false,\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.open !== this.props.open && nextProps.open) {\n this.setState({ hasReceivedOpen: true })\n }\n }\n\n render() {\n const { t } = this.props\n\n return (\n <Igloo\n server={\n localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") + localStorage.getItem(\"server\")\n : `https://v1.igloo.ooo`\n }\n bearer={\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\"\n }\n >\n <GenericDialog\n open={this.props.open}\n close={this.props.close}\n title={t`Pending transfer requests`}\n textButton={t`Close`}\n textButtonFunction={this.props.close}\n noHorizontalPadding\n noDialogContent\n >\n {this.state.hasReceivedOpen && (\n <PendingSharesContent {...this.props} />\n )}\n </GenericDialog>\n </Igloo>\n )\n }\n }\n)\n\nconst PendingSharesContent = graphql(\n gql`\n query ($limit: NaturalNumber!, $offset: NaturalNumber) {\n user {\n id\n pendingTransferCount\n pendingTransfers(limit: $limit, offset: $offset) {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n name\n }\n }\n }\n }\n `,\n {\n name: \"pendingTransfersData\",\n options: { variables: { offset: 0, limit: 20 } },\n }\n)(\n graphql(\n gql`\n mutation AcceptPendingTransfer($id: ID!) {\n acceptPendingTransfer(id: $id) {\n id\n }\n }\n `,\n {\n name: \"AcceptPendingTransfer\",\n }\n )(\n graphql(\n gql`\n mutation declinePendingTransfer($id: ID!) {\n declinePendingTransfer(id: $id)\n }\n `,\n {\n name: \"DeclinePendingTransfer\",\n }\n )(\n class PendingTransfersDialogContent extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n fetchMoreLoading: false,\n }\n }\n\n AcceptPendingTransfer = (id) =>\n this.props.AcceptPendingTransfer({\n variables: {\n id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingTransfers: {\n id,\n __typename: \"PendingTransfers\",\n },\n },\n })\n\n DeclinePendingTransfer = (id) =>\n this.props.DeclinePendingTransfer({\n variables: {\n id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n pendingTransfers: {\n id,\n __typename: \"PendingTransfers\",\n },\n },\n })\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.pendingTransfersData.user.pendingTransferCount >\n this.props.pendingTransfersData.user.pendingTransfers.length\n ) {\n this.queryMore.locked = true\n\n try {\n this.setState({ fetchMoreLoading: true })\n await this.props.pendingTransfersData.fetchMore({\n variables: {\n offset:\n this.props.pendingTransfersData.user.pendingTransfers\n .length,\n limit:\n this.props.pendingTransfersData.user.pendingTransferCount -\n this.props.pendingTransfersData.user.pendingTransfers\n .length >=\n 20\n ? 20\n : this.props.pendingTransfersData.user\n .pendingTransferCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev\n }\n\n const newTransfers = [\n ...prev.user.pendingTransfers,\n ...fetchMoreResult.user.pendingTransfers,\n ]\n\n return {\n user: {\n ...prev.user,\n pendingTransfers: newTransfers,\n },\n }\n },\n })\n } finally {\n this.setState(() => {\n this.queryMore.locked = false\n\n return { fetchMoreLoading: false }\n })\n }\n }\n }\n\n componentDidMount() {\n this.props.pendingTransfersData.refetch()\n\n this.props.pendingTransfersData.subscribeToMore({\n document: gql`\n subscription {\n pendingTransferCreated {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n name\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingTransfers = [\n ...prev.user.pendingTransfers,\n subscriptionData.data.pendingTransferCreated,\n ]\n\n return {\n user: {\n ...prev.user,\n pendingTransfers: newPendingTransfers,\n },\n }\n },\n })\n\n const pendingTransferDeclinedSubscription = gql`\n subscription {\n pendingTransferDeclined\n }\n `\n\n this.props.pendingTransfersData.subscribeToMore({\n document: pendingTransferDeclinedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingTransfers = prev.user.pendingTransfers.filter(\n (pendingTransfer) =>\n pendingTransfer.id !==\n subscriptionData.data.pendingTransferDeclined\n )\n\n return {\n user: {\n ...prev.user,\n pendingTransfers: newPendingTransfers,\n },\n }\n },\n })\n\n const pendingTransferRevokedSubscription = gql`\n subscription {\n pendingTransferRevoked\n }\n `\n\n this.props.pendingTransfersData.subscribeToMore({\n document: pendingTransferRevokedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingTransfers = prev.user.pendingTransfers.filter(\n (pendingTransfer) =>\n pendingTransfer.id !==\n subscriptionData.data.pendingTransferRevoked\n )\n\n return {\n user: {\n ...prev.user,\n pendingTransfers: newPendingTransfers,\n },\n }\n },\n })\n\n const pendingTransferAcceptedSubscription = gql`\n subscription {\n pendingTransferAccepted {\n id\n }\n }\n `\n\n this.props.pendingTransfersData.subscribeToMore({\n document: pendingTransferAcceptedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newPendingTransfers = prev.user.pendingTransfers.filter(\n (pendingTransfer) =>\n pendingTransfer.id !==\n subscriptionData.data.pendingTransferAccepted.id\n )\n\n return {\n user: {\n ...prev.user,\n pendingTransfers: newPendingTransfers,\n },\n }\n },\n })\n }\n\n componentWillReceiveProps(nextProps) {\n if (\n nextProps.pendingTransfersData.user &&\n this.props.pendingTransfersData.user &&\n nextProps.pendingTransfersData.user.pendingTransfers.length !==\n this.props.pendingTransfersData.user.pendingTransfers.length &&\n !nextProps.pendingTransfersData.user.pendingTransfers[0]\n ) {\n this.props.close()\n }\n }\n\n render() {\n const {\n pendingTransfersData: { error, loading, user, refetch },\n fullScreen,\n unverified,\n t,\n } = this.props\n\n const textColor = process.env.REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR\n\n if (loading)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <CenteredSpinner />\n </div>\n )\n\n if (error)\n dialogContent = (\n <div style={{ height: \"100%\" }}>\n <ErrorScreen\n refetch={() => refetch({ offset: 0, limit: 20 })}\n error={error}\n />\n </div>\n )\n\n if (user)\n dialogContent = (\n <DialogContent\n style={{ padding: 0 }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore()\n }}\n >\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.pendingTransfersData.refetch()\n }\n }}\n />\n <List\n style={{\n width: \"100%\",\n textOverflow: \"ellipsis\",\n padding: 0,\n }}\n >\n {user.pendingTransfers.map((pendingTransfer) => (\n <Collection\n id={pendingTransfer.collection.id}\n key={pendingTransfer.collection.id}\n fields={[\"name\"]}\n >\n {({ collectionData }) => (\n <User\n id={pendingTransfer.sender.id}\n fields={[\"name\"]}\n privateCloud={process.env.REACT_APP_PRIVATE_CLOUD}\n >\n {({ userData }) => (\n <ListItem\n style={{\n paddingLeft:\n \"calc(24px + \" +\n (fullScreen\n ? getNotchHeight(\"left\")\n : \"0px\") +\n \")\",\n paddingRight:\n \"calc(24px + \" +\n (fullScreen\n ? getNotchHeight(\"right\")\n : \"0px\") +\n \")\",\n }}\n key={pendingTransfer.id}\n >\n <ListItemText\n primary={\n <font\n style={{\n color: textColor,\n }}\n >\n {collectionData\n ? collectionData.name\n : pendingTransfer.collection.name}\n </font>\n }\n secondary={\n <font\n style={{\n color: tinyColor(textColor)\n .setAlpha(0.54)\n .toRgbString(),\n }}\n >\n {t`Sent by ` +\n (userData\n ? userData.name\n : pendingTransfer.sender.name)}\n </font>\n }\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n marginRight: \"72px\",\n }}\n />\n <ListItemSecondaryAction>\n <IconButton\n onClick={() =>\n this.AcceptPendingTransfer(\n pendingTransfer.id\n )\n }\n disabled={unverified}\n size=\"large\">\n <Done />\n </IconButton>\n <IconButton\n onClick={() =>\n this.DeclinePendingTransfer(\n pendingTransfer.id\n )\n }\n size=\"large\">\n <Close />\n </IconButton>\n </ListItemSecondaryAction>\n </ListItem>\n )}\n </User>\n )}\n </Collection>\n ))}\n </List>\n {this.state.fetchMoreLoading && <LinearProgress />}\n </DialogContent>\n )\n\n return dialogContent\n }\n }\n )\n )\n)\n","import React, { Component } from \"react\"\nimport Typography from \"@mui/material/Typography\"\nimport Paper from \"@mui/material/Paper\"\nimport ButtonBase from \"@mui/material/ButtonBase\"\nimport {\n CenteredSpinner,\n ErrorScreen,\n getNotchHeight,\n} from \"@igloocloud/igloosharedui\"\nimport CollectionCard from \"./CollectionCard\"\nimport Helmet from \"react-helmet\"\nimport PendingShares from \"./PendingShares\"\nimport PendingTransfers from \"./PendingTransfers\"\nimport Share from \"@mui/icons-material/Share\"\nimport People from \"@mui/icons-material/People\"\nimport LinearProgress from \"@mui/material/LinearProgress\"\nimport tinyColor from \"tinycolor2\"\nimport { withTranslation } from \"react-i18next\"\n\nconst {\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnBackgroundColor,\n} = process.env\n\nexport default withTranslation()(\n class CollectionsBody extends Component {\n constructor(props) {\n super(props)\n\n this.state = {\n createOpen: false,\n pendingSharesOpen: false,\n pendingTransfersOpen: false,\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.userData.user && nextProps.userData.user) {\n if (\n nextProps.userData.user.pendingShareCount !==\n this.props.userData.user.pendingShareCount &&\n !nextProps.userData.user.pendingShareCount\n ) {\n this.setState({\n pendingSharesOpen: false,\n })\n }\n\n if (\n nextProps.userData.user.pendingTransferCount !==\n this.props.userData.user.pendingTransferCount &&\n !nextProps.userData.user.pendingTransferCount\n ) {\n this.setState({\n pendingTransfersOpen: false,\n })\n }\n }\n }\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.userData.user.collectionCount >\n this.props.userData.user.collections.length\n ) {\n this.queryMore.locked = true\n\n try {\n this.setState({ fetchMoreLoading: true })\n await this.props.userData.fetchMore({\n variables: {\n offset: this.props.userData.user.collections.length,\n limit:\n this.props.userData.user.collectionCount -\n this.props.userData.user.collections.length >=\n 20\n ? 20\n : this.props.userData.user.collectionCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev\n }\n\n const newCollections = [\n ...prev.user.collections,\n ...fetchMoreResult.user.collections,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n )\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n }\n },\n })\n } finally {\n this.setState(() => {\n this.queryMore.locked = false\n\n return { fetchMoreLoading: false }\n })\n }\n }\n }\n\n componentDidMount() {\n if (this.props.mobile && window.cordova) {\n if (\n tinyColor(\n process.env.REACT_APP_MAIN_BACKGROUND_COLOR\n ).getBrightness() <= 128\n ) {\n window.StatusBar.styleLightContent()\n } else {\n window.StatusBar.styleDefault()\n }\n }\n }\n\n render() {\n const {\n userData: { error, loading, user, refetch },\n t,\n } = this.props\n const { fetchMoreLoading } = this.state\n const collectionsName =\n process.env.REACT_APP_COLLECTIONS_NAME || \"Collections\"\n\n let yourCollectionsList = \"\"\n\n let errorScreen = (\n <ErrorScreen\n refetch={() =>\n refetch({\n variables: {\n limit: 20,\n offset: 0,\n filter: {},\n },\n })\n }\n error={error}\n />\n )\n\n if (user) {\n yourCollectionsList = (\n <div\n justify=\"center\"\n className=\"collectionBodyGrid notSelectable defaultCursor\"\n style={{\n margin: \"16px\",\n paddingLeft: getNotchHeight(\"left\"),\n paddingRight: getNotchHeight(\"right\"),\n }}\n >\n {!!user.pendingTransferCount && (\n <ButtonBase\n focusRipple\n key=\"pendingTransfers\"\n style={{ borderRadius: \"4px\" }}\n onClick={() =>\n this.setState({\n pendingTransfersOpen: true,\n })\n }\n >\n <Paper\n style={{\n backgroundColor,\n width: \"100%\",\n height: \"192px\",\n cursor: \"pointer\",\n color: textOnBackgroundColor,\n }}\n elevation={5}\n >\n <div\n style={{\n paddingTop: \"47px\",\n paddingBottom: \"47px\",\n }}\n >\n <People style={{ fontSize: \"64px\" }} />\n <br />\n <Typography\n variant=\"h5\"\n style={{\n textAlign: \"center\",\n color: textOnBackgroundColor,\n }}\n >\n {user.pendingTransferCount > 99\n ? \"99+ \" + t`transfer requests`\n : user.pendingTransferCount +\n (user.pendingTransferCount === 1\n ? \" \" + t`transfer request`\n : \" \" + t`transfer requests`)}\n </Typography>\n </div>\n </Paper>\n </ButtonBase>\n )}\n {!!user.pendingShareCount && (\n <ButtonBase\n focusRipple\n key=\"pendingShares\"\n style={{ borderRadius: \"4px\" }}\n onClick={() =>\n this.setState({\n pendingSharesOpen: true,\n })\n }\n >\n <Paper\n style={{\n backgroundColor,\n width: \"100%\",\n height: \"192px\",\n cursor: \"pointer\",\n color: textOnBackgroundColor,\n }}\n elevation={5}\n >\n <div\n style={{\n paddingTop: \"47px\",\n paddingBottom: \"47px\",\n }}\n >\n <Share\n style={{\n fontSize: \"48px\",\n marginBottom: \"8px\",\n marginTop: \"8px\",\n }}\n />\n <br />\n <Typography\n variant=\"h5\"\n style={{\n color: textOnBackgroundColor,\n textAlign: \"center\",\n }}\n >\n {user.pendingShareCount > 99\n ? \"99+ \" + t`sharing requests`\n : user.pendingShareCount +\n (user.pendingShareCount === 1\n ? \" \" + t`sharing request`\n : \" \" + t`sharing requests`)}\n </Typography>\n </div>\n </Paper>\n </ButtonBase>\n )}\n {user.collections.map((collection) => (\n <CollectionCard\n userData={this.props.userData}\n collection={collection}\n client={this.props.client}\n key={collection.id}\n />\n ))}\n </div>\n )\n }\n\n return (\n <>\n <Helmet>\n <title>{process.env.REACT_APP_NAME}</title>\n </Helmet>\n {this.props.mobile ? (\n <div\n style={{\n height: \"100%\",\n backgroundColor,\n }}\n >\n {error && errorScreen}\n {loading && (\n <div\n style={{\n overflowY: \"auto\",\n }}\n >\n <CenteredSpinner\n style={{\n paddingTop: \"32px\",\n }}\n />\n </div>\n )}\n {user && (\n <div\n style={{\n overflowY: \"auto\",\n }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore()\n }}\n >\n {user.collections.length !== 0 ||\n user.pendingTransferCount ||\n user.pendingShareCount ? (\n yourCollectionsList\n ) : (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n textAlign: \"center\",\n margin: \"32px\",\n color: textOnBackgroundColor,\n }}\n >\n {t(\"No \" + collectionsName.toLowerCase())}\n </Typography>\n )}\n </div>\n )}\n </div>\n ) : (\n <div\n style={{\n backgroundColor,\n height: \"calc(100% - 64px - \" + getNotchHeight(\"top\") + \")\",\n }}\n >\n <div\n style={{\n width: \"100vw\",\n height: \"100%\",\n backgroundColor,\n overflowY: \"auto\",\n overscrollBehaviorY: \"none\",\n }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n )\n this.queryMore()\n }}\n >\n {error && errorScreen}\n {loading && (\n <div\n style={{\n overflowY: \"auto\",\n height:\n \"calc(100% - 64px - \" + getNotchHeight(\"top\") + \")\",\n }}\n >\n <CenteredSpinner\n style={{\n paddingTop: \"32px\",\n }}\n />\n </div>\n )}\n {user &&\n (user.collections.length !== 0 ||\n user.pendingTransferCount ||\n user.pendingShareCount ? (\n yourCollectionsList\n ) : (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n textAlign: \"center\",\n marginTop: \"32px\",\n marginBottom: \"32px\",\n color: textOnBackgroundColor,\n }}\n >\n {t(\"No \" + collectionsName.toLowerCase())}\n </Typography>\n ))}\n </div>\n </div>\n )}\n <PendingShares\n open={this.state.pendingSharesOpen}\n close={() =>\n this.setState({\n pendingSharesOpen: false,\n })\n }\n pendingShareCount={\n this.props.userData.user &&\n this.props.userData.user.pendingShareCount\n }\n unverified={\n !(\n this.props.userData.user &&\n this.props.userData.user.emailIsVerified\n )\n }\n />\n <PendingTransfers\n open={this.state.pendingTransfersOpen}\n close={() =>\n this.setState({\n pendingTransfersOpen: false,\n })\n }\n unverified={\n !(\n this.props.userData.user &&\n this.props.userData.user.emailIsVerified\n )\n }\n />\n {fetchMoreLoading && (\n <LinearProgress\n style={\n this.props.mobile\n ? { position: \"absolute\", top: 0, width: \"100%\" }\n : { marginTop: \"-4px\" }\n }\n />\n )}\n </>\n )\n }\n }\n)\n","import { graphql } from \"@apollo/react-hoc\";\nimport { GenericDialog } from \"@igloocloud/igloosharedui\";\nimport Clear from \"@mui/icons-material/Clear\";\nimport KeyboardArrowLeft from \"@mui/icons-material/KeyboardArrowLeft\";\nimport KeyboardArrowRight from \"@mui/icons-material/KeyboardArrowRight\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport InputAdornment from \"@mui/material/InputAdornment\";\nimport TextField from \"@mui/material/TextField\";\nimport gql from \"graphql-tag\";\nimport React, { Component } from \"react\";\nimport { withTranslation } from \"react-i18next\";\nimport SwipeableViews from \"react-swipeable-views\";\nimport tinyColor from \"tinycolor2\";\n\nexport default graphql(\n gql`\n mutation CreateCollection($name: String!, $picture: NaturalNumber) {\n createCollection(name: $name, picture: $picture) {\n id\n name\n picture\n }\n }\n `,\n {\n name: \"CreateCollection\",\n }\n)(\n withTranslation()(\n class CreateCollection extends Component {\n constructor(props) {\n super(props);\n\n const importAll = (require) =>\n require.keys().reduce((acc, next) => {\n acc[next.replace(\"./\", \"\")] = require(next);\n return acc;\n }, {});\n\n this.images = Object.values(\n importAll(\n require.context(\n \"../../styles/assets/collectionCards\",\n false,\n /\\.(png|jpe?g|svg)$/\n )\n )\n );\n\n this.state = {\n name: \"\",\n slideIndex: 0,\n nameEmpty: false,\n nameError: \"\",\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.open !== nextProps.open && nextProps.open) {\n this.setState({\n nameEmpty: false,\n name: \"\",\n nameError: \"\",\n slideIndex: Math.floor(Math.random() * this.images.length),\n showLoading: false,\n });\n }\n }\n\n createCollectionMutation = async () => {\n this.setState({ showLoading: true });\n\n try {\n await this.props.CreateCollection({\n variables: {\n name: this.state.name,\n picture: this.state.slideIndex,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n createCollection: {\n name: this.state.name,\n picture: this.state.slideIndex,\n __typename: \"Collection\",\n },\n },\n });\n\n this.props.close();\n } catch (e) {\n this.setState({ nameError: \"Error\" });\n } finally {\n this.setState({ showLoading: false });\n }\n };\n\n render() {\n const { open, close, t } = this.props;\n const { showLoading, name, nameEmpty, nameError, slideIndex } =\n this.state;\n const {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n } = process.env;\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t(\n \"Create \" + (collectionName?.toLowerCase() || \"collection\")\n )}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Create`}\n containedButtonFunction={this.createCollectionMutation}\n containedButtonDisabled={\n !name.replace(/\\s/g, \"\").length ||\n name.length > 256 ||\n showLoading\n }\n containedButtonLoading={showLoading}\n >\n <TextField\n id=\"create-collection-name\"\n label={t`Name`}\n value={name}\n variant=\"outlined\"\n error={nameEmpty || nameError || name.length > 256}\n helperText={\n name.length > 256\n ? t`Use fewer characters`\n : nameEmpty\n ? t`This field is required`\n : nameError || \" \"\n }\n onChange={(event) =>\n this.setState({\n name: event.target.value,\n nameEmpty: event.target.value.replace(/\\s/g, \"\") === \"\",\n nameError: \"\",\n })\n }\n onKeyPress={(event) => {\n if (event.key === \"Enter\" && name)\n this.createCollectionMutation();\n }}\n style={{\n width: \"100%\",\n marginBottom: \"16px\",\n }}\n InputLabelProps={name ? { shrink: true } : {}}\n InputProps={{\n endAdornment: name && (\n <InputAdornment position=\"end\">\n <IconButton\n onClick={() =>\n this.setState({\n name: \"\",\n nameEmpty: true,\n nameError: \"\",\n })\n }\n tabIndex=\"-1\"\n size=\"large\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n <SwipeableViews\n index={slideIndex}\n onChangeIndex={(value) => {\n this.setState({\n slideIndex: value,\n });\n }}\n style={{\n width: \"100%\",\n }}\n >\n {this.images.map(({ default: image }, index) => (\n <img\n src={image}\n key={\"collection-image-\" + index}\n alt=\"Collection\"\n className=\"notSelectable\"\n draggable=\"false\"\n style={{\n width: \"100%\",\n }}\n />\n ))}\n </SwipeableViews>\n <div>\n <Button\n size=\"small\"\n onClick={() =>\n this.setState((oldState) => ({\n slideIndex: oldState.slideIndex - 1,\n }))\n }\n disabled={slideIndex === 0}\n style={{\n color: tinyColor(textColor)\n .setAlpha(slideIndex === 0 ? 0.54 : 1)\n .toRgbString(),\n }}\n >\n <KeyboardArrowLeft />\n {t`Back`}\n </Button>\n <Button\n size=\"small\"\n onClick={() =>\n this.setState((oldState) => ({\n slideIndex: oldState.slideIndex + 1,\n }))\n }\n disabled={slideIndex === this.images.length - 1}\n style={{\n float: \"right\",\n marginRight: 0,\n marginLeft: \"auto\",\n color: tinyColor(textColor)\n .setAlpha(slideIndex === this.images.length - 1 ? 0.54 : 1)\n .toRgbString(),\n }}\n >\n {t`Next`}\n <KeyboardArrowRight />\n </Button>\n </div>\n </GenericDialog>\n );\n }\n }\n )\n);\n","import { Checkbox, Chip, MenuItem, TextField } from \"@mui/material\";\nimport tinyColor from \"tinycolor2\";\nimport { Thing } from \"../../CreateReport.types\";\nimport { Props } from \"./ChipInput.types\";\n\nconst menuItemStyle = (\n mainBackgroundColor: string,\n textOnMainBackgroundColor: string\n) => ({\n \"&.Mui-focusVisible\": {\n backgroundColor: mainBackgroundColor,\n },\n \"&.Mui-selected\": {\n backgroundColor: mainBackgroundColor,\n \"&.Mui-focusVisible\": {\n backgroundColor: mainBackgroundColor,\n },\n \"&:hover\": {\n backgroundColor: tinyColor(textOnMainBackgroundColor)\n .setAlpha(0.04)\n .toHex8String(),\n },\n },\n});\n\nexport default ({\n setBlocks,\n mainBackgroundColor,\n textOnMainBackgroundColor,\n things,\n variables,\n variableIds,\n localId,\n label,\n}: Props) => (\n <TextField\n required\n variant=\"outlined\"\n fullWidth\n label={label}\n select\n InputLabelProps={{\n style: {\n backgroundColor: mainBackgroundColor,\n },\n }}\n SelectProps={{\n SelectDisplayProps: {\n style: {\n height: \"56px\",\n padding: \"0\",\n },\n },\n IconComponent: null,\n multiple: true,\n renderValue: (selected: string[]) => (\n <div\n style={{\n padding: \"12px\",\n maxWidth: \"100%\",\n overflow: \"scroll\",\n }}\n >\n {things\n .filter(({ variables }: Thing) =>\n variables.some(({ id }) => selected.includes(id))\n )\n .map(({ id, name, variables }: Thing, thingIndex: number) => (\n <>\n <Chip\n key={\"create-report-thing-series-chip-\" + id}\n label={name}\n style={{\n cursor: \"pointer\",\n marginRight: \"8px\",\n }}\n />\n {variables\n .filter(({ id }) => selected.includes(id))\n .map(({ id, name }, variableIndex: number) => (\n <Chip\n variant=\"outlined\"\n key={\"create-report-series-chip-\" + id}\n label={name}\n style={{\n cursor: \"pointer\",\n marginRight:\n thingIndex === things.length - 1 &&\n variableIndex === variables.length - 1\n ? 0\n : \"8px\",\n }}\n />\n ))}\n </>\n ))}\n </div>\n ),\n }}\n value={variableIds}\n onChange={(event: any) =>\n setBlocks((blocks) =>\n blocks.map((block) =>\n block.localId === localId\n ? {\n ...block,\n variableIds: event.target.value.some((id) =>\n things\n .find(({ id: idToFind }: { id: string }) => idToFind === id)\n ?.variables.every(({ id }) => variableIds.includes(id))\n )\n ? (() => {\n const thing = things.find(\n ({ id: idToFind }: { id: string }) =>\n event.target.value.includes(idToFind)\n );\n\n return event.target.value.filter(\n (id: string) =>\n !thing.variables.find(\n ({ id: idToFind }: { id: string }) =>\n idToFind === id\n ) && id !== thing.id\n );\n })()\n : event.target.value\n .flatMap((id: string) =>\n variables.find(\n ({ id: idToFind }: { id: string }) => idToFind === id\n )\n ? id\n : things\n .find(\n ({ id: idToFind }: { id: string }) =>\n idToFind === id\n )\n .variables.map(({ id }) => id)\n )\n .filter(\n (id, position, array) => array.indexOf(id) === position\n ),\n }\n : block\n )\n )\n }\n >\n {things.map(({ id, name, variables }) => [\n <MenuItem\n value={id}\n sx={menuItemStyle(mainBackgroundColor, textOnMainBackgroundColor)}\n key={\"create-report-dialog-series-picker-thing-\" + id}\n >\n <Checkbox\n disableRipple\n checked={variables.every(({ id }) => variableIds.includes(id))}\n indeterminate={\n variables.some(({ id }) => variableIds.includes(id)) &&\n !variables.every(({ id }) => variableIds.includes(id))\n }\n />\n {name}\n </MenuItem>,\n ...variables.map(({ id, name }) => (\n <MenuItem\n value={id}\n sx={{\n paddingLeft: \"32px\",\n ...menuItemStyle(mainBackgroundColor, textOnMainBackgroundColor),\n }}\n >\n <Checkbox disableRipple checked={variableIds.indexOf(id) > -1} />\n {name}\n </MenuItem>\n )),\n ])}\n </TextField>\n);\n","import {\n DeleteButton,\n GenericDialog,\n MoveButtonGroup,\n theme,\n} from \"@igloocloud/igloosharedui\";\nimport {\n Button,\n ButtonGroup,\n Collapse,\n MenuItem,\n SvgIcon,\n TextField,\n useMediaQuery,\n} from \"@mui/material\";\nimport { useEffect, useState } from \"react\";\nimport {\n DragDropContext,\n Draggable,\n Droppable,\n PreDragActions,\n SensorAPI,\n SnapDragActions,\n} from \"react-beautiful-dnd\";\nimport { withTranslation } from \"react-i18next\";\nimport { TransitionGroup } from \"react-transition-group\";\nimport tinyColor from \"tinycolor2\";\nimport ChipInput from \"./components/ChipInput\";\nimport {\n Block,\n DragDirection,\n Props,\n Thing,\n Variable,\n} from \"./CreateReport.types\";\n\n//TODO: replace with real data\nconst series: Variable[] = [\n {\n id: \"1\",\n name: \"Temperature\",\n thing: { id: \"10\", name: \"Weather station\" },\n },\n { id: \"2\", name: \"Humidity\", thing: { id: \"10\", name: \"Weather station\" } },\n { id: \"3\", name: \"Pressure\", thing: { id: \"10\", name: \"Weather station\" } },\n { id: \"4\", name: \"Temperature\", thing: { id: \"20\", name: \"Solar panels\" } },\n { id: \"5\", name: \"Power\", thing: { id: \"20\", name: \"Solar panels\" } },\n];\nconst metrics: Variable[] = [\n {\n id: \"6\",\n name: \"Status\",\n thing: { id: \"30\", name: \"Smoke detector\" },\n },\n {\n id: \"7\",\n name: \"Carbon monoxide\",\n thing: { id: \"30\", name: \"Smoke detector\" },\n },\n {\n id: \"8\",\n name: \"Temperature\",\n thing: { id: \"40\", name: \"Fridge\" },\n },\n {\n id: \"9\",\n name: \"Humidity\",\n thing: { id: \"40\", name: \"Fridge\" },\n },\n];\n\nconst useMoveButtons =\n (\n selectedDraggable: string,\n setSelectedDraggable: (any) => void,\n dragDirection: DragDirection,\n setDragDirection: (any) => void\n ) =>\n (api: SensorAPI) => {\n const preDrag: PreDragActions = api.tryGetLock(selectedDraggable);\n\n if (preDrag) {\n const { moveUp, moveDown, drop }: SnapDragActions = preDrag.snapLift();\n\n if (dragDirection === \"up\") {\n moveUp();\n } else {\n moveDown();\n }\n\n const selectedBlock: HTMLElement = document.getElementById(\n \"draggable-block-\" + selectedDraggable\n );\n const dropBlock = ({ propertyName }: { propertyName: string }) => {\n if (propertyName === \"transform\") {\n drop();\n }\n\n selectedBlock.removeEventListener(\"transitionend\", dropBlock);\n };\n\n selectedBlock.addEventListener(\"transitionend\", dropBlock);\n }\n\n setSelectedDraggable(null);\n setDragDirection(null);\n };\n\nconst reorderBlocks = (array: Block[], fromIndex: number, toIndex: number) => {\n const element = array[fromIndex];\n array.splice(fromIndex, 1);\n array.splice(toIndex, 0, element);\n\n return array;\n};\n\nconst createReport = async (\n setLoading: (value: boolean) => void,\n setError: (value: string) => void,\n t: (string) => string,\n collectionId: string,\n reportTitle: string,\n blocks: Block[]\n) => {\n setLoading(true);\n\n try {\n const { ok } = await fetch(\n \"https://agrentareportapi.azurewebsites.net/createReport\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n collectionId,\n reportTitle,\n blocks: blocks.map(\n ({\n localId: propertyToDelete,\n ...propertiesToKeep\n }: {\n localId: number;\n }) => propertiesToKeep\n ),\n }),\n }\n );\n\n if (!ok) {\n throw new Error(t`Error`);\n }\n } catch (e) {\n setError(t`Error`);\n } finally {\n setLoading(false);\n }\n};\n\nconst CreateReport = withTranslation()(\n ({ open, close, t, collections }: Props) => {\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>(null);\n const [collectionId, setCollectionId] = useState<string>(null);\n const [reportTitle, setReportTitle] = useState<string>(null);\n const [reportTitleEmpty, setReportTitleEmpty] = useState<boolean>(false);\n const [blocks, setBlocks] = useState<Block[]>([]);\n const [selectedDraggable, setSelectedDraggable] = useState<string>(null);\n const [dragDirection, setDragDirection] = useState<DragDirection>(null);\n const greaterThanSm = useMediaQuery<boolean>(\n theme(process.env).breakpoints.up(\"sm\")\n );\n\n const {\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_MAIN_BACKGROUND_COLOR: mainBackgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnMainBackgroundColor,\n }: {\n REACT_APP_COLLECTION_NAME: string;\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: string;\n REACT_APP_MAIN_BACKGROUND_COLOR: string;\n } = process.env;\n const addButtonStyle: {\n borderColor: string;\n \"&:hover\": { borderColor: string };\n } = {\n borderColor: tinyColor(textOnMainBackgroundColor)\n .setAlpha(0.26)\n .toHex8String(),\n \"&:hover\": {\n borderColor: tinyColor(textOnMainBackgroundColor)\n .setAlpha(0.87)\n .toHex8String(),\n },\n };\n\n useEffect(() => setCollectionId(collections[0]?.id), collections);\n\n const seriesThings: Thing[] = series.reduce(\n (things, variable) => [\n ...things.filter(\n ({ id: idToRemove }) => idToRemove !== variable.thing.id\n ),\n things.find(({ id: idToFind }) => idToFind === variable.thing.id)\n ? {\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ),\n variables: [\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ).variables,\n variable,\n ],\n }\n : {\n ...variable.thing,\n variables: [variable],\n },\n ],\n []\n );\n const metricThings: Thing[] = metrics.reduce(\n (things, variable) => [\n ...things.filter(\n ({ id: idToRemove }) => idToRemove !== variable.thing.id\n ),\n things.find(({ id: idToFind }) => idToFind === variable.thing.id)\n ? {\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ),\n variables: [\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ).variables,\n variable,\n ],\n }\n : {\n ...variable.thing,\n variables: [variable],\n },\n ],\n []\n );\n\n return (\n <GenericDialog\n open={open}\n close={close}\n title={t`Create report`}\n textButton={t`Close`}\n textButtonFunction={close}\n containedButton={t`Create`}\n containedButtonFunction={() =>\n createReport(\n setLoading,\n setError,\n t,\n collectionId,\n reportTitle,\n blocks\n )\n }\n containedButtonDisabled={\n !reportTitle ||\n blocks.length === 0 ||\n !blocks.every(({ type, title, text, variableIds }: Block) =>\n type === \"paragraph\" ? title && text : variableIds.length\n )\n }\n containedButtonLoading={loading}\n containedButtonError={error}\n disableMaxHeight\n maxWidth=\"sm\"\n >\n <TextField\n variant=\"outlined\"\n label={t(collectionName || \"Collection\")}\n select\n fullWidth\n required\n value={collectionId}\n onChange={(event) => {\n setCollectionId(event.target.value);\n }}\n style={{ marginBottom: \"32px\" }}\n >\n {collections.map(({ id, name }) => (\n <MenuItem value={id} key={\"collection-\" + id}>\n {name}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n label={t`Report title`}\n variant=\"outlined\"\n fullWidth\n required\n value={reportTitle}\n onChange={(event) => {\n setReportTitle(event.target.value);\n setReportTitleEmpty(!event.target.value);\n }}\n helperText={\n error ?? (reportTitleEmpty ? t`This field is required` : \" \")\n }\n error={!!error || reportTitleEmpty}\n style={{ marginBottom: \"16px\" }}\n />\n <DragDropContext\n onDragUpdate={({ destination, source }) => {\n if (\n destination &&\n (destination.droppableId !== source.droppableId ||\n destination.index !== source.index)\n ) {\n setBlocks((blocks) =>\n reorderBlocks(blocks, source.index, destination.index)\n );\n }\n }}\n sensors={[\n useMoveButtons(\n selectedDraggable,\n setSelectedDraggable,\n dragDirection,\n setDragDirection\n ),\n ]}\n >\n <Droppable droppableId=\"create-report-dialog-droppable-area\">\n {({ innerRef, droppableProps, placeholder }) => (\n <div ref={innerRef} {...droppableProps}>\n <div>\n <TransitionGroup>\n {blocks.map(\n ({ localId, type, title, text, variableIds }, index) => (\n <Collapse key={\"draggable-block-collapse-\" + localId}>\n <Draggable\n draggableId={localId.toString()}\n index={index}\n >\n {({ draggableProps, innerRef }) => (\n <div\n {...draggableProps}\n id={\"draggable-block-\" + localId}\n ref={innerRef}\n >\n {type === \"paragraph\" ? (\n <div style={{ paddingBottom: \"32px\" }}>\n <div\n style={{\n backgroundColor: mainBackgroundColor,\n }}\n >\n <div\n style={{\n display: \"flex\",\n paddingBottom: \"16px\",\n }}\n >\n <TextField\n required\n label={t`Paragraph title`}\n variant=\"outlined\"\n style={{\n width: \"calc(100% - 144px)\",\n }}\n InputLabelProps={{\n style: {\n backgroundColor:\n mainBackgroundColor,\n },\n }}\n value={title}\n onChange={(event) =>\n setBlocks((blocks) => {\n return blocks.map((block) =>\n block.localId === localId\n ? {\n ...block,\n title: event.target.value,\n }\n : block\n );\n })\n }\n />\n <MoveButtonGroup\n onClick={(direction) => {\n setSelectedDraggable(\n localId.toString()\n );\n setDragDirection(direction);\n }}\n index={index}\n length={blocks.length}\n />\n <DeleteButton\n onClick={() =>\n setBlocks((blocks: Block[]) =>\n blocks.filter(\n ({ localId: idToRemove }) =>\n idToRemove !== localId\n )\n )\n }\n />\n </div>\n <TextField\n required\n label={t`Paragraph content`}\n multiline\n rows={6}\n variant=\"outlined\"\n fullWidth\n value={text}\n onChange={(event) =>\n setBlocks((blocks) => {\n return blocks.map((block) =>\n block.localId === localId\n ? {\n ...block,\n text: event.target.value,\n }\n : block\n );\n })\n }\n />\n </div>\n </div>\n ) : type === \"chart\" ? (\n <div\n style={{\n paddingBottom: \"32px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n backgroundColor: mainBackgroundColor,\n }}\n >\n <ChipInput\n setBlocks={setBlocks}\n mainBackgroundColor={\n mainBackgroundColor\n }\n textOnMainBackgroundColor={\n textOnMainBackgroundColor\n }\n things={seriesThings}\n variables={series}\n variableIds={variableIds}\n localId={localId}\n label={t`Series`}\n />\n <MoveButtonGroup\n onClick={(direction) => {\n setSelectedDraggable(\n localId.toString()\n );\n setDragDirection(direction);\n }}\n index={index}\n length={blocks.length}\n />\n <DeleteButton\n onClick={() =>\n setBlocks((blocks: Block[]) =>\n blocks.filter(\n ({ localId: idToRemove }) =>\n idToRemove !== localId\n )\n )\n }\n disableUndo\n />\n </div>\n </div>\n ) : (\n <div\n style={{\n paddingBottom: \"32px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n backgroundColor: mainBackgroundColor,\n }}\n >\n <ChipInput\n setBlocks={setBlocks}\n mainBackgroundColor={\n mainBackgroundColor\n }\n textOnMainBackgroundColor={\n textOnMainBackgroundColor\n }\n things={metricThings}\n variables={metrics}\n variableIds={variableIds}\n localId={localId}\n label={t`Metrics`}\n />\n <MoveButtonGroup\n onClick={(direction) => {\n setSelectedDraggable(\n localId.toString()\n );\n setDragDirection(direction);\n }}\n index={index}\n length={blocks.length}\n />\n <DeleteButton\n onClick={() =>\n setBlocks((blocks: Block[]) =>\n blocks.filter(\n ({ localId: idToRemove }) =>\n idToRemove !== localId\n )\n )\n }\n disableUndo\n />\n </div>\n </div>\n )}\n </div>\n )}\n </Draggable>\n </Collapse>\n )\n )}\n </TransitionGroup>\n {placeholder}\n </div>\n </div>\n )}\n </Droppable>\n </DragDropContext>\n <ButtonGroup fullWidth size=\"large\">\n <Button\n color=\"inherit\"\n sx={addButtonStyle}\n onClick={() =>\n setBlocks((blocks) => [\n ...blocks,\n {\n type: \"paragraph\",\n title: \"\",\n text: \"\",\n localId: +Date.now(),\n },\n ])\n }\n >\n <SvgIcon style={{ marginRight: greaterThanSm ? \"8px\" : 0 }}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M21 8V6H3V8H21ZM12 18H3V16H12V18ZM15.6822 13H3V11H21V12.3414C20.3744 12.1203 19.7013 12 19 12C17.7733 12 16.6325 12.3682 15.6822 13Z\"\n fill=\"black\"\n />\n <rect x=\"15\" y=\"17\" width=\"8\" height=\"2\" fill=\"black\" />\n <rect\n x=\"18\"\n y=\"22\"\n width=\"8\"\n height=\"2\"\n transform=\"rotate(-90 18 22)\"\n fill=\"black\"\n />\n </svg>\n </SvgIcon>\n {greaterThanSm && t`Paragraph`}\n </Button>\n <Button\n onClick={() =>\n setBlocks((blocks) => [\n ...blocks,\n {\n type: \"chart\",\n variableIds: [],\n localId: +Date.now(),\n },\n ])\n }\n color=\"inherit\"\n sx={addButtonStyle}\n >\n <SvgIcon style={{ marginRight: greaterThanSm ? \"8px\" : 0 }}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M20.24 4.45L16 11.78L9.5 8L4 17.54V3H2V21H13.8027C13.4513 20.3926 13.2034 19.7179 13.083 19H5.46L10.23 10.75L15.0205 13.5095C15.8795 12.7477 16.9585 12.2287 18.1502 12.0597L21.97 5.45L20.24 4.45Z\"\n fill=\"black\"\n />\n <rect x=\"15\" y=\"17\" width=\"8\" height=\"2\" fill=\"black\" />\n <rect\n x=\"18\"\n y=\"22\"\n width=\"8\"\n height=\"2\"\n transform=\"rotate(-90 18 22)\"\n fill=\"black\"\n />\n </svg>\n </SvgIcon>\n {greaterThanSm && t`Series`}\n </Button>\n <Button\n onClick={() =>\n setBlocks((blocks) => [\n ...blocks,\n {\n type: \"metric\",\n variableIds: [],\n localId: +Date.now(),\n },\n ])\n }\n color=\"inherit\"\n sx={addButtonStyle}\n >\n <SvgIcon style={{ marginRight: greaterThanSm ? \"8px\" : 0 }}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4 9V17H6V7H2V9H4ZM21.745 12.6633C20.9224 12.2394 19.9892 12 19 12C18.6593 12 18.3252 12.0284 18 12.083V11H20V9H16V7H20C20.5304 7 21.0391 7.21071 21.4142 7.58579C21.7893 7.96086 22 8.46957 22 9V10.5C22 10.8978 21.842 11.2794 21.5607 11.5607C21.2794 11.842 20.8978 12 20.5 12C20.8978 12 21.2794 12.158 21.5607 12.4393C21.6297 12.5084 21.6913 12.5835 21.745 12.6633ZM13.8027 15C13.4513 15.6074 13.2034 16.2821 13.083 17H8V13C8 11.89 8.9 11 10 11H12V9H8V7H12C12.5304 7 13.0391 7.21071 13.4142 7.58579C13.7893 7.96086 14 8.46957 14 9V11C14 12.11 13.1 13 12 13H10V15H13.8027Z\"\n fill=\"black\"\n />\n <rect x=\"15\" y=\"17\" width=\"8\" height=\"2\" fill=\"black\" />\n <rect\n x=\"18\"\n y=\"22\"\n width=\"8\"\n height=\"2\"\n transform=\"rotate(-90 18 22)\"\n fill=\"black\"\n />\n </svg>\n </SvgIcon>\n {greaterThanSm && t`Metrics`}\n </Button>\n </ButtonGroup>\n </GenericDialog>\n );\n }\n);\n\nexport default CreateReport;\n","import React, { Component } from \"react\"\nimport Skeleton from \"@mui/material/Skeleton\"\nimport Table from \"@mui/material/Table\"\nimport TableHead from \"@mui/material/TableHead\"\nimport TableRow from \"@mui/material/TableRow\"\nimport TableCell from \"@mui/material/TableCell\"\nimport TableBody from \"@mui/material/TableBody\"\nimport IconButton from \"@mui/material/IconButton\"\nimport SvgIcon from \"@mui/material/SvgIcon\"\nimport Typography from \"@mui/material/Typography\"\nimport Badge from \"@mui/material/Badge\"\nimport LinearProgress from \"@mui/material/LinearProgress\"\nimport { withStyles } from \"@mui/styles\"\nimport moment from \"moment\"\nimport { withTranslation } from \"react-i18next\"\nimport { graphql } from \"@apollo/react-hoc\"\nimport gql from \"graphql-tag\"\nimport { ErrorScreen } from \"@igloocloud/igloosharedui\"\n\nconst {\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnMainBackgroundColor,\n REACT_APP_COLLECTION_NAME: collectionName,\n} = process.env\n\nconst StyledBadge = withStyles(() => ({\n badge: {\n right: 4,\n top: 4,\n },\n}))(Badge)\n\nconst cellStyle = {\n whiteSpace: \"nowrap\",\n}\n\nexport default graphql(\n gql`\n query ($offset: NaturalNumber, $limit: NaturalNumber!) {\n user {\n id\n reportCount\n reports(limit: $limit, offset: $offset) {\n id\n createdAt\n downloaded\n downloadUrl\n title\n collection {\n id\n name\n }\n producer {\n id\n name\n }\n }\n }\n }\n `,\n {\n name: \"userData\",\n options: () => ({\n variables: {\n offset: 0,\n limit: 20,\n },\n }),\n }\n)(\n graphql(\n gql`\n mutation setDownloaded($id: ID!) {\n updateReport(id: $id, downloaded: true) {\n id\n downloaded\n }\n }\n `\n )(\n withTranslation()(\n class Reports extends Component {\n state = {\n fetchMoreLoading: false,\n }\n\n componentDidMount() {\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n reportCreated {\n id\n createdAt\n downloaded\n downloadUrl\n title\n collection {\n id\n name\n }\n producer {\n id\n name\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newReports = [\n ...prev.user.reports,\n subscriptionData.data.reportCreated,\n ].sort((a, b) =>\n +new Date(a.createdAt) < +new Date(b.createdAt)\n ? 1\n : +new Date(a.createdAt) > +new Date(b.createdAt)\n ? -1\n : 0\n )\n\n return {\n user: {\n ...prev.user,\n reports: newReports,\n },\n }\n },\n })\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n reportUpdated {\n id\n createdAt\n downloaded\n downloadUrl\n title\n collection {\n id\n name\n }\n producer {\n id\n name\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newReports = [\n ...prev.user.reports.filter(\n (report) =>\n report.id !== subscriptionData.data.reportUpdated.id\n ),\n subscriptionData.data.reportUpdated,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n )\n\n return {\n user: {\n ...prev.user,\n reports: newReports,\n },\n }\n },\n })\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n reportDeleted\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev\n }\n\n const newReports = prev.user.reports.filter(\n (report) => report.id !== subscriptionData.data.reportDeleted\n )\n\n return {\n user: {\n ...prev.user,\n reports: newReports,\n },\n }\n },\n })\n }\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.userData.user.reportCount >\n this.props.userData.user.reports.length\n ) {\n this.queryMore.locked = true\n\n try {\n this.setState({ fetchMoreLoading: true })\n await this.props.userData.fetchMore({\n variables: {\n offset: this.props.userData.user.reports.length,\n limit:\n this.props.userData.user.reportCount -\n this.props.userData.user.reports.length >=\n 20\n ? 20\n : this.props.userData.user.reportCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev\n }\n\n const newReports = [\n ...prev.user.reports,\n ...fetchMoreResult.user.reports,\n ]\n\n return {\n user: {\n ...prev.user,\n reports: newReports,\n },\n }\n },\n })\n } finally {\n this.setState(() => {\n this.queryMore.locked = false\n\n return { fetchMoreLoading: false }\n })\n }\n }\n }\n\n setDownloaded = async (id) => {\n this.setState({ showLoading: true })\n\n await this.props.mutate({\n variables: {\n id,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n updateReport: {\n id,\n downloaded: true,\n __typename: \"Report\",\n },\n },\n })\n }\n\n render() {\n const {\n mobile,\n t,\n userData: { error, loading, user, refetch },\n } = this.props\n const { fetchMoreLoading } = this.state\n\n const getReadableDate = (timestamp) =>\n timestamp.isSame(moment(), \"day\")\n ? t`Today`\n : timestamp.isSameOrAfter(moment().subtract(7, \"days\"), \"day\") &&\n timestamp.isBefore(new Date())\n ? t`This week`\n : timestamp.isSameOrAfter(moment().subtract(31, \"days\"), \"day\") &&\n timestamp.isBefore(new Date())\n ? t`This month`\n : timestamp.fromNow().charAt(0).toUpperCase() +\n timestamp.fromNow().slice(1)\n\n return user && !user.reports.length ? (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n width: \"100%\",\n textAlign: \"center\",\n marginTop: \"32px\",\n marginBottom: \"32px\",\n color: textOnMainBackgroundColor,\n }}\n >\n {t`No reports`}\n </Typography>\n ) : error ? (\n <ErrorScreen\n refetch={() =>\n refetch({\n limit: 20,\n offset: 0,\n filter: {},\n })\n }\n error={error}\n />\n ) : (\n <>\n <div>\n <div\n className=\"notSelectable\"\n style={{\n width: \"100%\",\n maxWidth: mobile ? \"unset\" : \"768px\",\n height: mobile ? \"100%\" : \"calc(100% - 64px)\",\n margin: \"0 auto\",\n }}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n ) {\n this.queryMore()\n }\n }}\n >\n <Table stickyHeader>\n <TableHead>\n <TableRow style={{ height: \"64px\" }}>\n <TableCell\n style={{\n backgroundColor,\n width: mobile ? \"50%\" : \"25%\",\n }}\n >\n <b>{t`Title`}</b>\n </TableCell>\n <TableCell\n style={{\n backgroundColor,\n width: mobile ? \"50%\" : \"25%\",\n }}\n >\n <b>{t(collectionName || \"Collection\")}</b>\n </TableCell>\n {!mobile && (\n <>\n <TableCell\n style={{\n backgroundColor,\n width: \"25%\",\n }}\n >\n <b>{t`Author`}</b>\n </TableCell>\n <TableCell\n style={{ backgroundColor, width: \"25%\" }}\n >\n <b>{t`Created`}</b>\n </TableCell>\n </>\n )}\n <TableCell style={{ backgroundColor }}>\n <div style={{ width: \"32px\" }} />\n {/* Forces column width to be 64px */}\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {(loading ? new Array(20).fill({}) : user.reports).map(\n ({\n id,\n title,\n producer,\n collection,\n createdAt,\n downloaded,\n downloadUrl,\n }) => (\n <TableRow key={id} style={{ height: \"64px\" }}>\n <TableCell\n style={{\n ...cellStyle,\n width: mobile ? \"50%\" : \"25%\",\n }}\n >\n {loading ? <Skeleton /> : title}\n </TableCell>\n <TableCell\n style={{\n ...cellStyle,\n width: mobile ? \"50%\" : \"25%\",\n }}\n >\n {loading ? <Skeleton /> : collection.name}\n </TableCell>\n {!mobile && (\n <>\n <TableCell\n style={{\n ...cellStyle,\n width: \"25%\",\n }}\n >\n {loading ? <Skeleton /> : producer.name}\n </TableCell>\n <TableCell\n style={{ ...cellStyle, width: \"25%\" }}\n >\n {loading ? (\n <Skeleton />\n ) : (\n getReadableDate(moment(createdAt))\n )}\n </TableCell>\n </>\n )}\n <TableCell\n style={{\n ...cellStyle,\n width: \"48px\",\n padding: \"0 8px\",\n }}\n align=\"right\"\n >\n {loading ? (\n <Skeleton\n variant=\"circular\"\n style={{\n width: \"24px\",\n height: \"24px\",\n margin: \"auto\",\n }}\n />\n ) : (\n <IconButton\n component=\"a\"\n download\n href={\n downloadUrl +\n \"?token=\" +\n (localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(\n localStorage.getItem(\"accountList\")\n ).filter(\n (account) =>\n account.id ===\n localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(\n localStorage.getItem(\"accountList\")\n ).filter(\n (account) =>\n account.id ===\n localStorage.getItem(\"userId\")\n )[0].token\n : \"\")\n }\n onClick={() => this.setDownloaded(id)}\n size=\"large\"\n >\n <StyledBadge\n color=\"secondary\"\n variant=\"dot\"\n invisible={downloaded}\n style={{ zIndex: 0 }}\n >\n <SvgIcon>\n <svg\n style={{\n width: \"24px\",\n height: \"24px\",\n }}\n viewBox=\"0 0 24 24\"\n >\n <g>\n <rect\n fill=\"none\"\n height=\"24\"\n width=\"24\"\n />\n </g>\n <g>\n <path d=\"M18,15v3H6v-3H4v3c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2v-3H18z M17,11l-1.41-1.41L13,12.17V4h-2v8.17L8.41,9.59L7,11l5,5 L17,11z\" />\n </g>\n </svg>\n </SvgIcon>\n </StyledBadge>\n </IconButton>\n )}\n </TableCell>\n </TableRow>\n )\n )}\n </TableBody>\n </Table>\n </div>\n </div>\n {fetchMoreLoading && (\n <LinearProgress\n style={\n this.props.mobile\n ? {\n position: \"absolute\",\n top: 0,\n width: \"100%\",\n maxWidth: \"unset\",\n margin: \"0 auto\",\n zIndex: 100,\n }\n : {\n margin: \"-4px auto 0 auto\",\n width: \"100%\",\n maxWidth: \"768px\",\n }\n }\n />\n )}\n </>\n )\n }\n }\n )\n )\n)\n","import React, { Fragment } from \"react\";\nimport { MobileDateRangePicker, DateRangePickerDay } from \"@mui/lab\";\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\";\nimport { createTheme, adaptV4Theme, styled } from \"@mui/material/styles\";\nimport TextField from \"@mui/material/TextField\";\nimport moment from \"moment\";\nimport { withTranslation } from \"react-i18next\";\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\";\nimport tinyColor from \"tinycolor2\";\n\nexport default withTranslation()(\n ({\n t,\n startDate,\n endDate,\n user,\n setDates,\n style,\n disabled,\n refetchSeries,\n seriesCount,\n }) => {\n const {\n REACT_APP_MAIN_COLOR: mainColor,\n REACT_APP_TEXT_ON_MAIN_COLOR: textOnMainColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n REACT_APP_TEXT_ON_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS:\n textOnLightContrastColor,\n } = process.env;\n\n const CustomDateRangePickerDay = styled(DateRangePickerDay)(\n ({ _, isHighlighting, outsideCurrentMonth }) => ({\n ...(isHighlighting &&\n !outsideCurrentMonth && {\n backgroundColor: tinyColor(lightContrastColor || mainColor)\n .setAlpha(0.7)\n .toHex8String(),\n color: textOnLightContrastColor || textOnMainColor,\n }),\n })\n );\n\n return (\n <StyledEngineProvider injectFirst>\n <ThemeProvider\n theme={createTheme(\n adaptV4Theme({\n palette: {\n primary: {\n main: lightContrastColor || mainColor,\n },\n },\n })\n )}\n >\n <MobileDateRangePicker\n disableHighlightToday\n allowSameDateSelection\n renderInput={(startProps, endProps) => (\n <Fragment>\n <TextField\n {...startProps}\n style={{ width: \"calc(50% - 8px)\", marginRight: \"16px\" }}\n label={t`From`}\n disabled={!seriesCount}\n />\n <TextField\n {...endProps}\n style={{ width: \"calc(50% - 8px)\" }}\n label={t`To`}\n disabled={!seriesCount}\n />\n </Fragment>\n )}\n value={[startDate, endDate]}\n onChange={([startDate, endDate]) => {\n localStorage.setItem(\n \"dataLabDates\",\n localStorage.getItem(\"dataLabDates\") &&\n JSON.parse(localStorage.getItem(\"dataLabDates\"))[0]\n ? JSON.stringify([\n ...JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).filter(\n ({ id }) => id !== localStorage.getItem(\"userId\")\n ),\n {\n id: localStorage.getItem(\"userId\"),\n selectedVariables:\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n )?.selectedVariables || null,\n startDate: moment(startDate).startOf(\"day\").toString(),\n endDate:\n endDate && !moment(endDate).isSame(new Date(), \"day\")\n ? moment(endDate).endOf(\"day\").toString()\n : \"\",\n },\n ])\n : JSON.stringify([\n {\n id: localStorage.getItem(\"userId\"),\n startDate: moment(startDate).startOf(\"day\").toString(),\n endDate:\n endDate && !moment(endDate).isSame(new Date(), \"day\")\n ? moment(endDate).endOf(\"day\").toString()\n : \"\",\n },\n ])\n );\n\n setDates(\n moment(startDate).startOf(\"day\"),\n moment(endDate).endOf(\"day\")\n );\n\n refetchSeries(\n moment(startDate).startOf(\"day\"),\n moment(endDate).endOf(\"day\")\n );\n }}\n inputVariant=\"outlined\"\n inputFormat={\n user\n ? user.dateFormat === \"DMY\"\n ? \"DD/MM/YYYY\"\n : user.dateFormat === \"MDY\"\n ? \"MM/DD/YYYY\"\n : user.dateFormat === \"YMD\"\n ? \"YYYY/MM/DD\"\n : \"YYYY/DD/MM\"\n : null\n }\n style={style}\n cancelText={t`Close`}\n okText={t`Confirm`}\n DialogProps={{\n className: \"notSelectable\",\n style: { textTransform: \"capitalize\" },\n }}\n invalidDateMessage={t`Invalid date format`}\n className=\"notSelectable\"\n disabled={disabled}\n showToolbar={false}\n renderDay={(_, dateRangePickerDayProps) => (\n <CustomDateRangePickerDay {...dateRangePickerDayProps} />\n )}\n />\n </ThemeProvider>\n </StyledEngineProvider>\n );\n }\n);\n","import React, { Component, Fragment } from \"react\"\nimport List from \"@mui/material/List\"\nimport ListItem from \"@mui/material/ListItem\"\nimport ListItemText from \"@mui/material/ListItemText\"\nimport ListItemSecondaryAction from \"@mui/material/ListItemSecondaryAction\"\nimport Collapse from \"@mui/material/Collapse\"\nimport Typography from \"@mui/material/Typography\"\nimport ExpandMore from \"@mui/icons-material/ExpandMore\"\nimport tinyColor from \"tinycolor2\"\nimport { withTranslation } from \"react-i18next\"\nimport { unitConversion } from \"@igloocloud/igloosharedui\"\n\nexport const Keyframes = (props) => {\n const toCss = (cssObject) =>\n typeof cssObject === \"string\"\n ? cssObject\n : Object.keys(cssObject).reduce((accumulator, key) => {\n const cssKey = key.replace(/[A-Z]/g, (v) => `-${v.toLowerCase()}`)\n const cssValue = cssObject[key].toString().replace(\"'\", \"\")\n return `${accumulator}${cssKey}:${cssValue};`\n }, \"\")\n\n return (\n <style>\n {`@keyframes ${props.name} {\n ${Object.keys(props)\n .map((key) => {\n return [\"from\", \"to\"].includes(key)\n ? `${key} { ${toCss(props[key])} }`\n : /^_[0-9]+$/.test(key)\n ? `${key.replace(\"_\", \"\")}% { ${toCss(props[key])} }`\n : \"\"\n })\n .join(\" \")}\n }`}\n </style>\n )\n}\n\nexport default withTranslation()(\n class SeriesList extends Component {\n state = { fetchMoreLoading: false }\n\n queryMore = async () => {\n if (\n !this.queryMore.locked &&\n this.props.seriesData.user.floatSeriesVariableCount >\n this.props.seriesData.user.floatSeriesVariables.length\n ) {\n this.queryMore.locked = true\n\n try {\n this.setState({ fetchMoreLoading: true })\n\n await this.props.seriesData.fetchMore({\n variables: {\n offset: this.props.seriesData.user.floatSeriesVariables.length,\n limit:\n this.props.seriesData.user.floatSeriesVariableCount -\n this.props.seriesData.user.floatSeriesVariables.length >=\n 20\n ? 20\n : this.props.seriesData.user.floatSeriesVariableCount % 20,\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev\n }\n\n const newFloatSeriesVariables = [\n ...prev.user.floatSeriesVariables,\n ...fetchMoreResult.user.floatSeriesVariables,\n ]\n\n return {\n user: {\n ...prev.user,\n floatSeriesVariables: newFloatSeriesVariables,\n },\n }\n },\n })\n } finally {\n this.setState(() => {\n this.queryMore.locked = false\n\n return { fetchMoreLoading: false }\n })\n\n this.checkIfScrollable()\n }\n }\n }\n\n checkIfScrollable = () => {\n if (\n this.seriesList &&\n this.seriesList.clientHeight > this.seriesList.scrollHeight\n ) {\n this.queryMore()\n }\n }\n\n componentDidMount() {\n this.checkIfScrollable()\n\n window.addEventListener(\"resize\", this.checkIfScrollable)\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", this.checkIfScrollable)\n }\n\n render() {\n const {\n loadingVariables,\n selectedVariables,\n setSelectedVariables,\n expandedThings,\n setExpandedThings,\n allSeries,\n shownUnits,\n isInDrawer,\n fetchSeries,\n t,\n user,\n seriesUser: { floatSeriesVariables },\n } = this.props\n const {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnBackgroundColor,\n REACT_APP_SERIES_COLORS,\n } = process.env\n const seriesColors = JSON.parse(REACT_APP_SERIES_COLORS)\n\n const things = floatSeriesVariables.reduce(\n (things, variable) => [\n ...things.filter(\n ({ id: idToRemove }) => idToRemove !== variable.thing.id\n ),\n things.find(({ id: idToFind }) => idToFind === variable.thing.id)\n ? {\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ),\n variables: [\n ...things.find(\n ({ id: idToFind }) => idToFind === variable.thing.id\n ).variables,\n variable,\n ],\n }\n : {\n ...variable.thing,\n variables: [variable],\n },\n ],\n []\n )\n\n const loadingUnits = [\n ...new Set(\n floatSeriesVariables\n .filter(({ id }) => loadingVariables.includes(id))\n .map(({ unitOfMeasurement }) => unitOfMeasurement)\n ),\n ]\n\n return things[0] ? (\n <List\n style={{\n padding: isInDrawer ? 0 : \"0 16px\",\n height: isInDrawer ? \"100%\" : \"calc(100% - 88px)\",\n overflow: \"auto\",\n }}\n ref={(ref) => (this.seriesList = ref)}\n onScroll={(event) => {\n if (\n event.target.scrollTop + event.target.clientHeight >=\n event.target.scrollHeight - 600\n ) {\n this.queryMore()\n }\n }}\n >\n {things.map(({ id: thingId, name: thingName, variables }) => (\n <Fragment key={\"data-lab-thing-\" + thingId}>\n <ListItem\n button\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n borderRadius: isInDrawer ? 0 : \"4px\",\n margin: isInDrawer ? 0 : \"4px 0\",\n }}\n onClick={() =>\n setExpandedThings(({ expandedThings }) => ({\n expandedThings: expandedThings.includes(thingId)\n ? expandedThings.filter((id) => id !== thingId)\n : [...expandedThings, thingId],\n }))\n }\n >\n <ListItemText\n disableTypography\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {thingName}\n </ListItemText>\n <ExpandMore\n style={{\n transform: expandedThings.includes(thingId)\n ? \"rotate(180deg)\"\n : \"\",\n transition:\n \"transform 150ms cubic-bezier(0.4, 0, 0.2, 1) 0ms\",\n }}\n />\n </ListItem>\n {variables.map(\n ({\n id: variableId,\n name: variableName,\n unitOfMeasurement,\n nodeCount,\n }) => (\n <Collapse in={expandedThings.includes(thingId)}>\n <Keyframes\n name={\"pulse-\" + variableId}\n _0={{\n backgroundColor: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).setAlpha(0.15)\n : \"unset\",\n }}\n _50={{\n backgroundColor: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).setAlpha(0.05)\n : \"unset\",\n }}\n _100={{\n backgroundColor: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).setAlpha(0.15)\n : \"unset\",\n }}\n />\n <List component=\"div\" disablePadding>\n <ListItem\n key={\"data-lab-variable-\" + variableId}\n button\n onClick={() => {\n if (selectedVariables.includes(variableId)) {\n localStorage.setItem(\n \"dataLabDates\",\n localStorage.getItem(\"dataLabDates\") &&\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n )[0]\n ? JSON.stringify([\n ...JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).filter(\n ({ id }) =>\n id !== localStorage.getItem(\"userId\")\n ),\n {\n id: localStorage.getItem(\"userId\"),\n startDate:\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).find(\n ({ id }) =>\n id ===\n localStorage.getItem(\"userId\")\n )?.startDate || null,\n endDate:\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).find(\n ({ id }) =>\n id ===\n localStorage.getItem(\"userId\")\n )?.endDate || null,\n selectedVariables:\n selectedVariables.filter(\n (selectedVariableId) =>\n selectedVariableId !== variableId\n ),\n },\n ])\n : JSON.stringify([\n {\n id: localStorage.getItem(\"userId\"),\n selectedVariables:\n selectedVariables.filter(\n (selectedVariableId) =>\n selectedVariableId !== variableId\n ),\n },\n ])\n )\n\n setSelectedVariables(({ selectedVariables }) => ({\n selectedVariables: selectedVariables.filter(\n (selectedVariableId) =>\n selectedVariableId !== variableId\n ),\n }))\n } else {\n localStorage.setItem(\n \"dataLabDates\",\n localStorage.getItem(\"dataLabDates\") &&\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n )[0]\n ? JSON.stringify([\n ...JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).filter(\n ({ id }) =>\n id !== localStorage.getItem(\"userId\")\n ),\n {\n id: localStorage.getItem(\"userId\"),\n startDate:\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).find(\n ({ id }) =>\n id ===\n localStorage.getItem(\"userId\")\n )?.startDate || null,\n endDate:\n JSON.parse(\n localStorage.getItem(\"dataLabDates\")\n ).find(\n ({ id }) =>\n id ===\n localStorage.getItem(\"userId\")\n )?.endDate || null,\n selectedVariables: [\n ...selectedVariables,\n variableId,\n ],\n },\n ])\n : JSON.stringify([\n {\n id: localStorage.getItem(\"userId\"),\n selectedVariables: [\n ...selectedVariables,\n variableId,\n ],\n },\n ])\n )\n\n setSelectedVariables(({ selectedVariables }) => ({\n selectedVariables: [\n ...selectedVariables,\n variableId,\n ],\n }))\n\n if (\n !allSeries.find(\n (series) => series.id === variableId\n )\n ) {\n fetchSeries(variableId)\n }\n }\n }}\n selected={selectedVariables.includes(variableId)}\n style={{\n animationName: \"pulse-\" + variableId,\n animationDuration: \"1.5s\",\n animationIterationCount: loadingVariables.includes(\n variableId\n )\n ? \"infinite\"\n : 0,\n paddingLeft: \"32px\",\n borderRadius: isInDrawer ? 0 : \"4px\",\n margin: isInDrawer ? 0 : \"4px 0\",\n color: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).setAlpha(0.15)\n : null,\n backgroundColor: selectedVariables.includes(\n variableId\n )\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).setAlpha(0.15)\n : \"unset\",\n }}\n disabled={\n (shownUnits.length + loadingUnits.length >= 2 &&\n !(\n shownUnits.includes(unitOfMeasurement) ||\n loadingUnits.includes(unitOfMeasurement)\n )) ||\n nodeCount === 0\n }\n >\n <ListItemText\n disableTypography\n style={{\n color: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).darken()\n : textColor,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {variableName}\n </ListItemText>\n <ListItemSecondaryAction\n style={{\n color: selectedVariables.includes(variableId)\n ? tinyColor(\n selectedVariables.findIndex(\n (id) => id === variableId\n ) !== -1\n ? seriesColors[\n selectedVariables.findIndex(\n (id) => id === variableId\n ) % seriesColors.length\n ]\n : seriesColors[\n (selectedVariables.length - 1) %\n seriesColors.length\n ]\n ).darken()\n : tinyColor(textColor).setAlpha(0.38),\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n zIndex: -1,\n }}\n className=\"notSelectable\"\n >\n {unitConversion(\n null,\n unitOfMeasurement,\n user.lengthAndMass,\n user.temperature\n )}\n </ListItemSecondaryAction>\n </ListItem>\n </List>\n </Collapse>\n )\n )}\n </Fragment>\n ))}\n </List>\n ) : (\n <Typography\n variant=\"h5\"\n className=\"notSelectable defaultCursor\"\n style={{\n textAlign: \"center\",\n margin: \"32px\",\n color: textOnBackgroundColor,\n }}\n >\n {t`No series`}\n </Typography>\n )\n }\n }\n)\n","import React, { Component } from \"react\";\nimport { AutoSizer } from \"react-virtualized\";\nimport {\n XYPlot,\n XAxis,\n YAxis,\n HorizontalGridLines,\n LineMarkSeries,\n MarkSeries,\n Highlight,\n Borders,\n Crosshair,\n} from \"react-vis\";\nimport { withRouter } from \"react-router\";\nimport tinyColor from \"tinycolor2\";\nimport moment from \"moment\";\nimport Paper from \"@mui/material/Paper\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n roundToPrecision,\n valueConversion,\n unitConversion,\n getTickFormat,\n debounce,\n isNullish,\n} from \"@igloocloud/igloosharedui\";\n\nexport default withRouter(\n class Plot extends Component {\n state = {\n left: null,\n right: null,\n lessThan1200: null,\n crosshairValues: [],\n leftLabelWidth: 0,\n rightLabelWidth: 0,\n };\n\n updateDimensions = () => {\n const { lessThan1200 } = this.state;\n\n if (window.innerWidth < 1200) {\n !lessThan1200 && this.setState({ lessThan1200: true });\n } else {\n lessThan1200 && this.setState({ lessThan1200: false });\n }\n };\n\n checkIfNoData = (\n shownSeries,\n startDate,\n endDate,\n selectedVariables,\n loadingVariables\n ) => {\n if (\n selectedVariables[0] &&\n !loadingVariables[0] &&\n shownSeries[0] &&\n !shownSeries.flatMap(({ nodes }) =>\n nodes\n .filter(\n ({ value, timestamp }) =>\n !isNullish(value) &&\n new Date(timestamp) >= startDate &&\n new Date(timestamp) <= endDate\n )\n .flatMap(({ timestamp }) => new Date(timestamp))\n ).length\n ) {\n this.props.setSnackbarOpen(true);\n } else {\n this.props.setSnackbarOpen(false);\n }\n };\n\n componentDidMount() {\n this.updateDimensions();\n window.addEventListener(\"resize\", debounce(this.updateDimensions));\n\n this.unlisten = this.props.history.listen((location) => {\n if (location.pathname === \"/data\") {\n this.checkIfNoData(\n this.props.shownSeries,\n this.props.startDate,\n this.props.endDate,\n this.props.selectedVariables,\n this.props.loadingVariables\n );\n } else {\n this.props.setSnackbarOpen(false);\n }\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", debounce(this.updateDimensions));\n\n this.unlisten();\n }\n\n computeLabelWidth(text) {\n let canvas =\n this.computeTextWidth.canvas ||\n (this.computeTextWidth.canvas = document.createElement(\"canvas\"));\n let context = canvas.getContext(\"2d\");\n let metrics = context.measureText(text);\n\n return metrics.width * 1.06;\n }\n\n computeTextWidth(text) {\n let canvas =\n this.computeTextWidth.canvas ||\n (this.computeTextWidth.canvas = document.createElement(\"canvas\"));\n let context = canvas.getContext(\"2d\");\n let metrics = context.measureText(text);\n\n return metrics.width * 1.65;\n }\n\n componentWillReceiveProps(nextProps) {\n if (\n (nextProps.startDate !== this.props.startDate ||\n nextProps.endDate !== this.props.endDate ||\n nextProps.shownSeries.length !== this.props.shownSeries.length ||\n nextProps.shownSeries.flatMap(({ nodes }) =>\n nodes\n .filter(\n ({ value, timestamp }) =>\n value &&\n new Date(timestamp) >= nextProps.startDate &&\n new Date(timestamp) <= nextProps.endDate\n )\n .flatMap(({ timestamp }) => new Date(timestamp))\n ).length !==\n this.props.shownSeries.flatMap(({ nodes }) =>\n nodes\n .filter(\n ({ value, timestamp }) =>\n value &&\n new Date(timestamp) >= nextProps.startDate &&\n new Date(timestamp) <= nextProps.endDate\n )\n .flatMap(({ timestamp }) => new Date(timestamp))\n ).length) &&\n window.location.pathname === \"/data\"\n ) {\n this.checkIfNoData(\n nextProps.shownSeries,\n nextProps.startDate,\n nextProps.endDate,\n nextProps.selectedVariables,\n nextProps.loadingVariables\n );\n }\n }\n\n render() {\n const {\n shownUnits,\n startDate,\n endDate,\n shownSeries,\n user,\n selectedVariables,\n enableAnimation,\n } = this.props;\n const {\n left,\n right,\n lessThan1200,\n crosshairValues,\n leftLabelWidth,\n rightLabelWidth,\n } = this.state;\n const {\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n REACT_APP_LIGHT_COLOR: lightColor,\n REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor,\n REACT_APP_SERIES_COLORS,\n } = process.env;\n const seriesColors = JSON.parse(REACT_APP_SERIES_COLORS);\n\n const shownTimestamps = shownSeries\n .flatMap(({ nodes }) =>\n nodes\n .filter(\n ({ value, timestamp }) =>\n !isNullish(value) &&\n new Date(timestamp) >= startDate &&\n new Date(timestamp) <= endDate\n )\n .flatMap(({ timestamp }) => new Date(timestamp))\n )\n .sort((a, b) => (+a > +b ? 1 : +a === +b ? 0 : -1));\n let shownNodesByUnit = { firstUnit: [], secondUnit: [] };\n shownSeries.forEach(({ unitOfMeasurement, nodes }) =>\n unitOfMeasurement === shownUnits[0]\n ? shownNodesByUnit.firstUnit.push(\n ...nodes\n .filter(\n ({ timestamp }) =>\n new Date(timestamp) >= startDate &&\n new Date(timestamp) <= endDate\n )\n .map(({ value }) => value)\n )\n : shownNodesByUnit.secondUnit.push(\n ...nodes\n .filter(\n ({ timestamp }) =>\n new Date(timestamp) >= startDate &&\n new Date(timestamp) <= endDate\n )\n .map(({ value }) => value)\n )\n );\n\n return (\n <AutoSizer>\n {({ height, width }) => (\n <XYPlot\n margin={{\n top: 32,\n right:\n shownUnits[1] !== undefined && shownTimestamps[0]\n ? rightLabelWidth + 16\n : 16,\n bottom: 40,\n left: leftLabelWidth + 16,\n }}\n width={width}\n height={height}\n xDomain={\n shownTimestamps.length === 1\n ? [+shownTimestamps[0] - 60_000, +shownTimestamps[0] + 60_000]\n : left && right\n ? [left, right]\n : [\n +startDate < +shownTimestamps[0]\n ? shownTimestamps[0]\n : startDate,\n +endDate > +shownTimestamps[shownTimestamps.length - 1]\n ? shownTimestamps[shownTimestamps.length - 1]\n : endDate,\n ]\n }\n yDomain={[0, 1]}\n xType=\"time\"\n onMouseLeave={() => this.setState({ crosshairValues: [] })}\n onTouchEnd={() => this.setState({ crosshairValues: [] })}\n dontCheckIfEmpty\n >\n {user && shownTimestamps[0] && startDate && endDate\n ? shownSeries\n .map((series) => {\n let minValue, maxValue;\n if (series.unitOfMeasurement === shownUnits[0]) {\n minValue = Math.min(...shownNodesByUnit.firstUnit);\n maxValue = Math.max(...shownNodesByUnit.firstUnit);\n } else {\n minValue = Math.min(...shownNodesByUnit.secondUnit);\n maxValue = Math.max(...shownNodesByUnit.secondUnit);\n }\n\n return {\n ...series,\n nodes: series.nodes.map((node) => ({\n ...node,\n value:\n node.value === null\n ? null\n : maxValue === minValue\n ? 0.5\n : (node.value - minValue) / (maxValue - minValue),\n })),\n };\n })\n .map((floatSeriesVariable, index) =>\n floatSeriesVariable.nodes.length === 1 ? (\n <MarkSeries\n key={\"mark-series\" + floatSeriesVariable.id}\n animation={enableAnimation}\n data={floatSeriesVariable.nodes.map((node) => ({\n x: +new Date(node.timestamp),\n y: 0.5,\n }))}\n color={seriesColors[index % seriesColors.length]}\n opacity={1}\n size={3}\n getNull={(node) => node.y !== null}\n />\n ) : floatSeriesVariable.visualization === \"mark\" ||\n floatSeriesVariable.visualization === \"bar\" ||\n floatSeriesVariable.visualization ===\n \"windDirection\" ? (\n <MarkSeries\n key={\"mark-series\" + floatSeriesVariable.id}\n animation={enableAnimation}\n data={floatSeriesVariable.nodes.map((node) => ({\n x: +new Date(node.timestamp),\n y: roundToPrecision(\n valueConversion(\n node.value,\n floatSeriesVariable.unitOfMeasurement,\n user.lengthAndMass,\n user.temperature\n ),\n floatSeriesVariable.precision\n ),\n }))}\n color={seriesColors[index % seriesColors.length]}\n size={3}\n getNull={(node) => node.y !== null}\n />\n ) : (\n <LineMarkSeries\n key={\"line-series\" + floatSeriesVariable.id}\n animation={enableAnimation}\n curve=\"curveMonotoneX\"\n data={floatSeriesVariable.nodes.map((node) => ({\n x: +new Date(node.timestamp),\n y: node.value,\n }))}\n size={0}\n opacity={1}\n strokeStyle=\"solid\"\n stroke={\n seriesColors[\n selectedVariables.findIndex(\n (id) => id === floatSeriesVariable.id\n ) % seriesColors.length\n ]\n }\n strokeWidth={3}\n getNull={(node) => node.y !== null}\n />\n )\n )\n : null}\n {startDate && endDate && (\n <MarkSeries\n data={shownTimestamps.map((x) => ({ x, y: null }))}\n size={0}\n onNearestX={(value, { index }) => {\n if (\n (!left ||\n !right ||\n (value.x >= left && value.x <= right)) &&\n value.x >= startDate &&\n value.x <= endDate\n ) {\n this.setState({\n crosshairValues: [\n {\n x: shownTimestamps[index],\n y: 0.5,\n },\n ],\n });\n }\n }}\n />\n )}\n <Borders\n style={{\n all: { fill: backgroundColor },\n top: { height: \"30px\" },\n bottom: { y: height - 38, height: \"38px\" },\n }}\n />\n <HorizontalGridLines\n style={{\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n }}\n tickTotal={12}\n />\n <XAxis\n attr=\"x\"\n attrAxis=\"y\"\n orientation=\"bottom\"\n className=\"notSelectable\"\n tickSize={startDate && endDate ? 6 : 0}\n tickFormat={(date) =>\n user && startDate && endDate\n ? shownTimestamps[0]\n ? moment(date).format(\n shownTimestamps.length === 1\n ? user.timeFormat === \"H24\"\n ? \"HH:mm:ss\"\n : \"hh:mm:ss A\"\n : getTickFormat(\n shownTimestamps[0],\n shownTimestamps[shownTimestamps.length - 1],\n user.dateFormat,\n user.timeFormat,\n moment\n )\n )\n : moment(date).format(\n shownTimestamps.length === 1\n ? user.timeFormat === \"H24\"\n ? \"HH:mm:ss\"\n : \"hh:mm:ss A\"\n : getTickFormat(\n startDate,\n endDate,\n user.dateFormat,\n user.timeFormat,\n moment\n )\n )\n : \"\"\n }\n style={{\n line: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n ticks: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n text: {\n stroke: tinyColor(textColor).setAlpha(0.25).toRgbString(),\n fontSize: \"10px\",\n },\n }}\n tickTotal={lessThan1200 ? 4 : 8}\n />\n <YAxis\n attr=\"y\"\n attrAxis=\"x\"\n orientation=\"left\"\n className=\"notSelectable\"\n style={{\n line: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n ticks: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n text: {\n stroke: tinyColor(textColor).setAlpha(0.25).toRgbString(),\n fontSize: \"10px\",\n },\n }}\n tickSize={0}\n tickFormat={(value) => {\n const convertedValue = user\n ? valueConversion(\n shownNodesByUnit.firstUnit.every(\n (value) => value === shownNodesByUnit.firstUnit[0]\n )\n ? value * shownNodesByUnit.firstUnit[0] * 2\n : value *\n (Math.max(...shownNodesByUnit.firstUnit) -\n Math.min(...shownNodesByUnit.firstUnit)) +\n Math.min(...shownNodesByUnit.firstUnit),\n shownUnits[0],\n user.lengthAndMass,\n user.temperature\n )\n : null;\n\n const roundedValue = user\n ? parseFloat(\n convertedValue.toString().includes(\".\")\n ? convertedValue.toPrecision(6)\n : convertedValue\n )\n : null;\n\n if (\n leftLabelWidth <\n this.computeLabelWidth(\n user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[0] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[0],\n user.lengthAndMass,\n user.temperature\n )\n : \"\"\n )\n ) {\n this.setState({\n leftLabelWidth: this.computeLabelWidth(\n user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[0] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[0],\n user.lengthAndMass,\n user.temperature\n )\n : \"\"\n ),\n });\n }\n\n return user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[0] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[0],\n user.lengthAndMass,\n user.temperature\n )\n : \"\";\n }}\n tickTotal={12}\n />\n {shownUnits[1] !== undefined &&\n shownNodesByUnit.secondUnit &&\n shownTimestamps[0] &&\n startDate &&\n endDate ? (\n <YAxis\n attr=\"y\"\n attrAxis=\"x\"\n orientation=\"right\"\n className=\"notSelectable\"\n style={{\n line: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n ticks: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n text: {\n stroke: tinyColor(textColor).setAlpha(0.25).toRgbString(),\n fontSize: \"10px\",\n },\n }}\n tickSize={0}\n tickFormat={(value) => {\n const convertedValue = user\n ? valueConversion(\n value *\n (Math.max(...shownNodesByUnit.secondUnit) -\n Math.min(...shownNodesByUnit.secondUnit)) +\n Math.min(...shownNodesByUnit.secondUnit),\n shownUnits[1],\n user.lengthAndMass,\n user.temperature\n )\n : null;\n\n const roundedValue = user\n ? parseFloat(\n convertedValue.toString().includes(\".\")\n ? convertedValue.toPrecision(6)\n : convertedValue\n )\n : null;\n\n if (\n rightLabelWidth <\n this.computeLabelWidth(\n user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[1] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[1],\n user.lengthAndMass,\n user.temperature\n )\n : \"\"\n )\n ) {\n this.setState({\n rightLabelWidth: this.computeLabelWidth(\n user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[1] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[1],\n user.lengthAndMass,\n user.temperature\n )\n : \"\"\n ),\n });\n }\n\n return user && shownTimestamps[0] && startDate && endDate\n ? roundedValue +\n (shownUnits[1] !== \"%\" ? \" \" : \"\") +\n unitConversion(\n roundedValue,\n shownUnits[1],\n user.lengthAndMass,\n user.temperature\n )\n : \"\";\n }}\n tickTotal={12}\n />\n ) : (\n <YAxis\n attr=\"y\"\n attrAxis=\"x\"\n orientation=\"right\"\n className=\"notSelectable\"\n style={{\n line: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n ticks: {\n stroke: tinyColor(textColor).setAlpha(0.1).toRgbString(),\n },\n text: {\n stroke: tinyColor(textColor).setAlpha(0.25).toRgbString(),\n fontSize: \"10px\",\n },\n }}\n tickSize={0}\n tickFormat={() => \"\"}\n />\n )}\n {shownTimestamps[1] && (\n <Highlight\n className=\"plotHighlight\"\n enableY={false}\n color={lightContrastColor || lightColor}\n opacity={0.2}\n highlightWidth={width - 50}\n highlightHeight={height - 51}\n onBrushEnd={(range) => {\n this.setState({\n left: range?.left,\n right: range?.right,\n crosshairValues: [],\n });\n }}\n />\n )}\n {shownTimestamps[0] &&\n crosshairValues[0] &&\n (() => {\n const crosshairText = shownSeries.map(\n ({ name, nodes, unitOfMeasurement }) => {\n let seriesRanges = nodes\n .filter(\n (node, index) =>\n (!nodes[index - 1]?.value ||\n !nodes[index + 1]?.value) &&\n !isNullish(node.value)\n )\n .map(({ timestamp }) => timestamp)\n .reverse()\n .reduce((result, _, index, array) => {\n if (index % 2 === 0) {\n result.push(array.slice(index, index + 2));\n }\n\n return result;\n }, []);\n\n return seriesRanges.some(\n (range) =>\n +new Date(range[0]) <= +crosshairValues[0].x &&\n +new Date(range[1]) >= +crosshairValues[0].x\n )\n ? `${name}: ${\n nodes\n .slice()\n .sort((a, b) =>\n Math.abs(\n +new Date(a.timestamp) - +crosshairValues[0].x\n ) >\n Math.abs(\n +new Date(b.timestamp) - +crosshairValues[0].x\n )\n ? 1\n : Math.abs(\n +new Date(a.timestamp) -\n +crosshairValues[0].x\n ) ===\n Math.abs(\n +new Date(b.timestamp) -\n +crosshairValues[0].x\n )\n ? 0\n : -1\n )[0].value +\n (unitOfMeasurement\n ? (unitOfMeasurement !== \"%\" ? \"\\u00A0\" : \"\") +\n unitConversion(\n null,\n unitOfMeasurement,\n user.lengthAndMass,\n user.temperature\n )\n : \"\")\n }`\n : \"\";\n }\n );\n\n const crosshairElement = shownSeries.map(\n ({ name, nodes, unitOfMeasurement, precision }) => {\n let seriesRanges = nodes\n .filter(\n (node, index) =>\n (isNullish(nodes[index - 1]?.value) ||\n isNullish(nodes[index + 1]?.value)) &&\n !isNullish(node.value)\n )\n .map(({ timestamp }) => timestamp)\n .reverse()\n .reduce((result, _, index, array) => {\n if (index % 2 === 0) {\n result.push(array.slice(index, index + 2));\n }\n\n return result;\n }, []);\n\n return seriesRanges.some(\n (range) =>\n +new Date(range[0]) <= +crosshairValues[0].x &&\n +new Date(range[1]) >= +crosshairValues[0].x\n ) || nodes.length === 1 ? (\n <>\n {name}:{\" \"}\n {roundToPrecision(\n valueConversion(\n nodes\n .slice()\n .sort((a, b) =>\n Math.abs(\n +new Date(a.timestamp) -\n +crosshairValues[0].x\n ) >\n Math.abs(\n +new Date(b.timestamp) -\n +crosshairValues[0].x\n )\n ? 1\n : Math.abs(\n +new Date(a.timestamp) -\n +crosshairValues[0].x\n ) ===\n Math.abs(\n +new Date(b.timestamp) -\n +crosshairValues[0].x\n )\n ? 0\n : -1\n )[0].value,\n unitOfMeasurement,\n user.lengthAndMass,\n user.temperature\n ),\n precision\n )}\n {unitOfMeasurement ? (\n <>\n {unitOfMeasurement !== \"%\" ? \"\\u00A0\" : \"\"}\n {unitConversion(\n null,\n unitOfMeasurement,\n user.lengthAndMass,\n user.temperature\n )}\n </>\n ) : (\n \"\"\n )}\n </>\n ) : (\n \"\"\n );\n }\n );\n\n return (\n <Crosshair\n values={crosshairValues}\n style={{\n line: {\n backgroundColor: lightContrastColor || lightColor,\n height: height - 72,\n },\n }}\n >\n <Paper\n style={{\n padding: \"8px\",\n width:\n Math.max(\n ...[\n ...crosshairText,\n moment(crosshairValues[0].x).format(\n getTickFormat(\n shownTimestamps.length === 1\n ? +shownTimestamps[0] - 60_000\n : shownTimestamps[0],\n shownTimestamps.length === 1\n ? +shownTimestamps[0] + 60_000\n : shownTimestamps[\n shownTimestamps.length - 1\n ],\n user.dateFormat,\n user.timeFormat,\n moment\n )\n ),\n ].map((string) => this.computeTextWidth(string))\n ) || \"216px\",\n }}\n elevation={4}\n className=\"notSelectable\"\n >\n <Typography\n style={{\n fontWeight: \"bolder\",\n }}\n >\n {moment(crosshairValues[0].x).format(\n getTickFormat(\n shownTimestamps.length === 1\n ? +shownTimestamps[0] - 60_000\n : shownTimestamps[0],\n shownTimestamps.length === 1\n ? +shownTimestamps[0] + 60_000\n : shownTimestamps[shownTimestamps.length - 1],\n user.dateFormat,\n user.timeFormat,\n moment\n )\n )}\n </Typography>\n <Typography>\n {crosshairElement.map((text) => (\n <>\n {text}\n {text && <br />}\n </>\n ))}\n </Typography>\n </Paper>\n </Crosshair>\n );\n })()}\n </XYPlot>\n )}\n </AutoSizer>\n );\n }\n }\n);\n","import React, { Component } from \"react\";\nimport IconButton from \"@mui/material/IconButton\";\nimport SwipeableDrawer from \"@mui/material/SwipeableDrawer\";\nimport MenuOpen from \"@mui/icons-material/MenuOpen\";\nimport moment from \"moment\";\nimport Papa from \"papaparse\";\nimport gql from \"graphql-tag\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport {\n debounce,\n isNullish,\n CenteredSpinner,\n ErrorScreen,\n} from \"@igloocloud/igloosharedui\";\nimport { withRouter } from \"react-router\";\nimport DatePicker from \"./components/data/DatePicker\";\nimport SeriesList from \"./components/data/SeriesList\";\nimport Plot from \"./components/data/Plot\";\n\nconst isJSON = (text) =>\n /^[\\],:{}\\s]*$/.test(\n text\n // eslint-disable-next-line\n .replace(/\\\\[\"\\\\\\/bfnrtu]/g, \"@\")\n .replace(\n // eslint-disable-next-line\n /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n \"]\"\n )\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, \"\")\n );\n\nexport default withRouter(\n graphql(\n gql`\n query ($offset: NaturalNumber, $limit: NaturalNumber!) {\n user {\n id\n floatSeriesVariableCount\n floatSeriesVariables(\n limit: $limit\n offset: $offset\n bannedVisualizations: \"windDirection\"\n ) {\n id\n name\n unitOfMeasurement\n nodeCount\n thing {\n id\n name\n }\n }\n }\n }\n `,\n {\n name: \"seriesData\",\n options: () => ({\n variables: {\n offset: 0,\n limit: 20,\n },\n }),\n }\n )(\n class DataLab extends Component {\n state = {\n selectedVariables:\n localStorage.getItem(\"dataLabDates\") &&\n isJSON(localStorage.getItem(\"dataLabDates\")) &&\n JSON.parse(localStorage.getItem(\"dataLabDates\"))[0] &&\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n )?.selectedVariables\n ? JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n ).selectedVariables\n : [],\n allSeries: [],\n startDate:\n localStorage.getItem(\"dataLabDates\") &&\n isJSON(localStorage.getItem(\"dataLabDates\")) &&\n JSON.parse(localStorage.getItem(\"dataLabDates\"))[0] &&\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n )?.startDate\n ? new Date(\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n ).startDate\n )\n : moment().subtract(1, \"week\"),\n endDate:\n localStorage.getItem(\"dataLabDates\") &&\n isJSON(localStorage.getItem(\"dataLabDates\")) &&\n JSON.parse(localStorage.getItem(\"dataLabDates\"))[0] &&\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n )?.endDate\n ? new Date(\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n ).endDate\n )\n : new Date(),\n expandedThings: [],\n drawerOpen: false,\n lessThan900: null,\n loadingVariables: [],\n enableAnimation: true,\n };\n\n refetchSeries = async (startDate, endDate, allSeries) => {\n this.setState({ enableAnimation: false });\n\n for (const { id } of allSeries) {\n await this.fetchSeries(id, startDate, endDate, allSeries);\n }\n\n this.setState({ enableAnimation: true });\n };\n\n fetchSeries = async (id, startDate, endDate, allSeries) => {\n const { expandedThings } = this.state;\n\n try {\n if (\n allSeries.find(({ id: idToFind }) => idToFind === id)\n ?.fetchedIntervals &&\n +endDate <=\n allSeries.find(({ id: idToFind }) => idToFind === id)\n .fetchedIntervals[1] &&\n +startDate >=\n allSeries.find(({ id: idToFind }) => idToFind === id)\n .fetchedIntervals[0]\n ) {\n return;\n }\n\n this.setState(({ loadingVariables }) => ({\n loadingVariables: [...loadingVariables, id],\n }));\n\n let newStartDate, newEndDate;\n\n if (\n allSeries.find(({ id: idToFind }) => idToFind === id)\n ?.fetchedIntervals &&\n +endDate <\n allSeries.find(({ id: idToFind }) => idToFind === id)\n .fetchedIntervals[1]\n ) {\n newStartDate = endDate;\n }\n\n if (\n allSeries.find(({ id: idToFind }) => idToFind === id)\n ?.fetchedIntervals &&\n +startDate >\n allSeries.find(({ id: idToFind }) => idToFind === id)\n .fetchedIntervals[0]\n ) {\n newEndDate = startDate;\n }\n\n const {\n data: { floatSeriesVariable: floatSeriesVariableWithNodeCounts },\n } = await this.props.client.query({\n query: gql`\n query (\n $id: ID!\n $startTimestamp: DateTime\n $endTimestamp: DateTime\n $now: DateTime\n ) {\n floatSeriesVariable(id: $id) {\n id\n name\n unitOfMeasurement\n precision\n visualization\n thing {\n id\n }\n limitNodeCount: nodeCount(\n filter: {\n startTimestamp: $startTimestamp\n endTimestamp: $endTimestamp\n }\n )\n offsetNodeCount: nodeCount(\n filter: {\n startTimestamp: $endTimestamp\n endTimestamp: $now\n }\n )\n }\n }\n `,\n variables: {\n id,\n startTimestamp: newStartDate || startDate,\n endTimestamp: newEndDate || endDate,\n now: Date.now(),\n },\n });\n\n if (\n floatSeriesVariableWithNodeCounts.thing.id &&\n !expandedThings.includes(floatSeriesVariableWithNodeCounts.thing.id)\n ) {\n this.setState(({ expandedThings }) => ({\n expandedThings: [\n ...expandedThings,\n floatSeriesVariableWithNodeCounts.thing.id,\n ],\n }));\n }\n\n if (floatSeriesVariableWithNodeCounts.limitNodeCount < 500) {\n const {\n data: { floatSeriesVariable },\n } = await this.props.client.query({\n query: gql`\n query (\n $id: ID!\n $limit: NaturalNumber!\n $offset: NaturalNumber\n ) {\n floatSeriesVariable(id: $id) {\n id\n name\n unitOfMeasurement\n precision\n visualization\n thing {\n id\n }\n nodes(limit: $limit, offset: $offset) {\n id\n value\n timestamp\n }\n }\n }\n `,\n variables: {\n id,\n limit: floatSeriesVariableWithNodeCounts.limitNodeCount,\n offset: floatSeriesVariableWithNodeCounts.offsetNodeCount,\n },\n });\n\n this.setState(({ allSeries, loadingVariables }) => ({\n allSeries: [\n ...allSeries.filter(\n ({ id: idToRemove }) => idToRemove !== floatSeriesVariable.id\n ),\n {\n ...floatSeriesVariable,\n nodes: [\n ...(allSeries.find(\n ({ id: idToFind }) => idToFind === floatSeriesVariable.id\n )?.nodes || []),\n ...floatSeriesVariable.nodes,\n ].sort((a, b) =>\n +new Date(a.timestamp) < +new Date(b.timestamp)\n ? 1\n : +new Date(a.timestamp) > +new Date(b.timestamp)\n ? -1\n : 0\n ),\n fetchedIntervals: [\n allSeries.find(\n ({ id: idToFind }) => idToFind === floatSeriesVariable.id\n )?.fetchedIntervals\n ? Math.min(\n +allSeries.find(\n ({ id: idToFind }) =>\n idToFind === floatSeriesVariable.id\n )?.fetchedIntervals[0],\n +startDate\n )\n : +startDate,\n allSeries.find(\n ({ id: idToFind }) => idToFind === floatSeriesVariable.id\n )?.fetchedIntervals\n ? Math.max(\n +allSeries.find(\n ({ id: idToFind }) =>\n idToFind === floatSeriesVariable.id\n )?.fetchedIntervals[1],\n +endDate\n )\n : +endDate,\n ],\n },\n ],\n loadingVariables: loadingVariables.filter(\n (variableId) => variableId !== id\n ),\n }));\n } else {\n let response = await fetch(\n `https://csv.igloo.ooo/${id}?token=${\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n (account) => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\"\n }&limit=${\n floatSeriesVariableWithNodeCounts.limitNodeCount\n }&offset=${floatSeriesVariableWithNodeCounts.offsetNodeCount}`\n );\n\n response.text().then((response) => {\n this.setState(({ allSeries, loadingVariables }) => ({\n allSeries: [\n ...allSeries.filter(\n ({ id: idToRemove }) =>\n idToRemove !== floatSeriesVariableWithNodeCounts.id\n ),\n {\n ...floatSeriesVariableWithNodeCounts,\n nodeCount: floatSeriesVariableWithNodeCounts.limitNodeCount,\n nodes: [\n ...(allSeries.find(\n ({ id: idToFind }) =>\n idToFind === floatSeriesVariableWithNodeCounts.id\n )?.nodes || []),\n ...Papa.parse(response)\n .data.splice(1)\n .map(([value, timestamp]) => ({\n value: value === \"null\" ? null : parseFloat(value),\n timestamp,\n }))\n .reverse(),\n ].sort((a, b) =>\n +new Date(a.timestamp) < +new Date(b.timestamp)\n ? 1\n : +new Date(a.timestamp) > +new Date(b.timestamp)\n ? -1\n : 0\n ),\n fetchedIntervals: [\n allSeries.find(\n ({ id: idToFind }) =>\n idToFind === floatSeriesVariableWithNodeCounts.id\n )?.fetchedIntervals\n ? Math.min(\n +allSeries.find(\n ({ id: idToFind }) =>\n idToFind ===\n floatSeriesVariableWithNodeCounts.id\n )?.fetchedIntervals[0],\n +startDate\n )\n : +startDate,\n allSeries.find(\n ({ id: idToFind }) =>\n idToFind === floatSeriesVariableWithNodeCounts.id\n )?.fetchedIntervals\n ? Math.max(\n +allSeries.find(\n ({ id: idToFind }) =>\n idToFind ===\n floatSeriesVariableWithNodeCounts.id\n )?.fetchedIntervals[1],\n +endDate\n )\n : +endDate,\n ],\n },\n ],\n loadingVariables: loadingVariables.filter(\n (variableId) => variableId !== id\n ),\n }));\n });\n }\n } catch (e) {\n this.setState(({ selectedVariables }) => ({\n selectedVariables: selectedVariables.filter(\n (variableId) => variableId !== id\n ),\n }));\n }\n };\n\n updateDimensions = () => {\n if (window.innerWidth < 900) {\n this.setState({ lessThan900: true });\n } else {\n this.setState({ lessThan900: false });\n }\n };\n\n componentDidMount() {\n const { selectedVariables, allSeries, startDate, endDate } = this.state;\n\n this.updateDimensions();\n window.addEventListener(\"resize\", debounce(this.updateDimensions));\n\n if (\n selectedVariables.some(\n (variableId) =>\n !allSeries.find((series) => series.id === variableId)\n ) &&\n window.location.pathname === \"/data\"\n ) {\n selectedVariables.forEach((variable) =>\n this.fetchSeries(variable, startDate, endDate, allSeries)\n );\n }\n\n this.unlisten = this.props.history.listen((location) => {\n //get selectedVariables and allSeries from state to prevent outdated values being read\n if (\n this.state.selectedVariables.some(\n (variableId) =>\n !this.state.allSeries.find((series) => series.id === variableId)\n ) &&\n location.pathname === \"/data\"\n ) {\n this.state.selectedVariables.forEach((variable) =>\n this.fetchSeries(variable, startDate, endDate, allSeries)\n );\n }\n });\n\n this.props.seriesData.subscribeToMore({\n document: gql`\n subscription {\n floatSeriesVariableCreated {\n id\n name\n unitOfMeasurement\n nodeCount\n thing {\n id\n name\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newSeries = [\n ...prev.user.floatSeriesVariables,\n subscriptionData.data.floatSeriesVariableCreated,\n ].sort((a, b) =>\n a.thing.name.toLowerCase() > b.thing.name.toLowerCase()\n ? 1\n : a.thing.name.toLowerCase() < b.thing.name.toLowerCase()\n ? -1\n : a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n floatSeriesVariables: newSeries,\n },\n };\n },\n });\n\n this.props.seriesData.subscribeToMore({\n document: gql`\n subscription {\n floatSeriesVariableUpdated {\n id\n name\n unitOfMeasurement\n nodeCount\n thing {\n id\n name\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newSeries = [\n ...prev.user.floatSeriesVariables.filter(\n ({ id: idToRemove }) =>\n idToRemove !==\n subscriptionData.data.floatSeriesVariableUpdated.id\n ),\n subscriptionData.data.floatSeriesVariableUpdated,\n ].sort((a, b) =>\n a.thing.name.toLowerCase() > b.thing.name.toLowerCase()\n ? 1\n : a.thing.name.toLowerCase() < b.thing.name.toLowerCase()\n ? -1\n : a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n floatSeriesVariables: newSeries,\n },\n };\n },\n });\n\n this.props.seriesData.subscribeToMore({\n document: gql`\n subscription {\n floatSeriesVariableDeleted\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newSeries = prev.user.floatSeriesVariables.filter(\n (series) =>\n series.id !== subscriptionData.data.floatSeriesVariableDeleted\n );\n\n return {\n user: {\n ...prev.user,\n floatSeriesVariables: newSeries,\n },\n };\n },\n });\n\n this.props.seriesData.subscribeToMore({\n document: gql`\n subscription {\n thingUpdated {\n id\n name\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n let newSeries = prev.user.floatSeriesVariables;\n\n newSeries.forEach((series) => {\n if (series.thing.id === subscriptionData.data.thingUpdated.id) {\n series.thing.name = subscriptionData.data.thingUpdated.name;\n }\n });\n\n return {\n user: {\n ...prev.user,\n floatSeriesVariables: newSeries.sort((a, b) =>\n a.thing.name.toLowerCase() > b.thing.name.toLowerCase()\n ? 1\n : a.thing.name.toLowerCase() < b.thing.name.toLowerCase()\n ? -1\n : a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n ),\n },\n };\n },\n });\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", debounce(this.updateDimensions));\n\n this.unlisten();\n }\n\n componentWillReceiveProps(nextProps) {\n if (!this.props.seriesData.user && nextProps.seriesData.user) {\n this.setState(({ expandedThings }) => ({\n expandedThings: [\n ...expandedThings,\n (localStorage.getItem(\"dataLabDates\") &&\n isJSON(localStorage.getItem(\"dataLabDates\")) &&\n JSON.parse(localStorage.getItem(\"dataLabDates\"))[0] &&\n JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n )?.selectedVariables\n ? JSON.parse(localStorage.getItem(\"dataLabDates\")).find(\n ({ id }) => id === localStorage.getItem(\"userId\")\n ).selectedVariables\n : []\n ).map(\n (variable) =>\n nextProps.seriesData.user.floatSeriesVariables.find(\n ({ id: idToFind }) => idToFind === variable\n )?.thing.id\n ),\n ],\n }));\n }\n }\n\n render() {\n const {\n userData: {\n error: userError,\n loading: userLoading,\n user,\n refetch: userRefetch,\n },\n seriesData: {\n error: seriesError,\n loading: seriesLoading,\n user: seriesUser,\n refetch: seriesRefetch,\n },\n mobile,\n setSnackbarOpen,\n } = this.props;\n const {\n selectedVariables,\n allSeries,\n startDate,\n endDate,\n expandedThings,\n drawerOpen,\n lessThan900,\n loadingVariables,\n enableAnimation,\n } = this.state;\n const { REACT_APP_MAIN_BACKGROUND_COLOR: backgroundColor } =\n process.env;\n\n const shownSeries = allSeries\n .filter(({ id }) => selectedVariables.includes(id))\n .sort(\n (a, b) =>\n selectedVariables.indexOf(a.id) - selectedVariables.indexOf(b.id)\n );\n\n const shownUnits = [\n ...new Set(\n shownSeries\n .filter(({ nodes }) =>\n nodes.some(\n ({ value, timestamp }) =>\n !isNullish(value) &&\n new Date(timestamp) >= startDate &&\n new Date(timestamp) <= endDate\n )\n )\n .map(({ unitOfMeasurement }) => unitOfMeasurement)\n ),\n ];\n\n return lessThan900 ? (\n <>\n <div\n style={{\n margin: \"24px 16px 8px 16px\",\n display: \"flex\",\n justifyContent: \"space-between\",\n }}\n >\n <DatePicker\n startDate={startDate}\n endDate={endDate}\n setDates={(startDate, endDate) =>\n this.setState({ startDate, endDate })\n }\n user={user}\n disabled={!seriesUser || !user}\n refetchSeries={(startDate, endDate) =>\n this.refetchSeries(startDate, endDate, allSeries)\n }\n seriesCount={allSeries.length}\n />\n <IconButton\n onClick={(drawerOpen) => this.setState({ drawerOpen })}\n style={{ margin: \"4px 0 4px 16px\" }}\n disabled={!seriesUser || !user}\n size=\"large\"\n >\n <MenuOpen />\n </IconButton>\n </div>\n <div\n style={{\n height: mobile ? \"calc(100% - 88px)\" : \"calc(100% - 152px)\",\n }}\n >\n <Plot\n selectedVariables={selectedVariables}\n shownSeries={shownSeries}\n shownUnits={shownUnits}\n startDate={startDate}\n endDate={endDate}\n user={user}\n setSnackbarOpen={setSnackbarOpen}\n loadingVariables={loadingVariables}\n enableAnimation={enableAnimation}\n />\n <SwipeableDrawer\n anchor=\"right\"\n open={drawerOpen}\n onOpen={() => this.setState({ drawerOpen: true })}\n onClose={() => this.setState({ drawerOpen: false })}\n disableBackdropTransition={false}\n disableDiscovery\n disableSwipeToOpen\n PaperProps={{\n style: {\n backgroundColor,\n maxWidth: \"320px\",\n width: \"calc(100% - 64px)\",\n },\n }}\n >\n {userError || seriesError ? (\n <ErrorScreen\n refetch={() => {\n userRefetch({\n limit: 20,\n offset: 0,\n filter: {},\n });\n seriesRefetch({\n limit: 20,\n offset: 0,\n filter: {},\n });\n }}\n error={userError || seriesError}\n />\n ) : userLoading || seriesLoading ? (\n <CenteredSpinner\n style={{\n paddingTop: \"32px\",\n }}\n />\n ) : (\n <SeriesList\n isInDrawer\n allSeries={allSeries}\n loadingVariables={loadingVariables}\n selectedVariables={selectedVariables}\n expandedThings={expandedThings}\n shownUnits={shownUnits}\n setExpandedThings={(expandedThingsFunction) =>\n this.setState(expandedThingsFunction)\n }\n setSelectedVariables={(selectedVariablesFunction) =>\n this.setState(selectedVariablesFunction)\n }\n fetchSeries={(id) =>\n this.fetchSeries(id, startDate, endDate, allSeries)\n }\n user={user}\n seriesUser={seriesUser}\n seriesData={this.props.seriesData}\n />\n )}\n </SwipeableDrawer>\n </div>\n </>\n ) : (\n <div\n style={{\n display: \"flex\",\n height: \"calc(100% - 64px)\",\n }}\n className=\"notSelectable\"\n >\n <div style={{ width: \"320px\" }}>\n <div style={{ margin: \"24px 16px 8px 16px\" }}>\n <DatePicker\n startDate={startDate}\n endDate={endDate}\n setDates={(startDate, endDate) =>\n this.setState({ startDate, endDate })\n }\n user={user}\n disabled={!seriesUser || !user}\n refetchSeries={(startDate, endDate) =>\n this.refetchSeries(startDate, endDate, allSeries)\n }\n seriesCount={allSeries.length}\n />\n </div>\n {userError || seriesError ? (\n <ErrorScreen\n refetch={() => {\n userRefetch({\n limit: 20,\n offset: 0,\n filter: {},\n });\n seriesRefetch({\n limit: 20,\n offset: 0,\n filter: {},\n });\n }}\n error={userError || seriesError}\n />\n ) : userLoading || seriesLoading ? (\n <CenteredSpinner\n style={{\n paddingTop: \"32px\",\n }}\n />\n ) : (\n <SeriesList\n allSeries={allSeries}\n loadingVariables={loadingVariables}\n selectedVariables={selectedVariables}\n expandedThings={expandedThings}\n shownUnits={shownUnits}\n setExpandedThings={(expandedThingsFunction) =>\n this.setState(expandedThingsFunction)\n }\n setSelectedVariables={(selectedVariablesFunction) =>\n this.setState(selectedVariablesFunction)\n }\n fetchSeries={(id) =>\n this.fetchSeries(id, startDate, endDate, allSeries)\n }\n user={user}\n seriesUser={seriesUser}\n seriesData={this.props.seriesData}\n />\n )}\n </div>\n <div\n style={{\n width: \"calc(100% - 320px)\",\n height: \"100%\",\n }}\n >\n <Plot\n selectedVariables={selectedVariables}\n shownSeries={shownSeries}\n shownUnits={shownUnits}\n startDate={startDate}\n endDate={endDate}\n user={user}\n setSnackbarOpen={setSnackbarOpen}\n loadingVariables={loadingVariables}\n enableAnimation={enableAnimation}\n />\n </div>\n </div>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\";\nimport {\n SettingsDialog,\n getNotchHeight,\n theme,\n} from \"@igloocloud/igloosharedui\";\nimport Zoom from \"@mui/material/Zoom\";\nimport Fab from \"@mui/material/Fab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport Tab from \"@mui/material/Tab\";\nimport Snackbar from \"@mui/material/Snackbar\";\nimport IconButton from \"@mui/material/IconButton\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport Box from \"@mui/material/Box\";\nimport Add from \"@mui/icons-material/Add\";\nimport Close from \"@mui/icons-material/Close\";\nimport Home from \"@mui/icons-material/Home\";\nimport Assignment from \"@mui/icons-material/Assignment\";\nimport { withTranslation } from \"react-i18next\";\nimport SwipeableRoutes from \"react-swipeable-routes\";\nimport { Route, withRouter } from \"react-router-dom\";\nimport tinyColor from \"tinycolor2\";\nimport CollectionsHeader from \"./components/collections/CollectionsHeader\";\nimport CollectionsBody from \"./components/collections/CollectionsBody\";\nimport CreateCollection from \"./components/collections/CreateCollection\";\nimport CreateReport from \"./components/reports/CreateReport\";\nimport Reports from \"./Reports\";\nimport DataLab from \"./DataLab\";\n\nexport default withTranslation()(\n withRouter(\n class Collections extends Component {\n constructor(props) {\n super(props);\n\n this.state = {\n settingsOpen: false,\n snackbarOpen: false,\n createReportOpen: false,\n createCollectionOpen: false,\n };\n }\n\n searchMore = async (searchText) => {\n if (\n !this.searchMore.locked &&\n this.props.userData.user.collectionCount >\n this.props.userData.user.collections.length\n ) {\n this.searchMore.locked = true;\n\n try {\n this.setState({ searchMoreLoading: true });\n\n await this.props.userData.fetchMore({\n variables: {\n filter: {\n name: { regexMatch: \"(?i)\" + searchText },\n },\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) {\n return prev;\n }\n\n const newCollections = [\n ...prev.user.collections,\n ...fetchMoreResult.user.collections,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n };\n },\n });\n } finally {\n this.setState(() => {\n this.searchMore.locked = false;\n\n return { searchMoreLoading: false };\n });\n }\n }\n };\n\n render() {\n const {\n mobile,\n t,\n userData: { user },\n client,\n history,\n } = this.props;\n const { snackbarOpen, createCollectionOpen, createReportOpen } =\n this.state;\n const {\n REACT_APP_MAIN_COLOR: mainColor,\n REACT_APP_LIGHT_COLOR_ON_LIGHT_BACKGROUNDS: lightContrastColor,\n REACT_APP_MAIN_BACKGROUND_COLOR: mainBackgroundColor,\n REACT_APP_TEXT_ON_MAIN_BACKGROUND_COLOR: textOnMainBackgroundColor,\n REACT_APP_ENABLE_DATA_LAB: enableDataLab,\n REACT_APP_ENABLE_REPORTS: enableReports,\n REACT_APP_COLLECTION_NAME: collectionName,\n REACT_APP_HOME_ICON: homeIcon,\n REACT_APP_HOME_NAME: homeName,\n } = process.env;\n const transitionDuration = {\n enter: theme(process.env).transitions.duration.enteringScreen,\n exit: theme(process.env).transitions.duration.leavingScreen,\n };\n\n const showTabs = enableDataLab || enableReports;\n const collectionsHeader = (\n <CollectionsHeader\n logOut={this.props.logOut}\n changeBearer={this.props.changeBearer}\n changeAccount={this.props.changeAccount}\n isOpen={this.state.settingsOpen}\n setOpen={(settingsOpen) => this.setState({ settingsOpen })}\n user={this.props.userData}\n mobile={this.props.mobile}\n userData={this.props.userData}\n searchCollections={this.props.searchCollections}\n searchText={this.props.collectionsSearchText}\n searchMore={this.searchMore}\n />\n );\n\n const collectionRoute = (\n <Route path=\"/\" exact>\n <CollectionsBody\n userData={this.props.userData}\n searchCollections={this.props.searchCollections}\n searchText={this.props.collectionsSearchText}\n snackBarHidden={this.props.snackBarHidden}\n client={this.props.client}\n mobile={mobile}\n searchMoreLoading={this.state.searchMoreLoading}\n />\n </Route>\n );\n\n const dataLabRoute = (\n <Route path=\"/data\">\n <DataLab\n client={client}\n userData={this.props.userData}\n mobile={mobile}\n setSnackbarOpen={(snackbarOpen) =>\n this.setState({ snackbarOpen })\n }\n />\n </Route>\n );\n\n const reportRoute = (\n <Route path=\"/reports\">\n <Reports mobile={mobile} />\n </Route>\n );\n\n const routes =\n enableReports && enableDataLab\n ? [collectionRoute, dataLabRoute, reportRoute]\n : enableReports\n ? [collectionRoute, reportRoute]\n : enableDataLab\n ? [collectionRoute, dataLabRoute]\n : collectionRoute;\n\n return (\n <>\n {mobile\n ? showTabs && (\n <Box sx={{ borderBottom: 1, borderColor: \"divider\" }}>\n <Tabs\n variant=\"fullWidth\"\n TabIndicatorProps={{\n style: {\n width: `${100 / routes.length}%`,\n left: `${\n ((window.location.pathname === \"/\"\n ? 0\n : window.location.pathname === \"/data\"\n ? 1\n : 2) *\n 100) /\n routes.length\n }%`,\n },\n }}\n >\n <Tab\n icon={\n homeIcon ? (\n <div\n dangerouslySetInnerHTML={{ __html: homeIcon }}\n style={{ margin: 0 }}\n />\n ) : (\n <Home />\n )\n }\n label={t(homeName || \"Home\")}\n style={\n window.location.pathname === \"/\"\n ? { color: lightContrastColor || mainColor }\n : {\n color: tinyColor(\n textOnMainBackgroundColor\n ).setAlpha(\n tinyColor.isReadable(\n lightContrastColor || mainColor,\n textOnMainBackgroundColor\n )\n ? 0.54\n : 0.3\n ),\n }\n }\n onClick={() => history.push(\"/\")}\n />\n {enableDataLab && (\n <Tab\n icon={\n <SvgIcon>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n enable-background=\"new 0 0 24 24\"\n height=\"24px\"\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n >\n <g>\n <rect fill=\"none\" height=\"24\" width=\"24\" />\n </g>\n <g>\n <g>\n <path d=\"M21,8c-1.45,0-2.26,1.44-1.93,2.51l-3.55,3.56c-0.3-0.09-0.74-0.09-1.04,0l-2.55-2.55C12.27,10.45,11.46,9,10,9 c-1.45,0-2.27,1.44-1.93,2.52l-4.56,4.55C2.44,15.74,1,16.55,1,18c0,1.1,0.9,2,2,2c1.45,0,2.26-1.44,1.93-2.51l4.55-4.56 c0.3,0.09,0.74,0.09,1.04,0l2.55,2.55C12.73,16.55,13.54,18,15,18c1.45,0,2.27-1.44,1.93-2.52l3.56-3.55 C21.56,12.26,23,11.45,23,10C23,8.9,22.1,8,21,8z\" />\n <polygon points=\"15,9 15.94,6.93 18,6 15.94,5.07 15,3 14.08,5.07 12,6 14.08,6.93\" />\n <polygon points=\"3.5,11 4,9 6,8.5 4,8 3.5,6 3,8 1,8.5 3,9\" />\n </g>\n </g>\n </svg>\n </SvgIcon>\n }\n label={t`Data Lab`}\n style={\n window.location.pathname === \"/data\"\n ? { color: lightContrastColor || mainColor }\n : {\n color: tinyColor(\n textOnMainBackgroundColor\n ).setAlpha(\n tinyColor.isReadable(\n lightContrastColor || mainColor,\n textOnMainBackgroundColor\n )\n ? 0.54\n : 0.3\n ),\n }\n }\n onClick={() => history.push(\"/data\")}\n />\n )}\n {enableReports && (\n <Tab\n icon={<Assignment />}\n label={t`Reports`}\n style={\n window.location.pathname === \"/reports\"\n ? { color: lightContrastColor || mainColor }\n : {\n color: tinyColor(\n textOnMainBackgroundColor\n ).setAlpha(\n tinyColor.isReadable(\n lightContrastColor || mainColor,\n textOnMainBackgroundColor\n )\n ? 0.54\n : 0.3\n ),\n }\n }\n onClick={() => history.push(\"/reports\")}\n />\n )}\n </Tabs>\n </Box>\n )\n : collectionsHeader}\n <div\n style={{\n display: \"flex\",\n height: mobile\n ? showTabs\n ? \"calc(100% - 136px)\"\n : \"calc(100% - 64px)\"\n : \"100%\",\n backgroundColor: mainBackgroundColor,\n }}\n >\n <SwipeableRoutes\n style={{\n width: \"100%\",\n height: mobile\n ? \"calc(100% - env(safe-area-inset-bottom))\"\n : \"100%\",\n backgroundColor: mainBackgroundColor,\n }}\n containerStyle={{ height: \"100%\" }}\n disabled\n >\n {routes}\n </SwipeableRoutes>\n </div>\n {mobile && collectionsHeader}\n <SettingsDialog\n isOpen={this.state.settingsOpen}\n setOpen={(settingsOpen) => this.setState({ settingsOpen })}\n user={this.props.userData.user}\n forceUpdate={this.props.forceUpdate}\n logOut={this.props.logOut}\n client={this.props.client}\n />\n {mobile ? (\n <Zoom\n in={\n window.location.pathname === \"/\" &&\n user &&\n (user.emailIsVerified\n ? user.collections.length < 100\n : !user.collections.length)\n }\n timeout={transitionDuration}\n style={{\n transitionDelay: `${\n window.location.pathname === \"/\" &&\n user?.flags.reportSendingEnabled\n ? transitionDuration.exit\n : 0\n }ms`,\n }}\n unmountOnExit\n >\n <Fab\n color=\"secondary\"\n style={{\n position: \"absolute\",\n bottom: \"calc(36px + env(safe-area-inset-bottom))\",\n left:\n \"calc(50% - 28px + \" +\n getNotchHeight(\"left\") +\n \"/2 - \" +\n getNotchHeight(\"right\") +\n \"/2)\",\n zIndex: 1200,\n }}\n onClick={() =>\n this.setState({\n createCollectionOpen: true,\n })\n }\n >\n <Add />\n </Fab>\n </Zoom>\n ) : (\n <Zoom\n in={\n window.location.pathname === \"/\" &&\n user &&\n (user.emailIsVerified\n ? user.collections.length < 100\n : !user.collections.length)\n }\n timeout={transitionDuration}\n style={{\n transitionDelay: `${\n window.location.pathname === \"/\"\n ? transitionDuration.exit &&\n user?.flags.reportSendingEnabled\n : 0\n }ms`,\n }}\n unmountOnExit\n >\n <Fab\n variant=\"extended\"\n color=\"secondary\"\n onClick={() =>\n this.setState({\n createCollectionOpen: true,\n })\n }\n style={{\n position: \"absolute\",\n right: \"calc(16px + \" + getNotchHeight(\"right\") + \")\",\n bottom: \"calc(16px + env(safe-area-inset-bottom))\",\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n zIndex: 20,\n }}\n >\n <Add\n style={{\n marginRight: \"8px\",\n }}\n />\n {t(collectionName || \"Collection\")}\n </Fab>\n </Zoom>\n )}\n {mobile ? (\n <Zoom\n in={\n window.location.pathname === \"/reports\" &&\n user?.flags.reportSendingEnabled\n }\n timeout={transitionDuration}\n style={{\n transitionDelay: `${\n window.location.pathname === \"/reports\"\n ? transitionDuration.exit\n : 0\n }ms`,\n }}\n unmountOnExit\n >\n <Fab\n color=\"secondary\"\n style={{\n position: \"absolute\",\n bottom: \"calc(36px + env(safe-area-inset-bottom))\",\n left:\n \"calc(50% - 28px + \" +\n getNotchHeight(\"left\") +\n \"/2 - \" +\n getNotchHeight(\"right\") +\n \"/2)\",\n zIndex: 1200,\n }}\n onClick={() =>\n this.setState({\n createReportOpen: true,\n })\n }\n >\n <Add />\n </Fab>\n </Zoom>\n ) : (\n <Zoom\n in={\n window.location.pathname === \"/reports\" &&\n user?.flags.reportSendingEnabled\n }\n timeout={transitionDuration}\n style={{\n transitionDelay: `${\n window.location.pathname === \"/reports\"\n ? transitionDuration.exit\n : 0\n }ms`,\n }}\n unmountOnExit\n >\n <Fab\n variant=\"extended\"\n color=\"secondary\"\n onClick={() =>\n this.setState({\n createReportOpen: true,\n })\n }\n style={{\n position: \"absolute\",\n right: \"calc(16px + \" + getNotchHeight(\"right\") + \")\",\n bottom: \"calc(16px + env(safe-area-inset-bottom))\",\n transition:\n \"all 450ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, left 0s linear, right 0s linear, top 0s linear, bottom 0s linear\",\n zIndex: 20,\n }}\n >\n <Add\n style={{\n marginRight: \"8px\",\n }}\n />\n {t(collectionName || \"Report\")}\n </Fab>\n </Zoom>\n )}\n <Snackbar\n open={snackbarOpen}\n onClose={(_, reason) => {\n if (reason === \"clickaway\") {\n return;\n }\n\n this.setState({ snackbarOpen: false });\n }}\n message={t`No data in this date range`}\n anchorOrigin={{ vertical: \"top\", horizontal: \"center\" }}\n style={\n mobile\n ? { top: \"88px\", left: \"16px\", right: \"16px\", zIndex: 1200 }\n : { top: \"80px\", zIndex: 1200 }\n }\n action={\n <IconButton\n onClick={() => this.setState({ snackbarOpen: false })}\n style={{ color: \"white\" }}\n >\n <Close />\n </IconButton>\n }\n autoHideDuration={5000}\n className=\"notSelectable\"\n />\n <CreateCollection\n open={createCollectionOpen}\n close={() =>\n this.setState({\n createCollectionOpen: false,\n })\n }\n />\n {user && (\n <CreateReport\n open={createReportOpen}\n close={() =>\n this.setState({\n createReportOpen: false,\n })\n }\n collections={user?.collections}\n />\n )}\n </>\n );\n }\n }\n )\n);\n","import React, { Component } from \"react\";\nimport CollectionFetcher from \"./CollectionFetcher\";\nimport { graphql } from \"@apollo/react-hoc\";\nimport gql from \"graphql-tag\";\nimport { Switch, Route, Redirect } from \"react-router-dom\";\nimport IsOnline from \"is-online-component\";\nimport {\n Error404,\n EmailNotVerified,\n PolicyDialog,\n} from \"@igloocloud/igloosharedui\";\nimport Collections from \"./Collections\";\nimport querystringify from \"querystringify\";\nimport moment from \"moment\";\nimport { withTranslation } from \"react-i18next\";\n\nconst appName = process.env.REACT_APP_NAME;\n\nexport default graphql(\n gql`\n mutation ChangeLanguage($language: String) {\n updateUser(language: $language) {\n language\n }\n }\n `,\n {\n name: \"ChangeLanguage\",\n }\n)(\n graphql(\n gql`\n query (\n $limit: NaturalNumber!\n $offset: NaturalNumber\n $filter: CollectionFilterExtended\n ) {\n metadata {\n privacyPolicyVersion\n }\n user {\n id\n emailIsVerified\n name\n profileIconColor\n email\n collectionCount\n pendingShareCount\n pendingTransferCount\n timeFormat\n dateFormat\n lengthAndMass\n temperature\n appNotifications\n smsNotifications\n emailNotifications\n passwordChangeNotification\n accessTokenCreatedNotification\n shareAndTransferNotification\n reportNotification\n totpEnabled\n privacyPolicyAccepted\n firstDayOfTheWeek\n phoneVerified\n phoneNumber\n flags {\n id\n reportSendingEnabled\n smsActive\n }\n collections(\n sortBy: name\n sortDirection: ASCENDING\n limit: $limit\n offset: $offset\n filter: $filter\n ) {\n id\n index\n name\n createdAt\n updatedAt\n muted\n picture\n myRole\n editorCount\n viewerCount\n thingCount\n }\n }\n }\n `,\n {\n name: \"userData\",\n options: {\n variables: {\n limit: 20,\n offset: 0,\n filter: {},\n },\n },\n }\n )(\n withTranslation()(\n class UserFetcher extends Component {\n state = {\n collectionsSearchText: \"\",\n thingsSearchText: \"\",\n snackbarOpen: true,\n acceptPrivacyPolicyOpen: false,\n };\n\n changeLanguage = (language) => {\n this.props.ChangeLanguage({\n variables: {\n language,\n },\n optimisticResponse: {\n __typename: \"Mutation\",\n user: {\n language,\n __typename: \"User\",\n },\n },\n });\n };\n\n componentDidMount() {\n this.changeLanguage(\n localStorage.getItem(\"language\") ||\n (navigator.language || navigator.userLanguage).slice(0, 2)\n );\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n collectionCreated {\n id\n index\n name\n createdAt\n updatedAt\n muted\n picture\n myRole\n editorCount\n viewerCount\n thingCount\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newCollections = [\n ...prev.user.collections,\n subscriptionData.data.collectionCreated,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n };\n },\n });\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n collectionUpdated {\n id\n index\n name\n createdAt\n updatedAt\n muted\n picture\n myRole\n editorCount\n viewerCount\n thingCount\n uniqueFirmwares\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newCollections = [\n ...prev.user.collections.filter(\n (collection) =>\n collection.id !== subscriptionData.data.collectionUpdated.id\n ),\n subscriptionData.data.collectionUpdated,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n };\n },\n });\n\n const collectionDeletedSubscription = gql`\n subscription {\n collectionDeleted\n }\n `;\n\n this.props.userData.subscribeToMore({\n document: collectionDeletedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const newCollections = prev.user.collections.filter(\n (collection) =>\n collection.id !== subscriptionData.data.collectionDeleted\n );\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n };\n },\n });\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n userLeftCollection {\n user {\n id\n }\n collection {\n id\n }\n }\n }\n `,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n if (\n subscriptionData.data.userLeftCollection.user.id !==\n localStorage.getItem(\"userId\")\n ) {\n return prev;\n }\n\n const newCollections = prev.user.collections.filter(\n (collection) =>\n collection.id !==\n subscriptionData.data.userLeftCollection.collection.id\n );\n\n return {\n user: {\n ...prev.user,\n collections: newCollections,\n },\n };\n },\n });\n\n this.props.userData.subscribeToMore({\n document: gql`\n subscription {\n userUpdated {\n id\n emailIsVerified\n name\n profileIconColor\n email\n collectionCount\n pendingShareCount\n pendingTransferCount\n timeFormat\n dateFormat\n lengthAndMass\n temperature\n appNotifications\n smsNotifications\n emailNotifications\n passwordChangeNotification\n accessTokenCreatedNotification\n shareAndTransferNotification\n reportNotification\n totpEnabled\n language\n privacyPolicyAccepted\n firstDayOfTheWeek\n phoneVerified\n phoneNumber\n flags {\n id\n reportSendingEnabled\n smsActive\n }\n }\n }\n `,\n });\n\n const userDeletedSubscription = gql`\n subscription {\n userDeleted\n }\n `;\n\n this.props.userData.subscribeToMore({\n document: userDeletedSubscription,\n updateQuery: () => {\n this.props.logOut(true);\n },\n });\n\n const pendingShareAcceptedSubscription = gql`\n subscription {\n pendingShareAccepted {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n index\n name\n createdAt\n updatedAt\n muted\n picture\n myRole\n editorCount\n viewerCount\n thingCount\n }\n }\n }\n `;\n\n this.props.userData.subscribeToMore({\n document: pendingShareAcceptedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const collections = [\n ...prev.user.collections.filter(\n (collection) =>\n collection.id !==\n subscriptionData.data.pendingShareAccepted.collection.id\n ),\n subscriptionData.data.pendingShareAccepted.collection,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n collections,\n },\n };\n },\n });\n\n const pendingTransferAcceptedSubscription = gql`\n subscription {\n pendingTransferAccepted {\n id\n recipient {\n id\n profileIconColor\n name\n email\n }\n sender {\n id\n name\n }\n collection {\n id\n index\n name\n createdAt\n updatedAt\n muted\n picture\n myRole\n editorCount\n viewerCount\n thingCount\n }\n }\n }\n `;\n\n this.props.userData.subscribeToMore({\n document: pendingTransferAcceptedSubscription,\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const collections = [\n ...prev.user.collections.filter(\n (collection) =>\n collection.id !==\n subscriptionData.data.pendingTransferAccepted.collection.id\n ),\n subscriptionData.data.pendingTransferAccepted.collection,\n ].sort((a, b) =>\n a.name.toLowerCase() > b.name.toLowerCase()\n ? 1\n : a.name.toLowerCase() < b.name.toLowerCase()\n ? -1\n : 0\n );\n\n return {\n user: {\n ...prev.user,\n collections,\n },\n };\n },\n });\n\n if (this.props.userData.user)\n this.props.userData.subscribeToMore({\n document: gql`\n subscription ($userId: ID!) {\n pendingShareDeleted(userId: $userId) {\n collection {\n id\n }\n }\n }\n `,\n variables: { userId: localStorage.getItem(\"userId\") },\n updateQuery: (prev, { subscriptionData }) => {\n if (!subscriptionData.data) {\n return prev;\n }\n\n const collections = prev.user.collections.filter(\n (collection) =>\n collection.id !==\n subscriptionData.data.pendingShareDeleted.collection.id\n );\n\n return {\n user: {\n ...prev.user,\n collections,\n },\n };\n },\n });\n }\n\n componentWillReceiveProps(nextProps) {\n if (\n !this.props.userData.user &&\n nextProps.userData.user &&\n nextProps.userData.metadata &&\n nextProps.userData.user.privacyPolicyAccepted !==\n nextProps.userData.metadata.privacyPolicyVersion\n ) {\n this.setState({ acceptPrivacyPolicyOpen: true });\n }\n\n if (!this.props.userData.user && nextProps.userData.user) {\n moment.updateLocale(nextProps.i18n.language, {\n week: {\n dow:\n nextProps.userData.user.firstDayOfTheWeek === \"FRIDAY\"\n ? 5\n : nextProps.userData.user.firstDayOfTheWeek === \"SATURDAY\"\n ? 6\n : nextProps.userData.user.firstDayOfTheWeek === \"SUNDAY\"\n ? 7\n : 1,\n },\n });\n }\n }\n\n render() {\n const {\n userData: { user },\n logOut,\n } = this.props,\n { acceptPrivacyPolicyOpen } = this.state;\n const {\n REACT_APP_ENABLE_DATA_LAB: enableDataLab,\n REACT_APP_ENABLE_REPORTS: enableReports,\n } = process.env;\n\n return (\n <>\n <IsOnline\n onChange={(online) => {\n if (online) {\n this.props.userData.refetch();\n }\n }}\n />\n <PolicyDialog\n requireConsent\n open={acceptPrivacyPolicyOpen}\n close={() => this.setState({ acceptPrivacyPolicyOpen: false })}\n user={user}\n />\n <Switch>\n <Route\n exact\n path={\n enableDataLab && enableReports\n ? [\"/\", \"/data\", \"/reports\"]\n : enableDataLab\n ? [\"/\", \"/data\"]\n : enableReports\n ? [\"/\", \"/reports\"]\n : \"/\"\n }\n >\n {querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection ||\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing ? (\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing ? (\n <>\n <CollectionFetcher\n mobile={this.props.isMobile}\n logOut={logOut}\n changeAccount={this.props.changeAccount}\n userData={this.props.userData}\n selectedThing={\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n }\n collectionId={\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection\n }\n collections={\n this.props.userData.user &&\n this.props.userData.user.collections\n }\n searchThings={(text) => {\n this.setState({ thingsSearchText: text });\n }}\n thingsSearchText={this.state.thingsSearchText}\n forceUpdate={this.props.forceUpdate}\n client={this.props.client}\n />\n <EmailNotVerified\n open={\n user &&\n !user.emailIsVerified &&\n this.state.snackbarOpen\n }\n close={() => this.setState({ snackbarOpen: false })}\n user={this.props.userData.user}\n />\n </>\n ) : (\n <>\n <CollectionFetcher\n mobile={this.props.isMobile}\n logOut={this.props.logOut}\n changeAccount={this.props.changeAccount}\n userData={this.props.userData}\n selectedThing={null}\n collectionId={\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).collection\n }\n collections={\n this.props.userData.user &&\n this.props.userData.user.collections\n }\n searchThings={(text) => {\n this.setState({ thingsSearchText: text });\n }}\n thingsSearchText={this.state.thingsSearchText}\n forceUpdate={this.props.forceUpdate}\n client={this.props.client}\n />\n <EmailNotVerified\n mobile={this.props.isMobile}\n open={\n user &&\n !user.emailIsVerified &&\n this.state.snackbarOpen\n }\n close={() => this.setState({ snackbarOpen: false })}\n email={user?.email}\n user={this.props.userData.user}\n />\n </>\n )\n ) : (\n <>\n <Collections\n userData={this.props.userData}\n logOut={this.props.logOut}\n changeAccount={this.props.changeAccount}\n changeBearer={this.props.changeBearer}\n searchCollections={(text) => {\n this.setState({ collectionsSearchText: text });\n }}\n collectionsSearchText={this.state.collectionsSearchText}\n forceUpdate={this.props.forceUpdate}\n client={this.props.client}\n mobile={this.props.isMobile}\n changeEmail={this.props.changeEmail}\n changeEmailBearer={this.props.changeEmailBearer}\n changeAuthenticationBearer={\n this.props.changeAuthenticationBearer\n }\n deleteUserBearer={this.props.deleteUserBearer}\n manageAccessTokensBearer={\n this.props.manageAccessTokensBearer\n }\n />\n <EmailNotVerified\n mobile={this.props.isMobile}\n open={\n user &&\n !user.emailIsVerified &&\n this.state.snackbarOpen\n }\n close={() => this.setState({ snackbarOpen: false })}\n email={user?.email}\n user={this.props.userData.user}\n />\n </>\n )}\n </Route>\n <Route>\n <Error404\n isMobile={this.props.isMobile}\n setRedirect={(redirectTo) => this.setState({ redirectTo })}\n appName={appName}\n />\n </Route>\n </Switch>\n {this.state.redirectTo && (\n <Redirect push to={this.state.redirectTo} />\n )}\n </>\n );\n }\n }\n )\n )\n);\n","import React, { Component } from \"react\"\nimport { ApolloClient } from \"apollo-client\"\nimport { HttpLink } from \"apollo-link-http\"\nimport { ApolloLink } from \"apollo-link\"\nimport { onError } from \"apollo-link-error\"\nimport {\n InMemoryCache,\n IntrospectionFragmentMatcher,\n} from \"apollo-cache-inmemory\"\nimport { ApolloProvider } from \"@apollo/client\"\nimport { WebSocketLink } from \"apollo-link-ws\"\nimport { split } from \"apollo-link\"\nimport { getMainDefinition } from \"apollo-utilities\"\nimport introspectionQueryResultData from \"./fragmentTypes.json\"\nimport UserFetcher from \"./UserFetcher\"\n\nexport default class AuthenticatedApp extends Component {\n constructor(props) {\n super(props)\n\n const bearer = props.bearer\n const wsLink = new WebSocketLink({\n uri: localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"ws://\"\n : \"wss://\") +\n localStorage.getItem(\"server\") +\n \"/subscriptions\"\n : `wss://v1.igloo.ooo/subscriptions`,\n options: {\n reconnect: true,\n connectionParams: {\n Authorization: \"Bearer \" + bearer,\n },\n },\n })\n\n const httpLink = new HttpLink({\n uri: localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/graphql\"\n : `https://v1.igloo.ooo/graphql`,\n headers: {\n Authorization: \"Bearer \" + bearer,\n },\n })\n\n const errorLink = onError(({ networkError, graphQLErrors }) => {\n if (graphQLErrors) {\n graphQLErrors.forEach((error) => {\n if (error.message === \"This user doesn't exist anymore\") {\n this.props.logOut(true)\n }\n })\n }\n\n if (\n networkError &&\n (networkError.message ===\n \"The token is invalid, expired, revoked or malformed\" ||\n networkError.message === \"Token expired\" ||\n networkError.message === \"Malformed JWT\" ||\n networkError.message ===\n \"User doesn't exist. Use `signUp` to create one\")\n )\n this.props.logOut()\n })\n\n const requestLink = split(\n // split based on operation type\n ({ query }) => {\n const { kind, operation } = getMainDefinition(query)\n return kind === \"OperationDefinition\" && operation === \"subscription\"\n },\n wsLink,\n httpLink\n )\n\n const link = ApolloLink.from([errorLink, requestLink])\n\n const fragmentMatcher = new IntrospectionFragmentMatcher({\n introspectionQueryResultData,\n })\n\n this.client = new ApolloClient({\n // By default, this client will send queries to the\n // `/graphql` endpoint on the same address\n link,\n cache: new InMemoryCache({ fragmentMatcher }),\n })\n }\n\n componentDidMount() {\n if (window.cordova) {\n window.StatusBar.backgroundColorByHexString(\"#00000000\")\n }\n }\n\n componentWillReceiveProps(nextProps) {\n if (nextProps.bearer !== this.props.bearer) {\n const bearer = nextProps.bearer\n const wsLink = new WebSocketLink({\n uri: localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"ws://\"\n : \"wss://\") +\n localStorage.getItem(\"server\") +\n \"/subscriptions\"\n : `wss://v1.igloo.ooo/subscriptions`,\n options: {\n reconnect: true,\n connectionParams: {\n Authorization: \"Bearer \" + bearer,\n },\n },\n })\n\n const httpLink = new HttpLink({\n uri: localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/graphql\"\n : `https://v1.igloo.ooo/graphql`,\n headers: {\n Authorization: \"Bearer \" + bearer,\n },\n })\n\n const errorLink = onError(({ networkError }) => {\n if (\n networkError &&\n (networkError.message ===\n \"The token is invalid, expired, revoked or malformed\" ||\n networkError.message === \"This user doesn't exist anymore\" ||\n networkError.message === \"Token expired\")\n )\n this.props.logOut()\n })\n\n const link = ApolloLink.from([errorLink, wsLink, httpLink])\n\n const fragmentMatcher = new IntrospectionFragmentMatcher({\n introspectionQueryResultData,\n })\n\n this.client = new ApolloClient({\n // By default, this client will send queries to the\n // `/graphql` endpoint on the same address\n link,\n cache: new InMemoryCache({ fragmentMatcher }),\n })\n }\n }\n\n render() {\n return (\n <ApolloProvider client={this.client}>\n <UserFetcher\n isMobile={this.props.isMobile}\n logOut={this.props.logOut}\n changeAccount={this.props.changeAccount}\n changeBearer={this.props.changeBearer}\n forceUpdate={this.props.forceUpdate}\n client={this.client}\n changeEmailBearer={this.props.changeEmailBearer}\n changeAuthenticationBearer={this.props.changeAuthenticationBearer}\n deleteUserBearer={this.props.deleteUserBearer}\n manageAccessTokensBearer={this.props.manageAccessTokensBearer}\n />\n </ApolloProvider>\n )\n }\n}\n","export default __webpack_public_path__ + \"static/media/unauthenticated-logo.98d92209.svg\";","export default __webpack_public_path__ + \"static/media/mobile-unauthenticated-logo.98d92209.svg\";","/* globals Connection */\nimport React, { Component } from \"react\"\nimport AuthenticatedApp from \"./AuthenticatedApp\"\nimport { Route, Switch, Redirect } from \"react-router-dom\"\nimport {\n theme,\n UnauthenticatedApp,\n Error404,\n OfflineError,\n SharedUIProvider,\n debounce,\n importAll,\n} from \"@igloocloud/igloosharedui\"\nimport ThemeProvider from \"@mui/material/styles/ThemeProvider\"\nimport StyledEngineProvider from \"@mui/material/StyledEngineProvider\"\nimport { useTheme, useMediaQuery } from \"@mui/material\"\nimport querystringify from \"querystringify\"\nimport logo from \"./styles/assets/logo.svg\"\nimport backgroundLogo from \"./styles/assets/background-logo.svg\"\nimport unauthenticatedLogo from \"./styles/assets/unauthenticated-logo.svg\"\nimport mobileUnauthenticatedLogo from \"./styles/assets/mobile-unauthenticated-logo.svg\"\nimport { withTranslation } from \"react-i18next\"\nimport moment from \"moment\"\nimport { version } from \"../package.json\"\n\nconst appName = process.env.REACT_APP_NAME\n\nfunction setupWebPush(token, id) {\n const applicationServerPublicKey =\n \"BOZG_RBpt8yVp6J1JN08zCEPSFbYC_aHQQKNY0isQDnozk9GXZAiSHMnnXowvfacQeh38j2TQAyp9yT0qpUXS6Y\"\n\n function urlB64ToUint8Array(base64String) {\n const padding = \"=\".repeat((4 - (base64String.length % 4)) % 4)\n const base64 = (base64String + padding)\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n\n const rawData = window.atob(base64)\n const outputArray = new Uint8Array(rawData.length)\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i)\n }\n return outputArray\n }\n\n // checks whether the browser supports push service workers and push notifications\n if (\"serviceWorker\" in navigator && \"PushManager\" in window) {\n navigator.serviceWorker.register(\"webPushSw.js\").then(function(swReg) {\n // checks whether user is already subscribed to push notifications\n swReg.pushManager.getSubscription().then(function(subscription) {\n const isSubscribed = subscription !== null\n\n if (isSubscribed) {\n sendSubscriptionToServer(subscription, id)\n } else {\n // subscribes user\n const applicationServerKey = urlB64ToUint8Array(\n applicationServerPublicKey\n )\n\n swReg.pushManager\n .subscribe({\n userVisibleOnly: true,\n applicationServerKey: applicationServerKey,\n })\n .then(function(subscription) {\n sendSubscriptionToServer(subscription, id)\n })\n }\n })\n })\n }\n\n function sendSubscriptionToServer(subscription, id) {\n if (\n JSON.parse(localStorage.getItem(\"endpointList\")).find(\n endpoint => endpoint.id === id\n )\n ) {\n localStorage.setItem(\n \"endpointList\",\n JSON.stringify(\n JSON.parse(localStorage.getItem(\"endpointList\")).filter(\n endpoint => endpoint.id !== id\n )\n )\n )\n }\n\n let newEndpointList = JSON.parse(localStorage.getItem(\"endpointList\"))\n\n newEndpointList.push({\n id,\n endpoint: subscription.endpoint,\n })\n\n localStorage.setItem(\"endpointList\", JSON.stringify(newEndpointList))\n\n // the server URL changes based on whether the server setting is set to auto or manual\n const serverUrl = localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/web-push-subscribe\"\n : `https://v1.igloo.ooo/web-push-subscribe`\n\n fetch(serverUrl, {\n body: JSON.stringify(subscription),\n cache: \"no-cache\",\n credentials: \"same-origin\",\n headers: {\n \"user-agent\": \"Mozilla/4.0 MDN Example\",\n \"content-type\": \"application/json\",\n authorization: \"Bearer \" + token,\n },\n method: \"POST\",\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"no-referrer\",\n })\n }\n}\n\nfunction webPushUnsubscribe(token, id, endpoint) {\n // the server URL changes based on whether the server setting is set to auto or manual\n const serverUrl = localStorage.getItem(\"server\")\n ? (localStorage.getItem(\"serverUnsecure\") === \"true\"\n ? \"http://\"\n : \"https://\") +\n localStorage.getItem(\"server\") +\n \"/web-push-unsubscribe\"\n : `https://v1.igloo.ooo/web-push-unsubscribe`\n\n fetch(serverUrl, {\n body: JSON.stringify({\n endpoint,\n }),\n cache: \"no-cache\",\n credentials: \"same-origin\",\n headers: {\n \"user-agent\": \"Mozilla/4.0 MDN Example\",\n \"content-type\": \"application/json\",\n authorization: \"Bearer \" + token,\n },\n method: \"POST\",\n mode: \"cors\",\n redirect: \"follow\",\n referrer: \"no-referrer\",\n })\n\n localStorage.setItem(\n \"endpointList\",\n JSON.stringify(\n JSON.parse(localStorage.getItem(\"endpointList\")).filter(\n endpoint => endpoint.id !== id\n )\n )\n )\n}\n\nexport default props => {\n const theme = useTheme()\n const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"))\n\n return <App {...props} fullScreen={fullScreen} />\n}\n\nconst App = withTranslation()(\n class App extends Component {\n constructor() {\n super()\n\n window.backStack = 0\n\n let bearer = \"\"\n // reuses the previous session bearer if present\n\n if (!localStorage.getItem(\"accountList\")) {\n localStorage.setItem(\"accountList\", \"[]\")\n }\n if (!localStorage.getItem(\"endpointList\")) {\n localStorage.setItem(\"endpointList\", \"[]\")\n }\n if (!localStorage.getItem(\"language\")) {\n localStorage.setItem(\n \"language\",\n (navigator.language || navigator.userLanguage).slice(0, 2)\n )\n }\n\n bearer =\n localStorage.getItem(\"accountList\") &&\n localStorage.getItem(\"userId\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).filter(\n account => account.id === localStorage.getItem(\"userId\")\n )[0]\n ? JSON.parse(localStorage.getItem(\"accountList\")).filter(\n account => account.id === localStorage.getItem(\"userId\")\n )[0].token\n : \"\"\n\n JSON.parse(localStorage.getItem(\"accountList\")).forEach(\n account => account.token && setupWebPush(account.token, account.id)\n )\n\n if (!sessionStorage.getItem(\"loginBackground\")) {\n const images = importAll(\n require.context(\n \"./styles/assets/loginBackgrounds\",\n false,\n /\\.(png|jpe?g|svg)$/\n )\n )\n\n sessionStorage.setItem(\n \"loginBackground\",\n Math.floor(Math.random() * Object.keys(images).length)\n )\n }\n\n this.state = {\n bearer,\n isMobile: window.innerWidth < 600,\n from: \"\",\n loggedOut: false,\n loginEmail: \"\",\n loginEmailError: \"\",\n loginPassword: \"\",\n signupEmail: \"\",\n signupEmailError: \"\",\n signupPassword: \"\",\n name: \"\",\n changeEmailBearer: \"\",\n changeAuthenticationBearer: \"\",\n deleteUserBearer: \"\",\n manageAccessTokensBearer: \"\",\n online: true,\n }\n }\n\n updateDimensions = () => {\n if (window.innerWidth < 600) {\n !this.state.isMobile && this.setState({ isMobile: true })\n } else {\n this.state.isMobile && this.setState({ isMobile: false })\n }\n }\n\n setOnline = online => this.setState({ online })\n\n handleBackButton = e => {\n e.preventDefault()\n\n if (\n (window.location.hash === \"#/\" ||\n window.location.hash ===\n (JSON.parse(localStorage.getItem(\"accountList\"))[0]\n ? \"#/accounts\"\n : \"#/signup\")) &&\n !window.backStack\n ) {\n navigator.Backbutton.goBack()\n }\n\n if (!window.backStack) {\n if (\n window.location.hash.split(\"?\").length === 2 &&\n querystringify.parse(\"?\" + window.location.hash.split(\"?\")[1])\n .collection\n ) {\n if (\n querystringify.parse(\"?\" + window.location.hash.split(\"?\")[1])\n .thing &&\n this.state.isMobile\n ) {\n //main body to sidebar (mobile mode online)\n this.setState({\n redirectTo:\n \"/?collection=\" +\n querystringify.parse(\"?\" + window.location.hash.split(\"?\")[1])\n .collection,\n })\n } else {\n //sidebar (or desktop main body) to collections\n this.setState({\n redirectTo: \"/\",\n })\n }\n }\n\n if (window.location.hash === \"#/signup\") {\n this.setState({\n redirectTo: \"/accounts\",\n })\n }\n\n if (window.location.hash.startsWith(\"#/login\")) {\n if (\n querystringify.parse(\"?\" + window.location.hash.split(\"?\")[1]).user\n ) {\n this.setState({\n redirectTo: \"/accounts\",\n })\n } else {\n this.setState({\n redirectTo: JSON.parse(localStorage.getItem(\"accountList\"))[0]\n ? \"/accounts\"\n : \"/signup\",\n })\n }\n }\n\n if (window.location.hash === \"#/recovery\") {\n this.setState({\n redirectTo: \"/login\",\n })\n }\n }\n }\n\n componentDidMount() {\n this.updateDimensions()\n window.addEventListener(\"resize\", debounce(this.updateDimensions))\n\n if (window.cordova) {\n this.setState({\n online: navigator.connection.type !== Connection.NONE,\n })\n\n document.addEventListener(\"offline\", this.setOnline, false)\n document.addEventListener(\"online\", this.setOnline, false)\n document.addEventListener(\"backbutton\", this.handleBackButton)\n\n window.StatusBar.show()\n window.StatusBar.overlaysWebView(true)\n }\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"resize\", debounce(this.updateDimensions))\n\n if (window.cordova) {\n document.removeEventListener(\"offline\", this.setOnline)\n document.removeEventListener(\"online\", this.setOnline)\n document.removeEventListener(\"backbutton\", this.handleBackButton)\n }\n }\n\n render() {\n const { i18n } = this.props\n const { online } = this.state\n const {\n REACT_APP_ENABLE_DATA_LAB: enableDataLab,\n REACT_APP_ENABLE_REPORTS: enableReports,\n } = process.env\n\n moment.updateLocale(\n i18n.language,\n i18n.language === \"en\"\n ? require(\"moment/locale/en-gb\")\n : require(\"moment/locale/\" + i18n.language)\n )\n\n if (window.cordova) {\n window.StatusBar.overlaysWebView(true)\n }\n\n const logOut = deleted => {\n let currentAccountList = JSON.parse(localStorage.getItem(\"accountList\"))\n const currentUser = currentAccountList.find(\n account => account.id === localStorage.getItem(\"userId\")\n )\n\n currentUser &&\n JSON.parse(localStorage.getItem(\"endpointList\")).find(\n endpoint => endpoint.id === currentUser.id\n ) &&\n webPushUnsubscribe(\n currentUser.token,\n currentUser.id,\n JSON.parse(localStorage.getItem(\"endpointList\")).find(\n endpoint => endpoint.id === currentUser.id\n ).endpoint\n )\n\n deleted\n ? (currentAccountList = currentAccountList.filter(\n account => account.id !== localStorage.getItem(\"userId\")\n ))\n : currentAccountList.filter(\n account => account.id === localStorage.getItem(\"userId\")\n )[0] &&\n (currentAccountList.filter(\n account => account.id === localStorage.getItem(\"userId\")\n )[0].token = \"\")\n\n localStorage.setItem(\"accountList\", JSON.stringify(currentAccountList))\n\n localStorage.setItem(\"userId\", \"\")\n\n this.setState({\n bearer: \"\",\n loggedOut: true,\n loginEmail: \"\",\n signupEmail: \"\",\n })\n }\n\n const changeAccount = (userId, redirect) => {\n this.setState({\n bearer: \"\",\n loggedOut: true,\n userId,\n redirect,\n signupEmail: \"\",\n })\n localStorage.setItem(\"userId\", \"\")\n }\n\n if (\n querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).user &&\n localStorage.getItem(\"accountList\") &&\n JSON.parse(localStorage.getItem(\"accountList\")).find(\n account =>\n account.id ===\n querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).user\n ) &&\n (window.cordova\n ? window.location.hash.split(\"?\")[0] === \"#/\" ||\n window.location.hash.split(\"?\")[0] === \"#/data\" ||\n window.location.hash.split(\"?\")[0] === \"#/reports\"\n : window.location.pathname === \"/\" ||\n window.location.pathname === \"/data\" ||\n window.location.pathname === \"/reports\")\n ) {\n localStorage.setItem(\n \"userId\",\n querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).user\n )\n\n this.setState({\n bearer: JSON.parse(localStorage.getItem(\"accountList\")).find(\n account =>\n account.id ===\n querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).user\n ).token,\n })\n\n return (\n <Redirect\n to={\n window.location.pathname +\n (querystringify.parse(\n window.cordova && window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n ? \"?thing=\" +\n querystringify.parse(\n window.cordova &&\n window.location.hash.split(\"?\").length === 2\n ? \"?\" + window.location.hash.split(\"?\")[1]\n : window.location.search\n ).thing\n : \"\")\n }\n />\n )\n }\n\n if (this.state.redirectTo) {\n let address = this.state.redirectTo\n this.setState({ redirectTo: \"\" })\n return <Redirect push to={address} />\n }\n\n if (this.state.redirectToHidden) {\n let address = this.state.redirectToHidden\n this.setState({ redirectToHidden: \"\" })\n return <Redirect to={address} />\n }\n\n return (\n <SharedUIProvider\n value={{\n ...process.env,\n i18n,\n moment,\n logo,\n backgroundLogo,\n unauthenticatedLogo,\n mobileUnauthenticatedLogo,\n loginBackgrounds: Object.values(\n importAll(\n require.context(\n \"./styles/assets/loginBackgrounds\",\n false,\n /\\.(png|jpe?g|svg)$/\n )\n )\n ).map(module => module[\"default\"]),\n version,\n }}\n >\n <StyledEngineProvider injectFirst>\n <ThemeProvider theme={theme(process.env)}>\n {online ? (\n <>\n <Switch>\n <Route\n exact\n path={\n enableDataLab && enableReports\n ? [\"/\", \"/data\", \"/reports\"]\n : enableDataLab\n ? [\"/\", \"/data\"]\n : enableReports\n ? [\"/\", \"/reports\"]\n : \"/\"\n }\n >\n {(() => {\n if (this.state.bearer) {\n return (\n <AuthenticatedApp\n bearer={this.state.bearer}\n logOut={logOut}\n changeBearer={bearer => this.setState({ bearer })}\n changeAccount={changeAccount}\n isMobile={this.state.isMobile}\n forceUpdate={() => this.forceUpdate()}\n changeEmail={loginEmail =>\n this.setState({ loginEmail })\n }\n changeEmailBearer={this.state.changeEmailBearer}\n changeAuthenticationBearer={\n this.state.changeAuthenticationBearer\n }\n deleteUserBearer={this.state.deleteUserBearer}\n manageAccessTokensBearer={\n this.state.manageAccessTokensBearer\n }\n />\n )\n } else {\n // if the bearer is not present because the user chose to log out in this session, their referrer is not saved\n // the referrer is the address of the page on which the user was before being asked to log in\n if (!this.state.loggedOut) {\n // this check avoids redirecting the user to remote.igloo.ooo/?collectionundefined in case there is nothing after ?collection=\n window.location.href.split(\"?collection=\")[1] &&\n this.setState({\n from:\n \"/?collection=\" +\n window.location.href.split(\"?collection=\")[1],\n })\n }\n // the user is redirected to the log in screen if someone already logged in on their machine\n return JSON.parse(\n localStorage.getItem(\"accountList\")\n )[0] ? (\n <Redirect to=\"/accounts\" />\n ) : (\n <Redirect to=\"/signup\" />\n )\n }\n })()}\n </Route>\n <Route path=\"/accounts\">\n <UnauthenticatedApp\n isAccountSwitcher\n forceUpdate={() => this.forceUpdate()}\n changeBearer={bearer => this.setState({ bearer })}\n setupWebPush={setupWebPush}\n setRedirect={redirectTo =>\n this.setState({ redirectTo })\n }\n appName={appName}\n />\n </Route>\n <Route path=\"/login\">\n <UnauthenticatedApp\n isLogin\n forceUpdate={this.forceUpdate}\n changeBearer={bearer => this.setState({ bearer })}\n setupWebPush={setupWebPush}\n setRedirect={redirectTo =>\n this.setState({ redirectTo })\n }\n setHiddenRedirect={redirectToHidden =>\n this.setState({ redirectToHidden })\n }\n appName={appName}\n />\n </Route>\n <Route path=\"/signup\">\n <UnauthenticatedApp\n isSignup\n forceUpdate={() => this.forceUpdate()}\n changeBearer={bearer => this.setState({ bearer })}\n setupWebPush={setupWebPush}\n setRedirect={redirectTo =>\n this.setState({ redirectTo })\n }\n appName={appName}\n />\n </Route>\n <Route path=\"/recovery\">\n <UnauthenticatedApp\n isRecovery\n setRedirect={redirectTo =>\n this.setState({ redirectTo })\n }\n changeBearer={bearer => this.setState({ bearer })}\n appName={appName}\n />\n </Route>\n <Route>\n <Error404\n isMobile={this.state.isMobile}\n setRedirect={redirectTo =>\n this.setState({ redirectTo })\n }\n appName={appName}\n />\n </Route>\n </Switch>\n {this.state.redirect && (\n <Redirect push to={\"/login?user=\" + this.state.userId} />\n )}\n </>\n ) : (\n <OfflineError appName={appName} />\n )}\n </ThemeProvider>\n </StyledEngineProvider>\n </SharedUIProvider>\n )\n }\n }\n)\n","import i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport { en, it } from \"@igloocloud/igloosharedui/locales\";\n\ni18n.use(initReactI18next).init({\n resources: {\n en,\n it,\n },\n lng:\n localStorage.getItem(\"language\") ||\n (navigator.language || navigator.userLanguage).slice(0, 2),\n fallbackLng: \"en\",\n debug: false,\n ns: [\"translations\"],\n defaultNS: \"translations\",\n interpolation: {\n escapeValue: false,\n formatSeparator: \",\",\n },\n react: {\n wait: true,\n bindI18n: \"languageChanged loaded\",\n bindStore: \"added removed\",\n nsMode: \"default\",\n },\n});\n\nexport default i18n;\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport App from \"./App\"\nimport { HashRouter, BrowserRouter } from \"react-router-dom\"\nimport { I18nextProvider } from \"react-i18next\"\nimport { LocalizationProvider } from \"@mui/lab\"\nimport DateAdapter from \"@mui/lab/AdapterMoment\"\nimport i18n from \"./i18n\"\n\nconst HybridRouter = window.cordova ? HashRouter : BrowserRouter\n\nconst startApp = () => {\n ReactDOM.render(\n <LocalizationProvider dateAdapter={DateAdapter}>\n <I18nextProvider i18n={i18n}>\n <HybridRouter>\n <App />\n </HybridRouter>\n </I18nextProvider>\n </LocalizationProvider>,\n document.getElementById(\"root\")\n )\n}\n\nif (window.cordova) {\n document.addEventListener(\"deviceready\", startApp, false)\n} else {\n startApp()\n}\n","var map = {\n\t\"./card0.svg\": 1439,\n\t\"./card1.svg\": 1440,\n\t\"./card2.svg\": 1441\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 503;","var map = {\n\t\"./loginBackground0.jpg\": 1464\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 692;"],"sourceRoot":""}