{"version":3,"sources":["utils/extensions.js","styles/theme_light.js","styles/theme_dark.js","app/db_config.js","utils/utils.js","utils/dateRange.js","utils/dateUtils.js","utils/repeat.js","redux/dataSlice.js","redux/alertSlice.js","features/components/Alert.js","redux/prefsSlice.js","features/components/icons/LightThemeIcon.js","features/components/icons/DarkThemeIcon.js","features/components/ThemeSwitch.js","redux/authSlice.js","features/auth/LoginFooter.js","hooks/useInputValue.js","utils/api.js","features/auth/LoginForm.js","features/auth/SocialForm.js","features/auth/RecoveryForm.js","features/auth/Login.js","features/components/icons/StarIcon.js","features/components/details/DetailsNavbar.js","features/components/DatePicker.js","redux/appStateSlice.js","features/components/items/TagItem.js","features/components/details/SelectableDropdown.js","features/components/details/TagsDropdown.js","features/components/details/TaskRepeat.js","features/components/details/DetailsFooter.js","features/components/items/SubtaskItem.js","features/components/details/ThemedButton.js","features/components/TaskEditor.js","features/components/MultipleTasksEditor.js","features/components/Details.js","redux/filterSlice.js","app/api.js","features/components/Header.js","features/components/icons/ProjectIcon.js","features/components/icons/ExpandIcon.js","features/components/items/EditableEntityItem.js","features/components/Circle.js","features/components/items/EditTagItem.js","features/components/Nav.js","features/components/NewTaskInput.js","features/components/icons/DueDateIcon.js","features/components/items/ContextItem.js","features/components/items/ProjectItem.js","features/components/items/TaskItem.js","features/components/ColoredLine.js","features/components/items/DateRangeItem.js","features/components/Loader.js","features/components/TasksList.js","features/components/items/UserFilterItem.js","features/components/Filter.js","app/ws.js","features/components/dialogs/PremiumDialog.js","features/components/dialogs/LimitDevicesDialog.js","Content.js","App.js","app/store.js","serviceWorker.js","index.js","utils/constants.js"],"names":["Storage","prototype","setObject","key","value","this","setItem","JSON","stringify","removeItem","getObject","getItem","parse","e","Array","random","Math","floor","length","Theme","DBConfig","name","version","objectStoresMeta","store","Constants","table_tasks","storeConfig","keyPath","autoIncrement","storeSchema","keypath","options","unique","table_projects","table_contexts","table_tags","table_user_filters","extraCounter","getExtraCounter","findByCloudId","items","cloudId","find","item","_","__","findByCloudIds","cloudIds","filter","includes","removeItemFromArray","predicate","i","splice","logEvent","event","firebase","analytics","rankSort","a","b","rank1","rank","rank2","getRankBetween","first","second","firstRank","rank_start","secondRank","rank_end","firstCodes","string2Bin","secondCodes","difference","firstCode","secondCode","alphabet_size","pow","newElement","offset","index","diffInSymbols","newElementCode","charCodeAt","String","fromCharCode","split","reverse","join","str","result","push","openUrl","link","window","open","DateRange","all","starred","overdue","today","tomorrow","next7Days","later","noDate","completed","formatDate","date","now","moment","isSame","add","calendar","replace","year","format","formatDateDb","date_format","getDateRangeName","dateRange","getDateRange","task","onlyDate","dateDue","dueMoment","isBefore","start","startOf","end","isAfter","RepeatEndType","RepeatIntervalType","getNextOccurrenceAfter","repeat","interval","endType","endAfter","type","dateMoment","clone","intervalType","weekDays","some","weekdays","isTheDay","adjustMoment","firstDayOfWeek","isoWeekday","checkEnd","calculateWeek","lastDayOfMonth","endOf","counter","endOn","initDB","taskDB","useIndexedDB","userFiltersDB","projectDB","contextDB","tagDB","sortByRankAndDueDate","dateUpdated","dataSlice","createSlice","initialState","taskSyncCounter","pctSyncCounter","selectedTasks","allUserFilters","allProjects","allContexts","allTags","toSync","tasks","filters","projects","contexts","tags","reducers","dataLoadedFromDb","state","action","payload","data","archived","sort","dataGetFromServer","console","log","updateItemsInDB","taskInSelection","taskInModified","deleted","extra","setSelected","refreshTaskList","clearData","clear","completeTask","dateCompleted","nextOccurrence","newRepeat","originalDueDate","taskUpdated","subtasks","map","subtask","reminders","updateRemindersIfNeeded","updateTask","updateTasks","forEach","selectTask","addTasksToSelection","removeTasksFromSelection","element","updateUserFilter","userFilter","uuidv4","dateCreated","addOrReplace","userFilterUpdated","updateProject","project","projectUpdated","updateContext","context","contextUpdated","updateTag","tag","color","constants","default_colors","tagUpdated","createDefaultData","updateDates","projectCloudId","contextCloudId","isNew","position","isArray","selected","newDate","daysDifference","diff","reminder","newReminder","newDateTime","originalDateTime","dateTime","removeDeleted","item1","item2","findIndex","db","syncCollection","deleteRecord","update","actions","selectSelectedTasks","selectSelectedTasksCount","selectDataToSync","selectTasksSynced","selectPctSynced","selectAllUserFilters","selectAllProjects","selectAllContexts","selectAllTags","alertSlice","visible","text","dismissable","premiumMessage","limitDevices","loggedOut","showPremium","hidePremium","showDevicesLimitDialog","hideDevicesLimitDialog","showAlert","hideAlert","showLoggedOut","hideLoggedOut","selectAlert","alert","selectLoggedOut","Alert","useSelector","dispatch","useDispatch","CSSTransition","in","timeout","enter","exit","classNames","mountOnEnter","unmountOnExit","className","onClick","aria-label","storage","localStorage","theme","accent","prefsSlice","prefsSetAccent","saveState","prefsSetTheme","newTheme","selectPrefsThemeIsDark","prefs","selectPrefsAccent","LightThemeIcon","props","rest","SvgIcon","fill","d","DarkThemeIcon","ThemeSwitch","isDarkTheme","checked","checkedIcon","uncheckedIcon","offColor","onColor","width","height","onChange","deviceId","token","profile","authSlice","createDeviceId","saveProfile","saveToken","logout","undefined","selectDeviceId","auth","selectToken","selectProfile","LoginFooter","isRegister","isRecover","setIsRegister","setIsRecover","href","preventDefault","useInputValue","defaultValue","useState","setValue","bind","target","getErrorMessage","code","detect","require","LoginForm","onLogin","emailInput","passwordInput","useEffect","Form","onSubmit","browser","info","os","authData","email","pass","headers","Headers","Origin2","fetch","process","method","mode","body","then","response","json","error","catch","FormGroup","controlId","bssize","FormLabel","FormControl","autoFocus","Button","block","disabled","rel","SocialForm","responseGoogle","tokenId","loginSocial","network","Container","Row","noGutters","Col","clientId","buttonText","onSuccess","onFailure","render","renderProps","variant","style","padding","alt","src","appId","autoLoad","fields","callback","accessToken","Facebook","RecoveryForm","setState","pinInput","validateForm","message","makeRequest","readOnly","maxLength","Login","isLoggedOut","handleLogin","Toast","show","top","left","onClose","Header","Body","borderColor","backgroundColor","StarIcon","isStarred","StarRounded","StarBorderRounded","DetailsNavbar","every","ArrowBackRounded","DeleteRounded","DatePicker","showButtons","focused","setFocused","onDateChange","onFocusChange","hideKeyboardShortcutsPanel","numberOfMonths","renderCalendarInfo","size","addingEntity","editingEntity","navOpen","userFiltersOpen","projectsOpen","contextsOpen","tagsOpen","appStateSlice","setEditingEntity","setAddingEntity","setNavOpen","id","id_adding_project","id_adding_context","id_adding_tag","id_adding_user_filters","selectAddingProject","appState","selectAddingContext","selectAddingTag","selectEditingEntity","selectAppStateNavOpen","TagItem","editable","dispatchFunction","stopPropagation","marginRight","cursor","tinycolor","getLuminance","EditRounded","fontSize","marginLeft","paddingBottom","SelectableDropdown","title","emptyName","onSelect","DropdownButton","as","ButtonGroup","drop","Dropdown","Item","eventKey","Divider","TagsDropdown","defaultWeekdays","taskDueDate","toString","TaskRepeat","repeatWeekdays","isIntervalValid","setIntervalValid","intervalValue","setIntervalValue","isEndAfterValid","setEndAfterValid","endAfterValue","setEndAfterValue","doUpdateTask","InputGroup","placeholder","isInvalid","newValue","parseInt","Control","day","weekRow","Group","Check","label","Prepend","occurrences","isEndAfterOccerenceds","repeat_next_preview","repeatPreview","DetailsFooter","reduce","changedItem","SortableItem","SortableHandle","SubtaskItem","createNewSubtask","formRef","form","setName","titleRef","useRef","setCursor","input","current","setSelectionRange","onChecked","updateSubtask","refreshTimeout","updatedSubtask","withRemovedSubtask","deleteSubtask","clearTimeout","pointerEvents","tabIndex","minRows","maxRows","ref","resize","selectionStart","newName","setTimeout","refresh_subtask_when_typing_delay","handleTimer","onKeyDown","ctrlKey","canCreateNew","nextIndex","elements","focus","newSubtask","slice","focusNext","keyCode","ThemedButton","SortableElement","SortableList","SortableContainer","paddingInlineStart","TaskEditor","description","setDescription","refresh_list_when_typing_delay","fromTop","max_subtasks","fromQuickInput","onKeyPress","helperClass","useDragHandle","lockToContainerEdges","axis","lockOffset","onSortEnd","oldIndex","newIndex","arrayMove","MultipleTasksEditor","Details","inbox","filterSlice","filterClear","save","filterSetUserFilter","filterSetProject","filterSetContext","filterAddTag","filterRemoveTag","filterSetDateRange","filterSetInbox","inboxPreviousValue","filterNotifyEntityDeleted","i1","i2","selectFilter","useApiLogout","isLoggedIn","forced","doLogout","ok","Error","setLoggedIn","alignRight","Toggle","Menu","NavDropdown","Android","link_google_play","Apple","link_app_store","packageJson","ProjectIcon","ExpandIcon","isExpanded","ArrowForwardIosRounded","transform","EditableEntityItem","entity","icon","dispatchDoneFunction","isEditing","nameInput","finishEditingEntity","objectId","onKeyUp","onFocus","CheckRounded","notEditable","Circle","circleStyle","borderRadius","EditTagItem","tagColor","setTagColor","isShowingPicker","setShowingPicker","styles","reactCSS","default","popover","zIndex","cover","right","bottom","onChangeComplete","hex","colors","BaseListItem","children","SortableEntityItem","editingCloudId","SortableTagItem","SortableRankList","buildChild","Nav","addingProject","addingContext","addingTag","navOpenState","isDragging","setIsDragging","sortableRankList","dispatchOnSortEnd","distance","onSortStart","node","collection","isKeySorting","newRank","draggedItem","AllInboxRounded","TodayRounded","InboxRounded","marginTop","paddingLeft","test_users","aria-controls","aria-expanded","Collapse","textColor","checkLimitAndPremium","free_projects","AlternateEmailRounded","free_contexts","LabelOutlined","free_tags","max","isPremium","NewTaskInput","titleInput","trim","DueDateIcon","isRepeat","ContextItem","ProjectItem","TaskItem","isSelected","onSelected","isChecked","setChecked","isLocked","setLocked","ListGroup","opacity","bigger","shape","data-type","animation","locked","ColoredLine","DateRangeItem","onDateRangeSelected","margin","role","checkIds","asString","isNot","noCondition","condition","conditions","res","it","TasksList","synced","setTasks","tasksDB","isLoadingTasks","setIsLoadingTasks","hasMoreTasks","setHasMoreTasks","page","setPage","listRef","canSelectNextOnKey","initialShiftSelection","setInitialShiftSelection","getAll","totalTasks","includeCompleted","days","projectsNot","contextsNot","tagsNot","tagsType","filterType","filterByUserFilter","taskDateRange","filterTag","tagId","filterByFilter","oldTasks","newPortion","byDueOrUpdatedDate","tasks_portion_size","concat","newDateRange","previousDateRange","selectTaskIfCan","taskView","getAttribute","scrollIntoViewIfNeeded","onScroll","scrollHeight","scrollTop","clientHeight","activeKey","shiftKey","newSelection","taskid","lastIndex","selectedIndex","min","_selectWithShift","_selectWithCtrl","_selectWithoutKey","Loader","UserFilterItem","Filter","marginBottom","sendMessage","socket","send","sendDataToServer","WS","URL","isAutoconnect","onWelcomeReceived","onConnectionChanged","onSyncMessage","onLogout","rws","ReconnectingWebSocket","maxReconnectionDelay","startClosed","addEventListener","onMessage","reason","wasClean","lastSync","lastSyncFilters","syncDate","syncDateFilters","onWelcome","done","PremiumDialog","Modal","onHide","closeButton","Title","Footer","DeviceItem","device","onDelete","currentDeviceId","isDeleting","setIsDeleting","origin","DesktopWindows","DeviceUnknown","deviceIcon","suffix","deviceTitle","dateAsString","lastSyncDate","utc","local","deviceLastSync","Close","deleteDevice","LimitDevicesDialog","devices","setDevices","hasErrorDeleting","setHasErrorDeleting","removeAlertTimeout","backdrop","keyboard","limit","Content","setError","status","setStatus","isReconnecting","setReconnecting","reconnect","setReconnect","filtersDB","syncTimeout","isConnected","isVisible","webSocket","selectedTasksCount","sync_delay","close","document","hasFocus","isConnectionOpen","onConnectionStateChanged","onBlur","removeEventListener","display","alignItems","justifyContent","App","locale","navigator","language","userLanguage","toLowerCase","Object","entries","ThemeDark","ThemeLight","documentElement","setProperty","configureStore","reducer","appStateReducer","dataReducer","alertReducer","authReducer","filterReducer","prefsReducer","middleware","getDefaultMiddleware","Boolean","location","hostname","match","initializeApp","apiKey","projectId","measurementId","ReactDOM","getElementById","serviceWorker","ready","registration","unregister","module","exports","free_user_filters","free_reminders"],"mappings":"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","file":"static/js/main.7be251a4.chunk.js","sourcesContent":["Storage.prototype.setObject = function (key, value) {\n if (value) {\n this.setItem(key, JSON.stringify(value));\n } else {\n this.removeItem(key);\n }\n};\n\nStorage.prototype.getObject = function (key) {\n var value = this.getItem(key);\n if (value) {\n try {\n return JSON.parse(value);\n } catch (e) {}\n }\n return null;\n};\n\nArray.prototype.random = function () {\n return this[Math.floor(Math.random() * this.length)];\n};\n","export const Theme = {\n \"--accent\": \"#FFC107\",\n \"--background-color\": \"#eee\",\n \"--background-color-lighter\": \"#f5f5f5\",\n \"--background-color-darker\": \"#ccc\",\n \"--background-color-very-darker\": \"#aaa\",\n \"--text-color\": \"#444\",\n \"--text-color-secondary\": \"#666\",\n\n \"--input-border\": \"rgba(128, 128, 128, 0.25)\",\n \"--input-background\": \"rgba(255, 255, 255, 0.15)\",\n \"--input-border-focus\": \"rgba(128, 128, 128, 0.5)\",\n \"--input-background-focus\": \"rgba(255, 255, 255, 0.25)\",\n};\n","export const Theme = {\n \"--accent\": \"#FFC107\",\n \"--background-color\": \"#24272E\",\n \"--background-color-lighter\": \"#31343D\",\n \"--background-color-darker\": \"#212529\",\n \"--background-color-very-darker\": \"#151515\",\n \"--text-color\": \"#ffffff\",\n \"--text-color-secondary\": \"#aaaaaa\",\n\n \"--input-border\": \"rgba(0, 0, 0, 0.25)\",\n \"--input-background\": \"rgba(0, 0, 0, 0.15)\",\n \"--input-border-focus\": \"rgba(0, 0, 0, 0.5)\",\n \"--input-background-focus\": \"rgba(0, 0, 0, 0.25)\",\n};\n","import Constants from \"../utils/constants\";\n\nexport const DBConfig = {\n name: \"tasks_db\",\n version: 2,\n objectStoresMeta: [\n {\n store: Constants.table_tasks,\n storeConfig: { keyPath: \"cloudId\", autoIncrement: false },\n storeSchema: [\n { name: \"cloudId\", keypath: \"cloudId\", options: { unique: true } },\n // { name: \"name\", keypath: \"name\", options: { unique: false } },\n ],\n },\n {\n store: Constants.table_projects,\n storeConfig: { keyPath: \"cloudId\", autoIncrement: false },\n storeSchema: [\n { name: \"cloudId\", keypath: \"cloudId\", options: { unique: true } },\n ],\n },\n {\n store: Constants.table_contexts,\n storeConfig: { keyPath: \"cloudId\", autoIncrement: false },\n storeSchema: [\n { name: \"cloudId\", keypath: \"cloudId\", options: { unique: true } },\n ],\n },\n {\n store: Constants.table_tags,\n storeConfig: { keyPath: \"cloudId\", autoIncrement: false },\n storeSchema: [\n { name: \"cloudId\", keypath: \"cloudId\", options: { unique: true } },\n ],\n },\n {\n store: Constants.table_user_filters,\n storeConfig: { keyPath: \"cloudId\", autoIncrement: false },\n storeSchema: [\n { name: \"cloudId\", keypath: \"cloudId\", options: { unique: true } },\n ],\n },\n ],\n};\n","import tinycolor from \"tinycolor2\";\nimport firebase from \"firebase/app\";\nimport Constants from \"./constants\";\n\nvar extraCounter = 0;\n\nexport const getExtraCounter = () => ++extraCounter;\n\nexport const findByCloudId = (items, cloudId) =>\n items ? items.find((item, _, __) => item.cloudId === cloudId) : null;\n\nexport const findByCloudIds = (items, cloudIds) =>\n items && cloudIds\n ? items.filter((item) => cloudIds.includes(item.cloudId))\n : [];\n\nexport const removeItemFromArray = (items, item, predicate) => {\n var i = 0;\n while (i < items.length) {\n if (predicate(items[i], item)) {\n items.splice(i, 1);\n } else {\n ++i;\n }\n }\n return items;\n};\n\nexport const isColorLight = (color) => {\n return tinycolor(color).getLuminance() > 0.85;\n};\n\nexport const isDevelopment = () => process.env.NODE_ENV === \"development\";\n\nexport const logEvent = (event) => {\n if (!isDevelopment()) {\n firebase.analytics().logEvent(event);\n }\n};\n\nexport const rankSort = (a, b) => {\n const rank1 = a.rank ?? \"\";\n const rank2 = b.rank ?? \"\";\n\n if (rank1 < rank2) {\n return -1;\n }\n if (rank1 > rank2) {\n return 1;\n }\n return 0;\n};\n\nexport const getRankBetween = (first, second) => {\n var firstRank = first ?? Constants.rank_start;\n var secondRank = second ?? Constants.rank_end;\n\n while (firstRank.length != secondRank.length) {\n if (firstRank.length > secondRank.length) {\n secondRank += \"z\";\n } else {\n firstRank += \"a\";\n }\n }\n\n if (firstRank == secondRank) {\n secondRank += \"r\";\n } else if (firstRank > secondRank) {\n [firstRank, secondRank] = [secondRank, firstRank];\n }\n\n var firstCodes = string2Bin(firstRank);\n var secondCodes = string2Bin(secondRank);\n\n var difference = 0;\n for (var i = firstCodes.length - 1; i >= 0; i--) {\n var firstCode = firstCodes[i];\n var secondCode = secondCodes[i];\n\n if (secondCode < firstCode) {\n secondCode += Constants.alphabet_size;\n secondCodes[i - 1] -= 1;\n }\n\n var powRes = Math.pow(Constants.alphabet_size, firstRank.length - i - 1);\n difference += (secondCode - firstCode) * powRes;\n }\n\n var newElement = \"\";\n if (difference <= 1) {\n /// add middle char from alphabet\n newElement = firstRank + \"r\";\n } else {\n difference = Math.floor((difference * 2) / 3);\n\n var offset = 0;\n for (var index = 0; index < firstCodes.length; index++) {\n /// formula: x = difference / (size^place - 1) % size;\n /// i.e. difference = 110, size = 10, we want place 2 (middle),\n /// then x = 100 / 10^(2 - 1) % 10 = 100 / 10 % 10 = 11 % 10 = 1\n var diffInSymbols =\n Math.floor(difference / Math.pow(Constants.alphabet_size, index)) %\n Constants.alphabet_size;\n\n var newElementCode =\n firstRank.charCodeAt(secondRank.length - index - 1) +\n diffInSymbols +\n offset;\n offset = 0;\n\n /// if newElement is greater then 'z'\n if (newElementCode > \"z\".charCodeAt(0)) {\n offset++;\n newElementCode -= Constants.alphabet_size;\n }\n\n newElement += String.fromCharCode(newElementCode);\n }\n\n newElement = newElement.split(\"\").reverse().join(\"\");\n }\n\n return newElement;\n};\n\nfunction string2Bin(str) {\n var result = [];\n for (var i = 0; i < str.length; i++) {\n result.push(str.charCodeAt(i));\n }\n return result;\n}\n\nexport const openUrl = (link) => {\n window.open(link, \"_blank\");\n};\n","const DateRange = {\n all: 1,\n starred: 2,\n overdue: 3,\n today: 4,\n tomorrow: 5,\n next7Days: 6,\n later: 7,\n noDate: 8,\n completed: 9,\n};\n\nexport default DateRange;\n","import moment from \"moment\";\nimport { date_format } from \"./constants\";\nimport DateRange from \"./dateRange\";\n\nexport const formatDate = (date) => {\n if (!date) {\n return null;\n }\n\n const now = moment();\n\n if (\n moment().isSame(date, \"day\") ||\n moment().add(-1, \"day\").isSame(date, \"day\") ||\n moment().add(1, \"day\").isSame(date, \"day\")\n ) {\n return date.calendar().split(\" \")[0].replace(\",\", \"\");\n }\n\n return date.year() == now.year()\n ? date.format(\"D MMMM\")\n : date.format(\"D MMMM YYYY\");\n};\n\nexport const formatTime = (dateAsString) => {\n return moment.utc(dateAsString).local().format(\"HH:mm\");\n};\n\nexport const isToday = (date) => {\n if (!date) {\n return false;\n }\n\n const now = moment();\n return now.isSame(date, \"day\");\n};\n\nexport const isTodayOrBefore = (date) => {\n if (!date) {\n return false;\n }\n\n const now = moment();\n return now.isSame(date, \"day\") || date.isBefore(now);\n};\n\nexport const formatDateDb = (date) => {\n return date?.format(date_format);\n};\n\nexport const getDateRangeName = (dateRange) => {\n switch (dateRange) {\n case DateRange.all:\n return \"All\";\n case DateRange.starred:\n return \"Starred\";\n case DateRange.overdue:\n return \"overdue\";\n case DateRange.today:\n return \"Today\";\n case DateRange.tomorrow:\n return \"Tomorrow\";\n case DateRange.next7Days:\n return \"Next 7 days\";\n case DateRange.later:\n return \"Later\";\n case DateRange.noDate:\n return \"No date\";\n case DateRange.completed:\n return \"Completed\";\n default:\n return \"\";\n }\n};\n\nexport const getDateRange = (task, onlyDate) => {\n if (!onlyDate) {\n if (task.completed) {\n return DateRange.completed;\n }\n\n if (task.starred) {\n return DateRange.starred;\n }\n }\n\n if (task.dateDue == null) {\n return DateRange.noDate;\n } else {\n const now = moment();\n const dueMoment = moment(task.dateDue);\n\n if (now.isSame(dueMoment, \"date\") || dueMoment.isBefore(now)) {\n return DateRange.today;\n } else {\n const start = now.startOf(\"day\").add(1, \"d\");\n const end = moment().startOf(\"day\").add(7, \"d\");\n\n if (now.isSame(dueMoment, \"date\")) {\n return DateRange.tomorrow;\n } else if (dueMoment.isAfter(start) && dueMoment.isBefore(end)) {\n return DateRange.next7Days;\n } else {\n return DateRange.later;\n }\n }\n }\n};\n","import { start } from \"@popperjs/core\";\nimport moment from \"moment\";\nimport Constants from \"./constants.js\";\n\nexport const RepeatEndType = {\n NEVER: \"NEVER\",\n ON_DATE: \"ON_DATE\",\n AFTER_OCCURENCES: \"AFTER_OCCURENCES\",\n};\n\nexport const RepeatIntervalType = {\n DAY: \"DAY\",\n WEEK: \"WEEK\",\n MONTH: \"MONTH\",\n YEAR: \"YEAR\",\n};\n\nexport const getNextOccurrenceAfter = (repeat, date) => {\n if (\n !date ||\n repeat.interval <= 0 ||\n (repeat.endType === RepeatEndType.AFTER_OCCURENCES && repeat.endAfter <= 1)\n ) {\n return null;\n }\n\n const dateMoment = moment(date).startOf(\"day\");\n var start = dateMoment.clone();\n const now = moment().startOf(\"day\");\n\n var type;\n if (repeat.intervalType === RepeatIntervalType.DAY) {\n type = \"d\";\n } else if (repeat.intervalType === RepeatIntervalType.WEEK) {\n if (\n !repeat.weekDays ||\n !repeat.weekDays\n .split(\"\")\n .some((item) => Constants.weekdays.includes(item))\n ) {\n return null;\n }\n return calculateWeek(start, now, repeat);\n } else if (repeat.intervalType === RepeatIntervalType.MONTH) {\n if (repeat.lastDayOfMonth) {\n start.endOf(\"month\").startOf(\"day\");\n if (!now.isAfter(start) && start.isAfter(dateMoment))\n return checkEnd(start, repeat);\n }\n type = \"M\";\n } else if (repeat.intervalType === RepeatIntervalType.YEAR) {\n type = \"y\";\n } else {\n type = \"d\";\n }\n\n do {\n const interval = repeat.interval > 0 ? repeat.interval : 1;\n start.add(interval, type);\n if (repeat.intervalType === RepeatIntervalType.MONTH) {\n if (repeat.lastDayOfMonth) {\n start.endOf(\"month\");\n } else {\n //because of 30/31 difference, and also 28 days in february\n var counter = 2;\n while (start.date() !== dateMoment.date()) {\n start = dateMoment.clone().add(interval * counter, type);\n counter++;\n }\n }\n }\n } while (start.isBefore(now));\n\n return checkEnd(start, repeat);\n};\n\nfunction calculateWeek(start, now, repeat) {\n const isTheDay = (date) => {\n return repeat.weekDays.includes(adjustMoment(date)) && !now.isAfter(date);\n };\n\n const firstDayOfWeek = adjustMoment(start.clone().startOf(\"week\"));\n\n do {\n start.add(1, \"d\");\n while (start.isoWeekday() !== firstDayOfWeek) {\n if (isTheDay(start)) {\n return checkEnd(start, repeat);\n }\n start.add(1, \"d\");\n }\n start.add(repeat.interval - 1, \"w\");\n } while (!isTheDay(start));\n\n return checkEnd(start, repeat);\n}\n\nexport function adjustMoment(date) {\n return (date.isoWeekday() % 7) + 1;\n}\n\nfunction checkEnd(dateMoment, repeat) {\n if (\n repeat.endType === RepeatEndType.ON_DATE &&\n moment(repeat.endOn).isBefore(dateMoment)\n ) {\n return null;\n } else {\n return dateMoment;\n }\n}\n","import { createSlice } from \"@reduxjs/toolkit\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { useIndexedDB } from \"react-indexed-db\";\nimport { DBConfig } from \"../app/db_config\";\nimport { initDB } from \"react-indexed-db\";\nimport Constants from \"../utils/constants\";\nimport \"../utils/extensions\";\nimport moment from \"moment\";\nimport {\n findByCloudId,\n removeItemFromArray,\n getExtraCounter,\n} from \"../utils/utils\";\nimport constants from \"../utils/constants\";\nimport { formatDateDb } from \"../utils/dateUtils\";\nimport { getNextOccurrenceAfter, RepeatEndType } from \"../utils/repeat\";\n\ninitDB(DBConfig);\n\nconst defaultProjects = () => [\n { cloudId: uuidv4(), name: \"Welcome\", rank: \"rrrr\" },\n];\n\nconst defaultContexts = () => [\n { cloudId: uuidv4(), name: \"Work\", rank: \"gmzz\" },\n { cloudId: uuidv4(), name: \"Home\", rank: \"mzzy\" },\n { cloudId: uuidv4(), name: \"FreeTime\", rank: \"tmzx\" },\n];\n\nconst defaultTags = () => [\n { cloudId: uuidv4(), name: \"Urgent\", rank: \"cxcx\", color: \"#F44336\" },\n { cloudId: uuidv4(), name: \"Read\", rank: \"fufu\", color: \"#FF9800\" },\n { cloudId: uuidv4(), name: \"Movies\", rank: \"irir\", color: \"#CDDC39\" },\n { cloudId: uuidv4(), name: \"People\", rank: \"lolo\", color: \"#3F51B5\" },\n { cloudId: uuidv4(), name: \"Sport\", rank: \"olol\", color: \"#9C27B0\" },\n { cloudId: uuidv4(), name: \"Web\", rank: \"riri\", color: \"#4CAF50\" },\n { cloudId: uuidv4(), name: \"Finance\", rank: \"ufuf\", color: \"#795548\" },\n { cloudId: uuidv4(), name: \"Productivity\", rank: \"xcxc\", color: \"#607D8B\" },\n];\n\nconst defaultTasks = () => [\n {\n cloudId: uuidv4(),\n name: \"Welcome to Blitz\",\n dateDue: formatDateDb(moment()),\n },\n {\n cloudId: uuidv4(),\n name: \"Tasks can be assigned to projects or contexts, or both\",\n },\n {\n cloudId: uuidv4(),\n name: \"Tasks can have tags! Even multiple\",\n },\n {\n cloudId: uuidv4(),\n name: \"Tasks without project, context and tags get into Inbox. Try to keep it clean!\",\n },\n {\n cloudId: uuidv4(),\n name: \"Keep playing around and stay productive!\",\n },\n];\n\nconst dataState = {\n taskSyncCounter: 0,\n pctSyncCounter: 0,\n\n selectedTasks: [],\n\n allUserFilters: [],\n allProjects: [],\n allContexts: [],\n allTags: [],\n toSync: {\n tasks: [],\n filters: [],\n projects: [],\n contexts: [],\n tags: [],\n },\n};\n\nconst taskDB = useIndexedDB(Constants.table_tasks);\nconst userFiltersDB = useIndexedDB(Constants.table_user_filters);\nconst projectDB = useIndexedDB(Constants.table_projects);\nconst contextDB = useIndexedDB(Constants.table_contexts);\nconst tagDB = useIndexedDB(Constants.table_tags);\n\nconst sortByRankAndDueDate = (a, b) => {\n if (a.rank && b.rank) {\n return a.rank < b.rank ? -1 : 1;\n } else {\n return a.dateUpdated < b.dateUpdated ? 1 : -1;\n }\n};\n\nexport const dataSlice = createSlice({\n name: \"data\",\n initialState: dataState,\n reducers: {\n dataLoadedFromDb: (state, action) => {\n switch (action.payload.type) {\n case Constants.table_projects:\n state.allProjects = [...action.payload.data]\n .filter((item) => !item.archived)\n .sort(sortByRankAndDueDate);\n break;\n case Constants.table_contexts:\n state.allContexts = [...action.payload.data].sort(\n sortByRankAndDueDate\n );\n break;\n case Constants.table_tags:\n state.allTags = [...action.payload.data].sort(sortByRankAndDueDate);\n break;\n case Constants.table_user_filters:\n state.allUserFilters = [...action.payload.data].sort(\n sortByRankAndDueDate\n );\n break;\n default:\n break;\n }\n },\n\n dataGetFromServer: (state, action) => {\n console.log(\"--- saving filters: \" + action.payload.filters?.length);\n updateItemsInDB(action.payload.tasks, taskDB, state.toSync.tasks);\n //update selected task if it's in modified objects\n if (action.payload.tasks) {\n for (let index = 0; index < state.selectedTasks.length; index++) {\n const taskInSelection = state.selectedTasks[index];\n var taskInModified = findByCloudId(\n action.payload.tasks,\n taskInSelection.cloudId\n );\n if (taskInModified) {\n taskInModified =\n taskInModified.deleted || taskInModified.archived\n ? null\n : {\n ...taskInModified,\n extra: getExtraCounter(),\n };\n if (state.selectedTasks.length === 1) {\n setSelected(state, taskInModified);\n } else {\n state.selectedTasks[index] = taskInModified;\n }\n }\n }\n state.selectedTasks = state.selectedTasks.filter(\n (item) => item !== null\n );\n }\n\n updateItemsInDB(\n action.payload.projects,\n projectDB,\n state.toSync.projects\n );\n updateItemsInDB(\n action.payload.contexts,\n contextDB,\n state.toSync.contexts\n );\n updateItemsInDB(action.payload.tags, tagDB, state.toSync.tags);\n updateItemsInDB(\n action.payload.filters,\n userFiltersDB,\n state.toSync.filters\n );\n\n if (action.payload.tasks) {\n state.taskSyncCounter++;\n }\n if (\n action.payload.projects ||\n action.payload.contexts ||\n action.payload.tags ||\n action.payload.filters\n ) {\n state.pctSyncCounter++;\n }\n },\n\n refreshTaskList: (state, action) => {\n state.taskSyncCounter++;\n },\n\n clearData: (state, action) => {\n state.selectedTasks = [];\n taskDB.clear();\n state.toSync.tasks = [];\n userFiltersDB.clear();\n state.toSync.filters = [];\n projectDB.clear();\n state.toSync.projects = [];\n contextDB.clear();\n state.toSync.contexts = [];\n tagDB.clear();\n state.toSync.tags = [];\n },\n\n completeTask: (state, action) => {\n var task = action.payload;\n if (task.completed) {\n task.completed = false;\n task.dateCompleted = null;\n } else {\n if (task.repeat) {\n var nextOccurrence = getNextOccurrenceAfter(\n task.repeat,\n task.dateDue\n );\n if (nextOccurrence) {\n const newRepeat = {\n ...task.repeat,\n };\n if (newRepeat.endType === RepeatEndType.AFTER_OCCURENCES) {\n newRepeat.endAfter = newRepeat.endAfter - 1;\n newRepeat.originalDueDate = formatDateDb(nextOccurrence);\n }\n\n var newTask = {\n ...task,\n cloudId: null,\n completed: false,\n dateCompleted: null,\n dateDue: formatDateDb(nextOccurrence),\n repeat: newRepeat,\n subtasks: task.subtasks\n ? task.subtasks.map((subtask) => ({\n ...subtask,\n completed: false,\n }))\n : null,\n reminders: updateRemindersIfNeeded(task, nextOccurrence),\n };\n taskUpdated(state, newTask);\n }\n\n task.repeat = null;\n }\n task.completed = true;\n task.dateCompleted = formatDateDb(moment());\n }\n taskUpdated(state, task);\n },\n\n updateTask: (state, action) => {\n taskUpdated(state, action.payload);\n },\n updateTasks: (state, action) => {\n var tasks = action.payload;\n tasks.forEach((task) => taskUpdated(state, task));\n },\n\n selectTask: (state, action) => {\n setSelected(state, action.payload);\n },\n addTasksToSelection: (state, action) => {\n setSelected(state, [...state.selectedTasks, ...action.payload]);\n },\n removeTasksFromSelection: (state, action) => {\n setSelected(\n state,\n state.selectedTasks.filter(\n (element) => !findByCloudId(action.payload, element.cloudId)\n )\n );\n },\n updateUserFilter: (state, action) => {\n var userFilter = action.payload;\n if (!userFilter.cloudId) {\n let now = moment().format(Constants.date_format);\n userFilter.cloudId = uuidv4();\n userFilter.dateCreated = now;\n userFilter.dateUpdated = now;\n }\n userFilterUpdated(state, userFilter);\n },\n updateProject: (state, action) => {\n var project = action.payload;\n if (!project.cloudId) {\n let now = moment().format(Constants.date_format);\n project.cloudId = uuidv4();\n project.dateCreated = now;\n project.dateUpdated = now;\n }\n projectUpdated(state, project);\n },\n\n updateContext: (state, action) => {\n var context = action.payload;\n if (!context.cloudId) {\n let now = moment().format(Constants.date_format);\n context.cloudId = uuidv4();\n context.dateCreated = now;\n context.dateUpdated = now;\n }\n contextUpdated(state, context);\n },\n\n updateTag: (state, action) => {\n var tag = action.payload;\n if (!tag.cloudId) {\n let now = moment().format(Constants.date_format);\n tag.cloudId = uuidv4();\n tag.dateCreated = now;\n tag.dateUpdated = now;\n }\n if (tag.color === \"\") {\n tag.color = constants.default_colors.random();\n }\n tagUpdated(state, tag);\n },\n\n createDefaultData: (state, action) => {\n let now = moment().format(Constants.date_format);\n\n const updateDates = (items) => {\n items.forEach((item) => {\n item.dateCreated = now;\n item.dateUpdated = now;\n });\n return items;\n };\n\n var tags = updateDates(defaultTags());\n var contexts = updateDates(defaultContexts());\n var projects = updateDates(defaultProjects());\n var tasks = updateDates(defaultTasks());\n\n tasks[0].projectCloudId = projects[0].cloudId;\n tasks[1].projectCloudId = projects[0].cloudId;\n tasks[1].contextCloudId = contexts[0].cloudId;\n tasks[2].projectCloudId = projects[0].cloudId;\n tasks[2].tags = [tags[5].cloudId, tags[7].cloudId];\n tasks[4].projectCloudId = projects[0].cloudId;\n\n state.allProjects = projects;\n state.allContexts = contexts;\n state.allTags = tags;\n\n updateItemsInDB(projects, projectDB, []);\n updateItemsInDB(contexts, contextDB, []);\n updateItemsInDB(tags, tagDB, []);\n updateItemsInDB(tasks, taskDB, []);\n\n state.toSync.projects = projects;\n state.toSync.contexts = contexts;\n state.toSync.tags = tags;\n state.toSync.tasks = tasks;\n },\n },\n});\n\nfunction userFilterUpdated(state, userFilter) {\n let now = moment().format(Constants.date_format);\n userFilter = { ...userFilter, dateUpdated: now };\n\n updateItemsInDB([userFilter], userFiltersDB, []);\n state.allUserFilters = addOrReplace(state.allUserFilters, userFilter, true);\n state.toSync.filters = addOrReplace(state.toSync.filters, userFilter, false);\n}\n\nfunction projectUpdated(state, project) {\n let now = moment().format(Constants.date_format);\n project = { ...project, dateUpdated: now };\n\n updateItemsInDB([project], projectDB, []);\n state.allProjects = addOrReplace(state.allProjects, project, true);\n state.toSync.projects = addOrReplace(state.toSync.projects, project, false);\n}\n\nfunction contextUpdated(state, context) {\n let now = moment().format(Constants.date_format);\n context = { ...context, dateUpdated: now };\n\n updateItemsInDB([context], contextDB, []);\n state.allContexts = addOrReplace(state.allContexts, context, true);\n state.toSync.contexts = addOrReplace(state.toSync.contexts, context, false);\n}\n\nfunction tagUpdated(state, tag) {\n let now = moment().format(Constants.date_format);\n tag = { ...tag, dateUpdated: now };\n\n updateItemsInDB([tag], tagDB, []);\n state.allTags = addOrReplace(state.allTags, tag, true);\n state.toSync.tags = addOrReplace(state.toSync.tags, tag, false);\n}\n\nfunction taskUpdated(state, task) {\n let now = moment().format(Constants.date_format);\n if (!task.cloudId) {\n task.cloudId = uuidv4();\n task.dateCreated = now;\n state.selectedTasks = [task];\n task.isNew = true; //for editor to autofocus\n }\n task = {\n ...task,\n dateUpdated: now,\n subtasks: task.subtasks?.length\n ? task.subtasks.map((subtask, index) => {\n return { ...subtask, position: index + 1 };\n })\n : null,\n };\n\n for (let index = 0; index < state.selectedTasks.length; index++) {\n const taskInSelection = state.selectedTasks[index];\n if (\n taskInSelection.cloudId === task.cloudId &&\n taskInSelection.dateUpdated < task.dateUpdated\n ) {\n state.selectedTasks[index] = task;\n break;\n }\n }\n\n state.taskSyncCounter++;\n updateItemsInDB([task], taskDB, []);\n //sync\n state.toSync.tasks = addOrReplace(state.toSync.tasks, task, false);\n}\n\nfunction setSelected(state, task) {\n if (!task) {\n if (state.selectedTasks.length === 0) {\n console.log(\"skipping select, already null\");\n return;\n }\n state.selectedTasks = [];\n } else if (Array.isArray(task)) {\n console.log(\"updating array \", task.length);\n state.selectedTasks = [...task];\n return;\n } else {\n const selected = state.selectedTasks;\n if (selected.length === 1) {\n console.log(\n \"--- selected: \",\n selected[0].dateUpdated,\n \" task: \",\n task.dateUpdated\n );\n }\n if (\n selected.length === 1 &&\n selected[0].cloudId === task.cloudId &&\n selected[0].dateUpdated >= task.dateUpdated\n // !task.fromServer\n ) {\n console.log(\"skipping select, 1 task didn't change\");\n return;\n }\n state.selectedTasks = [task];\n }\n}\n\nexport function updateRemindersIfNeeded(task, newDate) {\n const daysDifference = moment(newDate)\n .startOf(\"day\")\n .diff(moment(task.dateDue).startOf(\"day\"), \"days\");\n return task.reminders\n ? task.reminders.map((reminder) => {\n const newReminder = { ...reminder };\n const newDateTime = moment(reminder.originalDateTime).add(\n daysDifference,\n \"d\"\n );\n newReminder.dateTime = formatDateDb(newDateTime);\n newReminder.originalDateTime = formatDateDb(newDateTime);\n return newReminder;\n })\n : null;\n}\n\nfunction addOrReplace(items, item, removeDeleted) {\n if (item.deleted && removeDeleted) {\n return removeItemFromArray(\n items,\n item,\n (item1, item2) => item1.cloudId === item2.cloudId\n );\n }\n\n const index = items.findIndex((i) => i.cloudId === item.cloudId);\n if (index !== -1) {\n items[index] = item;\n return items;\n } else {\n return [item, ...items];\n }\n}\n\n/**\n *\n * @param {New objects data} data\n * @param {DB provider} db\n * @param {Pending sync collection, new objects will be removed from it} syncCollection\n */\nfunction updateItemsInDB(data, db, syncCollection) {\n data &&\n data.forEach((item) => {\n if (item.deleted) {\n db.deleteRecord(item.cloudId);\n } else {\n db.update(item);\n }\n\n removeItemFromArray(\n syncCollection,\n item,\n (item1, item2) => item1.cloudId === item2.cloudId\n );\n });\n}\n\nexport const {\n dataLoadedFromDb,\n\n dataGetFromServer,\n clearData,\n refreshTaskList,\n\n completeTask,\n updateTask,\n updateTasks,\n selectTask,\n addTasksToSelection,\n removeTasksFromSelection,\n\n updateUserFilter,\n updateProject,\n updateContext,\n updateTag,\n\n createDefaultData,\n} = dataSlice.actions;\n\nexport const selectSelectedTasks = (state) => state.data.selectedTasks;\nexport const selectSelectedTasksCount = (state) =>\n state.data.selectedTasks.length;\n\nexport const selectDataToSync = (state) => state.data.toSync;\n\nexport const selectTasksSynced = (state) => state.data.taskSyncCounter;\nexport const selectPctSynced = (state) => state.data.pctSyncCounter;\n\nexport const selectAllUserFilters = (state) => state.data.allUserFilters ?? [];\nexport const selectAllProjects = (state) => state.data.allProjects;\nexport const selectAllContexts = (state) => state.data.allContexts;\nexport const selectAllTags = (state) => state.data.allTags;\n\nexport default dataSlice.reducer;\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport const alertSlice = createSlice({\n name: \"alert\",\n initialState: {\n visible: false,\n text: \"\",\n type: null,\n dismissable: true,\n premiumMessage: null,\n limitDevices: null,\n loggedOut: false,\n },\n reducers: {\n showPremium: (state, action) => {\n state.premiumMessage = action.payload;\n },\n hidePremium: (state, action) => {\n state.premiumMessage = null;\n },\n showDevicesLimitDialog: (state, action) => {\n state.limitDevices = action.payload;\n },\n hideDevicesLimitDialog: (state, action) => {\n state.limitDevices = null;\n },\n showAlert: (state, action) => {\n state.visible = true;\n state.text = action.payload.text;\n state.type = action.payload.type;\n state.dismissable = action.payload.dismissable ?? true;\n },\n hideAlert: (state, action) => {\n state.visible = false;\n },\n showLoggedOut: (state, action) => {\n state.loggedOut = true;\n },\n hideLoggedOut: (state, action) => {\n state.loggedOut = false;\n },\n },\n});\n\nexport const selectAlert = (state) => state.alert;\nexport const selectLoggedOut = (state) => state.alert.loggedOut;\n\nexport const {\n showAlert,\n hideAlert,\n showPremium,\n hidePremium,\n showDevicesLimitDialog,\n hideDevicesLimitDialog,\n showLoggedOut,\n hideLoggedOut,\n} = alertSlice.actions;\n\nexport default alertSlice.reducer;\n","import React from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { selectAlert, hideAlert } from \"../../redux/alertSlice\";\n\nexport const Alert = () => {\n const alert = useSelector(selectAlert);\n const dispatch = useDispatch();\n\n return (\n \n \n  {alert.text}\n {alert.dismissable ? (\n dispatch(hideAlert())}\n type=\"button\"\n className=\"close\"\n aria-label=\"Close\"\n >\n ×\n \n ) : null}\n \n \n );\n};\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nconst storage = window.localStorage;\n\nconst state = storage.getObject(\"app_prefs\") ?? {\n theme: \"dark\",\n accent: \"#007bff\",\n};\n\nexport const prefsSlice = createSlice({\n name: \"prefs\",\n initialState: state,\n reducers: {\n prefsSetAccent: (state, action) => {\n state.accent = action.payload;\n saveState(state);\n },\n prefsSetTheme: (state, action) => {\n const newTheme = action.payload === \"dark\" ? \"dark\" : \"light\";\n state.theme = newTheme;\n saveState(state);\n },\n },\n});\n\nfunction saveState(state) {\n storage.setObject(\"app_prefs\", state);\n}\n\nexport const selectPrefsThemeIsDark = (state) => state.prefs.theme === \"dark\";\nexport const selectPrefsAccent = (state) => state.prefs.accent;\n\nexport const { prefsSetTheme, prefsSetAccent } = prefsSlice.actions;\n\nexport default prefsSlice.reducer;\n","import React from \"react\";\nimport { SvgIcon } from \"@material-ui/core\";\n\nexport default function LightThemeIcon(props) {\n const { color, ...rest } = props;\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport { SvgIcon } from \"@material-ui/core\";\n\nexport default function DarkThemeIcon(props) {\n const { color, ...rest } = props;\n\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { prefsSetTheme, selectPrefsThemeIsDark } from \"../../redux/prefsSlice\";\nimport LightThemeIcon from \"./icons/LightThemeIcon\";\nimport DarkThemeIcon from \"./icons/DarkThemeIcon\";\nimport Switch from \"react-switch\";\n\nconst ThemeSwitch = (props) => {\n const isDarkTheme = useSelector(selectPrefsThemeIsDark);\n const dispatch = useDispatch();\n\n const changeTheme = (_) =>\n dispatch(prefsSetTheme(isDarkTheme ? \"light\" : \"dark\"));\n\n return (\n }\n uncheckedIcon={}\n offColor={\"#fbc02d\"}\n onColor={\"#5c6bc0\"}\n width={60}\n height={28}\n onChange={changeTheme}\n />\n );\n};\n\nexport default ThemeSwitch;\n","import { createSlice } from \"@reduxjs/toolkit\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport \"../utils/extensions\";\n\nconst storage = window.localStorage;\n\nconst state = {\n deviceId: storage.getItem(\"device_id\"),\n token: storage.getItem(\"token\"),\n profile: storage.getObject(\"profile\"),\n};\n\nexport const authSlice = createSlice({\n name: \"auth\",\n initialState: state,\n reducers: {\n createDeviceId: (state, action) => {\n let deviceId = uuidv4();\n storage.setItem(\"device_id\", deviceId);\n state.deviceId = deviceId;\n },\n saveProfile: (state, action) => {\n storage.setObject(\"profile\", action.payload);\n state.profile = action.payload;\n },\n saveToken: (state, action) => {\n storage.setItem(\"token\", action.payload);\n state.token = action.payload;\n },\n logout: (state, action) => {\n storage.removeItem(\"token\");\n storage.removeItem(\"profile\");\n storage.removeItem(\"last_sync\");\n storage.removeItem(\"selected_task\");\n storage.removeItem(\"active_filter\");\n storage.removeItem(\"app_state_nav_open\");\n state.token = undefined;\n },\n },\n});\n\nexport const selectDeviceId = (state) => state.auth.deviceId;\nexport const selectToken = (state) => state.auth.token;\nexport const selectProfile = (state) => state.auth.profile;\n\nexport const {\n createDeviceId,\n saveToken,\n saveProfile,\n logout,\n} = authSlice.actions;\n\nexport default authSlice.reducer;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { hideAlert } from \"../../redux/alertSlice\";\n\nexport const LoginFooter = ({\n isRegister,\n isRecover,\n setIsRegister,\n setIsRecover,\n}) => {\n const dispatch = useDispatch();\n\n if (isRecover) {\n return (\n
\n {\n e.preventDefault();\n setIsRecover(false);\n dispatch(hideAlert());\n }}\n >\n Back to Login\n \n
\n );\n } else {\n return (\n
\n {isRegister ? \"Already have an account?\" : \"Don't have an account?\"}{\" \"}\n {\n e.preventDefault();\n setIsRegister(!isRegister);\n dispatch(hideAlert());\n }}\n >\n {isRegister ? \"Login\" : \"Register\"}\n \n
\n );\n }\n};\n","import { useState } from \"react\";\n\nexport const useInputValue = (defaultValue) => {\n const [value, setValue] = useState(defaultValue);\n\n return {\n bind: {\n value,\n onChange: (event) => setValue(event.target.value),\n },\n clear: () => setValue(\"\"),\n value: () => value,\n setValue: setValue,\n };\n};\n","export const getErrorMessage = (code) => {\n switch (code) {\n case \"wrong_credentials\":\n return \"Wrong credentials\";\n case \"already_registered\":\n return \"User already exists\";\n case \"invalid_code\":\n return \"Invalid code\";\n case \"code_expired\":\n return \"Code expired\";\n case \"password_too_short\":\n return \"Password too short\";\n case \"password_too_long\":\n return \"Password too long\";\n case \"cannot_change\":\n return \"Invalid code\";\n default:\n return \"Something wrong. Try again\";\n }\n};\n","import React, { useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport {\n Button,\n FormGroup,\n FormControl,\n FormLabel,\n Form,\n} from \"react-bootstrap\";\nimport { useInputValue } from \"../../hooks/useInputValue\";\nimport { showAlert, hideAlert } from \"../../redux/alertSlice\";\nimport { getErrorMessage } from \"../../utils/api\";\n\nconst { detect } = require(\"detect-browser\");\n\nexport const LoginForm = ({ isRegister, deviceId, onLogin, setIsRecover }) => {\n const dispatch = useDispatch();\n\n const emailInput = useInputValue(\"\");\n const passwordInput = useInputValue(\"\");\n\n useEffect(() => {\n emailInput.setValue(\"\");\n passwordInput.setValue(\"\");\n }, [isRegister]);\n\n function validateForm() {\n return emailInput.value().length > 0 && passwordInput.value().length > 0;\n }\n\n function handleSubmit(event) {\n event.preventDefault();\n\n dispatch(hideAlert());\n\n const browser = detect();\n\n const info = browser.name + (browser.os ? \" on \" + browser.os : \"\");\n\n const authData = {\n email: emailInput.value(),\n pass: passwordInput.value(),\n info: info,\n };\n const headers = new Headers({\n Origin2: \"web@\" + deviceId,\n });\n\n fetch(\n `${process.env.REACT_APP_BASE_URL}/api/v1/auth${\n isRegister ? \"/reg\" : \"/login\"\n }`,\n {\n method: \"POST\",\n mode: \"cors\",\n headers: headers,\n body: JSON.stringify(authData),\n }\n )\n .then((response) => {\n return response.json();\n })\n .then((result) => {\n console.log(\"Logged in with email\", result);\n if (result.error || !result.token) {\n dispatch(\n showAlert({ text: getErrorMessage(result.error), type: \"danger\" })\n );\n } else {\n onLogin(result);\n }\n // window.localStorage.setItem(\"token\", result.token);\n // setTimeout(() => {\n // setIsLoaded(true);\n // }, 2000);\n })\n .catch((error) => {\n console.log(\"Login error\", error);\n dispatch(showAlert({ text: getErrorMessage(\"\"), type: \"danger\" }));\n });\n }\n\n return (\n
\n \n Email\n \n \n \n Password\n \n \n \n {isRegister ? \"Register\" : \"Login\"}\n \n
\n {isRegister ? (\n \n I agree to the{\" \"}\n \n Terms of Service\n {\" \"}\n and{\" \"}\n \n Privacy Policy\n \n \n ) : (\n {\n e.preventDefault();\n setIsRecover(true);\n dispatch(hideAlert());\n }}\n >\n Forgot password?\n \n )}\n
\n \n );\n};\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { Button, Row, Col, Container } from \"react-bootstrap\";\nimport FacebookLogin from \"react-facebook-login/dist/facebook-login-render-props\";\nimport GoogleLogin from \"react-google-login\";\nimport { Facebook } from \"@material-ui/icons\";\nimport { showAlert } from \"../../redux/alertSlice\";\nimport { getErrorMessage } from \"../../utils/api\";\n\nexport const SocialForm = ({ onLogin, deviceId }) => {\n const dispatch = useDispatch();\n\n const responseFacebook = (response) => {\n if (response.accessToken) {\n loginSocial(\"facebook\", response.accessToken);\n } else {\n //TODO show error\n }\n };\n\n const responseGoogle = (response) => {\n if (response.tokenId) {\n loginSocial(\"google\", response.tokenId);\n } else {\n //TODO show error\n }\n };\n\n function loginSocial(name, token) {\n const authData = { network: name, token: token, info: \"\" };\n const headers = new Headers({\n Origin2: \"web@\" + deviceId,\n });\n fetch(`${process.env.REACT_APP_BASE_URL}/api/v1/auth/social`, {\n method: \"POST\",\n mode: \"cors\",\n headers: headers,\n body: JSON.stringify(authData),\n })\n .then((response) => {\n return response.json();\n })\n .then((result) => {\n if (result.error || !result.token) {\n dispatch(\n showAlert({ text: getErrorMessage(result.error), type: \"danger\" })\n );\n } else {\n console.log(\"Logged in with\", name, result);\n onLogin(result);\n }\n // window.localStorage.setItem(\"token\", result.token);\n // setTimeout(() => {\n // setIsLoaded(true);\n // }, 2000);\n })\n .catch((error) => {\n dispatch(showAlert({ text: getErrorMessage(\"\"), type: \"danger\" }));\n });\n }\n\n return (\n \n \n \n (\n \n \n Google\n \n )}\n />\n \n\n \n (\n \n \n Facebook\n \n )}\n />\n \n \n \n );\n};\n","import React, { useState } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport {\n Button,\n Form,\n FormGroup,\n FormControl,\n FormLabel,\n} from \"react-bootstrap\";\nimport { useInputValue } from \"../../hooks/useInputValue\";\nimport { showAlert, hideAlert } from \"../../redux/alertSlice\";\nimport { Alert } from \"../components/Alert\";\nimport { getErrorMessage } from \"../../utils/api\";\n\nconst stateInitial = 0;\nconst stateEmailSent = 1;\nconst stateSuccess = 2;\n\nexport const RecoveryForm = ({ deviceId }) => {\n const dispatch = useDispatch();\n\n const [state, setState] = useState(stateInitial);\n\n const emailInput = useInputValue(\"\");\n const passwordInput = useInputValue(\"\");\n const pinInput = useInputValue(\"\");\n\n const makeRequest = () => {\n dispatch(hideAlert());\n\n const authData = {\n email: emailInput.value(),\n pass: state === stateEmailSent ? passwordInput.value() : null,\n code: state === stateEmailSent ? pinInput.value() : null,\n };\n const headers = new Headers({\n Origin2: \"web@\" + deviceId,\n });\n\n fetch(`${process.env.REACT_APP_BASE_URL}/api/v1/auth/recover`, {\n method: \"POST\",\n mode: \"cors\",\n headers: headers,\n body: JSON.stringify(authData),\n })\n .then((response) => {\n return response.json();\n })\n .then((response) => {\n console.log(\"Recover response\", response);\n if (response.error) {\n dispatch(\n showAlert({ text: getErrorMessage(response.error), type: \"danger\" })\n );\n } else {\n if (state === stateInitial) {\n setState(stateEmailSent);\n } else {\n setState(stateSuccess);\n }\n }\n })\n .catch((error) => {\n dispatch(showAlert({ text: getErrorMessage(\"\"), type: \"danger\" }));\n });\n };\n\n function handleSubmit(event) {\n event.preventDefault();\n makeRequest();\n }\n\n function validateForm() {\n switch (state) {\n case stateInitial:\n return emailInput.value().length > 0;\n case stateEmailSent:\n return passwordInput.value().length > 0 && pinInput.value().length > 0;\n case stateSuccess:\n return true;\n default:\n return false;\n }\n }\n\n const email = () => {\n return (\n \n Email\n \n {message()}\n \n );\n };\n\n const message = () => {\n const text = (text) =>
{text}
;\n switch (state) {\n case stateEmailSent:\n return text(\"Verification code was sent to your email\");\n case stateSuccess:\n return text(\"Password changed. You can now login\");\n default:\n return null;\n }\n };\n\n const body = () => {\n if (state === stateEmailSent) {\n return (\n
\n \n New password\n \n \n \n Verification code\n \n \n
\n );\n } else {\n return null;\n }\n };\n\n const button = () => {\n if (state === stateSuccess) {\n return null;\n } else {\n return (\n \n {state === stateInitial ? \"Recover\" : \"Change password\"}\n \n );\n }\n };\n\n return (\n
\n {email()}\n {body()}\n {button()}\n
\n \n
\n
\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport \"./Login.css\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Toast } from \"react-bootstrap\";\nimport { createDefaultData } from \"../../redux/dataSlice\";\nimport { Alert } from \"../components/Alert\";\nimport ThemeSwitch from \"../components/ThemeSwitch\";\nimport {\n saveToken,\n selectDeviceId,\n createDeviceId,\n} from \"../../redux/authSlice\";\nimport { LoginFooter } from \"./LoginFooter\";\nimport { LoginForm } from \"./LoginForm\";\nimport { SocialForm } from \"./SocialForm\";\nimport { RecoveryForm } from \"./RecoveryForm\";\nimport { selectLoggedOut, hideLoggedOut } from \"../../redux/alertSlice\";\n\nexport default function Login() {\n const deviceId = useSelector(selectDeviceId);\n const dispatch = useDispatch();\n\n const [isRegister, setIsRegister] = useState(false);\n const [isRecover, setIsRecover] = useState(false);\n\n const isLoggedOut = useSelector(selectLoggedOut);\n\n useEffect(() => {\n if (!deviceId) {\n dispatch(createDeviceId());\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleLogin = (result) => {\n if (result.isNew) {\n dispatch(createDefaultData());\n }\n dispatch(hideLoggedOut());\n dispatch(saveToken(result.token));\n };\n\n return (\n
\n dispatch(hideLoggedOut())}\n >\n \n Ooops\n \n You've been logged out\n \n
\n \n
\n
\n \n\n {isRecover ? (\n \n ) : (\n
\n
\n \n
\n \n
\n or continue with\n
\n \n
\n )}\n\n
\n \n
\n
\n );\n}\n","import React from \"react\";\nimport { StarRounded, StarBorderRounded } from \"@material-ui/icons\";\n\nconst StarIcon = (props) => {\n const { isStarred, ...rest } = props;\n\n return isStarred === true ? (\n \n ) : (\n \n );\n};\n\nexport default StarIcon;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport StarIcon from \"../icons/StarIcon\";\nimport { ArrowBackRounded, DeleteRounded } from \"@material-ui/icons\";\n\nimport { selectTask, updateTasks } from \"../../../redux/dataSlice\";\n\nconst DetailsNavbar = ({ tasks }) => {\n const dispatch = useDispatch();\n\n const isStarred = tasks.every((item) => item.starred);\n\n return (\n
\n dispatch(selectTask(null))}\n />\n\n {\n dispatch(\n updateTasks(tasks.map((item) => ({ ...item, starred: !isStarred })))\n );\n }}\n />\n {tasks[0]?.cloudId ? (\n {\n dispatch(\n updateTasks(tasks.map((item) => ({ ...item, deleted: true })))\n );\n dispatch(selectTask(null));\n }}\n />\n ) : null}\n
\n );\n};\n\nexport default DetailsNavbar;\n","import React, { useState } from \"react\";\nimport { Button } from \"react-bootstrap\";\nimport { DayPickerSingleDateController } from \"react-dates\";\nimport moment from \"moment\";\n\nimport \"react-dates/initialize\";\nimport \"react-dates/lib/css/_datepicker.css\";\nimport \"../../styles/react_dates_overrides.scss\";\nimport { formatDate } from \"../../utils/dateUtils\";\n\nexport default function DatePicker({ date, onChange, showButtons }) {\n const [focused, setFocused] = useState(false);\n\n return (\n
\n onChange(date)}\n onFocusChange={({ focused }) => setFocused(focused)}\n focused={focused}\n date={date}\n // displayFormat=\"YYYY-MM-DD\"\n hideKeyboardShortcutsPanel\n numberOfMonths={1}\n // withFullScreenPortal={window.innerWidth < 400}\n renderCalendarInfo={() => {\n return showButtons ? (\n
\n {\n onChange(null);\n }}\n >\n Clear\n \n {\n onChange(moment());\n }}\n >\n {formatDate(moment())}\n \n {\n onChange(moment().add(1, \"days\"));\n }}\n >\n {formatDate(moment().add(1, \"days\"))}\n \n
\n ) : null;\n }}\n />\n
\n );\n}\n","import { createSlice } from \"@reduxjs/toolkit\";\nimport \"../utils/extensions\";\nimport \"../utils/constants\";\nimport {\n id_adding_project,\n id_adding_context,\n id_adding_tag,\n id_adding_user_filters,\n} from \"../utils/constants\";\n\nconst storage = window.localStorage;\n\nconst state = {\n addingEntity: null,\n editingEntity: null,\n navOpen: storage.getObject(\"app_state_nav_open\") ?? {\n userFiltersOpen: true,\n projectsOpen: true,\n contextsOpen: true,\n tagsOpen: true,\n },\n};\n\nexport const appStateSlice = createSlice({\n name: \"appState\",\n initialState: state,\n reducers: {\n setEditingEntity: (state, action) => {\n clear(state);\n state.editingEntity = action.payload;\n },\n setAddingEntity: (state, action) => {\n clear(state);\n state.addingEntity = action.payload;\n },\n setNavOpen: (state, action) => {\n if (action.payload.id === id_adding_project) {\n state.navOpen.projectsOpen = action.payload.value === true;\n } else if (action.payload.id === id_adding_context) {\n state.navOpen.contextsOpen = action.payload.value === true;\n } else if (action.payload.id === id_adding_tag) {\n state.navOpen.tagsOpen = action.payload.value === true;\n } else if (action.payload.id === id_adding_user_filters) {\n state.navOpen.userFiltersOpen = action.payload.value === true;\n }\n storage.setObject(\"app_state_nav_open\", state.navOpen);\n },\n },\n});\n\nfunction clear(state) {\n state.addingEntity = null;\n state.editingEntity = null;\n}\n\nexport const selectAddingProject = (state) =>\n state.appState.addingEntity?.id === id_adding_project\n ? state.appState.addingEntity\n : null;\nexport const selectAddingContext = (state) =>\n state.appState.addingEntity?.id === id_adding_context\n ? state.appState.addingEntity\n : null;\nexport const selectAddingTag = (state) =>\n state.appState.addingEntity?.id === id_adding_tag\n ? state.appState.addingEntity\n : null;\n\nexport const selectEditingEntity = (state) => state.appState.editingEntity;\n\nexport const selectAppStateNavOpen = (state) => state.appState.navOpen;\n\nexport const { setAddingEntity, setEditingEntity, setNavOpen } =\n appStateSlice.actions;\n\nexport default appStateSlice.reducer;\n","import React from \"react\";\nimport { EditRounded } from \"@material-ui/icons\";\nimport { useDispatch } from \"react-redux\";\nimport { setAddingEntity } from \"../../../redux/appStateSlice\";\nimport { id_adding_tag } from \"../../../utils/constants\";\nimport { isColorLight } from \"../../../utils/utils\";\n\nconst TagItem = ({ tag, editable, dispatchFunction }) => {\n const dispatch = useDispatch();\n\n const onClick = (event) => {\n if (dispatchFunction) {\n event.stopPropagation();\n dispatch(dispatchFunction(tag));\n }\n };\n\n return tag ? (\n \n {tag.name}\n {editable ? (\n {\n e.stopPropagation();\n dispatch(setAddingEntity({ ...tag, id: id_adding_tag }));\n }}\n />\n ) : null}\n \n ) : null;\n};\n\nTagItem.propTypes = {\n // tag: PropTypes.object.isRequired,\n};\n\nexport default TagItem;\n","import React from \"react\";\nimport { Dropdown, DropdownButton, ButtonGroup } from \"react-bootstrap\";\n\nconst SelectableDropdown = ({ title, emptyName, items, onSelect }) => (\n \n {items.map((item) => (\n \n {item.name}\n \n ))}\n \n onSelect(null)}>{emptyName}\n \n);\n\nexport default SelectableDropdown;\n","import React from \"react\";\nimport TagItem from \"../items/TagItem\";\nimport { updateTasks } from \"../../../redux/dataSlice\";\nimport { DropdownButton, ButtonGroup } from \"react-bootstrap\";\n\nconst TagsDropdown = ({ tasks, allTags }) => (\n \n
\n {allTags.map((tag) => (\n \n updateTasks(\n tasks.map((item) => ({\n ...item,\n tags: item.tags ? [...item.tags, tag.cloudId] : [tag.cloudId],\n }))\n )\n }\n />\n ))}\n
\n \n);\n\nexport default TagsDropdown;\n","import React, { useState } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n InputGroup,\n FormControl,\n Form,\n DropdownButton,\n ButtonGroup,\n} from \"react-bootstrap\";\nimport moment from \"moment\";\nimport DatePicker from \"../DatePicker\";\n\nimport { updateTask } from \"../../../redux/dataSlice\";\nimport { selectPrefsAccent } from \"../../../redux/prefsSlice\";\nimport {\n RepeatEndType,\n RepeatIntervalType,\n getNextOccurrenceAfter,\n adjustMoment,\n} from \"../../../utils/repeat\";\nimport { formatDate, formatDateDb } from \"../../../utils/dateUtils\";\nimport constants from \"../../../utils/constants\";\nimport Switch from \"react-switch\";\n\nconst newRepeat = {\n interval: 1,\n intervalType: RepeatIntervalType.DAY,\n weekDays: \"\",\n lastDayOfMonth: false,\n endType: RepeatEndType.NEVER,\n endAfter: 21,\n endOn: null,\n};\n\nconst weekRow = (weekDays, onChange) => {\n const now = moment().startOf(\"week\");\n\n return (\n
\n {[0, 1, 1, 1, 1, 1, 1].map((element, index) => {\n now.add(element, \"d\");\n const day = index + 1;\n // const day = now.day();\n\n return (\n {\n if (weekDays.includes(day)) {\n onChange(weekDays.replace(day, \"\"));\n } else {\n onChange(weekDays + day);\n }\n }}\n >\n {now.format(\"dd\")}\n
\n );\n })}\n \n );\n};\n\nconst defaultWeekdays = (taskDueDate) =>\n adjustMoment(moment(taskDueDate)).toString();\n\nconst TaskRepeat = ({ task }) => {\n const accent = useSelector(selectPrefsAccent);\n\n const dispatch = useDispatch();\n\n const endOn = task.repeat?.endOn\n ? moment(task.repeat.endOn)\n : moment().add(1, \"M\");\n\n const repeatWeekdays = task.repeat?.weekDays?.length\n ? task.repeat.weekDays\n : defaultWeekdays(task.dateDue);\n\n const [isIntervalValid, setIntervalValid] = useState(true);\n const [intervalValue, setIntervalValue] = useState(\n task.repeat?.interval ?? 1\n );\n\n const [isEndAfterValid, setEndAfterValid] = useState(true);\n const [endAfterValue, setEndAfterValue] = useState(\n task.repeat?.endAfter ?? 1\n );\n\n const repeatPreview = (task, repeat) => {\n var now = moment(task.dateDue);\n\n var result = formatDate(now);\n var occurrences = 0;\n const isEndAfterOccerenceds =\n repeat.endType === RepeatEndType.AFTER_OCCURENCES;\n\n for (var i = 1; i <= constants.repeat_next_preview; i++) {\n now = getNextOccurrenceAfter(repeat, now);\n\n if (\n !now ||\n (isEndAfterOccerenceds && occurrences >= repeat.endAfter - 1)\n ) {\n break;\n } else if (i === constants.repeat_next_preview) {\n result += \", ...\";\n } else {\n result += \", \" + formatDate(now);\n }\n\n if (isEndAfterOccerenceds) {\n occurrences++;\n }\n }\n return result;\n };\n\n const doUpdateTask = (repeat) => {\n const dateDue = task.dateDue ?? formatDateDb(moment());\n dispatch(\n updateTask({\n ...task,\n dateDue: dateDue,\n repeat: repeat ? { ...repeat, originalDueDate: dateDue } : null,\n })\n );\n };\n\n const onIntervalTypeChanged = (type) => {\n doUpdateTask({ ...task.repeat, intervalType: type });\n };\n\n const onEndTypeChanged = (type) => {\n doUpdateTask({ ...task.repeat, endType: type });\n };\n\n return (\n
\n \n
Repeat
\n {\n doUpdateTask(\n checked\n ? {\n ...newRepeat,\n weekDays: defaultWeekdays(\n task.dateDue ?? formatDateDb(moment())\n ),\n }\n : null\n );\n }}\n uncheckedIcon={null}\n checkedIcon={null}\n height={20}\n width={36}\n onColor={accent}\n checked={task.repeat ? true : false}\n />\n
\n {task.repeat ? (\n
\n
\n
Every
\n
\n \n {\n const newValue = parseInt(e.target.value);\n setIntervalValue(newValue);\n if (newValue > 0 && newValue <= 999) {\n setIntervalValid(true);\n doUpdateTask({ ...task.repeat, interval: newValue });\n } else if (isIntervalValid) {\n doUpdateTask({ ...task.repeat, interval: 1 });\n setIntervalValid(false);\n }\n }}\n />\n onIntervalTypeChanged(e.target.value)}\n >\n \n \n \n \n \n \n {task.repeat.intervalType === RepeatIntervalType.WEEK\n ? weekRow(repeatWeekdays, (weekDays) =>\n doUpdateTask({ ...task.repeat, weekDays: weekDays })\n )\n : null}\n {task.repeat.intervalType === RepeatIntervalType.MONTH ? (\n \n \n doUpdateTask({\n ...task.repeat,\n lastDayOfMonth: e.target.checked,\n })\n }\n />\n \n ) : null}\n
\n
\n
\n
Ends
\n \n \n onEndTypeChanged(e.target.value)}\n >\n \n \n \n \n \n {task.repeat.endType === RepeatEndType.AFTER_OCCURENCES ? (\n {\n const newValue = parseInt(e.target.value);\n setEndAfterValue(newValue);\n if (newValue > 0 && newValue <= 999) {\n setEndAfterValid(true);\n doUpdateTask({ ...task.repeat, endAfter: newValue });\n } else if (isEndAfterValid) {\n doUpdateTask({ ...task.repeat, endAfter: 1 });\n setEndAfterValid(false);\n }\n }}\n />\n ) : task.repeat.endType == RepeatEndType.ON_DATE ? (\n \n {\n doUpdateTask({\n ...task.repeat,\n endOn: formatDateDb(date),\n });\n }}\n />\n \n ) : null}\n \n
\n
\n {repeatPreview(task, task.repeat)}\n
\n
\n ) : null}\n \n );\n};\n\nexport default TaskRepeat;\n","import React from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { DropdownButton, ButtonGroup } from \"react-bootstrap\";\nimport {\n updateTasks,\n selectAllContexts,\n selectAllProjects,\n selectAllTags,\n updateRemindersIfNeeded,\n} from \"../../../redux/dataSlice\";\nimport DatePicker from \"../DatePicker\";\nimport { formatDate, formatDateDb } from \"../../../utils/dateUtils\";\nimport {\n findByCloudId,\n findByCloudIds,\n removeItemFromArray,\n} from \"../../../utils/utils\";\nimport moment from \"moment\";\nimport TagItem from \"../items/TagItem\";\nimport SelectableDropdown from \"./SelectableDropdown\";\nimport TagsDropdown from \"./TagsDropdown\";\nimport TaskRepeat from \"./TaskRepeat\";\n\nconst DetailsFooter = ({ tasks }) => {\n const dispatch = useDispatch();\n const allProjects = useSelector(selectAllProjects);\n const project = useSelector((state) =>\n findByCloudId(\n allProjects,\n tasks.reduce(\n (projectCloudId, item) =>\n item.projectCloudId === projectCloudId ? projectCloudId : null,\n tasks[0].projectCloudId\n )\n )\n );\n\n const allContexts = useSelector(selectAllContexts);\n const context = useSelector((state) =>\n findByCloudId(\n allContexts,\n tasks.reduce(\n (contextCloudId, item) =>\n item.contextCloudId === contextCloudId ? contextCloudId : null,\n tasks[0].contextCloudId\n )\n )\n );\n\n const allTags = useSelector(selectAllTags);\n const tags = useSelector((state) =>\n findByCloudIds(\n allTags,\n tasks.reduce(\n (tags, item) =>\n tags && tags.filter((tag) => item.tags && item.tags.includes(tag)),\n tasks[0].tags\n )\n )\n );\n\n const dateDue = tasks.reduce(\n (dateDue, item) => {\n if (!dateDue || !item.dateDue) {\n return null;\n }\n return dateDue.isSame(moment(item.dateDue), \"d\") ? dateDue : null;\n },\n tasks[0].dateDue ? moment(tasks[0].dateDue) : null\n );\n\n return (\n
\n \n \n dispatch(\n updateTasks(\n tasks.map((item) => {\n const changedItem = {\n ...item,\n dateDue: formatDateDb(date),\n };\n if (!date) {\n changedItem.repeat = null;\n changedItem.reminders = null;\n } else {\n if (item.repeat) {\n changedItem.repeat = {\n ...item.repeat,\n originalDueDate: item.dateDue,\n };\n }\n changedItem.reminders = updateRemindersIfNeeded(item, date);\n }\n return changedItem;\n })\n )\n )\n }\n />\n {tasks.length === 1 ? : null}\n \n\n \n dispatch(\n updateTasks(\n tasks.map((item) => ({\n ...item,\n projectCloudId: cloudId,\n }))\n )\n )\n }\n />\n \n dispatch(\n updateTasks(\n tasks.map((item) => ({\n ...item,\n contextCloudId: cloudId,\n }))\n )\n )\n }\n />\n\n \n \n {tags.length > 0\n ? tags.map((tag, index) => (\n \n updateTasks(\n tasks.map((item) => ({\n ...item,\n tags: removeItemFromArray(\n [...item.tags],\n tag.cloudId,\n (item1, item2) => item1 === item2\n ),\n }))\n )\n }\n />\n ))\n : null}\n \n
\n );\n};\n\nexport default DetailsFooter;\n","import React, { useRef, useState, useEffect } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { SortableHandle } from \"react-sortable-hoc\";\nimport {\n CloseRounded as DeleteSubtaskIcon,\n DragHandle as DragIcon,\n} from \"@material-ui/icons\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport { updateTask } from \"../../../redux/dataSlice\";\nimport { removeItemFromArray } from \"../../../utils/utils\";\nimport constants from \"../../../utils/constants\";\n\nconst SortableItem = SortableHandle((_) => (\n \n));\n\nconst SubtaskItem = (props) => {\n const task = props.task;\n const subtask = props.subtask;\n const createNewSubtask = props.createNewSubtask;\n const formRef = props.form;\n\n const dispatch = useDispatch();\n\n const [name, setName] = useState(subtask.name ?? \"\");\n\n const titleRef = useRef(null);\n const [cursor, setCursor] = useState(null);\n\n useEffect(() => {\n const input = titleRef.current;\n if (input && name)\n input.setSelectionRange(cursor ?? name.length, cursor ?? name.length);\n }, [titleRef]);\n\n const onChecked = (event) => {\n if (event) {\n event.stopPropagation();\n }\n updateSubtask({\n ...subtask,\n name: name,\n completed: !subtask.completed,\n });\n };\n\n const refreshTimeout = useRef(null);\n\n const handleTimer = (name) => {\n clearTimeout(refreshTimeout.current);\n refreshTimeout.current = setTimeout(() => {\n refreshTimeout.current = null;\n if (subtask.name !== name) {\n updateSubtask({ ...subtask, name: name });\n }\n }, constants.refresh_subtask_when_typing_delay);\n };\n\n function updateSubtask(updatedSubtask) {\n const withRemovedSubtask = removeItemFromArray(\n [...task.subtasks],\n subtask,\n (item1, item2) => item1.position === item2.position\n );\n\n if (!updatedSubtask) {\n for (var i = 0; i < withRemovedSubtask.length; i++) {\n var item = withRemovedSubtask[i];\n if (item.position >= subtask.position) {\n withRemovedSubtask[i] = {\n ...item,\n position: item.position - 1,\n isNew: i === 0 && subtask.position === 1,\n };\n } else if (item.position === subtask.position - 1) {\n withRemovedSubtask[i] = { ...item, isNew: true };\n }\n }\n }\n dispatch(\n updateTask({\n ...task,\n subtasks: (updatedSubtask\n ? [...withRemovedSubtask, updatedSubtask]\n : withRemovedSubtask\n ).sort((a, b) => a.position - b.position),\n })\n );\n }\n\n function handleKeyDown(event) {\n if (event.key === \"Enter\") {\n //enter\n event.preventDefault();\n if (event.ctrlKey) {\n onChecked(null);\n } else {\n focusNext(true);\n }\n } else if (event.keyCode === 8) {\n // backspace\n if (name.length === 0) {\n event.preventDefault();\n deleteSubtask();\n }\n }\n }\n\n function focusNext(canCreateNew) {\n if (!formRef.current) {\n return;\n }\n const nextIndex = subtask.position * 2 + 1;\n //focus next input field (+2 because of the checkbox which is also an input)\n console.log(\"--- next focus index: \", nextIndex);\n if (nextIndex <= formRef.current.elements.length) {\n formRef.current.elements[nextIndex].focus();\n } else if (canCreateNew) {\n const newSubtask = createNewSubtask(false);\n if (newSubtask) {\n if (refreshTimeout.current) {\n clearTimeout(refreshTimeout.current);\n refreshTimeout.current = null;\n }\n dispatch(\n updateTask({\n ...task,\n subtasks: [\n ...task.subtasks.slice(0, task.subtasks.length - 1),\n { ...subtask, name: name },\n newSubtask,\n ],\n })\n );\n }\n }\n }\n\n function deleteSubtask() {\n if (refreshTimeout.current) {\n clearTimeout(refreshTimeout.current);\n refreshTimeout.current = null;\n }\n updateSubtask(null);\n }\n\n return (\n \n \n \n {\n setCursor(e.target.selectionStart);\n const newName = e.target.value;\n setName(newName);\n handleTimer(newName);\n }}\n onKeyDown={handleKeyDown}\n />\n \n {\n deleteSubtask();\n }}\n />\n \n \n );\n};\n\nexport default SubtaskItem;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Button } from \"react-bootstrap\";\nimport { selectPrefsThemeIsDark } from \"../../../redux/prefsSlice\";\n\nconst ThemedButton = (props) => {\n const isDarkTheme = useSelector(selectPrefsThemeIsDark);\n\n return (\n \n );\n};\n\nexport default ThemedButton;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport arrayMove from \"array-move\";\nimport TextareaAutosize from \"react-textarea-autosize\";\n\nimport { SortableContainer, SortableElement } from \"react-sortable-hoc\";\nimport { updateTask } from \"../../redux/dataSlice\";\nimport DetailsNavbar from \"./details/DetailsNavbar\";\nimport DetailsFooter from \"./details/DetailsFooter\";\nimport SubtaskItem from \"./items/SubtaskItem\";\nimport constants from \"../../utils/constants\";\nimport { getExtraCounter } from \"../../utils/utils\";\nimport ThemedButton from \"./details/ThemedButton\";\n\nconst SortableItem = SortableElement((props) => {\n const value = props.value;\n\n const key =\n \"key:\" + value.position + props.task.extra + props.task.subtasks.length;\n\n return (\n
  • \n \n
  • \n );\n});\n\nconst SortableList = SortableContainer((props) => {\n return (\n
      \n {[...props.items]\n .sort((a, b) => a.position - b.position)\n .map((value, index) => (\n \n ))}\n
    \n );\n});\n\nconst TaskEditor = ({ task }) => {\n const dispatch = useDispatch();\n\n const refreshTimeout = useRef(null);\n\n const formRef = useRef(null);\n const titleRef = useRef(null);\n const [cursor, setCursor] = useState(null);\n\n const [name, setName] = useState(task.name);\n const [description, setDescription] = useState(task.description ?? \"\");\n\n //for some reason inputs are not updated when new value comes from server\n useEffect(() => {\n setName(task.name);\n setDescription(task.description);\n\n const input = titleRef.current;\n if (input && name)\n input.setSelectionRange(cursor ?? name.length, cursor ?? name.length);\n }, [task.name, task.description, titleRef]);\n\n const handleTimer = (name, description) => {\n clearTimeout(refreshTimeout.current);\n refreshTimeout.current = setTimeout(() => {\n dispatch(\n updateTask({\n ...task,\n name: name,\n description: description,\n })\n );\n }, constants.refresh_list_when_typing_delay);\n };\n\n const createNewSubtask = (fromTop) => {\n if (task.subtasks?.length >= constants.max_subtasks) {\n return null;\n }\n const newSubtask = {\n name: \"\",\n completed: false,\n isNew: true,\n position:\n task.subtasks?.length > 0 && !fromTop\n ? task.subtasks.reduce((item1, item2) =>\n item1.position > item2.position ? item1 : item2\n ).position + 1\n : 0,\n };\n return newSubtask;\n };\n\n return (\n
    \n \n
    \n {\n if (e.key === \"Enter\") {\n e.preventDefault();\n }\n }}\n maxLength=\"500\"\n placeholder=\"Task\"\n className=\"my-2 w-100 TaskTitle\"\n onChange={(e) => {\n setCursor(e.target.selectionStart);\n setName(e.target.value);\n handleTimer(e.target.value, description);\n }}\n />\n\n {\n setDescription(e.target.value);\n handleTimer(name, e.target.value);\n }}\n minRows={5}\n />\n
    \n {task.subtasks?.length >= constants.max_subtasks ? (\n
    Max subtasks reached
    \n ) : (\n {\n const newSubtask = createNewSubtask(true);\n if (newSubtask) {\n dispatch(\n updateTask({\n ...task,\n subtasks: task.subtasks\n ? [\n newSubtask,\n ...task.subtasks.map((item) => ({\n ...item,\n position: item.position + 1,\n isNew: false,\n })),\n ]\n : [newSubtask],\n })\n );\n }\n }}\n >\n +Add subtask\n \n )}\n
    \n
    \n {\n if (oldIndex !== newIndex) {\n dispatch(\n updateTask({\n ...task,\n extra: getExtraCounter(),\n subtasks: arrayMove(\n task.subtasks.map((item) => ({ ...item, isNew: false })),\n oldIndex - 1,\n newIndex - 1\n ),\n })\n );\n }\n }}\n />\n \n
    \n \n
    \n );\n};\n\nexport default TaskEditor;\n","import React from \"react\";\nimport { PlaylistAddCheckRounded as TasksIcon } from \"@material-ui/icons\";\n\nimport DetailsNavbar from \"./details/DetailsNavbar\";\nimport DetailsFooter from \"./details/DetailsFooter\";\n\nconst MultipleTasksEditor = ({ tasks }) => {\n return (\n
    \n \n
    \n \n {tasks.length} tasks selected\n
    \n \n
    \n );\n};\n\nexport default MultipleTasksEditor;\n","import React from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { selectTask, selectSelectedTasks } from \"../../redux/dataSlice\";\nimport TaskEditor from \"./TaskEditor\";\nimport MultipleTasksEditor from \"./MultipleTasksEditor\";\nimport ThemedButton from \"./details/ThemedButton\";\n\nconst Details = () => {\n const dispatch = useDispatch();\n const selectedTasks = useSelector(selectSelectedTasks);\n\n return (\n
    \n {selectedTasks.length === 0 ? (\n
    \n
    \n
    Nothing selected
    \n\n dispatch(selectTask({}))}\n >\n + New task\n \n
    \n
    \n ) : selectedTasks.length === 1 ? (\n \n ) : (\n \n )}\n
    \n );\n};\n\nexport default Details;\n","import { createSlice } from \"@reduxjs/toolkit\";\nimport \"../utils/extensions\";\nimport { removeItemFromArray } from \"../utils/utils\";\n\nconst storage = window.localStorage;\n\nconst state = storage.getObject(\"active_filter\") ?? {\n inbox: false,\n completed: false,\n userFilter: null,\n context: null,\n project: null,\n dateRange: null,\n tags: [],\n};\n\nexport const filterSlice = createSlice({\n name: \"filter\",\n initialState: state,\n reducers: {\n filterClear: (state, action) => {\n clear(state);\n state.dateRange = null;\n save(null);\n },\n filterSetUserFilter: (state, action) => {\n if (!state.userFilter) {\n clear(state);\n }\n state.dateRange = null;\n console.log(state.userFilter);\n if (\n !state.userFilter ||\n state.userFilter.cloudId !== action.payload?.cloudId\n ) {\n state.userFilter = action.payload;\n } else {\n state.userFilter = null;\n }\n save(state);\n },\n filterSetProject: (state, action) => {\n state.inbox = false;\n state.userFilter = null;\n if (!state.project || state.project.cloudId !== action.payload?.cloudId) {\n //reset on second click\n state.project = action.payload;\n } else {\n state.project = null;\n }\n save(state);\n },\n filterSetContext: (state, action) => {\n state.inbox = false;\n state.userFilter = null;\n if (!state.context || state.context.cloudId !== action.payload?.cloudId) {\n //reset on second click\n state.context = action.payload;\n } else {\n state.context = null;\n }\n save(state);\n },\n filterAddTag: (state, action) => {\n state.inbox = false;\n state.userFilter = null;\n const index = state.tags.findIndex(\n (item) => item.cloudId === action.payload.cloudId\n );\n if (index === -1) {\n state.tags = [...state.tags, action.payload];\n } else {\n state.tags.splice(index, 1);\n }\n save(state);\n },\n filterRemoveTag: (state, action) => {\n state.tags = state.tags.filter(\n (item) => item.cloudId !== action.payload.cloudId\n );\n save(state);\n },\n filterSetDateRange: (state, action) => {\n state.userFilter = null;\n if (state.dateRange === action.payload) {\n state.dateRange = null;\n } else {\n state.dateRange = action.payload;\n }\n save(state);\n },\n filterSetInbox: (state, action) => {\n const inboxPreviousValue = state.inbox;\n clear(state);\n state.inbox = !inboxPreviousValue;\n save(state);\n },\n filterNotifyEntityDeleted: (state, action) => {\n if (state.userFilter?.cloudId === action.payload.cloudId) {\n state.userFilter = null;\n save(state);\n } else if (state.project?.cloudId === action.payload.cloudId) {\n state.project = null;\n save(state);\n } else if (state.context?.cloudId === action.payload.cloudId) {\n state.context = null;\n save(state);\n } else {\n state.tags.forEach((item) => {\n if (item.cloudId === action.payload.cloudId) {\n state.tags = removeItemFromArray(\n state.tags,\n item,\n (i1, i2) => i1.cloudId === i2.cloudId\n );\n save(state);\n }\n });\n }\n },\n },\n});\n\nfunction clear(state) {\n state.inbox = false;\n state.completed = false;\n state.userFilter = null;\n state.project = null;\n state.context = null;\n // state.dateRange = null;\n state.tags = [];\n}\n\nfunction save(state) {\n storage.setObject(\"active_filter\", state);\n}\n\n// export const selectIsLoadingTasks = (state) => state.filter.isLoadingTasks;\nexport const selectFilter = (state) => state.filter;\n\nexport const {\n filterClear,\n\n filterSetUserFilter,\n filterSetInbox,\n filterSetProject,\n filterSetContext,\n filterAddTag,\n filterRemoveTag,\n filterSetDateRange,\n filterNotifyEntityDeleted,\n} = filterSlice.actions;\n\nexport default filterSlice.reducer;\n","import { useDispatch, useSelector } from \"react-redux\";\nimport { clearData } from \"../redux/dataSlice\";\nimport { hideAlert, showLoggedOut } from \"../redux/alertSlice\";\nimport { selectDeviceId, selectToken, logout } from \"../redux/authSlice\";\nimport { filterClear } from \"../redux/filterSlice\";\n\nexport const useApiLogout = (isLoggedIn, forced) => {\n const dispatch = useDispatch();\n\n const deviceId = useSelector(selectDeviceId);\n const token = useSelector(selectToken);\n\n const headers = new Headers({\n Origin2: \"web@\" + deviceId,\n \"X-Auth-Token\": token,\n });\n\n const doLogout = () => {\n dispatch(logout());\n dispatch(hideAlert());\n dispatch(filterClear());\n dispatch(clearData());\n if (forced) {\n dispatch(showLoggedOut());\n }\n };\n\n if (!isLoggedIn) {\n fetch(`${process.env.REACT_APP_BASE_URL}/api/v1/auth/logout`, {\n method: \"POST\",\n mode: \"cors\",\n headers: headers,\n })\n .then((response) => {\n if (response.ok) {\n doLogout();\n } else {\n throw new Error(\"alarm!\");\n }\n })\n .catch((error) => {\n doLogout();\n // dispatch(showAlert({ text: \"Error occured\", type: \"danger\" }));\n });\n }\n};\n","import React, { useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { Dropdown, NavDropdown, Button } from \"react-bootstrap\";\nimport { Android, Apple } from \"@material-ui/icons\";\nimport { useApiLogout } from \"../../app/api\";\nimport { selectProfile } from \"../../redux/authSlice\";\nimport ThemeSwitch from \"./ThemeSwitch\";\nimport Constants from \"../../utils/constants\";\nimport { openUrl } from \"../../utils/utils\";\nimport packageJson from \"../../../package.json\";\n\nexport function Header() {\n const [isLoggedIn, setLoggedIn] = useState(true);\n\n useApiLogout(isLoggedIn);\n\n const profile = useSelector(selectProfile);\n\n return (\n
    \n \n\n \n \n \n {profile && profile.email ? (\n \n // dispatch(filterSetDateRange(Constants.date_range_completed))\n // }\n >\n {profile.email}\n \n ) : null}\n\n \n {/* */}\n
    \n Theme\n \n
    \n {/*
    \n {[\"#FFC107\", \"#2196F3\", \"#4CAF50\", \"#607D8B\"].map((color) => (\n dispatch(prefsSetAccent(color))}\n />\n ))}\n
    */}\n {/*
    */}\n setLoggedIn(false)}>\n Logout\n \n \n
    \n Apps\n openUrl(Constants.link_google_play)}\n />\n openUrl(Constants.link_app_store)}\n />\n
    \n \n
    \n blitz.do\n v.{packageJson.version}\n
    \n
    \n
    \n
    \n );\n}\n","import React from \"react\";\nimport { SvgIcon } from \"@material-ui/core\";\n\nexport default function ProjectIcon(props) {\n const { ...rest } = props;\n\n return (\n \n \n \n \n );\n}\n","import React from \"react\";\nimport { ArrowForwardIosRounded } from \"@material-ui/icons\";\n\nconst ExpandIcon = (props) => {\n const { isExpanded, ...rest } = props;\n return (\n \n );\n};\n\nexport default ExpandIcon;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useDispatch } from \"react-redux\";\nimport { EditRounded, DeleteRounded, CheckRounded } from \"@material-ui/icons\";\nimport { useInputValue } from \"../../../hooks/useInputValue\";\nimport { filterNotifyEntityDeleted } from \"../../../redux/filterSlice\";\n\nimport {\n setAddingEntity,\n setEditingEntity,\n} from \"../../../redux/appStateSlice\";\n\nconst EditableEntityItem = (props) => {\n const { entity, icon, dispatchDoneFunction, isEditing, ...rest } = props;\n const dispatch = useDispatch();\n\n const nameInput = useInputValue(entity.name);\n\n const onClick = (event) => {\n if (isEditing) {\n event.stopPropagation();\n }\n };\n\n const onKeyPress = (event) => {\n if (event.key === \"Enter\") {\n finishEditingEntity();\n }\n };\n\n const onKeyUp = (event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n if (entity.objectId) {\n dispatch(setEditingEntity(null));\n } else {\n dispatch(setAddingEntity(null));\n }\n }\n };\n\n const finishEditingEntity = () => {\n dispatch(dispatchDoneFunction({ ...entity, name: nameInput.value() }));\n if (!entity.objectId) {\n dispatch(setAddingEntity(null));\n } else {\n dispatch(setEditingEntity(null));\n }\n };\n\n const onFocus = () => {\n //clear previously entered and not confirmed value\n nameInput.setValue(entity.name);\n };\n\n return (\n \n {!isEditing && icon ? icon : null}\n {isEditing ? (\n \n ) : (\n
    {entity.name}
    \n )}\n\n {isEditing ? (\n
    \n {\n e.stopPropagation();\n if (entity.cloudId) {\n dispatch(dispatchDoneFunction({ ...entity, deleted: true }));\n dispatch(filterNotifyEntityDeleted(entity));\n } else {\n dispatch(setAddingEntity(null));\n }\n }}\n />\n {\n e.stopPropagation();\n finishEditingEntity();\n }}\n />\n
    \n ) : props.notEditable ? null : (\n {\n e.stopPropagation();\n dispatch(setEditingEntity(entity));\n }}\n />\n )}\n \n );\n};\n\nEditableEntityItem.propTypes = {\n entity: PropTypes.object.isRequired,\n dispatchDoneFunction: PropTypes.func.isRequired,\n};\n\nexport default EditableEntityItem;\n","import React from \"react\";\n\nexport const Circle = (props) => {\n const { color, ...rest } = props;\n\n var circleStyle = {\n padding: 10,\n backgroundColor: props.color ?? \"transparent\",\n borderRadius: \"50%\",\n width: 44,\n height: 32,\n };\n return
    ;\n};\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport reactCSS from \"reactcss\";\nimport { useDispatch } from \"react-redux\";\nimport { DeleteRounded, CheckRounded } from \"@material-ui/icons\";\nimport { useInputValue } from \"../../../hooks/useInputValue\";\nimport { filterNotifyEntityDeleted } from \"../../../redux/filterSlice\";\nimport { Circle } from \"../Circle\";\nimport {\n setAddingEntity,\n setEditingEntity,\n} from \"../../../redux/appStateSlice\";\nimport Constants from \"../../../utils/constants\";\nimport { GithubPicker } from \"react-color\";\n\nconst EditTagItem = (props) => {\n const { entity, dispatchDoneFunction, ...rest } = props;\n const dispatch = useDispatch();\n\n const nameInput = useInputValue(entity.name);\n const [tagColor, setTagColor] = useState(entity.color);\n const [isShowingPicker, setShowingPicker] = useState(false);\n\n const onClick = (event) => {\n event.stopPropagation();\n };\n\n const onKeyPress = (event) => {\n if (event.key === \"Enter\") {\n finishEditingEntity();\n }\n };\n\n const onKeyUp = (event) => {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n if (entity.objectId) {\n dispatch(setEditingEntity(null));\n } else {\n dispatch(setAddingEntity(null));\n }\n }\n };\n\n const finishEditingEntity = () => {\n dispatch(\n dispatchDoneFunction({\n ...entity,\n name: nameInput.value(),\n color: tagColor,\n })\n );\n if (!entity.objectId) {\n dispatch(setAddingEntity(null));\n } else {\n dispatch(setEditingEntity(null));\n }\n };\n\n const onFocus = () => {\n //clear previously entered and not confirmed value\n nameInput.setValue(entity.name);\n };\n\n const styles = reactCSS({\n default: {\n popover: {\n position: \"absolute\",\n zIndex: \"2\",\n },\n cover: {\n position: \"fixed\",\n top: \"0px\",\n right: \"0px\",\n bottom: \"0px\",\n left: \"0px\",\n },\n },\n });\n\n return (\n
    \n \n setShowingPicker(!isShowingPicker)}\n />\n\n \n\n
    \n {\n e.stopPropagation();\n if (entity.cloudId) {\n dispatch(dispatchDoneFunction({ ...entity, deleted: true }));\n dispatch(filterNotifyEntityDeleted(entity));\n }\n dispatch(setAddingEntity(null));\n }}\n />\n {\n e.stopPropagation();\n finishEditingEntity();\n }}\n />\n
    \n
    \n {isShowingPicker ? (\n
    \n setShowingPicker(false)}\n />\n {\n setTagColor(color.hex);\n setShowingPicker(false);\n }}\n width=\"190px\"\n colors={Constants.default_colors}\n />\n
    \n ) : null}\n \n );\n};\n\nEditTagItem.propTypes = {\n entity: PropTypes.object.isRequired,\n};\n\nexport default EditTagItem;\n","import React, { useState } from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { SortableContainer, SortableElement } from \"react-sortable-hoc\";\nimport {\n filterSetInbox,\n filterSetProject,\n filterSetContext,\n filterAddTag,\n filterClear,\n filterSetDateRange,\n filterSetUserFilter,\n} from \"../../redux/filterSlice\";\nimport {\n InboxRounded,\n TodayRounded,\n AllInboxRounded,\n AddOutlined as AddIcon,\n CheckCircleRounded as CompletedIcon,\n FlashOnRounded as UserFilterIcon,\n LabelOutlined,\n AlternateEmailRounded,\n} from \"@material-ui/icons\";\nimport ProjectIcon from \"./icons/ProjectIcon\";\nimport ExpandIcon from \"./icons/ExpandIcon\";\nimport StarIcon from \"./icons/StarIcon\";\nimport { Collapse } from \"react-bootstrap\";\nimport {\n selectAllUserFilters,\n selectAllContexts,\n selectAllProjects,\n selectAllTags,\n updateUserFilter,\n updateProject,\n updateContext,\n updateTag,\n} from \"../../redux/dataSlice\";\nimport DateRange from \"../../utils/dateRange\";\nimport \"../../utils/extensions\";\nimport {\n setAddingEntity,\n setNavOpen,\n selectEditingEntity,\n selectAddingProject,\n selectAddingContext,\n selectAddingTag,\n selectAppStateNavOpen,\n} from \"../../redux/appStateSlice\";\nimport { selectProfile } from \"../../redux/authSlice\";\n\nimport TagItem from \"./items/TagItem\";\nimport EditableEntityItem from \"./items/EditableEntityItem\";\nimport EditTagItem from \"./items/EditTagItem\";\nimport Constants from \"../../utils/constants\";\nimport { getRankBetween, rankSort } from \"../../utils/utils\";\nimport { showPremium } from \"../../redux/alertSlice\";\n\nconst BaseListItem = (props) => {\n const dispatch = useDispatch();\n\n const onClicked = () => {\n if (props.dispatchFunction && props.item) {\n dispatch(props.dispatchFunction(props.item));\n }\n };\n\n return (\n
    \n {props.children}\n
    \n );\n};\n\nconst SortableEntityItem = SortableElement((props) => {\n const value = props.value;\n\n // const key =\n // \"key:\" + value.position + props.task.extra + props.task.subtasks.length;\n\n return (\n \n \n \n );\n});\n\nconst SortableTagItem = SortableElement((props) => {\n return ;\n});\n\nconst SortableRankList = SortableContainer((props) => {\n return (\n
      \n {[...props.items]\n .sort(rankSort)\n .map((value, index) => props.buildChild(value, index))}\n
    \n );\n});\n\nconst Nav = () => {\n const dispatch = useDispatch();\n\n const allUserFilters = useSelector(selectAllUserFilters);\n const allProjects = useSelector(selectAllProjects);\n const allContexts = useSelector(selectAllContexts);\n const allTags = useSelector(selectAllTags);\n\n const editingEntity = useSelector(selectEditingEntity);\n\n const addingProject = useSelector(selectAddingProject);\n const addingContext = useSelector(selectAddingContext);\n const addingTag = useSelector(selectAddingTag);\n\n const navOpenState = useSelector(selectAppStateNavOpen);\n const profile = useSelector(selectProfile);\n\n const [isDragging, setIsDragging] = useState(false);\n\n const sortableRankList = (axis, items, dispatchOnSortEnd, buildChild) => {\n return (\n \n setIsDragging(true)\n }\n onSortEnd={({ oldIndex, newIndex }) => {\n setIsDragging(false);\n if (oldIndex !== newIndex) {\n const draggedItem = items[oldIndex];\n var newRank;\n if (newIndex == 0) {\n newRank = getRankBetween(null, items[newIndex].rank);\n } else if (newIndex == items.length - 1) {\n newRank = getRankBetween(items[newIndex].rank, null);\n } else if (newIndex < oldIndex) {\n newRank = getRankBetween(\n items[newIndex - 1].rank,\n items[newIndex].rank\n );\n } else {\n newRank = getRankBetween(\n items[newIndex].rank,\n items[newIndex + 1].rank\n );\n }\n dispatch(dispatchOnSortEnd({ ...draggedItem, rank: newRank }));\n }\n }}\n />\n );\n };\n\n return (\n
    \n {filters()}\n
    \n {profile &&\n profile.email &&\n Constants.test_users.includes(profile.email)\n ? userFilters()\n : null}\n {projects()}\n {contexts()}\n {tags()}\n
    \n
    \n );\n\n function filters() {\n return (\n <>\n dispatch(filterClear())}\n >\n \n
    All
    \n \n dispatch(filterSetDateRange(DateRange.today))}\n >\n \n
    Today
    \n \n dispatch(filterSetInbox())}\n >\n \n
    Inbox
    \n \n dispatch(filterSetDateRange(DateRange.starred))}\n >\n \n
    Starred
    \n \n dispatch(filterSetDateRange(DateRange.completed))}\n >\n \n
    Completed
    \n \n \n );\n }\n\n function userFilters() {\n return (\n
    \n \n dispatch(\n setNavOpen({\n id: Constants.id_adding_user_filters,\n value: !navOpenState.userFiltersOpen,\n })\n )\n }\n aria-controls=\"all-userFilters-list\"\n aria-expanded={navOpenState.userFiltersOpen}\n >\n \n Blitz Filters\n {/* {\n event.stopPropagation();\n if (\n checkLimitAndPremium(\n allUserFilters.length,\n Constants.free_user_filters,\n \"Free Blitz Filters limit reached\"\n )\n ) {\n dispatch(\n setAddingEntity({\n id: Constants.id_adding_user_filters,\n rank: getRankBetween(null, allUserFilters[0]?.rank),\n })\n );\n }\n }}\n /> */}\n \n
    \n \n
    \n {\n allUserFilters.length > 0 ? (\n
      \n {sortableRankList(\n \"y\",\n allUserFilters,\n updateUserFilter,\n (value, index) => (\n \n }\n notEditable\n isDragging={isDragging}\n // editingCloudId={editingEntity?.cloudId}\n dispatchDoneFunction={() => {}}\n dispatchFunction={filterSetUserFilter}\n />\n )\n )}\n
    \n ) : null\n // No filters\n }\n
    \n
    \n \n );\n }\n\n function projects() {\n return (\n
    \n \n dispatch(\n setNavOpen({\n id: Constants.id_adding_project,\n value: !navOpenState.projectsOpen,\n })\n )\n }\n aria-controls=\"all-projects-list\"\n aria-expanded={navOpenState.projectsOpen}\n >\n \n Projects\n {\n event.stopPropagation();\n if (\n checkLimitAndPremium(\n allProjects.length,\n Constants.free_projects,\n \"Free active Projects limit reached\"\n )\n ) {\n dispatch(\n setAddingEntity({\n id: Constants.id_adding_project,\n rank: getRankBetween(null, allProjects[0]?.rank),\n })\n );\n }\n }}\n />\n \n
    \n \n
    \n
      \n {addingProject != null ? (\n \n ) : null}\n {sortableRankList(\n \"y\",\n allProjects,\n updateProject,\n (value, index) => (\n \n }\n isDragging={isDragging}\n editingCloudId={editingEntity?.cloudId}\n dispatchDoneFunction={updateProject}\n dispatchFunction={filterSetProject}\n />\n )\n )}\n
    \n
    \n
    \n \n );\n }\n\n function contexts() {\n return (\n
    \n \n dispatch(\n setNavOpen({\n id: Constants.id_adding_context,\n value: !navOpenState.contextsOpen,\n })\n )\n }\n aria-controls=\"example-contexts-text\"\n aria-expanded={navOpenState.contextsOpen}\n >\n \n Contexts\n {\n event.stopPropagation();\n if (\n checkLimitAndPremium(\n allContexts.length,\n Constants.free_contexts,\n \"Free Contexts limit reached\"\n )\n ) {\n dispatch(\n setAddingEntity({\n id: Constants.id_adding_context,\n rank: getRankBetween(null, allContexts[0]?.rank),\n })\n );\n }\n }}\n />\n \n
    \n \n
    \n
      \n {addingContext != null ? (\n \n ) : null}\n\n {sortableRankList(\n \"y\",\n allContexts,\n updateContext,\n (value, index) => (\n }\n isDragging={isDragging}\n editingCloudId={editingEntity?.cloudId}\n dispatchDoneFunction={updateContext}\n dispatchFunction={filterSetContext}\n />\n )\n )}\n
    \n
    \n
    \n \n );\n }\n\n function tags() {\n return (\n
    \n \n dispatch(\n setNavOpen({\n id: Constants.id_adding_tag,\n value: !navOpenState.tagsOpen,\n })\n )\n }\n aria-controls=\"example-tags-text\"\n aria-expanded={navOpenState.tagsOpen}\n >\n \n Tags\n {\n event.stopPropagation();\n if (\n checkLimitAndPremium(\n allTags.length,\n Constants.free_tags,\n \"Free Tags limit reached\"\n )\n ) {\n dispatch(\n setAddingEntity({\n id: Constants.id_adding_tag,\n rank: getRankBetween(null, allTags[0]?.rank),\n color: Constants.default_colors.random(),\n })\n );\n }\n }}\n />\n \n
    \n \n
    \n {addingTag ? (\n \n ) : null}\n {sortableRankList(\"xy\", allTags, updateTag, (value, index) => {\n return (\n \n );\n })}\n
    \n
    \n \n );\n }\n\n function checkLimitAndPremium(current, max, message) {\n if (current >= max && !profile.isPremium) {\n dispatch(showPremium(message));\n return false;\n }\n return true;\n }\n};\n\nexport default Nav;\n","import React from \"react\";\nimport moment from \"moment\";\nimport TextareaAutosize from \"react-textarea-autosize\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { updateTask } from \"../../redux/dataSlice\";\nimport { useInputValue } from \"../../hooks/useInputValue\";\nimport { selectFilter } from \"../../redux/filterSlice\";\nimport { formatDateDb } from \"../../utils/dateUtils\";\nimport DateRange from \"../../utils/dateRange\";\n\nconst NewTaskInput = () => {\n const titleInput = useInputValue(\"\");\n const dispatch = useDispatch();\n\n const filter = useSelector(selectFilter);\n\n return (\n
    \n {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (titleInput.value().trim()) {\n dispatch(\n updateTask({\n name: titleInput.value(),\n fromQuickInput: true,\n projectCloudId: filter?.project?.cloudId,\n contextCloudId: filter?.context?.cloudId,\n tags: filter?.tags?.map((item) => item.cloudId),\n starred: filter?.dateRange === DateRange.starred,\n dateDue:\n filter?.dateRange === DateRange.today\n ? formatDateDb(moment())\n : null,\n })\n );\n titleInput.clear();\n }\n }\n }}\n />\n \n );\n};\n\nexport default NewTaskInput;\n","import React from \"react\";\nimport {\n RepeatRounded as Repeat,\n CalendarTodayRounded as DueDate,\n} from \"@material-ui/icons\";\n\nconst DueDateIcon = (props) => {\n const { isRepeat, ...rest } = props;\n\n return isRepeat ? : null;\n};\n\nexport default DueDateIcon;\n","import React from \"react\";\nimport { AlternateEmailRounded } from \"@material-ui/icons\";\nimport { useDispatch } from \"react-redux\";\n\nconst ContextItem = (props) => {\n const { context, dispatchFunction, ...rest } = props;\n\n const dispatch = useDispatch();\n\n const onClick = (event) => {\n if (dispatchFunction) {\n event.stopPropagation();\n dispatch(dispatchFunction(context));\n }\n };\n\n return context ? (\n \n \n {context.name}\n \n ) : null;\n};\n\nContextItem.propTypes = {\n // context: PropTypes.object.isRequired,\n};\n\nexport default ContextItem;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport ProjectIcon from \"../icons/ProjectIcon\";\n\nconst ProjectItem = (props) => {\n const { project, dispatchFunction, ...rest } = props;\n const dispatch = useDispatch();\n\n const onClick = (event) => {\n if (dispatchFunction) {\n event.stopPropagation();\n dispatch(dispatchFunction(project));\n }\n };\n\n return project ? (\n \n \n {project.name}\n \n ) : null;\n};\n\nProjectItem.propTypes = {\n // project: PropTypes.object.isRequired,\n};\n\nexport default ProjectItem;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport TagItem from \"./TagItem\";\nimport moment from \"moment\";\nimport StarIcon from \"../icons/StarIcon\";\nimport DueDateIcon from \"../icons/DueDateIcon\";\nimport { Checkbox } from \"pretty-checkbox-react\";\nimport {\n PlaylistAddCheckRounded as SubtasksIcon,\n CheckRounded as CheckboxIcon,\n DescriptionRounded as DescriptionIcon,\n} from \"@material-ui/icons\";\n\nimport {\n filterSetProject,\n filterSetContext,\n filterAddTag,\n} from \"../../../redux/filterSlice\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n completeTask,\n selectAllProjects,\n selectAllContexts,\n selectAllTags,\n} from \"../../../redux/dataSlice\";\n\nimport { findByCloudId, findByCloudIds } from \"../../../utils/utils\";\nimport { formatDate } from \"../../../utils/dateUtils\";\nimport { ListGroup, Container } from \"react-bootstrap\";\nimport ContextItem from \"./ContextItem\";\nimport ProjectItem from \"./ProjectItem\";\n\nimport \"@djthoms/pretty-checkbox\";\n\nconst TaskItem = ({ task, isSelected, onSelected }) => {\n const dispatch = useDispatch();\n\n const project = useSelector((state) =>\n findByCloudId(selectAllProjects(state), task.projectCloudId)\n );\n const context = useSelector((state) =>\n findByCloudId(selectAllContexts(state), task.contextCloudId)\n );\n const tags = useSelector((state) =>\n findByCloudIds(selectAllTags(state), task.tags)\n );\n\n const [isChecked, setChecked] = useState(task.completed);\n const [isLocked, setLocked] = useState(false);\n\n const onChecked = (event) => {\n setChecked(!task.completed);\n setLocked(true);\n setTimeout(() => {\n dispatch(completeTask({ ...task }));\n }, 300);\n setTimeout(() => {\n setLocked(false);\n }, 400);\n };\n\n return (\n {\n onSelected(event, task);\n }}\n >\n \n
    \n {/* Hack to prevent task click and selection */}\n event.stopPropagation()}>\n }\n animation=\"smooth\"\n checked={isLocked ? isChecked : task.completed}\n locked={isLocked}\n onChange={onChecked}\n />\n \n \n {task.name}\n
    \n {task.description ? (\n \n ) : null}\n {task.starred ? (\n \n ) : null}\n \n
    \n
    \n {task.subtasks?.length > 0 ? (\n \n {\" \"}\n {task.subtasks.filter((subtask) => subtask.completed).length}/\n {task.subtasks.length}\n \n ) : null}\n {project ? (\n \n ) : null}\n {context ? (\n \n ) : null}\n {tags.map((value, index) => (\n \n ))}\n
    \n {task.dateDue ? (\n \n {formatDate(moment(task.dateDue))}\n \n
    \n ) : null}\n \n
    \n \n );\n};\n\nTaskItem.propTypes = {\n task: PropTypes.object.isRequired,\n};\n\nexport default TaskItem;\n","import React from \"react\";\n\nconst ColoredLine = ({ color }) => (\n \n);\n\nexport default ColoredLine;\n","import React from \"react\";\nimport { getDateRangeName } from \"../../../utils/dateUtils\";\nimport ColoredLine from \"./../ColoredLine\";\n\nconst DateRangeItem = (props) => {\n const { dateRange, onDateRangeSelected, ...rest } = props;\n\n return (\n
    \n
    \n \n
    \n onDateRangeSelected(dateRange)}\n >\n
    {getDateRangeName(dateRange)}
    \n \n
    \n \n
    \n
    \n );\n};\n\nexport default DateRangeItem;\n","import React from \"react\";\n\nexport default () => (\n //
    \n //
    \n //
    \n
    \n
    \n Loading...\n
    \n
    \n);\n","import React, { useEffect, useState, useRef } from \"react\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport moment from \"moment\";\nimport TaskItem from \"./items/TaskItem\";\nimport DateRangeItem from \"./items/DateRangeItem\";\nimport { CSSTransition } from \"react-transition-group\";\nimport {\n selectTask,\n selectSelectedTasks,\n selectTasksSynced,\n addTasksToSelection,\n removeTasksFromSelection,\n} from \"../../redux/dataSlice\";\n\nimport Loader from \"./Loader\";\nimport { selectFilter, filterSetDateRange } from \"../../redux/filterSlice\";\nimport { useIndexedDB } from \"react-indexed-db\";\nimport Constants from \"../../utils/constants\";\nimport { ListGroup } from \"react-bootstrap\";\nimport { findByCloudId } from \"../../utils/utils\";\nimport { getDateRange } from \"../../utils/dateUtils\";\nimport DateRange from \"../../utils/dateRange\";\n\nconst TasksList = () => {\n const selectedTasks = useSelector(selectSelectedTasks);\n\n const synced = useSelector(selectTasksSynced);\n\n const filter = useSelector(selectFilter);\n\n const [tasks, setTasks] = useState([]);\n\n const tasksDB = useIndexedDB(Constants.table_tasks);\n const dispatch = useDispatch();\n\n const [isLoadingTasks, setIsLoadingTasks] = useState(true);\n const [hasMoreTasks, setHasMoreTasks] = useState(true);\n\n const [page, setPage] = useState(0);\n\n const listRef = useRef(null);\n const canSelectNextOnKey = useRef(true);\n\n const [initialShiftSelection, setInitialShiftSelection] = useState(\n selectedTasks.length === 0 ? null : selectedTasks[selectedTasks.length - 1]\n );\n\n useEffect(() => {\n if (page === -1) {\n console.log(\"--- useEffect: page === -1\");\n setIsLoadingTasks(true);\n setPage(0);\n return;\n }\n tasksDB.getAll().then((result) => {\n console.log(\"--- useEffect: getAll() \" + result?.length);\n\n const totalTasks = result.filter((item) => {\n if (item.deleted || item.archived) {\n return false;\n }\n if (filter.userFilter) {\n return filterByUserFilter(filter.userFilter, item);\n } else {\n return filterByFilter(filter, item);\n }\n });\n const oldTasks = page === 0 ? [] : tasks;\n const newPortion = totalTasks\n .sort((a, b) => {\n if (a.completed && b.completed) {\n return a.dateCompleted < b.dateCompleted ? 1 : -1;\n } else if (a.completed) {\n return 1;\n } else if (b.completed) {\n return -1;\n }\n\n const byDueOrUpdatedDate = (a, b) => {\n if (a.dateDue && b.dateDue) {\n return a.dateDue < b.dateDue ? -1 : 1;\n } else if (a.dateDue) {\n return -1;\n } else if (b.dateDue) {\n return 1;\n }\n return a.dateUpdated < b.dateUpdated ? 1 : -1;\n };\n\n if (a.starred && b.starred) {\n return byDueOrUpdatedDate(a, b);\n } else if (a.starred) {\n return -1;\n } else if (b.starred) {\n return 1;\n }\n\n return byDueOrUpdatedDate(a, b);\n })\n .slice(\n page * Constants.tasks_portion_size,\n (page + 1) * Constants.tasks_portion_size\n );\n\n if (filter.dateRange) {\n setTasks(oldTasks.concat(newPortion));\n } else {\n var newDateRange;\n var previousDateRange = oldTasks.length\n ? getDateRange(oldTasks[oldTasks.length - 1])\n : null;\n\n for (var i = 0; i < newPortion.length; i++) {\n newDateRange = getDateRange(newPortion[i]);\n if (!previousDateRange || newDateRange !== previousDateRange) {\n oldTasks.push(newDateRange);\n previousDateRange = newDateRange;\n }\n oldTasks.push(newPortion[i]);\n }\n setTasks(oldTasks);\n }\n\n setIsLoadingTasks(false);\n setHasMoreTasks(\n totalTasks.length > (page + 1) * Constants.tasks_portion_size\n );\n });\n }, [page]);\n\n useEffect(() => {\n console.log(\"--- useEffect: synced\");\n setPage(-1);\n }, [filter, synced]);\n\n const handleScroll = (e) => {\n if (hasMoreTasks && !isLoadingTasks) {\n const bottom =\n e.target.scrollHeight - e.target.scrollTop === e.target.clientHeight;\n if (bottom) {\n setIsLoadingTasks(true);\n setPage(page + 1);\n // dispatch(setIsLoadingTasks(true));\n }\n }\n };\n\n const selectTaskIfCan = (task) => {\n if (task) {\n dispatch(selectTask(task));\n\n if (listRef.current) {\n //scroll to the view of the selected tasks\n const taskView = [...listRef.current.children].find(\n (item) => item.getAttribute(\"taskid\") == task.cloudId\n );\n if (taskView) {\n taskView.scrollIntoViewIfNeeded(false);\n }\n }\n }\n };\n\n const handleKeyDown = (e) => {\n if (!canSelectNextOnKey.current || e.ctrlKey || e.shiftKey) {\n return;\n }\n canSelectNextOnKey.current = false;\n setTimeout(() => {\n canSelectNextOnKey.current = true;\n }, 50);\n\n if (selectedTasks.length != 0) {\n const index = tasks.findIndex(\n (item) =>\n item.cloudId === selectedTasks[selectedTasks.length - 1].cloudId\n );\n if (e.key == \"ArrowDown\" && index < tasks.length - 1) {\n //do not forget to skip headers\n const newSelection = tasks[index + 1].cloudId\n ? tasks[index + 1]\n : tasks[index + 2];\n selectTaskIfCan(newSelection);\n } else if (e.key == \"ArrowUp\" && index > 0) {\n const newSelection = tasks[index - 1].cloudId\n ? tasks[index - 1]\n : tasks[index - 2];\n selectTaskIfCan(newSelection);\n }\n } else if (\n (e.key == \"ArrowDown\" || e.key == \"ArrowUp\") &&\n tasks.length > 0\n ) {\n const newSelection = tasks[0].cloudId ? tasks[0] : tasks[1];\n selectTaskIfCan(newSelection);\n }\n };\n\n return (\n // \n\n tasks.length == 0 && !hasMoreTasks ? (\n
    \n \n
    \n ) : (\n \n {tasks.map((item, index) => {\n const isSelected = findByCloudId(selectedTasks, item.cloudId);\n return item.cloudId ? (\n
    \n \n {\n if (event.shiftKey) {\n _selectWithShift(task);\n } else if (event.ctrlKey) {\n _selectWithCtrl(task);\n } else {\n _selectWithoutKey(task);\n }\n }}\n />\n \n
    \n ) : (\n \n \n dispatch(filterSetDateRange(dateRange))\n }\n />\n
    \n );\n })}\n {hasMoreTasks ? (\n
    \n \n
    \n ) : null}\n {/* /* */}\n \n )\n );\n\n function _selectWithoutKey(task) {\n if (\n selectedTasks.length < 2 &&\n findByCloudId(selectedTasks, task.cloudId)\n ) {\n dispatch(selectTask(null));\n setInitialShiftSelection(null);\n } else {\n dispatch(selectTask(task));\n setInitialShiftSelection(task);\n }\n }\n\n function _selectWithShift(task) {\n if (!initialShiftSelection) {\n setInitialShiftSelection(\n selectedTasks.length === 0\n ? null\n : selectedTasks[selectedTasks.length - 1]\n );\n }\n var lastIndex = initialShiftSelection\n ? tasks.findIndex(\n (item) => item.cloudId === initialShiftSelection.cloudId\n )\n : 0;\n var selectedIndex = tasks.findIndex(\n (item) => item.cloudId === task.cloudId\n );\n dispatch(\n selectTask(\n tasks\n .slice(\n Math.min(lastIndex, selectedIndex),\n Math.max(lastIndex, selectedIndex) + 1\n )\n .filter((item) => item.cloudId)\n )\n );\n }\n\n function _selectWithCtrl(task) {\n setInitialShiftSelection(task);\n if (findByCloudId(selectedTasks, task.cloudId)) {\n dispatch(removeTasksFromSelection([findByCloudId(tasks, task.cloudId)]));\n } else {\n dispatch(addTasksToSelection([findByCloudId(tasks, task.cloudId)]));\n }\n }\n};\n\nfunction filterByFilter(filter, item) {\n let taskDateRange = getDateRange(item, true);\n if (filter.dateRange) {\n if (filter.dateRange === DateRange.starred) {\n if (!item.starred) {\n return false;\n }\n } else if (filter.dateRange === DateRange.completed) {\n if (!item.completed) {\n return false;\n }\n } else {\n if (filter.dateRange === DateRange.today) {\n //for today we show\n // - due today and overdue, not completed\n // - due today, completed\n // - no date, completed today\n if (taskDateRange === DateRange.today) {\n if (item.completed) {\n let dateDue = moment(item.dateDue);\n if (!moment().isSame(dateDue, \"date\")) {\n return false;\n }\n }\n } else if (taskDateRange === DateRange.noDate) {\n if (!item.completed) {\n return false;\n }\n let dateCompleted = moment(item.dateCompleted);\n if (!moment().isSame(dateCompleted, \"date\")) {\n return false;\n }\n } else {\n return false;\n }\n } else if (filter.dateRange !== taskDateRange) {\n return false;\n }\n }\n }\n\n if (\n item.completed &&\n !filter.project &&\n filter.dateRange !== DateRange.completed &&\n !(\n filter.dateRange === DateRange.today &&\n (taskDateRange === DateRange.today || taskDateRange === DateRange.noDate)\n )\n ) {\n return false;\n }\n\n if (filter.inbox) {\n if (\n !item.projectCloudId &&\n !item.contextCloudId &&\n (item.tags?.length ?? 0) === 0\n ) {\n return true;\n } else {\n return false;\n }\n }\n if (filter.project) {\n if (filter.project.cloudId !== item.projectCloudId) {\n return false;\n }\n }\n if (filter.context && filter.context.cloudId !== item.contextCloudId) {\n return false;\n }\n if (filter.tags.length) {\n if (item.tags?.length) {\n return filter.tags.every((filterTag) =>\n item.tags.some((tagId) => filterTag.cloudId === tagId)\n );\n } else {\n return false;\n }\n }\n return true;\n}\n\nconst checkIds = (asString, isNot, type, noCondition, condition) => {\n if (asString) {\n var conditions = [];\n for (var id of asString.split(\",\")) {\n var result = true;\n if (id === \"no_id\") {\n if (!noCondition()) {\n result = false;\n }\n } else if (!condition(id)) {\n result = false;\n }\n conditions.push(result);\n }\n const res =\n type === \"AND\"\n ? conditions.every((it) => it)\n : conditions.some((it) => it);\n\n return isNot ? !res : res;\n }\n return true;\n};\n\nfunction filterByUserFilter(filter, task) {\n if (task.completed && !filter.includeCompleted) {\n return false;\n }\n\n if (filter.days === -1) {\n if (task.dateDue) {\n return false;\n }\n } else if (filter.days !== null && filter.days !== undefined) {\n if (!task.dateDue) {\n return false;\n }\n if (\n !moment(task.dateDue).isBefore(\n moment()\n .startOf(\"day\")\n .add(filter.days + 1, \"d\")\n )\n ) {\n return false;\n }\n }\n\n var conditions = [];\n\n if (filter.projects) {\n conditions.push(\n checkIds(\n filter.projects,\n filter.projectsNot,\n \"OR\",\n () => !task.projectCloudId,\n (id) => task.projectCloudId === id\n )\n );\n }\n if (filter.contexts) {\n conditions.push(\n checkIds(\n filter.contexts,\n filter.contextsNot,\n \"OR\",\n () => !task.contextCloudId,\n (id) => task.contextCloudId === id\n )\n );\n }\n if (filter.tags) {\n conditions.push(\n checkIds(\n filter.tags,\n filter.tagsNot,\n filter.tagsType,\n () => !task.tags?.length,\n (id) => task.tags?.includes(id)\n )\n );\n }\n\n return filter.filterType === \"AND\"\n ? conditions.every((it) => it)\n : conditions.some((it) => it);\n}\n\nexport default TasksList;\n","import React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { FlashOnRounded as UserFilterIcon } from \"@material-ui/icons\";\n\nconst UserFilterItem = (props) => {\n const { userFilter, dispatchFunction, ...rest } = props;\n const dispatch = useDispatch();\n\n const onClick = (event) => {\n if (dispatchFunction) {\n event.stopPropagation();\n dispatch(dispatchFunction(userFilter));\n }\n };\n\n return userFilter ? (\n \n \n {userFilter.name}\n \n ) : null;\n};\n\nUserFilterItem.propTypes = {\n // project: PropTypes.object.isRequired,\n};\n\nexport default UserFilterItem;\n","import React from \"react\";\nimport TagItem from \"./items/TagItem\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport {\n InboxRounded,\n TodayRounded,\n EventBusyRounded as NoDateIcon,\n CheckCircleRounded as CompletedIcon,\n} from \"@material-ui/icons\";\nimport {\n selectFilter,\n filterSetProject,\n filterSetContext,\n filterRemoveTag,\n filterSetDateRange,\n filterSetInbox,\n filterSetUserFilter,\n} from \"../../redux/filterSlice\";\nimport {\n selectAllProjects,\n selectAllContexts,\n selectAllTags,\n selectAllUserFilters,\n} from \"../../redux/dataSlice\";\nimport ContextItem from \"./items/ContextItem\";\nimport ProjectItem from \"./items/ProjectItem\";\nimport StarIcon from \"./icons/StarIcon\";\nimport { findByCloudId } from \"../../utils/utils\";\nimport DateRange from \"../../utils/dateRange\";\nimport { getDateRangeName } from \"../../utils/dateUtils\";\nimport UserFilterItem from \"./items/UserFilterItem\";\n\nconst Filter = () => {\n const dispatch = useDispatch();\n const filter = useSelector(selectFilter);\n\n const allProjects = useSelector(selectAllProjects);\n const allContexts = useSelector(selectAllContexts);\n const allTags = useSelector(selectAllTags);\n const allUserFilters = useSelector(selectAllUserFilters);\n\n const isActive = () =>\n filter?.inbox ||\n filter?.userFilter ||\n filter?.project ||\n filter?.context ||\n filter?.dateRange ||\n filter?.tags.length > 0;\n\n return (\n \n
    \n {filter.inbox ? (\n dispatch(filterSetInbox(false))}\n >\n \n Inbox\n \n ) : null}\n {filter.userFilter ? (\n \n ) : null}\n {filter.project ? (\n \n ) : null}\n {filter.context ? (\n filterSetContext(null)}\n />\n ) : null}\n {filter.tags.map((value, index) => (\n \n ))}\n
    \n {filter.dateRange && (\n dispatch(filterSetDateRange(null))}\n >\n {filter.dateRange === DateRange.completed ? (\n \n \n {getDateRangeName(filter.dateRange)}\n \n ) : filter.dateRange === DateRange.starred ? (\n \n \n {getDateRangeName(filter.dateRange)}\n \n ) : filter.dateRange === DateRange.noDate ? (\n \n \n {getDateRangeName(filter.dateRange)}\n \n ) : (\n \n \n {getDateRangeName(filter.dateRange)}\n \n )}\n \n )}\n \n );\n};\n\nexport default Filter;\n","import ReconnectingWebSocket from \"reconnecting-websocket\";\n\nconst storage = window.localStorage;\n\nconst WS = (\n URL,\n isAutoconnect,\n onWelcomeReceived,\n onConnectionChanged,\n onSyncMessage,\n onLogout\n) => {\n const rws = new ReconnectingWebSocket(() => URL, [], {\n maxReconnectionDelay: 60000,\n // minReconnectionDelay: 3000,\n startClosed: !isAutoconnect,\n // reconnectionDelayGrowFactor: 1,\n });\n\n rws.addEventListener(\"open\", (event) => {\n console.log(\"ws: open\", event);\n onConnectionChanged(true);\n });\n\n rws.addEventListener(\"message\", (event) => {\n console.log(\"ws: message\", event);\n onMessage(event.data);\n });\n\n rws.addEventListener(\"close\", (event) => {\n console.log(\"ws: close\", event);\n if (event.reason === \"need_auth\") {\n onLogout();\n } else if (!event.wasClean) {\n onConnectionChanged(false);\n }\n });\n\n rws.addEventListener(\"error\", (event) => {\n console.log(\"ws: error\", event);\n onConnectionChanged(false);\n });\n\n // -----------------------------\n const onMessage = (data) => {\n const message = JSON.parse(data);\n switch (message.event) {\n case \"blitz:welcome\":\n onWelcome(message.data?.profile);\n break;\n //no break here, move forward\n case \"blitz:sync_get\":\n if (message.data.done === true) {\n storage.setItem(\"last_sync\", message.data.syncDate);\n storage.setItem(\"last_sync_filters\", message.data.syncDate);\n }\n case \"blitz:sync\": // eslint-disable-line no-fallthrough\n onSyncMessage(message.data);\n break;\n default:\n // console.log(\"ws unknown event, ignoring\");\n break;\n }\n };\n\n function onWelcome(profile) {\n onWelcomeReceived(profile);\n\n const lastSync = storage.getItem(\"last_sync\");\n //TODO remove this\n const lastSyncFilters = storage.getItem(\"last_sync_filters\");\n sendMessage(\n rws,\n lastSync\n ? {\n event: \"blitz:sync_get\",\n data: {\n syncDate: lastSync,\n syncDateFilters: lastSyncFilters,\n },\n }\n : {\n event: \"blitz:sync_get\",\n }\n );\n }\n\n return rws;\n};\n\nfunction sendMessage(socket, message) {\n socket.send(JSON.stringify(message));\n}\n\nexport const sendDataToServer = (socket, toSync) => {\n if (\n toSync.tasks?.length ||\n toSync.projects?.length ||\n toSync.contexts?.length ||\n toSync.tags?.length ||\n toSync.filters?.length\n ) {\n sendMessage(socket, {\n event: \"blitz:sync\",\n data: { ...toSync },\n });\n }\n};\n\nexport default WS;\n","import React, { useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Button, Modal, Container, Row, Col } from \"react-bootstrap\";\nimport { hidePremium } from \"../../../redux/alertSlice\";\nimport Constants from \"../../../utils/constants\";\nimport { logEvent, openUrl } from \"../../../utils/utils\";\n\nconst PremiumDialog = ({ message }) => {\n const dispatch = useDispatch();\n\n const handleClose = () => {\n dispatch(hidePremium());\n };\n\n useEffect(() => {\n logEvent(\"premium_shown\");\n }, []);\n\n return (\n \n \n Blitz PRO\n \n \n
      \n {message}. Upgrade to PRO version in the app to get more freedom:\n
    \n
      📱  Any number of devices with realtime sync
    \n
      🏷️ Unlimited number of Projects, Contexts and Tags
    \n
      ⏰ Up to 5 reminders for a task
    \n
      🎨 Any color picker
    \n
      👍 More features coming soon
    \n
    \n \n \n \n \n openUrl(Constants.link_app_store)}\n >\n App Store\n \n \n \n openUrl(Constants.link_google_play)}\n >\n Google Play\n \n \n \n \n \n
    \n );\n};\n\nexport default PremiumDialog;\n","import React, { useEffect, useState, useRef } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Alert, Button, Modal, Container, Row, Col } from \"react-bootstrap\";\nimport moment from \"moment\";\nimport {\n Android,\n Apple,\n Close,\n DesktopWindows,\n DeviceUnknown,\n} from \"@material-ui/icons\";\nimport { hideDevicesLimitDialog } from \"../../../redux/alertSlice\";\nimport { selectDeviceId, selectToken } from \"../../../redux/authSlice\";\nimport Constants from \"../../../utils/constants\";\nimport { formatDate, formatTime } from \"../../../utils/dateUtils\";\nimport { logEvent, openUrl } from \"../../../utils/utils\";\nimport { useApiLogout } from \"../../../app/api\";\n\nconst DeviceItem = ({ device, onDelete, onLogout }) => {\n const currentDeviceId = useSelector(selectDeviceId);\n const [isDeleting, setIsDeleting] = useState(false);\n\n const token = useSelector(selectToken);\n\n const deviceIcon = (origin) => {\n switch (origin) {\n case \"web\":\n return ;\n case \"android\":\n return ;\n case \"ios\":\n return ;\n default:\n return ;\n }\n };\n\n const deviceTitle = (device) => {\n const suffix = device.deviceId === currentDeviceId ? \" (current)\" : \"\";\n\n return (\n
    \n {(device.info?.length == 0 ? device.origin : device.info) + suffix}\n
    \n );\n };\n\n const deviceLastSync = (date) => {\n const lastSyncDate = moment(date);\n return (\n
    \n {formatDate(lastSyncDate)} {formatTime(date)}\n
    \n );\n };\n\n const deleteDevice = (deviceId) => {\n setIsDeleting(!isDeleting);\n\n const headers = new Headers({\n Origin2: \"web@\" + currentDeviceId,\n \"X-Auth-Token\": token,\n });\n\n fetch(`${process.env.REACT_APP_BASE_URL}/api/v1/auth/unlinkdevice`, {\n method: \"POST\",\n mode: \"cors\",\n headers: headers,\n body: JSON.stringify({\n deviceId: deviceId,\n }),\n })\n .then((response) => {\n if (response.ok) {\n if (deviceId === currentDeviceId) {\n onLogout();\n } else {\n onDelete(deviceId);\n }\n } else {\n throw new Error(\"UnlinkDevice request is not ok\");\n }\n })\n .catch((error) => {\n console.log(error);\n setIsDeleting(false);\n onDelete(null);\n });\n };\n\n return (\n \n \n {deviceIcon(device.origin)}\n
    \n {deviceTitle(device)}\n {deviceLastSync(device.lastSync)}\n
    \n {isDeleting ? (\n
    \n ) : (\n deleteDevice(device.deviceId)}\n />\n )}\n \n \n );\n};\n\nconst LimitDevicesDialog = ({ data }) => {\n const dispatch = useDispatch();\n\n const [devices, setDevices] = useState(data.devices);\n const [hasErrorDeleting, setHasErrorDeleting] = useState(false);\n\n const [isLoggedIn, setLoggedIn] = useState(true);\n\n useApiLogout(isLoggedIn, true);\n\n const handleClose = () => {\n dispatch(hideDevicesLimitDialog());\n };\n\n const removeAlertTimeout = useRef(null);\n\n useEffect(() => {\n logEvent(\"limit_devices_shown\");\n return () => {\n clearTimeout(removeAlertTimeout.current);\n };\n }, []);\n\n return (\n \n \n Blitz PRO\n \n \n
      \n You can use only {data.limit} active devices in free version. Please,\n remove some devices or upgrade to PRO in the app\n
    \n {devices.map((item, index) => (\n {\n if (deviceId) {\n if (devices.length - 1 > data.limit) {\n setDevices(\n devices.filter((device) => device.deviceId !== deviceId)\n );\n } else {\n dispatch(hideDevicesLimitDialog());\n }\n } else {\n clearTimeout(removeAlertTimeout.current);\n setHasErrorDeleting(true);\n removeAlertTimeout.current = setTimeout(\n () => setHasErrorDeleting(false),\n 2000\n );\n }\n }}\n onLogout={() => {\n setLoggedIn(false);\n dispatch(hideDevicesLimitDialog());\n }}\n />\n ))}\n {hasErrorDeleting ? (\n \n Error deleting device. Try again\n \n ) : null}\n
    \n \n \n \n \n openUrl(Constants.link_app_store)}\n >\n App Store\n \n \n \n openUrl(Constants.link_google_play)}\n >\n Google Play\n \n \n \n \n \n
    \n );\n};\n\nexport default LimitDevicesDialog;\n","import React, { useEffect, useState, useRef } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { useIndexedDB } from \"react-indexed-db\";\r\nimport Constants from \"./utils/constants\";\r\nimport {\r\n dataLoadedFromDb,\r\n selectPctSynced,\r\n selectDataToSync,\r\n selectTask,\r\n selectSelectedTasksCount,\r\n} from \"./redux/dataSlice\";\r\nimport { selectDeviceId, selectToken } from \"./redux/authSlice\";\r\nimport Details from \"./features/components/Details\";\r\nimport { Header } from \"./features/components/Header\";\r\nimport Nav from \"./features/components/Nav\";\r\nimport NewTaskInput from \"./features/components/NewTaskInput\";\r\nimport TasksList from \"./features/components/TasksList\";\r\nimport Filter from \"./features/components/Filter\";\r\nimport Loader from \"./features/components/Loader\";\r\nimport { Alert } from \"./features/components/Alert\";\r\nimport { useApiLogout } from \"./app/api\";\r\nimport WS from \"./app/ws\";\r\nimport { sendDataToServer } from \"./app/ws\";\r\nimport {\r\n showAlert,\r\n hideAlert,\r\n selectAlert,\r\n showDevicesLimitDialog,\r\n} from \"./redux/alertSlice\";\r\nimport { dataGetFromServer } from \"./redux/dataSlice\";\r\nimport { saveProfile } from \"./redux/authSlice\";\r\nimport PremiumDialog from \"./features/components/dialogs/PremiumDialog\";\r\nimport LimitDevicesDialog from \"./features/components/dialogs/LimitDevicesDialog\";\r\n\r\nexport function Content() {\r\n const deviceId = useSelector(selectDeviceId);\r\n const token = useSelector(selectToken);\r\n\r\n const [error, setError] = useState(null);\r\n const [status, setStatus] = useState(null);\r\n\r\n const [isReconnecting, setReconnecting] = useState(false);\r\n\r\n const [reconnect, setReconnect] = useState(1);\r\n\r\n const [isLoggedIn, setLoggedIn] = useState(true);\r\n useApiLogout(isLoggedIn, true);\r\n\r\n const dispatch = useDispatch();\r\n\r\n const projectDB = useIndexedDB(Constants.table_projects);\r\n const contextDB = useIndexedDB(Constants.table_contexts);\r\n const tagDB = useIndexedDB(Constants.table_tags);\r\n const filtersDB = useIndexedDB(Constants.table_user_filters);\r\n\r\n const synced = useSelector(selectPctSynced);\r\n const toSync = useSelector(selectDataToSync);\r\n const syncTimeout = useRef(null);\r\n\r\n const isConnected = useRef(false);\r\n const isVisible = useRef(true);\r\n const webSocket = useRef(null);\r\n\r\n const selectedTasksCount = useSelector(selectSelectedTasksCount);\r\n const alert = useSelector(selectAlert);\r\n\r\n useEffect(() => {\r\n projectDB.getAll().then((data) => {\r\n dispatch(\r\n dataLoadedFromDb({ type: Constants.table_projects, data: data })\r\n );\r\n });\r\n contextDB.getAll().then((data) => {\r\n dispatch(\r\n dataLoadedFromDb({ type: Constants.table_contexts, data: data })\r\n );\r\n });\r\n tagDB.getAll().then((data) => {\r\n dispatch(dataLoadedFromDb({ type: Constants.table_tags, data: data }));\r\n });\r\n filtersDB.getAll().then((data) => {\r\n dispatch(\r\n dataLoadedFromDb({ type: Constants.table_user_filters, data: data })\r\n );\r\n });\r\n }, [synced]);\r\n\r\n useEffect(() => {\r\n clearTimeout(syncTimeout.current);\r\n\r\n if (\r\n webSocket.current &&\r\n (toSync.tasks?.length ||\r\n toSync.projects?.length ||\r\n toSync.contexts?.length ||\r\n toSync.tags?.length ||\r\n toSync.filters?.length)\r\n ) {\r\n syncTimeout.current = setTimeout(\r\n () => sendDataToServer(webSocket.current, toSync),\r\n Constants.sync_delay\r\n );\r\n }\r\n return () => {\r\n clearTimeout(syncTimeout.current);\r\n };\r\n }, [toSync]);\r\n\r\n const URL = `${process.env.REACT_APP_BASE_URL.replace(\"https\", \"wss\").replace(\r\n \"http\",\r\n \"ws\"\r\n )}/api/v2/sync?Origin2=web@${deviceId}&X-Auth-Token=${token}`;\r\n\r\n const onConnectionStateChanged = (isConnectionOpen) => {\r\n isConnected.current = isConnectionOpen;\r\n if (isConnectionOpen) {\r\n setError(null);\r\n setReconnecting(false);\r\n dispatch(hideAlert());\r\n sendDataToServer(webSocket.current, toSync);\r\n } else {\r\n if (!isVisible.current && webSocket.current) {\r\n webSocket.current.close();\r\n }\r\n console.log(\"--- CONNECTION ERROR. isReconnecting: \", isReconnecting);\r\n if (isReconnecting && isVisible.current) {\r\n dispatch(\r\n showAlert({\r\n text: \"Connection error\",\r\n type: \"danger\",\r\n dismissable: false,\r\n })\r\n );\r\n } else {\r\n setReconnecting(true);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (webSocket.current) {\r\n webSocket.current.close();\r\n }\r\n\r\n webSocket.current = WS(\r\n URL,\r\n document.hasFocus(),\r\n (profile) => {\r\n if (profile.limitDevices) {\r\n dispatch(showDevicesLimitDialog(profile.limitDevices));\r\n delete profile[\"limitDevices\"];\r\n }\r\n dispatch(saveProfile(profile));\r\n },\r\n (isConnectionOpen) => {\r\n onConnectionStateChanged(isConnectionOpen);\r\n },\r\n (data) => {\r\n dispatch(dataGetFromServer(data));\r\n },\r\n () => {\r\n setLoggedIn(false);\r\n }\r\n );\r\n setStatus(\"OK\");\r\n // webSocket.current.\r\n return () => {\r\n webSocket.current.close();\r\n webSocket.current = null;\r\n };\r\n }, [reconnect]);\r\n\r\n const onFocus = () => {\r\n isVisible.current = true;\r\n if (!isConnected.current) {\r\n setReconnect(reconnect + 1);\r\n }\r\n };\r\n\r\n const onBlur = () => {\r\n isVisible.current = false;\r\n if (isConnected.current && webSocket.current) {\r\n // webSocket.current.close();\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener(\"focus\", onFocus);\r\n window.addEventListener(\"blur\", onBlur);\r\n return () => {\r\n window.removeEventListener(\"focus\", onFocus);\r\n window.removeEventListener(\"blur\", onBlur);\r\n };\r\n });\r\n\r\n const onKeyUp = (event) => {\r\n if (event.key === \"Escape\" && selectSelectedTasksCount !== 0) {\r\n dispatch(selectTask(null));\r\n } else if (event.key === \"N\" && selectedTasksCount === 0) {\r\n //TODO Create new task. Consider inputs\r\n // dispatch(selectTask({}));\r\n } else if (event.key === \"Q\") {\r\n //TODO: focus new task input\r\n }\r\n };\r\n\r\n if (error) {\r\n return (\r\n \r\n {/* Error */}\r\n {/* {reconnecting ? ( */}\r\n \r\n Reconnecting in 5 seconds\r\n \r\n {/* ) : null} */}\r\n
    \r\n );\r\n } else if (webSocket.current == null || status == null) {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n } else {\r\n return (\r\n // order matters for shadows\r\n
    \r\n {alert.premiumMessage ? (\r\n \r\n ) : null}\r\n {alert.limitDevices ? (\r\n \r\n ) : null}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n","import React from \"react\";\r\nimport \"./styles/react_bootstrap_overrides.scss\";\r\nimport \"./App.scss\";\r\nimport { Theme as ThemeLight } from \"./styles/theme_light\";\r\nimport { Theme as ThemeDark } from \"./styles/theme_dark\";\r\nimport { useSelector } from \"react-redux\";\r\nimport Login from \"./features/auth/Login\";\r\nimport { Content } from \"./Content\";\r\nimport { selectToken } from \"./redux/authSlice\";\r\nimport { selectPrefsThemeIsDark, selectPrefsAccent } from \"./redux/prefsSlice\";\r\n\r\nimport moment from \"moment\";\r\nimport \"moment/locale/pt-br\";\r\nimport \"moment/locale/de\";\r\nimport \"moment/locale/ru\";\r\nimport \"moment/locale/en-gb\";\r\n\r\nexport function App() {\r\n var locale = navigator.language || navigator.userLanguage;\r\n if (locale) {\r\n locale = locale.toLowerCase();\r\n if (locale.includes(\"ru\")) {\r\n moment.locale(\"ru\");\r\n } else if (locale.includes(\"de\")) {\r\n moment.locale(\"de\");\r\n } else if (locale.includes(\"br\")) {\r\n moment.locale(\"pt-br\");\r\n } else if (locale.includes(\"us\") || locale.includes(\"ca\")) {\r\n moment.locale(\"en\");\r\n } else {\r\n moment.locale(\"en-gb\");\r\n }\r\n } else {\r\n moment.locale(\"en-gb\");\r\n }\r\n\r\n const isDarkTheme = useSelector(selectPrefsThemeIsDark);\r\n const accent = useSelector(selectPrefsAccent);\r\n\r\n for (const [key, value] of Object.entries(\r\n isDarkTheme ? ThemeDark : ThemeLight\r\n )) {\r\n document.documentElement.style.setProperty(key, value);\r\n }\r\n\r\n document.documentElement.style.setProperty(\"--accent\", accent);\r\n\r\n const token = useSelector(selectToken);\r\n\r\n if (token) {\r\n return ;\r\n } else {\r\n return ;\r\n }\r\n}\r\n","import { configureStore, getDefaultMiddleware } from \"@reduxjs/toolkit\";\r\nimport appStateReducer from \"../redux/appStateSlice\";\r\nimport dataReducer from \"../redux/dataSlice\";\r\nimport alertReducer from \"../redux/alertSlice\";\r\nimport authReducer from \"../redux/authSlice\";\r\nimport filterReducer from \"../redux/filterSlice\";\r\nimport prefsReducer from \"../redux/prefsSlice\";\r\n\r\nexport default configureStore({\r\n reducer: {\r\n appState: appStateReducer,\r\n data: dataReducer,\r\n alert: alertReducer,\r\n auth: authReducer,\r\n filter: filterReducer,\r\n prefs: prefsReducer,\r\n },\r\n middleware: [...getDefaultMiddleware()],\r\n});\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport \"./index.scss\";\r\nimport { App } from \"./App\";\r\nimport store from \"./app/store\";\r\nimport { Provider } from \"react-redux\";\r\nimport * as serviceWorker from \"./serviceWorker\";\r\nimport firebase from \"firebase/app\";\r\nimport \"firebase/analytics\";\r\nimport { isDevelopment } from \"./utils/utils\";\r\n\r\nif (!isDevelopment()) {\r\n console.log = () => {};\r\n\r\n var firebaseConfig = {\r\n apiKey: \"AIzaSyBVY9xPRe3evi3DYX5tzvbwFgZ7MK5WMBI\",\r\n projectId: \"blitz-af27b\",\r\n // messagingSenderId: \"419174467846\",\r\n appId: \"1:419174467846:web:2eb815905e8d21ec8d7687\",\r\n measurementId: \"G-6V3PXHXME0\",\r\n };\r\n firebase.initializeApp(firebaseConfig);\r\n}\r\n\r\nReactDOM.render(\r\n // \r\n \r\n \r\n ,\r\n // ,\r\n document.getElementById(\"root\")\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n","module.exports = {\n table_tasks: \"tasks\",\n table_user_filters: \"filters\",\n table_projects: \"projects\",\n table_contexts: \"contexts\",\n table_tags: \"tags\",\n\n free_user_filters: 1,\n free_projects: 3,\n free_contexts: 3,\n free_tags: 10,\n free_reminders: 1,\n\n date_format: \"YYYY-MM-DD HH:mm:ss\",\n\n max_subtasks: 100,\n tasks_portion_size: 50,\n\n repeat_next_preview: 6,\n\n sync_delay: 1000,\n refresh_list_when_typing_delay: 500,\n refresh_subtask_when_typing_delay: 500,\n\n id_adding_project: -101,\n id_adding_context: -102,\n id_adding_tag: -103,\n id_adding_user_filters: -104,\n\n weekdays: \"1234567\",\n\n rank_start: \"aaaa\",\n rank_end: \"zzzz\",\n alphabet_size: 26,\n\n link_google_play:\n \"https://play.google.com/store/apps/details?id=com.qwertywayapps.tasks&referrer=utm_source%3Dapp.blitz.do%26utm_medium%3Ddialog\",\n link_app_store: \"https://apps.apple.com/app/id1463093832\",\n\n default_colors: [\n \"#F44336\",\n \"#E91E63\",\n \"#9C27B0\",\n \"#673AB7\",\n \"#3F51B5\",\n \"#2196F3\",\n \"#03A9F4\",\n \"#00BCD4\",\n \"#009688\",\n \"#4CAF50\",\n \"#8BC34A\",\n \"#CDDC39\",\n \"#FFC107\",\n \"#FF9800\",\n \"#FF5722\",\n \"#795548\",\n \"#607D8B\",\n \"#20242B\",\n \"#ffffff\",\n ],\n\n test_users: [\n \"qwertyway@gmail.com\",\n \"artem@whisperarts.com\",\n \"artem2@whisperarts.com\",\n \"nykmen@gmail.com\",\n \"nykmen@mail.ru\",\n ],\n};\n"],"sourceRoot":""}