{"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":""}