{"version":3,"sources":["paths.ts","actions/settingsActions.ts","components/TablePaginationActions.tsx","api.ts","utils.ts","actions/queuesActions.ts","actions/queueStatsActions.ts","components/QueueSizeChart.tsx","components/ProcessedTasksChart.tsx","components/DeleteQueueConfirmationDialog.tsx","types/table.ts","components/QueuesOverviewTable.tsx","components/Tooltip.tsx","components/SplitButton.tsx","hooks/index.tsx","components/DailyStatsChart.tsx","views/DashboardView.tsx","reducers/settingsReducer.ts","theme.tsx","actions/snackbarActions.ts","components/ListItemLink.tsx","components/SyntaxHighlighter.tsx","actions/schedulerEntriesActions.ts","reducers/schedulerEntriesReducer.ts","components/SchedulerEnqueueEventsTable.tsx","components/SchedulerEntriesTable.tsx","views/SchedulersView.tsx","actions/tasksActions.ts","components/TableActions.tsx","components/ActiveTasksTable.tsx","components/PendingTasksTable.tsx","components/ScheduledTasksTable.tsx","components/RetryTasksTable.tsx","components/ArchivedTasksTable.tsx","components/CompletedTasksTable.tsx","components/TasksTable.tsx","components/QueueInfoBanner.tsx","components/QueueBreadcrumb.tsx","views/TasksView.tsx","views/TaskDetailsView.tsx","views/SettingsView.tsx","components/ServersTable.tsx","actions/serversActions.ts","views/ServersView.tsx","actions/redisInfoActions.ts","components/QueueLocationTable.tsx","views/RedisInfoView.tsx","actions/metricsActions.ts","components/QueueMetricsChart.tsx","components/MetricsFetchControls.tsx","views/MetricsView.tsx","views/PageNotFoundView.tsx","App.tsx","reducers/queuesReducer.ts","reducers/tasksReducer.ts","reducers/serversReducer.ts","reducers/snackbarReducer.ts","reducers/queueStatsReducer.ts","reducers/redisInfoReducer.ts","reducers/metricsReducer.ts","localStorage.ts","store.ts","serviceWorker.ts","index.tsx"],"names":["paths","HOME","window","ROOT_PATH","SETTINGS","SERVERS","SCHEDULERS","QUEUE_DETAILS","REDIS","TASK_DETAILS","QUEUE_METRICS","queueDetailsPath","qname","taskStatus","path","replace","taskDetailsPath","taskId","POLL_INTERVAL_CHANGE","THEME_PREFERENCE_CHANGE","TOGGLE_DRAWER","TASK_ROWS_PER_PAGE_CHANGE","DAILY_STATS_KEY_CHANGE","taskRowsPerPageChange","value","type","useStyles","makeStyles","theme","createStyles","root","flexShrink","marginLeft","spacing","TablePaginationActions","props","classes","useTheme","count","page","rowsPerPage","onPageChange","className","IconButton","onClick","event","disabled","aria-label","direction","Math","ceil","max","rowsPerPageOptions","BASE_URL","listQueues","a","axios","method","url","resp","data","deleteQueue","pauseQueue","resumeQueue","listQueueStats","getTaskInfo","id","listActiveTasks","pageOpts","queryString","stringify","cancelActiveTask","cancelAllActiveTasks","batchCancelActiveTasks","taskIds","task_ids","listPendingTasks","listScheduledTasks","listRetryTasks","listArchivedTasks","listCompletedTasks","archivePendingTask","batchArchivePendingTasks","archiveAllPendingTasks","deletePendingTask","batchDeletePendingTasks","deleteAllPendingTasks","runScheduledTask","archiveScheduledTask","deleteScheduledTask","batchDeleteScheduledTasks","deleteAllScheduledTasks","batchRunScheduledTasks","runAllScheduledTasks","batchArchiveScheduledTasks","archiveAllScheduledTasks","runRetryTask","archiveRetryTask","deleteRetryTask","batchDeleteRetryTasks","deleteAllRetryTasks","batchRunRetryTasks","runAllRetryTasks","batchArchiveRetryTasks","archiveAllRetryTasks","runArchivedTask","deleteArchivedTask","batchDeleteArchivedTasks","deleteAllArchivedTasks","batchRunArchivedTasks","runAllArchivedTasks","deleteCompletedTask","batchDeleteCompletedTasks","deleteAllCompletedTasks","listServers","listSchedulerEntries","listSchedulerEnqueueEvents","entryId","getRedisInfo","getMetrics","endTime","duration","queues","params","endtime","length","join","toErrorStringWithHttpStatus","error","response","status","statusText","toErrorString","durationFromSeconds","totalSeconds","hour","floor","minute","second","durationBetween","start","end","durationInMillisec","stringifyDuration","d","n","durationBefore","timestamp","Date","parse","now","timeAgo","timeAgoUnix","console","unixtime","uuidPrefix","uuid","idx","indexOf","substr","percentage","numerator","denominator","perc","toFixed","prettifyPayload","p","JSON","isJsonPayload","currentUnixtime","durationRegex","LIST_QUEUES_BEGIN","LIST_QUEUES_SUCCESS","LIST_QUEUES_ERROR","DELETE_QUEUE_BEGIN","DELETE_QUEUE_SUCCESS","DELETE_QUEUE_ERROR","PAUSE_QUEUE_BEGIN","PAUSE_QUEUE_SUCCESS","PAUSE_QUEUE_ERROR","RESUME_QUEUE_BEGIN","RESUME_QUEUE_SUCCESS","RESUME_QUEUE_ERROR","listQueuesAsync","dispatch","payload","deleteQueueAsync","queue","LIST_QUEUE_STATS_BEGIN","LIST_QUEUE_STATS_SUCCESS","LIST_QUEUE_STATS_ERROR","QueueSizeChart","history","useHistory","ResponsiveContainer","maxBarSize","allQueues","map","b","activeLabel","includes","push","style","cursor","CartesianGrid","strokeDasharray","XAxis","dataKey","stroke","palette","text","secondary","YAxis","Tooltip","Legend","Bar","stackId","fill","ProcessedTasksChart","success","light","connector","SortDirection","connect","state","ownProps","requestPending","q","find","name","undefined","Dialog","open","onClose","aria-labelledby","aria-describedby","size","DialogTitle","DialogContent","DialogContentText","DialogActions","Button","color","autoFocus","SortBy","table","minWidth","fixedCell","position","zIndex","left","background","paper","colConfigs","label","key","sortBy","Queue","align","State","Size","MemoryUsage","Processed","Failed","ErrorRate","None","sortQueues","cmpFn","copy","sort","QueuesOverviewTable","useState","setSortBy","Asc","sortDir","setSortDir","queueToDelete","setQueueToDelete","Fragment","TableContainer","Table","TableHead","TableRow","cfg","i","TableCell","clsx","TableSortLabel","active","sortKey","e","nextSortDir","Desc","TableBody","q1","q2","isQ1Smaller","paused","memory_usage_bytes","processed","failed","q1ErrorRate","q2ErrorRate","Row","onPauseClick","onResumeClick","onDeleteClick","useRowStyles","row","borderBottomWidth","linkText","textDecoration","primary","textGreen","dark","textRed","boldCell","fontWeight","actionIconsContainer","display","justifyContent","showIcons","setShowIcons","component","scope","to","prettyBytes","onMouseEnter","onMouseLeave","title","fontSize","withStyles","tooltip","backgroundColor","maxWidth","typography","pxToRem","border","popper","buttonContained","isDarkTheme","default","action","hover","SplitButton","React","setOpen","anchorRef","useRef","initialSelectedKey","selectedKey","setSelectedKey","handleClose","current","contains","target","selectedOpt","options","opt","ButtonGroup","variant","ref","disableElevation","contained","aria-controls","aria-expanded","aria-haspopup","prevOpen","Popper","anchorEl","role","transition","disablePortal","TransitionProps","placement","Grow","transformOrigin","Paper","ClickAwayListener","onClickAway","MenuList","MenuItem","selected","onSelect","usePolling","doFn","interval","useEffect","setInterval","clearInterval","useQuery","search","useLocation","useMemo","URLSearchParams","DailyStatsChart","queueStats","numDays","dataByDate","stat","hasOwnProperty","date","succeeded","Object","values","sortByDate","slice","makeChartData","LineChart","minTickGap","Line","main","x","y","container","paddingTop","paddingBottom","padding","overflow","flexDirection","chartHeader","alignItems","marginBottom","chartHeaderTitle","chartContainer","width","height","infoIcon","grey","tooltipSection","tableContainer","mapDispatchToProps","pauseQueueAsync","resumeQueueAsync","listQueueStatsAsync","dailyStatsKeyChange","ThemePreference","loading","currentStats","pollInterval","settings","dailyStatsKey","dailyStatsChartType","qnames","processedStats","Container","Grid","item","xs","Alert","severity","AlertTitle","Typography","initialState","themePreference","SystemDefault","isDrawerOpen","taskRowsPerPage","settingsReducer","CLOSE_SNACKBAR","listItem","borderTopRightRadius","borderBottomRightRadius","selectedText","selectedIcon","ListItemLink","icon","isMatch","useRouteMatch","strict","sensitive","exact","renderLink","forwardRef","itemProps","ListItem","button","ListItemIcon","ListItemText","SyntaxHighlighter","styleDark","styleLight","language","customStyle","children","LIST_SCHEDULER_ENTRIES_BEGIN","LIST_SCHEDULER_ENTRIES_SUCCESS","LIST_SCHEDULER_ENTRIES_ERROR","LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN","LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS","LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR","getEnqueueEventsEntry","enqueueEventsByEntryId","schedulerEntriesReducer","entries","entry","sortByEnqueuedAt","e1","e2","enqueued_at","newData","uniqBy","events","stickyHeaderCell","schedulerEntries","listSchedulerEnqueueEventsAsync","stickyHeader","task_id","noBorder","modal","modalContent","outline","borderRadius","shape","eventsTable","maxHeight","EntryId","Spec","Type","Payload","Options","NextEnqueue","PrevEnqueue","sortEntries","SchedulerEntriesTable","activeEntryId","setActiveEntryId","isE1Smaller","spec","task_type","task_payload","next_enqueue_at","e1PrevEnqueueAt","prev_enqueue_at","e2PrevEnqueueAt","isLastRow","onShowHistoryClick","Modal","gutterBottom","rowRoot","borderBottom","heading","paddingLeft","listSchedulerEntriesAsync","GET_TASK_INFO_BEGIN","GET_TASK_INFO_SUCCESS","GET_TASK_INFO_ERROR","LIST_ACTIVE_TASKS_BEGIN","LIST_ACTIVE_TASKS_SUCCESS","LIST_ACTIVE_TASKS_ERROR","LIST_PENDING_TASKS_BEGIN","LIST_PENDING_TASKS_SUCCESS","LIST_PENDING_TASKS_ERROR","LIST_SCHEDULED_TASKS_BEGIN","LIST_SCHEDULED_TASKS_SUCCESS","LIST_SCHEDULED_TASKS_ERROR","LIST_RETRY_TASKS_BEGIN","LIST_RETRY_TASKS_SUCCESS","LIST_RETRY_TASKS_ERROR","LIST_ARCHIVED_TASKS_BEGIN","LIST_ARCHIVED_TASKS_SUCCESS","LIST_ARCHIVED_TASKS_ERROR","LIST_COMPLETED_TASKS_BEGIN","LIST_COMPLETED_TASKS_SUCCESS","LIST_COMPLETED_TASKS_ERROR","CANCEL_ACTIVE_TASK_BEGIN","CANCEL_ACTIVE_TASK_SUCCESS","CANCEL_ACTIVE_TASK_ERROR","CANCEL_ALL_ACTIVE_TASKS_BEGIN","CANCEL_ALL_ACTIVE_TASKS_SUCCESS","CANCEL_ALL_ACTIVE_TASKS_ERROR","BATCH_CANCEL_ACTIVE_TASKS_BEGIN","BATCH_CANCEL_ACTIVE_TASKS_SUCCESS","BATCH_CANCEL_ACTIVE_TASKS_ERROR","RUN_SCHEDULED_TASK_BEGIN","RUN_SCHEDULED_TASK_SUCCESS","RUN_SCHEDULED_TASK_ERROR","RUN_RETRY_TASK_BEGIN","RUN_RETRY_TASK_SUCCESS","RUN_RETRY_TASK_ERROR","RUN_ARCHIVED_TASK_BEGIN","RUN_ARCHIVED_TASK_SUCCESS","RUN_ARCHIVED_TASK_ERROR","DELETE_PENDING_TASK_BEGIN","DELETE_PENDING_TASK_SUCCESS","DELETE_PENDING_TASK_ERROR","ARCHIVE_PENDING_TASK_BEGIN","ARCHIVE_PENDING_TASK_SUCCESS","ARCHIVE_PENDING_TASK_ERROR","DELETE_SCHEDULED_TASK_BEGIN","DELETE_SCHEDULED_TASK_SUCCESS","DELETE_SCHEDULED_TASK_ERROR","ARCHIVE_SCHEDULED_TASK_BEGIN","ARCHIVE_SCHEDULED_TASK_SUCCESS","ARCHIVE_SCHEDULED_TASK_ERROR","ARCHIVE_RETRY_TASK_BEGIN","ARCHIVE_RETRY_TASK_SUCCESS","ARCHIVE_RETRY_TASK_ERROR","BATCH_ARCHIVE_PENDING_TASKS_BEGIN","BATCH_ARCHIVE_PENDING_TASKS_SUCCESS","BATCH_ARCHIVE_PENDING_TASKS_ERROR","BATCH_DELETE_PENDING_TASKS_BEGIN","BATCH_DELETE_PENDING_TASKS_SUCCESS","BATCH_DELETE_PENDING_TASKS_ERROR","DELETE_ALL_PENDING_TASKS_BEGIN","DELETE_ALL_PENDING_TASKS_SUCCESS","DELETE_ALL_PENDING_TASKS_ERROR","ARCHIVE_ALL_PENDING_TASKS_BEGIN","ARCHIVE_ALL_PENDING_TASKS_SUCCESS","ARCHIVE_ALL_PENDING_TASKS_ERROR","BATCH_RUN_SCHEDULED_TASKS_BEGIN","BATCH_RUN_SCHEDULED_TASKS_SUCCESS","BATCH_RUN_SCHEDULED_TASKS_ERROR","BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN","BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS","BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR","BATCH_DELETE_SCHEDULED_TASKS_BEGIN","BATCH_DELETE_SCHEDULED_TASKS_SUCCESS","BATCH_DELETE_SCHEDULED_TASKS_ERROR","RUN_ALL_SCHEDULED_TASKS_BEGIN","RUN_ALL_SCHEDULED_TASKS_SUCCESS","RUN_ALL_SCHEDULED_TASKS_ERROR","ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN","ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS","ARCHIVE_ALL_SCHEDULED_TASKS_ERROR","DELETE_ALL_SCHEDULED_TASKS_BEGIN","DELETE_ALL_SCHEDULED_TASKS_SUCCESS","DELETE_ALL_SCHEDULED_TASKS_ERROR","DELETE_RETRY_TASK_BEGIN","DELETE_RETRY_TASK_SUCCESS","DELETE_RETRY_TASK_ERROR","BATCH_RUN_RETRY_TASKS_BEGIN","BATCH_RUN_RETRY_TASKS_SUCCESS","BATCH_RUN_RETRY_TASKS_ERROR","BATCH_ARCHIVE_RETRY_TASKS_BEGIN","BATCH_ARCHIVE_RETRY_TASKS_SUCCESS","BATCH_ARCHIVE_RETRY_TASKS_ERROR","BATCH_DELETE_RETRY_TASKS_BEGIN","BATCH_DELETE_RETRY_TASKS_SUCCESS","BATCH_DELETE_RETRY_TASKS_ERROR","RUN_ALL_RETRY_TASKS_BEGIN","RUN_ALL_RETRY_TASKS_SUCCESS","RUN_ALL_RETRY_TASKS_ERROR","ARCHIVE_ALL_RETRY_TASKS_BEGIN","ARCHIVE_ALL_RETRY_TASKS_SUCCESS","ARCHIVE_ALL_RETRY_TASKS_ERROR","DELETE_ALL_RETRY_TASKS_BEGIN","DELETE_ALL_RETRY_TASKS_SUCCESS","DELETE_ALL_RETRY_TASKS_ERROR","DELETE_ARCHIVED_TASK_BEGIN","DELETE_ARCHIVED_TASK_SUCCESS","DELETE_ARCHIVED_TASK_ERROR","BATCH_RUN_ARCHIVED_TASKS_BEGIN","BATCH_RUN_ARCHIVED_TASKS_SUCCESS","BATCH_RUN_ARCHIVED_TASKS_ERROR","BATCH_DELETE_ARCHIVED_TASKS_BEGIN","BATCH_DELETE_ARCHIVED_TASKS_SUCCESS","BATCH_DELETE_ARCHIVED_TASKS_ERROR","RUN_ALL_ARCHIVED_TASKS_BEGIN","RUN_ALL_ARCHIVED_TASKS_SUCCESS","RUN_ALL_ARCHIVED_TASKS_ERROR","DELETE_ALL_ARCHIVED_TASKS_BEGIN","DELETE_ALL_ARCHIVED_TASKS_SUCCESS","DELETE_ALL_ARCHIVED_TASKS_ERROR","DELETE_COMPLETED_TASK_BEGIN","DELETE_COMPLETED_TASK_SUCCESS","DELETE_COMPLETED_TASK_ERROR","DELETE_ALL_COMPLETED_TASKS_BEGIN","DELETE_ALL_COMPLETED_TASKS_SUCCESS","DELETE_ALL_COMPLETED_TASKS_ERROR","BATCH_DELETE_COMPLETED_TASKS_BEGIN","BATCH_DELETE_COMPLETED_TASKS_SUCCESS","BATCH_DELETE_COMPLETED_TASKS_ERROR","actionsContainer","moreIcon","marginRight","iconGroup","borderLeft","TableActions","menuAnchor","setMenuAnchor","closeMenu","currentTarget","keepMounted","Boolean","menuItemActions","showIconButtons","iconButtonActions","alert","borderTopLeftRadius","pagination","listActiveTasksAsync","cancelActiveTaskAsync","batchCancelActiveTasksAsync","cancelAllActiveTasksAsync","columns","tasks","activeTasks","batchActionPending","allActionPending","pageSize","boxShadow","shadows","borderBottomColor","task","isSelected","stopPropagation","Checkbox","onChange","onSelectChange","checked","margin","canceling","start_time","deadline","onActionCellEnter","onActionCellLeave","showActions","onCancelClick","setPage","selectedIds","setSelectedIds","activeTaskId","setActiveTaskId","useCallback","rowCount","numSelected","then","indeterminate","newSelected","t","inputProps","col","concat","filter","TableFooter","TablePagination","colSpan","SelectProps","native","newPage","onRowsPerPageChange","parseInt","ActionsComponent","listPendingTasksAsync","deletePendingTaskAsync","batchDeletePendingTasksAsync","deleteAllPendingTasksAsync","deleted","archivePendingTaskAsync","batchArchivePendingTasksAsync","archiveAllPendingTasksAsync","pendingTasks","actionCell","actionButton","retried","max_retry","onArchiveClick","totalTaskCount","listScheduledTasksAsync","batchDeleteScheduledTasksAsync","batchRunScheduledTasksAsync","batchArchiveScheduledTasksAsync","deleteAllScheduledTasksAsync","runAllScheduledTasksAsync","archiveAllScheduledTasksAsync","deleteScheduledTaskAsync","runScheduledTaskAsync","archiveScheduledTaskAsync","scheduledTasks","next_process_at","onRunClick","batchDeleteRetryTasksAsync","batchRunRetryTasksAsync","batchArchiveRetryTasksAsync","deleteAllRetryTasksAsync","runAllRetryTasksAsync","archiveAllRetryTasksAsync","listRetryTasksAsync","deleteRetryTaskAsync","runRetryTaskAsync","archiveRetryTaskAsync","retryTasks","error_message","listArchivedTasksAsync","runArchivedTaskAsync","runAllArchivedTasksAsync","deleteArchivedTaskAsync","deleteAllArchivedTasksAsync","batchRunArchivedTasksAsync","batchDeleteArchivedTasksAsync","archivedTasks","last_failed_at","listCompletedTasksAsync","deleteCompletedTaskAsync","deleteAllCompletedTasksAsync","batchDeleteCompletedTasksAsync","completedTasks","completed_at","result","ttl_seconds","TabPanel","other","hidden","flex","overflowY","queueInfo","pending","scheduled","retry","archived","completed","header","paddingRight","chip","taskcount","textAlign","searchbar","searchIcon","pointerEvents","inputRoot","inputInput","chips","searchQuery","setSearchQuery","c","Chip","InputBase","placeholder","input","onKeyDown","trim","banner","bannerItem","flexGrow","divider","StyledBreadcrumb","fontWeightRegular","emphasize","QueueBreadcrumbs","setAnchorEl","handleClick","preventDefault","Breadcrumbs","Link","queueName","deleteIcon","onDelete","breadcrumbs","tasksTable","validStatus","useParams","get","taskInfo","getTaskInfoAsync","marginTop","infoRow","infoKeyCell","infoValueCell","footer","md","timeout_seconds","startIcon","goBack","formControl","selectEmpty","select","pollIntervalChange","selectTheme","sliderValue","setSliderValue","justify","Slider","val","onChangeCommitted","valueLabelDisplay","step","marks","min","Select","labelId","Always","Never","HostPID","Started","Status","Queues","ActiveWorkers","sortServerInfos","ServersTable","servers","s1","s2","isS1Smaller","host","pid","s1StartTime","s2StartTime","s1Queues","keys","queue_priorities","s2Queues","active_workers","srv","server","link","concurrency","Collapse","in","timeout","unmountOnExit","worker","Box","strict_priority_enabled","LIST_SERVERS_BEGIN","LIST_SERVERS_SUCCESS","LIST_SERVERS_ERROR","listServersAsync","GET_REDIS_INFO_BEGIN","GET_REDIS_INFO_SUCCESS","GET_REDIS_INFO_ERROR","QueueLocationTable","queueLocations","loc","keyslot","nodes","RedisMetricCards","redisInfo","MetricCard","content","redis_version","uptime_in_days","used_memory_human","used_memory_peak_human","mem_fragmentation_ratio","connected_clients","connected_slaves","rdb_last_save_time","rdb_changes_since_last_save","Card","CardContent","redis","redisAddress","address","redisInfoRaw","rawData","redisClusterEnabled","cluster","redisClusterNodesRaw","rawClusterNodes","getRedisInfoAsync","href","GET_METRICS_BEGIN","GET_METRICS_SUCCESS","GET_METRICS_ERROR","lineColors","QueueMetricsChart","metrics","byTimestamp","ts","metric","parseFloat","toChartData","domain","startTime","tickFormatter","toLocaleTimeString","scale","yAxisTickFormatter","labelFormatter","dot","defaultProps","toString","mapStateToProps","endTimeCaption","shiftButtons","buttonGroupRoot","top","endTimeShiftControls","borderBottomStyle","leftShiftButtons","rightShiftButtons","controlsContainer","controlSelectorBox","controlEndTimeSelector","controlDurationSelector","radioButtonRoot","formControlLabel","buttonLabel","textTransform","formControlRoot","formLabel","customInputField","filterButton","queueFilters","checkbox","day","formatTime","tz","timeZoneName","split","dayjs","unix","format","RadioInput","FormControlLabel","control","Radio","useShiftButtonStyles","dense","iconRoot","ShiftButton","endTimeSec","durationSec","endTimeOption","customEndTime","durationOption","customDuration","toISOString","customEndTimeError","customDurationError","getInitialState","setState","timePopoverAnchorElem","setTimePopoverAnchorElem","queuePopoverAnchorElem","setQueuePopoverAnchorElem","isTimePopoverOpen","isQueuePopoverOpen","onEndTimeChange","shiftBy","deltaSec","prevState","Popover","anchorOrigin","vertical","horizontal","FormLabel","RadioGroup","TextField","persist","timeUsecOrNaN","isNaN","helperText","isEndTimeFixed","onDurationChange","s","test","Error","parseDuration","FormGroup","selectedQueues","removeQueue","addQueue","appBar","right","chartInfo","errorMessage","warningIcon","getMetricsAsync","ENDTIME_URL_PARAM_KEY","DURATION_URL_PARAM_KEY","query","endTimeStr","durationStr","setEndTimeSec","setDurationSec","setSelectedQueues","urlQuery","location","tasks_processed_per_second","ChartRow","description","tasks_failed_per_second","error_rate","queue_size","queue_latency_seconds","queue_memory_usage_approx_bytes","pending_tasks_by_queue","retry_tasks_by_queue","archived_tasks_by_queue","headingText","PageNotFoundView","closeSnackbar","toggleDrawer","SlideUpTransition","Slide","snackbar","prefersDarkMode","useMediaQuery","createTheme","toolbar","toolbarIcon","mixins","drawer","menuButton","menuButtonHidden","drawerPaper","whiteSpace","transitions","create","easing","sharp","enteringScreen","drawerPaperClose","overflowX","leavingScreen","breakpoints","up","snackbarCloseIcon","appBarSpacer","mainContainer","contentWrapper","sidebarContainer","ThemeProvider","AppBar","Toolbar","edge","noWrap","Drawer","Snackbar","isOpen","autoHideDuration","TransitionComponent","SnackbarContent","message","List","PROMETHEUS_SERVER_ADDRESS","queuesReducer","stats","archived_ids","deleted_ids","pending_ids","tasksReducer","canceled_ids","error_ids","snackbarReducer","isSameDate","ts1","ts2","date1","date2","getUTCDate","getUTCMonth","getUTCFullYear","LOCAL_STORAGE_KEY","rootReducer","combineReducers","newStats","info","raw_info","raw_cluster_nodes","queue_locations","preloadedState","serializedState","localStorage","getItem","savedState","settingsInitialState","err","log","loadState","store","configureStore","reducer","hostname","match","currentSettings","subscribe","getState","setItem","saveState","ReactDOM","render","StrictMode","CssBaseline","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch"],"mappings":"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","file":"static/js/main.c4fad8d1.chunk.js","sourcesContent":["export const paths = {\n  HOME: `${window.ROOT_PATH}/`,\n  SETTINGS: `${window.ROOT_PATH}/settings`,\n  SERVERS: `${window.ROOT_PATH}/servers`,\n  SCHEDULERS: `${window.ROOT_PATH}/schedulers`,\n  QUEUE_DETAILS: `${window.ROOT_PATH}/queues/:qname`,\n  REDIS: `${window.ROOT_PATH}/redis`,\n  TASK_DETAILS: `${window.ROOT_PATH}/queues/:qname/tasks/:taskId`,\n  QUEUE_METRICS: `${window.ROOT_PATH}/q/metrics`,\n};\n\n/**************************************************************\n                        Path Helper functions\n **************************************************************/\n\nexport function queueDetailsPath(qname: string, taskStatus?: string): string {\n  const path = paths.QUEUE_DETAILS.replace(\":qname\", qname);\n  if (taskStatus) {\n    return `${path}?status=${taskStatus}`;\n  }\n  return path;\n}\n\nexport function taskDetailsPath(qname: string, taskId: string): string {\n  return paths.TASK_DETAILS.replace(\":qname\", qname).replace(\":taskId\", taskId);\n}\n\n/**************************************************************\n                        URL Params\n **************************************************************/\n\nexport interface QueueDetailsRouteParams {\n  qname: string;\n}\n\nexport interface TaskDetailsRouteParams {\n  qname: string;\n  taskId: string;\n}\n","import { ThemePreference } from \"../reducers/settingsReducer\";\nimport { DailyStatsKey } from \"../views/DashboardView\";\n// List of settings related action types.\nexport const POLL_INTERVAL_CHANGE = \"POLL_INTERVAL_CHANGE\";\nexport const THEME_PREFERENCE_CHANGE = \"THEME_PREFERENCE_CHANGE\";\nexport const TOGGLE_DRAWER = \"TOGGLE_DRAWER\";\nexport const TASK_ROWS_PER_PAGE_CHANGE = \"TASK_ROWS_PER_PAGE_CHANGE\";\nexport const DAILY_STATS_KEY_CHANGE = \"DAILY_STATS_KEY_CHANGE\";\n\ninterface PollIntervalChangeAction {\n  type: typeof POLL_INTERVAL_CHANGE;\n  value: number; // new poll interval value in seconds\n}\n\ninterface ThemePreferenceChangeAction {\n  type: typeof THEME_PREFERENCE_CHANGE;\n  value: ThemePreference;\n}\n\ninterface ToggleDrawerAction {\n  type: typeof TOGGLE_DRAWER;\n}\n\ninterface TaskRowsPerPageChange {\n  type: typeof TASK_ROWS_PER_PAGE_CHANGE;\n  value: number;\n}\n\ninterface DailyStatsKeyChange {\n  type: typeof DAILY_STATS_KEY_CHANGE;\n  value: DailyStatsKey;\n}\n\n// Union of all settings related action types.\nexport type SettingsActionTypes =\n  | PollIntervalChangeAction\n  | ThemePreferenceChangeAction\n  | ToggleDrawerAction\n  | TaskRowsPerPageChange\n  | DailyStatsKeyChange;\n\nexport function pollIntervalChange(value: number) {\n  return {\n    type: POLL_INTERVAL_CHANGE,\n    value,\n  };\n}\n\nexport function selectTheme(value: ThemePreference) {\n  return {\n    type: THEME_PREFERENCE_CHANGE,\n    value,\n  };\n}\n\nexport function toggleDrawer() {\n  return { type: TOGGLE_DRAWER };\n}\n\nexport function taskRowsPerPageChange(value: number) {\n  return {\n    type: TASK_ROWS_PER_PAGE_CHANGE,\n    value,\n  };\n}\n\nexport function dailyStatsKeyChange(value: DailyStatsKey) {\n  return {\n    type: DAILY_STATS_KEY_CHANGE,\n    value,\n  }\n}\n","import React from \"react\";\nimport {\n  useTheme,\n  makeStyles,\n  Theme,\n  createStyles,\n} from \"@material-ui/core/styles\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport FirstPageIcon from \"@material-ui/icons/FirstPage\";\nimport KeyboardArrowLeft from \"@material-ui/icons/KeyboardArrowLeft\";\nimport KeyboardArrowRight from \"@material-ui/icons/KeyboardArrowRight\";\nimport LastPageIcon from \"@material-ui/icons/LastPage\";\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    root: {\n      flexShrink: 0,\n      marginLeft: theme.spacing(2.5),\n    },\n  })\n);\n\ninterface TablePaginationActionsProps {\n  count: number;\n  page: number;\n  rowsPerPage: number;\n  onPageChange: (\n    event: React.MouseEvent<HTMLButtonElement>,\n    newPage: number\n  ) => void;\n}\n\nfunction TablePaginationActions(props: TablePaginationActionsProps) {\n  const classes = useStyles();\n  const theme = useTheme();\n  const { count, page, rowsPerPage, onPageChange } = props;\n\n  const handleFirstPageButtonClick = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    onPageChange(event, 0);\n  };\n\n  const handleBackButtonClick = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    onPageChange(event, page - 1);\n  };\n\n  const handleNextButtonClick = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    onPageChange(event, page + 1);\n  };\n\n  const handleLastPageButtonClick = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\n  };\n\n  return (\n    <div className={classes.root}>\n      <IconButton\n        onClick={handleFirstPageButtonClick}\n        disabled={page === 0}\n        aria-label=\"first page\"\n      >\n        {theme.direction === \"rtl\" ? <LastPageIcon /> : <FirstPageIcon />}\n      </IconButton>\n      <IconButton\n        onClick={handleBackButtonClick}\n        disabled={page === 0}\n        aria-label=\"previous page\"\n      >\n        {theme.direction === \"rtl\" ? (\n          <KeyboardArrowRight />\n        ) : (\n          <KeyboardArrowLeft />\n        )}\n      </IconButton>\n      <IconButton\n        onClick={handleNextButtonClick}\n        disabled={page >= Math.ceil(count / rowsPerPage) - 1}\n        aria-label=\"next page\"\n      >\n        {theme.direction === \"rtl\" ? (\n          <KeyboardArrowLeft />\n        ) : (\n          <KeyboardArrowRight />\n        )}\n      </IconButton>\n      <IconButton\n        onClick={handleLastPageButtonClick}\n        disabled={page >= Math.ceil(count / rowsPerPage) - 1}\n        aria-label=\"last page\"\n      >\n        {theme.direction === \"rtl\" ? <FirstPageIcon /> : <LastPageIcon />}\n      </IconButton>\n    </div>\n  );\n}\n\nexport default TablePaginationActions;\n\nexport const rowsPerPageOptions = [10, 20, 30, 60, 100];\nexport const defaultPageSize = 20;\n","import axios from \"axios\";\nimport queryString from \"query-string\";\n\n// In production build, API server is on listening on the same port as\n// the static file server.\n// In developement, we assume that the API server is listening on port 8080.\nconst BASE_URL =\n  process.env.NODE_ENV === \"production\"\n    ? `${window.ROOT_PATH}/api`\n    : `http://localhost:8080${window.ROOT_PATH}/api`;\n\nexport interface ListQueuesResponse {\n  queues: Queue[];\n}\n\nexport interface ListTasksResponse {\n  tasks: TaskInfo[];\n  stats: Queue;\n}\n\nexport interface ListServersResponse {\n  servers: ServerInfo[];\n}\n\nexport interface ListSchedulerEntriesResponse {\n  entries: SchedulerEntry[];\n}\n\nexport interface ListSchedulerEnqueueEventsResponse {\n  events: SchedulerEnqueueEvent[];\n}\n\nexport interface BatchCancelTasksResponse {\n  canceled_ids: string[];\n  error_ids: string[];\n}\n\nexport interface BatchDeleteTasksResponse {\n  deleted_ids: string[];\n  failed_ids: string[];\n}\n\nexport interface BatchRunTasksResponse {\n  pending_ids: string[];\n  error_ids: string[];\n}\n\nexport interface BatchArchiveTasksResponse {\n  archived_ids: string[];\n  error_ids: string[];\n}\n\nexport interface DeleteAllTasksResponse {\n  deleted: number;\n}\n\nexport interface ListQueueStatsResponse {\n  stats: { [qname: string]: DailyStat[] };\n}\n\nexport interface RedisInfoResponse {\n  address: string;\n  info: RedisInfo;\n  raw_info: string;\n  cluster: boolean;\n\n  // following fields are set only when cluster=true\n  raw_cluster_nodes: string;\n  queue_locations: QueueLocation[] | null;\n}\n\n// Describes location of a queue in cluster.\nexport interface QueueLocation {\n  queue: string; // queue name\n  keyslot: number; // cluster keyslot\n  nodes: string[]; // node addresses\n}\n\nexport interface MetricsResponse {\n  queue_size: PrometheusMetricsResponse;\n  queue_latency_seconds: PrometheusMetricsResponse;\n  queue_memory_usage_approx_bytes: PrometheusMetricsResponse;\n  tasks_processed_per_second: PrometheusMetricsResponse;\n  tasks_failed_per_second: PrometheusMetricsResponse;\n  error_rate: PrometheusMetricsResponse;\n  pending_tasks_by_queue: PrometheusMetricsResponse;\n  retry_tasks_by_queue: PrometheusMetricsResponse;\n  archived_tasks_by_queue: PrometheusMetricsResponse;\n}\n\nexport interface PrometheusMetricsResponse {\n  status: \"success\" | \"error\";\n  data?: MetricsResult; // present if status === \"success\"\n  error?: string; // present if status === \"error\"\n  errorType?: string; // present if status === \"error\"\n}\n\nexport interface MetricsResult {\n  resultType: string;\n  result: Metrics[];\n}\n\nexport interface Metrics {\n  metric: MetricsInfo;\n  values: [number, string][]; // [unixtime, value]\n}\n\nexport interface MetricsInfo {\n  __name__: string;\n  instance: string;\n  job: string;\n\n  // labels (may or may not be present depending on metrics)\n  queue?: string;\n  state?: string;\n}\n\n// Return value from redis INFO command.\n// See https://redis.io/commands/info#return-value.\nexport interface RedisInfo {\n  active_defrag_hits: string;\n  active_defrag_key_hits: string;\n  active_defrag_key_misses: string;\n  active_defrag_misses: string;\n  active_defrag_running: string;\n  allocator_active: string;\n  allocator_allocated: string;\n  allocator_frag_bytes: string;\n  allocator_frag_ratio: string;\n  allocator_resident: string;\n  allocator_rss_bytes: string;\n  allocator_rss_ratio: string;\n  aof_current_rewrite_time_sec: string;\n  aof_enabled: string;\n  aof_last_bgrewrite_status: string;\n  aof_last_cow_size: string;\n  aof_last_rewrite_time_sec: string;\n  aof_last_write_status: string;\n  aof_rewrite_in_progress: string;\n  aof_rewrite_scheduled: string;\n  arch_bits: string;\n  atomicvar_api: string;\n  blocked_clients: string;\n  client_recent_max_input_buffer: string;\n  client_recent_max_output_buffer: string;\n  clients_in_timeout_table: string;\n  cluster_enabled: string;\n  config_file: string;\n  configured_hz: string;\n  connected_clients: string;\n  connected_slaves: string;\n  evicted_keys: string;\n  executable: string;\n  expire_cycle_cpu_milliseconds: string;\n  expired_keys: string;\n  expired_stale_perc: string;\n  expired_time_cap_reached_count: string;\n  gcc_version: string;\n  hz: string;\n  instantaneous_input_kbps: string;\n  instantaneous_ops_per_sec: string;\n  instantaneous_output_kbps: string;\n  keyspace_hits: string;\n  keyspace_misses: string;\n  latest_fork_usec: string;\n  lazyfree_pending_objects: string;\n  loading: string;\n  lru_clock: string;\n  master_repl_offset: string;\n  master_replid: string;\n  master_replid2: string;\n  maxmemory: string;\n  maxmemory_human: string;\n  maxmemory_policy: string;\n  mem_allocator: string;\n  mem_aof_buffer: string;\n  mem_clients_normal: string;\n  mem_clients_slaves: string;\n  mem_fragmentation_bytes: string;\n  mem_fragmentation_ratio: string;\n  mem_not_counted_for_evict: string;\n  mem_replication_backlog: string;\n  migrate_cached_sockets: string;\n  module_fork_in_progress: string;\n  module_fork_last_cow_size: string;\n  multiplexing_api: string;\n  number_of_cached_scripts: string;\n  os: string;\n  process_id: string;\n  pubsub_channels: string;\n  pubsub_patterns: string;\n  rdb_bgsave_in_progress: string;\n  rdb_changes_since_last_save: string;\n  rdb_current_bgsave_time_sec: string;\n  rdb_last_bgsave_status: string;\n  rdb_last_bgsave_time_sec: string;\n  rdb_last_cow_size: string;\n  rdb_last_save_time: string;\n  redis_build_id: string;\n  redis_git_dirty: string;\n  redis_git_sha1: string;\n  redis_mode: string;\n  redis_version: string;\n  rejected_connections: string;\n  repl_backlog_active: string;\n  repl_backlog_first_byte_offset: string;\n  repl_backlog_histlen: string;\n  repl_backlog_size: string;\n  role: string;\n  rss_overhead_bytes: string;\n  rss_overhead_ratio: string;\n  run_id: string;\n  second_repl_offset: string;\n  slave_expires_tracked_keys: string;\n  sync_full: string;\n  sync_partial_err: string;\n  sync_partial_ok: string;\n  tcp_port: string;\n  total_commands_processed: string;\n  total_connections_received: string;\n  total_net_input_bytes: string;\n  total_net_output_bytes: string;\n  total_system_memory: string;\n  total_system_memory_human: string;\n  tracking_clients: string;\n  tracking_total_items: string;\n  tracking_total_keys: string;\n  tracking_total_prefixes: string;\n  unexpected_error_replies: string;\n  uptime_in_days: string;\n  uptime_in_seconds: string;\n  used_cpu_sys: string;\n  used_cpu_sys_children: string;\n  used_cpu_user: string;\n  used_cpu_user_children: string;\n  used_memory: string;\n  used_memory_dataset: string;\n  used_memory_dataset_perc: string;\n  used_memory_human: string;\n  used_memory_lua: string;\n  used_memory_lua_human: string;\n  used_memory_overhead: string;\n  used_memory_peak: string;\n  used_memory_peak_human: string;\n  used_memory_peak_perc: string;\n  used_memory_rss: string;\n  used_memory_rss_human: string;\n  used_memory_scripts: string;\n  used_memory_scripts_human: string;\n  used_memory_startup: string;\n}\n\nexport interface Queue {\n  queue: string;\n  paused: boolean;\n  size: number;\n  memory_usage_bytes: number;\n  active: number;\n  pending: number;\n  scheduled: number;\n  retry: number;\n  archived: number;\n  completed: number;\n  processed: number;\n  failed: number;\n  timestamp: string;\n}\n\nexport interface DailyStat {\n  queue: string;\n  date: string;\n  processed: number;\n  failed: number;\n}\n\nexport interface TaskInfo {\n  id: string;\n  queue: string;\n  type: string;\n  payload: string;\n  state: string;\n  start_time: string; // Only applies to task.state == 'active'\n  max_retry: number;\n  retried: number;\n  last_failed_at: string;\n  error_message: string;\n  next_process_at: string;\n  timeout_seconds: number;\n  deadline: string;\n  completed_at: string;\n  result: string;\n  ttl_seconds: number;\n}\n\nexport interface ServerInfo {\n  id: string;\n  host: string;\n  pid: number;\n  concurrency: number;\n  queue_priorities: { [qname: string]: number };\n  strict_priority_enabled: boolean;\n  start_time: string;\n  status: string;\n  active_workers: WorkerInfo[];\n}\n\nexport interface WorkerInfo {\n  task_id: string;\n  queue: string;\n  task_type: string;\n  task_payload: string;\n  start_time: string;\n}\n\nexport interface SchedulerEntry {\n  id: string;\n  spec: string;\n  task_type: string;\n  task_payload: string;\n  options: string[];\n  next_enqueue_at: string;\n  // prev_enqueue_at will be omitted\n  // if there were no previous enqueue events.\n  prev_enqueue_at?: string;\n}\n\nexport interface SchedulerEnqueueEvent {\n  task_id: string;\n  enqueued_at: string;\n}\n\nexport interface PaginationOptions extends Record<string, number | undefined> {\n  size?: number; // size of the page\n  page?: number; // page number (1 being the first page)\n}\n\nexport async function listQueues(): Promise<ListQueuesResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/queues`,\n  });\n  return resp.data;\n}\n\nexport async function deleteQueue(qname: string): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}`,\n  });\n}\n\nexport async function pauseQueue(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}:pause`,\n  });\n}\n\nexport async function resumeQueue(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}:resume`,\n  });\n}\n\nexport async function listQueueStats(): Promise<ListQueueStatsResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/queue_stats`,\n  });\n  return resp.data;\n}\n\nexport async function getTaskInfo(\n  qname: string,\n  id: string\n): Promise<TaskInfo> {\n  const url = `${BASE_URL}/queues/${qname}/tasks/${id}`;\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function listActiveTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/active_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function cancelActiveTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/active_tasks/${taskId}:cancel`,\n  });\n}\n\nexport async function cancelAllActiveTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/active_tasks:cancel_all`,\n  });\n}\n\nexport async function batchCancelActiveTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchCancelTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/active_tasks:batch_cancel`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function listPendingTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/pending_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function listScheduledTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/scheduled_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function listRetryTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/retry_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function listArchivedTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/archived_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function listCompletedTasks(\n  qname: string,\n  pageOpts?: PaginationOptions\n): Promise<ListTasksResponse> {\n  let url = `${BASE_URL}/queues/${qname}/completed_tasks`;\n  if (pageOpts) {\n    url += `?${queryString.stringify(pageOpts)}`;\n  }\n  const resp = await axios({\n    method: \"get\",\n    url,\n  });\n  return resp.data;\n}\n\nexport async function archivePendingTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks/${taskId}:archive`,\n  });\n}\n\nexport async function batchArchivePendingTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchArchiveTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks:batch_archive`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function archiveAllPendingTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks:archive_all`,\n  });\n}\n\nexport async function deletePendingTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks/${taskId}`,\n  });\n}\n\nexport async function batchDeletePendingTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchDeleteTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks:batch_delete`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function deleteAllPendingTasks(\n  qname: string\n): Promise<DeleteAllTasksResponse> {\n  const resp = await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/pending_tasks:delete_all`,\n  });\n  return resp.data;\n}\n\nexport async function runScheduledTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks/${taskId}:run`,\n  });\n}\n\nexport async function archiveScheduledTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks/${taskId}:archive`,\n  });\n}\n\nexport async function deleteScheduledTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks/${taskId}`,\n  });\n}\n\nexport async function batchDeleteScheduledTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchDeleteTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:batch_delete`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function deleteAllScheduledTasks(\n  qname: string\n): Promise<DeleteAllTasksResponse> {\n  const resp = await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:delete_all`,\n  });\n  return resp.data;\n}\n\nexport async function batchRunScheduledTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchRunTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:batch_run`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function runAllScheduledTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:run_all`,\n  });\n}\n\nexport async function batchArchiveScheduledTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchArchiveTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:batch_archive`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function archiveAllScheduledTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/scheduled_tasks:archive_all`,\n  });\n}\n\nexport async function runRetryTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks/${taskId}:run`,\n  });\n}\n\nexport async function archiveRetryTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks/${taskId}:archive`,\n  });\n}\n\nexport async function deleteRetryTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks/${taskId}`,\n  });\n}\n\nexport async function batchDeleteRetryTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchDeleteTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:batch_delete`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function deleteAllRetryTasks(\n  qname: string\n): Promise<DeleteAllTasksResponse> {\n  const resp = await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:delete_all`,\n  });\n  return resp.data;\n}\n\nexport async function batchRunRetryTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchRunTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:batch_run`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function runAllRetryTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:run_all`,\n  });\n}\n\nexport async function batchArchiveRetryTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchArchiveTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:batch_archive`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function archiveAllRetryTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/retry_tasks:archive_all`,\n  });\n}\n\nexport async function runArchivedTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks/${taskId}:run`,\n  });\n}\n\nexport async function deleteArchivedTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks/${taskId}`,\n  });\n}\n\nexport async function batchDeleteArchivedTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchDeleteTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks:batch_delete`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function deleteAllArchivedTasks(\n  qname: string\n): Promise<DeleteAllTasksResponse> {\n  const resp = await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks:delete_all`,\n  });\n  return resp.data;\n}\n\nexport async function batchRunArchivedTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchRunTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks:batch_run`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function runAllArchivedTasks(qname: string): Promise<void> {\n  await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/archived_tasks:run_all`,\n  });\n}\n\nexport async function deleteCompletedTask(\n  qname: string,\n  taskId: string\n): Promise<void> {\n  await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/completed_tasks/${taskId}`,\n  });\n}\n\nexport async function batchDeleteCompletedTasks(\n  qname: string,\n  taskIds: string[]\n): Promise<BatchDeleteTasksResponse> {\n  const resp = await axios({\n    method: \"post\",\n    url: `${BASE_URL}/queues/${qname}/completed_tasks:batch_delete`,\n    data: {\n      task_ids: taskIds,\n    },\n  });\n  return resp.data;\n}\n\nexport async function deleteAllCompletedTasks(\n  qname: string\n): Promise<DeleteAllTasksResponse> {\n  const resp = await axios({\n    method: \"delete\",\n    url: `${BASE_URL}/queues/${qname}/completed_tasks:delete_all`,\n  });\n  return resp.data;\n}\n\nexport async function listServers(): Promise<ListServersResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/servers`,\n  });\n  return resp.data;\n}\n\nexport async function listSchedulerEntries(): Promise<ListSchedulerEntriesResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/scheduler_entries`,\n  });\n  return resp.data;\n}\n\nexport async function listSchedulerEnqueueEvents(\n  entryId: string\n): Promise<ListSchedulerEnqueueEventsResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/scheduler_entries/${entryId}/enqueue_events`,\n  });\n  return resp.data;\n}\n\nexport async function getRedisInfo(): Promise<RedisInfoResponse> {\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/redis_info`,\n  });\n  return resp.data;\n}\n\ninterface MetricsEndpointParams {\n  endtime: number;\n  duration: number;\n  queues?: string; // comma-separated list of queues\n}\n\nexport async function getMetrics(\n  endTime: number,\n  duration: number,\n  queues: string[]\n): Promise<MetricsResponse> {\n  let params: MetricsEndpointParams = {\n    endtime: endTime,\n    duration: duration,\n  };\n  if (queues && queues.length > 0) {\n    params.queues = queues.join(\",\");\n  }\n  const resp = await axios({\n    method: \"get\",\n    url: `${BASE_URL}/metrics?${queryString.stringify(params)}`,\n  });\n  return resp.data;\n}\n","import { AxiosError } from \"axios\";\n\n// toErrorStringWithHttpStatus returns a string representaion of axios error with HTTP status.\nexport function toErrorStringWithHttpStatus(error: AxiosError<string>): string {\n  const { response } = error;\n  if (!response) {\n    return \"error: no error response data available\";\n  }\n  return `${response.status} (${response.statusText}): ${response.data}`;\n}\n\n// toErrorString returns a string representaion of axios error.\nexport function toErrorString(error: AxiosError<string>): string {\n  const { response } = error;\n  if (!response) {\n    return \"Unknown error occurred. See the logs for details.\";\n  }\n  return response.data;\n}\n\ninterface Duration {\n  hour: number;\n  minute: number;\n  second: number;\n  totalSeconds: number;\n}\n\n// Returns a duration from the number of seconds provided.\nexport function durationFromSeconds(totalSeconds: number): Duration {\n  const hour = Math.floor(totalSeconds / 3600);\n  const minute = Math.floor((totalSeconds - 3600 * hour) / 60);\n  const second = totalSeconds - 3600 * hour - 60 * minute;\n  return { hour, minute, second, totalSeconds };\n}\n\n// start and end are in milliseconds.\nfunction durationBetween(start: number, end: number): Duration {\n  const durationInMillisec = start - end;\n  const totalSeconds = Math.floor(durationInMillisec / 1000);\n  return durationFromSeconds(totalSeconds);\n}\n\nexport function stringifyDuration(d: Duration): string {\n  if (d.hour > 24) {\n    const n = Math.floor(d.hour / 24);\n    return n + (n === 1 ? \" day\" : \" days\");\n  }\n  return (\n    (d.hour !== 0 ? `${d.hour}h` : \"\") +\n    (d.minute !== 0 ? `${d.minute}m` : \"\") +\n    `${d.second}s`\n  );\n}\n\nexport function durationBefore(timestamp: string): string {\n  try {\n    const duration = durationBetween(Date.parse(timestamp), Date.now());\n    if (duration.totalSeconds < 1) {\n      return \"now\";\n    }\n    return \"in \" + stringifyDuration(duration);\n  } catch {\n    return \"-\";\n  }\n}\n\nexport function timeAgo(timestamp: string): string {\n  try {\n    return timeAgoUnix(Date.parse(timestamp) / 1000);\n  } catch (error) {\n    console.error(\"Could not parse timestamp: \", timestamp, error);\n    return \"-\";\n  }\n}\n\nexport function timeAgoUnix(unixtime: number): string {\n  if (unixtime === 0) {\n    return \"\";\n  }\n  const duration = durationBetween(Date.now(), unixtime * 1000);\n  return stringifyDuration(duration) + \" ago\";\n}\n\nexport function getCurrentUTCDate(): string {\n  const today = new Date();\n  const dd = today.getUTCDate().toString().padStart(2, \"0\");\n  const mm = (today.getMonth() + 1).toString().padStart(2, \"0\");\n  const yyyy = today.getFullYear();\n  return `${yyyy}-${mm}-${dd}`;\n}\n\nexport function uuidPrefix(uuid: string): string {\n  const idx = uuid.indexOf(\"-\");\n  if (idx === -1) {\n    return uuid;\n  }\n  return uuid.substr(0, idx);\n}\n\nexport function percentage(numerator: number, denominator: number): string {\n  if (denominator === 0) return \"0.00%\";\n  const perc = ((numerator / denominator) * 100).toFixed(2);\n  return `${perc} %`;\n}\n\nexport function isJsonPayload(p: string) {\n  try {\n    JSON.parse(p);\n  } catch (error) {\n    return false;\n  }\n  return true;\n}\n\nexport function prettifyPayload(p: string) {\n  if (isJsonPayload(p)) {\n    return JSON.stringify(JSON.parse(p), null, 2);\n  }\n  return p;\n}\n\n// Returns the number of seconds elapsed since January 1, 1970 00:00:00 UTC.\nexport function currentUnixtime(): number {\n  return Math.floor(Date.now() / 1000);\n}\n\nconst durationRegex = /([0-9]*(\\.[0-9]*)?)[s|m|h]/;\n// Parses the given string and returns the number of seconds if the input is valid.\n// Otherwise, it throws an error\n// Supported time units are \"s\", \"m\", \"h\"\nexport function parseDuration(s: string): number {\n  if (!durationRegex.test(s)) {\n    throw new Error(\"invalid duration\");\n  }\n  const val = parseFloat(s.slice(0, -1));\n  switch (s.slice(-1)) {\n    case \"s\":\n      return val;\n    case \"m\":\n      return val * 60;\n    case \"h\":\n      return val * 60 * 60;\n    default:\n      throw new Error(\"invalid duration unit\");\n  }\n}\n","import { Dispatch } from \"redux\";\nimport {\n  deleteQueue,\n  listQueues,\n  ListQueuesResponse,\n  pauseQueue,\n  resumeQueue,\n} from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of queue related action types.\nexport const LIST_QUEUES_BEGIN = \"LIST_QUEUES_BEGIN\";\nexport const LIST_QUEUES_SUCCESS = \"LIST_QUEUES_SUCCESS\";\nexport const LIST_QUEUES_ERROR = \"LIST_QUEUES_ERROR\";\nexport const DELETE_QUEUE_BEGIN = \"DELETE_QUEUE_BEGIN\";\nexport const DELETE_QUEUE_SUCCESS = \"DELETE_QUEUE_SUCCESS\";\nexport const DELETE_QUEUE_ERROR = \"DELETE_QUEUE_ERROR\";\nexport const PAUSE_QUEUE_BEGIN = \"PAUSE_QUEUE_BEGIN\";\nexport const PAUSE_QUEUE_SUCCESS = \"PAUSE_QUEUE_SUCCESS\";\nexport const PAUSE_QUEUE_ERROR = \"PAUSE_QUEUE_ERROR\";\nexport const RESUME_QUEUE_BEGIN = \"RESUME_QUEUE_BEGIN\";\nexport const RESUME_QUEUE_SUCCESS = \"RESUME_QUEUE_SUCCESS\";\nexport const RESUME_QUEUE_ERROR = \"RESUME_QUEUE_ERROR\";\n\ninterface ListQueuesBeginAction {\n  type: typeof LIST_QUEUES_BEGIN;\n}\n\ninterface ListQueuesSuccessAction {\n  type: typeof LIST_QUEUES_SUCCESS;\n  payload: ListQueuesResponse;\n}\n\ninterface ListQueuesErrorAction {\n  type: typeof LIST_QUEUES_ERROR;\n  error: string;\n}\n\ninterface DeleteQueueBeginAction {\n  type: typeof DELETE_QUEUE_BEGIN;\n  queue: string; // name of the queue\n}\n\ninterface DeleteQueueSuccessAction {\n  type: typeof DELETE_QUEUE_SUCCESS;\n  queue: string; // name of the queue\n}\n\ninterface DeleteQueueErrorAction {\n  type: typeof DELETE_QUEUE_ERROR;\n  queue: string; // name of the queue\n  error: string; // error description\n}\n\ninterface PauseQueueBeginAction {\n  type: typeof PAUSE_QUEUE_BEGIN;\n  queue: string; // name of the queue\n}\n\ninterface PauseQueueSuccessAction {\n  type: typeof PAUSE_QUEUE_SUCCESS;\n  queue: string; // name of the queue\n}\n\ninterface PauseQueueErrorAction {\n  type: typeof PAUSE_QUEUE_ERROR;\n  queue: string; // name of the queue\n  error: string; // error description\n}\n\ninterface ResumeQueueBeginAction {\n  type: typeof RESUME_QUEUE_BEGIN;\n  queue: string; // name of the queue\n}\n\ninterface ResumeQueueSuccessAction {\n  type: typeof RESUME_QUEUE_SUCCESS;\n  queue: string; // name of the queue\n}\n\ninterface ResumeQueueErrorAction {\n  type: typeof RESUME_QUEUE_ERROR;\n  queue: string; // name of the queue\n  error: string; // error description\n}\n\n// Union of all queues related action types.\nexport type QueuesActionTypes =\n  | ListQueuesBeginAction\n  | ListQueuesSuccessAction\n  | ListQueuesErrorAction\n  | DeleteQueueBeginAction\n  | DeleteQueueSuccessAction\n  | DeleteQueueErrorAction\n  | PauseQueueBeginAction\n  | PauseQueueSuccessAction\n  | PauseQueueErrorAction\n  | ResumeQueueBeginAction\n  | ResumeQueueSuccessAction\n  | ResumeQueueErrorAction;\n\nexport function listQueuesAsync() {\n  return async (dispatch: Dispatch<QueuesActionTypes>) => {\n    dispatch({ type: LIST_QUEUES_BEGIN });\n    try {\n      const response = await listQueues();\n      dispatch({\n        type: LIST_QUEUES_SUCCESS,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(`listQueuesAsync: ${toErrorStringWithHttpStatus(error)}`);\n      dispatch({\n        type: LIST_QUEUES_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function deleteQueueAsync(qname: string) {\n  return async (dispatch: Dispatch<QueuesActionTypes>) => {\n    dispatch({\n      type: DELETE_QUEUE_BEGIN,\n      queue: qname,\n    });\n    try {\n      await deleteQueue(qname);\n      // FIXME: this action doesn't get dispatched when server stalls\n      dispatch({\n        type: DELETE_QUEUE_SUCCESS,\n        queue: qname,\n      });\n    } catch (error) {\n      console.error(error);\n      dispatch({\n        type: DELETE_QUEUE_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function pauseQueueAsync(qname: string) {\n  return async (dispatch: Dispatch<QueuesActionTypes>) => {\n    dispatch({ type: PAUSE_QUEUE_BEGIN, queue: qname });\n    try {\n      await pauseQueue(qname);\n      dispatch({ type: PAUSE_QUEUE_SUCCESS, queue: qname });\n    } catch (error) {\n      console.error(\"pauseQueueAsynq: \", toErrorStringWithHttpStatus(error));\n      dispatch({\n        type: PAUSE_QUEUE_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function resumeQueueAsync(qname: string) {\n  return async (dispatch: Dispatch<QueuesActionTypes>) => {\n    dispatch({ type: RESUME_QUEUE_BEGIN, queue: qname });\n    try {\n      await resumeQueue(qname);\n      dispatch({ type: RESUME_QUEUE_SUCCESS, queue: qname });\n    } catch (error) {\n      console.error(\"resumeQueueAsync: \", toErrorStringWithHttpStatus(error));\n      dispatch({\n        type: RESUME_QUEUE_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n","import { Dispatch } from \"redux\";\nimport { listQueueStats, ListQueueStatsResponse } from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\nexport const LIST_QUEUE_STATS_BEGIN = \"LIST_QUEUE_STATS_BEGIN\";\nexport const LIST_QUEUE_STATS_SUCCESS = \"LIST_QUEUE_STATS_SUCCESS\";\nexport const LIST_QUEUE_STATS_ERROR = \"LIST_QUEUE_STATS_ERROR\";\n\ninterface ListQueueStatsBeginAction {\n  type: typeof LIST_QUEUE_STATS_BEGIN;\n}\n\ninterface ListQueueStatsSuccessAction {\n  type: typeof LIST_QUEUE_STATS_SUCCESS;\n  payload: ListQueueStatsResponse;\n}\n\ninterface ListQueueStatsErrorAction {\n  type: typeof LIST_QUEUE_STATS_ERROR;\n  error: string;\n}\n\n// Union of all queue stats related action types.\nexport type QueueStatsActionTypes =\n  | ListQueueStatsBeginAction\n  | ListQueueStatsSuccessAction\n  | ListQueueStatsErrorAction;\n\nexport function listQueueStatsAsync() {\n  return async (dispatch: Dispatch<QueueStatsActionTypes>) => {\n    dispatch({ type: LIST_QUEUE_STATS_BEGIN });\n    try {\n      const response = await listQueueStats();\n      dispatch({\n        type: LIST_QUEUE_STATS_SUCCESS,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listQueueStatsAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_QUEUE_STATS_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n","import React from \"react\";\nimport {\n  BarChart,\n  Bar,\n  XAxis,\n  YAxis,\n  CartesianGrid,\n  Tooltip,\n  Legend,\n  ResponsiveContainer,\n} from \"recharts\";\nimport { useHistory } from \"react-router-dom\";\nimport { useTheme } from \"@material-ui/core/styles\";\nimport { queueDetailsPath } from \"../paths\";\n\ninterface Props {\n  data: TaskBreakdown[];\n}\n\ninterface TaskBreakdown {\n  queue: string; // name of the queue.\n  active: number; // number of active tasks in the queue.\n  pending: number; // number of pending tasks in the queue.\n  scheduled: number; // number of scheduled tasks in the queue.\n  retry: number; // number of retry tasks in the queue.\n  archived: number; // number of archived tasks in the queue.\n  completed: number; // number of completed tasks in the queue.\n}\n\nfunction QueueSizeChart(props: Props) {\n  const theme = useTheme();\n  const handleClick = (params: { activeLabel?: string } | null) => {\n    const allQueues = props.data.map((b) => b.queue);\n    if (\n      params &&\n      params.activeLabel &&\n      allQueues.includes(params.activeLabel)\n    ) {\n      history.push(queueDetailsPath(params.activeLabel));\n    }\n  };\n  const history = useHistory();\n  return (\n    <ResponsiveContainer>\n      <BarChart\n        data={props.data}\n        maxBarSize={120}\n        onClick={handleClick}\n        style={{ cursor: \"pointer\" }}\n      >\n        <CartesianGrid strokeDasharray=\"3 3\" />\n        <XAxis dataKey=\"queue\" stroke={theme.palette.text.secondary} />\n        <YAxis stroke={theme.palette.text.secondary} />\n        <Tooltip />\n        <Legend />\n        <Bar dataKey=\"active\" stackId=\"a\" fill=\"#1967d2\" />\n        <Bar dataKey=\"pending\" stackId=\"a\" fill=\"#669df6\" />\n        <Bar dataKey=\"scheduled\" stackId=\"a\" fill=\"#fdd663\" />\n        <Bar dataKey=\"retry\" stackId=\"a\" fill=\"#f666a9\" />\n        <Bar dataKey=\"archived\" stackId=\"a\" fill=\"#ac4776\" />\n        <Bar dataKey=\"completed\" stackId=\"a\" fill=\"#4bb543\" />\n      </BarChart>\n    </ResponsiveContainer>\n  );\n}\n\nexport default QueueSizeChart;\n","import React from \"react\";\nimport {\n  BarChart,\n  Bar,\n  XAxis,\n  YAxis,\n  CartesianGrid,\n  Tooltip,\n  Legend,\n  ResponsiveContainer,\n} from \"recharts\";\nimport { useTheme, Theme } from \"@material-ui/core/styles\";\n\ninterface Props {\n  data: ProcessedStats[];\n}\n\ninterface ProcessedStats {\n  queue: string; // name of the queue.\n  succeeded: number; // number of tasks succeeded.\n  failed: number; // number of tasks failed.\n}\n\nfunction ProcessedTasksChart(props: Props) {\n  const theme = useTheme<Theme>();\n  return (\n    <ResponsiveContainer>\n      <BarChart data={props.data} maxBarSize={120}>\n        <CartesianGrid strokeDasharray=\"3 3\" />\n        <XAxis dataKey=\"queue\" stroke={theme.palette.text.secondary} />\n        <YAxis stroke={theme.palette.text.secondary} />\n        <Tooltip />\n        <Legend />\n        <Bar\n          dataKey=\"succeeded\"\n          stackId=\"a\"\n          fill={theme.palette.success.light}\n        />\n        <Bar dataKey=\"failed\" stackId=\"a\" fill={theme.palette.error.light} />\n      </BarChart>\n    </ResponsiveContainer>\n  );\n}\n\nexport default ProcessedTasksChart;\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Button from \"@material-ui/core/Button\";\nimport Dialog from \"@material-ui/core/Dialog\";\nimport DialogActions from \"@material-ui/core/DialogActions\";\nimport DialogContent from \"@material-ui/core/DialogContent\";\nimport DialogContentText from \"@material-ui/core/DialogContentText\";\nimport DialogTitle from \"@material-ui/core/DialogTitle\";\nimport { Queue } from \"../api\";\nimport { AppState } from \"../store\";\nimport { deleteQueueAsync } from \"../actions/queuesActions\";\n\ninterface Props {\n  queue: Queue | null; // queue to delete\n  onClose: () => void;\n}\n\nfunction mapStateToProps(state: AppState, ownProps: Props) {\n  let requestPending = false;\n  if (ownProps.queue !== null) {\n    const q = state.queues.data.find((q) => q.name === ownProps.queue?.queue);\n    if (q !== undefined) {\n      requestPending = q.requestPending;\n    }\n  }\n  return {\n    requestPending,\n  };\n}\n\nconst connector = connect(mapStateToProps, { deleteQueueAsync });\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\nfunction DeleteQueueConfirmationDialog(props: Props & ReduxProps) {\n  const handleDeleteClick = () => {\n    if (!props.queue) {\n      return;\n    }\n    props.deleteQueueAsync(props.queue.queue);\n    props.onClose();\n  };\n  return (\n    <Dialog\n      open={props.queue !== null}\n      onClose={props.onClose}\n      aria-labelledby=\"alert-dialog-title\"\n      aria-describedby=\"alert-dialog-description\"\n    >\n      {props.queue !== null &&\n        (props.queue.size > 0 ? (\n          <>\n            <DialogTitle id=\"alert-dialog-title\">\n              Queue is not empty\n            </DialogTitle>\n            <DialogContent>\n              <DialogContentText id=\"alert-dialog-description\">\n                You are trying to delete a non-emtpy queue \"{props.queue.queue}\n                \". Please empty the queue first before deleting.\n              </DialogContentText>\n            </DialogContent>\n            <DialogActions>\n              <Button onClick={props.onClose} color=\"primary\">\n                OK\n              </Button>\n            </DialogActions>\n          </>\n        ) : (\n          <>\n            <DialogTitle id=\"alert-dialog-title\">\n              Are you sure you want to delete \"{props.queue.queue}\"?\n            </DialogTitle>\n            <DialogContent>\n              <DialogContentText id=\"alert-dialog-description\">\n                You can't undo this action.\n              </DialogContentText>\n            </DialogContent>\n            <DialogActions>\n              <Button\n                onClick={props.onClose}\n                disabled={props.requestPending}\n                color=\"primary\"\n              >\n                Cancel\n              </Button>\n              <Button\n                onClick={handleDeleteClick}\n                disabled={props.requestPending}\n                color=\"primary\"\n                autoFocus\n              >\n                Delete\n              </Button>\n            </DialogActions>\n          </>\n        ))}\n    </Dialog>\n  );\n}\n\nexport default connector(DeleteQueueConfirmationDialog);\n","// SortDirection describes the direction of sort.\nexport enum SortDirection {\n  Asc = \"asc\",\n  Desc = \"desc\",\n}\n\n// TableColumn is a config for a table column.\nexport interface TableColumn {\n  key: string;\n  label: string;\n  align: \"left\" | \"right\" | \"center\";\n}\n\n// SortableTableColumn is a config for a table column\n// for table with sorting support.\n//\n// T is the enum of sort keys.\nexport interface SortableTableColumn<T> extends TableColumn {\n  sortBy: T;\n}\n","import React, { useState } from \"react\";\nimport clsx from \"clsx\";\nimport { Link } from \"react-router-dom\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableSortLabel from \"@material-ui/core/TableSortLabel\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport PauseCircleFilledIcon from \"@material-ui/icons/PauseCircleFilled\";\nimport PlayCircleFilledIcon from \"@material-ui/icons/PlayCircleFilled\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport DeleteQueueConfirmationDialog from \"./DeleteQueueConfirmationDialog\";\nimport { Queue } from \"../api\";\nimport { queueDetailsPath } from \"../paths\";\nimport { SortDirection, SortableTableColumn } from \"../types/table\";\nimport prettyBytes from \"pretty-bytes\";\nimport { percentage } from \"../utils\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  fixedCell: {\n    position: \"sticky\",\n    zIndex: 1,\n    left: 0,\n    background: theme.palette.background.paper,\n  },\n}));\n\ninterface QueueWithMetadata extends Queue {\n  requestPending: boolean; // indicates pause/resume/delete request is pending for the queue.\n}\n\ninterface Props {\n  queues: QueueWithMetadata[];\n  onPauseClick: (qname: string) => Promise<void>;\n  onResumeClick: (qname: string) => Promise<void>;\n  onDeleteClick: (qname: string) => Promise<void>;\n}\n\nenum SortBy {\n  Queue,\n  State,\n  Size,\n  MemoryUsage,\n  Processed,\n  Failed,\n  ErrorRate,\n\n  None, // no sort support\n}\n\nconst colConfigs: SortableTableColumn<SortBy>[] = [\n  { label: \"Queue\", key: \"queue\", sortBy: SortBy.Queue, align: \"left\" },\n  { label: \"State\", key: \"state\", sortBy: SortBy.State, align: \"left\" },\n  {\n    label: \"Size\",\n    key: \"size\",\n    sortBy: SortBy.Size,\n    align: \"right\",\n  },\n  {\n    label: \"Memory usage\",\n    key: \"memory_usage\",\n    sortBy: SortBy.MemoryUsage,\n    align: \"right\",\n  },\n  {\n    label: \"Processed\",\n    key: \"processed\",\n    sortBy: SortBy.Processed,\n    align: \"right\",\n  },\n  { label: \"Failed\", key: \"failed\", sortBy: SortBy.Failed, align: \"right\" },\n  {\n    label: \"Error rate\",\n    key: \"error_rate\",\n    sortBy: SortBy.ErrorRate,\n    align: \"right\",\n  },\n  { label: \"Actions\", key: \"actions\", sortBy: SortBy.None, align: \"center\" },\n];\n\n// sortQueues takes a array of queues and return a sorted array.\n// It returns a new array and leave the original array untouched.\nfunction sortQueues(\n  queues: QueueWithMetadata[],\n  cmpFn: (first: QueueWithMetadata, second: QueueWithMetadata) => number\n): QueueWithMetadata[] {\n  let copy = [...queues];\n  copy.sort(cmpFn);\n  return copy;\n}\n\nexport default function QueuesOverviewTable(props: Props) {\n  const classes = useStyles();\n  const [sortBy, setSortBy] = useState<SortBy>(SortBy.Queue);\n  const [sortDir, setSortDir] = useState<SortDirection>(SortDirection.Asc);\n  const [queueToDelete, setQueueToDelete] = useState<QueueWithMetadata | null>(\n    null\n  );\n  const createSortClickHandler = (sortKey: SortBy) => (e: React.MouseEvent) => {\n    if (sortKey === sortBy) {\n      // Toggle sort direction.\n      const nextSortDir =\n        sortDir === SortDirection.Asc ? SortDirection.Desc : SortDirection.Asc;\n      setSortDir(nextSortDir);\n    } else {\n      // Change the sort key.\n      setSortBy(sortKey);\n    }\n  };\n\n  const cmpFunc = (q1: QueueWithMetadata, q2: QueueWithMetadata): number => {\n    let isQ1Smaller: boolean;\n    switch (sortBy) {\n      case SortBy.Queue:\n        if (q1.queue === q2.queue) return 0;\n        isQ1Smaller = q1.queue < q2.queue;\n        break;\n      case SortBy.State:\n        if (q1.paused === q2.paused) return 0;\n        isQ1Smaller = !q1.paused;\n        break;\n      case SortBy.Size:\n        if (q1.size === q2.size) return 0;\n        isQ1Smaller = q1.size < q2.size;\n        break;\n      case SortBy.MemoryUsage:\n        if (q1.memory_usage_bytes === q2.memory_usage_bytes) return 0;\n        isQ1Smaller = q1.memory_usage_bytes < q2.memory_usage_bytes;\n        break;\n      case SortBy.Processed:\n        if (q1.processed === q2.processed) return 0;\n        isQ1Smaller = q1.processed < q2.processed;\n        break;\n      case SortBy.Failed:\n        if (q1.failed === q2.failed) return 0;\n        isQ1Smaller = q1.failed < q2.failed;\n        break;\n      case SortBy.ErrorRate:\n        const q1ErrorRate = q1.failed / q1.processed;\n        const q2ErrorRate = q2.failed / q2.processed;\n        if (q1ErrorRate === q2ErrorRate) return 0;\n        isQ1Smaller = q1ErrorRate < q2ErrorRate;\n        break;\n      default:\n        // eslint-disable-next-line no-throw-literal\n        throw `Unexpected order by value: ${sortBy}`;\n    }\n    if (sortDir === SortDirection.Asc) {\n      return isQ1Smaller ? -1 : 1;\n    } else {\n      return isQ1Smaller ? 1 : -1;\n    }\n  };\n\n  const handleDialogClose = () => {\n    setQueueToDelete(null);\n  };\n\n  return (\n    <React.Fragment>\n      <TableContainer>\n        <Table className={classes.table} aria-label=\"queues overview table\">\n          <TableHead>\n            <TableRow>\n              {colConfigs.map((cfg, i) => (\n                <TableCell\n                  key={cfg.key}\n                  align={cfg.align}\n                  className={clsx(i === 0 && classes.fixedCell)}\n                >\n                  {cfg.sortBy !== SortBy.None ? (\n                    <TableSortLabel\n                      active={sortBy === cfg.sortBy}\n                      direction={sortDir}\n                      onClick={createSortClickHandler(cfg.sortBy)}\n                    >\n                      {cfg.label}\n                    </TableSortLabel>\n                  ) : (\n                    <div>{cfg.label}</div>\n                  )}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {sortQueues(props.queues, cmpFunc).map((q) => (\n              <Row\n                key={q.queue}\n                queue={q}\n                onPauseClick={() => props.onPauseClick(q.queue)}\n                onResumeClick={() => props.onResumeClick(q.queue)}\n                onDeleteClick={() => setQueueToDelete(q)}\n              />\n            ))}\n          </TableBody>\n        </Table>\n      </TableContainer>\n      <DeleteQueueConfirmationDialog\n        onClose={handleDialogClose}\n        queue={queueToDelete}\n      />\n    </React.Fragment>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  row: {\n    \"&:last-child td\": {\n      borderBottomWidth: 0,\n    },\n    \"&:last-child th\": {\n      borderBottomWidth: 0,\n    },\n  },\n  linkText: {\n    textDecoration: \"none\",\n    color: theme.palette.text.primary,\n    \"&:hover\": {\n      textDecoration: \"underline\",\n    },\n  },\n  textGreen: {\n    color: theme.palette.success.dark,\n  },\n  textRed: {\n    color: theme.palette.error.dark,\n  },\n  boldCell: {\n    fontWeight: 600,\n  },\n  fixedCell: {\n    position: \"sticky\",\n    zIndex: 1,\n    left: 0,\n    background: theme.palette.background.paper,\n  },\n  actionIconsContainer: {\n    display: \"flex\",\n    justifyContent: \"center\",\n    minWidth: \"100px\",\n  },\n}));\n\ninterface RowProps {\n  queue: QueueWithMetadata;\n  onPauseClick: () => void;\n  onResumeClick: () => void;\n  onDeleteClick: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const classes = useRowStyles();\n  const { queue: q } = props;\n  const [showIcons, setShowIcons] = useState<boolean>(false);\n  return (\n    <TableRow key={q.queue} className={classes.row}>\n      <TableCell\n        component=\"th\"\n        scope=\"row\"\n        className={clsx(classes.boldCell, classes.fixedCell)}\n      >\n        <Link to={queueDetailsPath(q.queue)} className={classes.linkText}>\n          {q.queue}\n        </Link>\n      </TableCell>\n      <TableCell>\n        {q.paused ? (\n          <span className={classes.textRed}>paused</span>\n        ) : (\n          <span className={classes.textGreen}>run</span>\n        )}\n      </TableCell>\n      <TableCell align=\"right\">{q.size}</TableCell>\n      <TableCell align=\"right\">{prettyBytes(q.memory_usage_bytes)}</TableCell>\n      <TableCell align=\"right\">{q.processed}</TableCell>\n      <TableCell align=\"right\">{q.failed}</TableCell>\n      <TableCell align=\"right\">{percentage(q.failed, q.processed)}</TableCell>\n      <TableCell\n        align=\"center\"\n        onMouseEnter={() => setShowIcons(true)}\n        onMouseLeave={() => setShowIcons(false)}\n      >\n        <div className={classes.actionIconsContainer}>\n          {showIcons ? (\n            <React.Fragment>\n              {q.paused ? (\n                <Tooltip title=\"Resume\">\n                  <IconButton\n                    color=\"secondary\"\n                    onClick={props.onResumeClick}\n                    disabled={q.requestPending}\n                    size=\"small\"\n                  >\n                    <PlayCircleFilledIcon fontSize=\"small\" />\n                  </IconButton>\n                </Tooltip>\n              ) : (\n                <Tooltip title=\"Pause\">\n                  <IconButton\n                    color=\"primary\"\n                    onClick={props.onPauseClick}\n                    disabled={q.requestPending}\n                    size=\"small\"\n                  >\n                    <PauseCircleFilledIcon fontSize=\"small\" />\n                  </IconButton>\n                </Tooltip>\n              )}\n              <Tooltip title=\"Delete\">\n                <IconButton onClick={props.onDeleteClick} size=\"small\">\n                  <DeleteIcon fontSize=\"small\" />\n                </IconButton>\n              </Tooltip>\n            </React.Fragment>\n          ) : (\n            <IconButton size=\"small\">\n              <MoreHorizIcon fontSize=\"small\" />\n            </IconButton>\n          )}\n        </div>\n      </TableCell>\n    </TableRow>\n  );\n}\n","import { Theme, withStyles } from \"@material-ui/core/styles\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\n\n// Export custom style tooltip.\nexport default withStyles((theme: Theme) => ({\n  tooltip: {\n    backgroundColor: \"#f5f5f9\",\n    color: \"rgba(0, 0, 0, 0.87)\",\n    maxWidth: 400,\n    fontSize: theme.typography.pxToRem(12),\n    border: \"1px solid #dadde9\",\n  },\n}))(Tooltip);\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Button from \"@material-ui/core/Button\";\nimport ButtonGroup from \"@material-ui/core/ButtonGroup\";\nimport ArrowDropDownIcon from \"@material-ui/icons/ArrowDropDown\";\nimport ClickAwayListener from \"@material-ui/core/ClickAwayListener\";\nimport Grow from \"@material-ui/core/Grow\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Popper from \"@material-ui/core/Popper\";\nimport MenuItem from \"@material-ui/core/MenuItem\";\nimport MenuList from \"@material-ui/core/MenuList\";\nimport { isDarkTheme } from \"../theme\";\n\ninterface Option {\n  label: string;\n  key: string;\n}\n\ninterface Props {\n  options: Option[];\n  initialSelectedKey: string;\n  onSelect: (key: string) => void;\n}\n\nconst useStyles = makeStyles((theme) => ({\n  popper: {\n    zIndex: 2,\n  },\n  buttonContained: {\n    backgroundColor: isDarkTheme(theme)\n      ? \"#303030\"\n      : theme.palette.background.default,\n    color: theme.palette.text.primary,\n    \"&:hover\": {\n      backgroundColor: theme.palette.action.hover,\n    },\n  },\n}));\n\nexport default function SplitButton(props: Props) {\n  const classes = useStyles();\n  const [open, setOpen] = React.useState<boolean>(false);\n  const anchorRef = React.useRef<HTMLDivElement>(null);\n  const [selectedKey, setSelectedKey] = React.useState<string>(\n    props.initialSelectedKey\n  );\n\n  const handleMenuItemClick = (\n    event: React.MouseEvent<HTMLLIElement, MouseEvent>,\n    key: string\n  ) => {\n    setSelectedKey(key);\n    setOpen(false);\n    props.onSelect(key);\n  };\n\n  const handleToggle = () => {\n    setOpen((prevOpen) => !prevOpen);\n  };\n\n  const handleClose = (event: React.MouseEvent<Document, MouseEvent>) => {\n    if (\n      anchorRef.current &&\n      anchorRef.current.contains(event.target as HTMLElement)\n    ) {\n      return;\n    }\n    setOpen(false);\n  };\n\n  const selectedOpt = props.options.find((opt) => opt.key === selectedKey);\n\n  return (\n    <>\n      <ButtonGroup\n        variant=\"contained\"\n        ref={anchorRef}\n        aria-label=\"split button\"\n        size=\"small\"\n        disableElevation\n      >\n        <Button classes={{ contained: classes.buttonContained }}>\n          {selectedOpt ? selectedOpt.label : \"Select Option\"}\n        </Button>\n        <Button\n          size=\"small\"\n          aria-controls={open ? \"split-button-menu\" : undefined}\n          aria-expanded={open ? \"true\" : undefined}\n          aria-label=\"select option\"\n          aria-haspopup=\"menu\"\n          onClick={handleToggle}\n          classes={{ contained: classes.buttonContained }}\n        >\n          <ArrowDropDownIcon />\n        </Button>\n      </ButtonGroup>\n      <Popper\n        open={open}\n        anchorEl={anchorRef.current}\n        role={undefined}\n        transition\n        disablePortal\n        className={classes.popper}\n      >\n        {({ TransitionProps, placement }) => (\n          <Grow\n            {...TransitionProps}\n            style={{\n              transformOrigin:\n                placement === \"bottom\" ? \"center top\" : \"center bottom\",\n            }}\n          >\n            <Paper>\n              <ClickAwayListener onClickAway={handleClose}>\n                <MenuList id=\"split-button-menu\">\n                  {props.options.map((opt) => (\n                    <MenuItem\n                      key={opt.key}\n                      selected={opt.key === selectedKey}\n                      onClick={(event) => handleMenuItemClick(event, opt.key)}\n                    >\n                      {opt.label}\n                    </MenuItem>\n                  ))}\n                </MenuList>\n              </ClickAwayListener>\n            </Paper>\n          </Grow>\n        )}\n      </Popper>\n    </>\n  );\n}\n","import { useEffect, useMemo } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\n// usePolling repeatedly calls doFn with a fix time delay specified\n// by interval (in millisecond).\nexport function usePolling(doFn: () => void, interval: number) {\n  useEffect(() => {\n    doFn();\n    const id = setInterval(doFn, interval * 1000);\n    return () => clearInterval(id);\n  }, [interval, doFn]);\n}\n\n// useQuery gets the URL search params from the current URL.\nexport function useQuery(): URLSearchParams {\n  const { search } = useLocation();\n  return useMemo(() => new URLSearchParams(search), [search]);\n}\n","import React from \"react\";\nimport {\n  LineChart,\n  Line,\n  XAxis,\n  YAxis,\n  CartesianGrid,\n  Tooltip,\n  Legend,\n  ResponsiveContainer,\n} from \"recharts\";\nimport { useTheme, Theme } from \"@material-ui/core/styles\";\nimport { DailyStat } from \"../api\";\n\ninterface Props {\n  data: { [qname: string]: DailyStat[] };\n  numDays: number;\n}\n\ninterface ChartData {\n  succeeded: number;\n  failed: number;\n  date: string;\n}\n\nexport default function DailyStatsChart(props: Props) {\n  const data = makeChartData(props.data, props.numDays);\n  const theme = useTheme<Theme>();\n  return (\n    <ResponsiveContainer>\n      <LineChart data={data}>\n        <CartesianGrid strokeDasharray=\"3 3\" />\n        <XAxis\n          dataKey=\"date\"\n          minTickGap={10}\n          stroke={theme.palette.text.secondary}\n        />\n        <YAxis stroke={theme.palette.text.secondary} />\n        <Tooltip />\n        <Legend />\n        <Line\n          type=\"monotone\"\n          dataKey=\"succeeded\"\n          stroke={theme.palette.success.main}\n        />\n        <Line\n          type=\"monotone\"\n          dataKey=\"failed\"\n          stroke={theme.palette.error.main}\n        />\n      </LineChart>\n    </ResponsiveContainer>\n  );\n}\n\nfunction makeChartData(\n  queueStats: { [qname: string]: DailyStat[] },\n  numDays: number\n): ChartData[] {\n  const dataByDate: { [date: string]: ChartData } = {};\n  for (const qname in queueStats) {\n    for (const stat of queueStats[qname]) {\n      if (!dataByDate.hasOwnProperty(stat.date)) {\n        dataByDate[stat.date] = { succeeded: 0, failed: 0, date: stat.date };\n      }\n      dataByDate[stat.date].succeeded += stat.processed - stat.failed;\n      dataByDate[stat.date].failed += stat.failed;\n    }\n  }\n  return Object.values(dataByDate).sort(sortByDate).slice(-numDays);\n}\n\nfunction sortByDate(x: ChartData, y: ChartData): number {\n  return Date.parse(x.date) - Date.parse(y.date);\n}\n","import React, { useEffect } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Typography from \"@material-ui/core/Typography\";\nimport InfoIcon from \"@material-ui/icons/Info\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport {\n  listQueuesAsync,\n  pauseQueueAsync,\n  resumeQueueAsync,\n  deleteQueueAsync,\n} from \"../actions/queuesActions\";\nimport { listQueueStatsAsync } from \"../actions/queueStatsActions\";\nimport { dailyStatsKeyChange } from \"../actions/settingsActions\";\nimport { AppState } from \"../store\";\nimport QueueSizeChart from \"../components/QueueSizeChart\";\nimport ProcessedTasksChart from \"../components/ProcessedTasksChart\";\nimport QueuesOverviewTable from \"../components/QueuesOverviewTable\";\nimport Tooltip from \"../components/Tooltip\";\nimport SplitButton from \"../components/SplitButton\";\nimport { usePolling } from \"../hooks\";\nimport DailyStatsChart from \"../components/DailyStatsChart\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  paper: {\n    padding: theme.spacing(2),\n    display: \"flex\",\n    overflow: \"auto\",\n    flexDirection: \"column\",\n  },\n  chartHeader: {\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    marginBottom: theme.spacing(2),\n  },\n  chartHeaderTitle: {\n    display: \"flex\",\n    alignItems: \"center\",\n  },\n  chartContainer: {\n    width: \"100%\",\n    height: \"300px\",\n  },\n  infoIcon: {\n    marginLeft: theme.spacing(1),\n    color: theme.palette.grey[500],\n    cursor: \"pointer\",\n  },\n  tooltipSection: {\n    marginBottom: \"4px\",\n  },\n  tableContainer: {\n    marginBottom: theme.spacing(2),\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.queues.loading,\n    queues: state.queues.data.map((q) => ({\n      ...q.currentStats,\n      requestPending: q.requestPending,\n    })),\n    error: state.queues.error,\n    pollInterval: state.settings.pollInterval,\n    queueStats: state.queueStats.data,\n    dailyStatsKey: state.settings.dailyStatsChartType,\n  };\n}\n\nconst mapDispatchToProps = {\n  listQueuesAsync,\n  pauseQueueAsync,\n  resumeQueueAsync,\n  deleteQueueAsync,\n  listQueueStatsAsync,\n  dailyStatsKeyChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype Props = ConnectedProps<typeof connector>;\n\nexport type DailyStatsKey = \"today\" | \"last-7d\" | \"last-30d\" | \"last-90d\";\nexport const defaultDailyStatsKey = \"last-7d\";\n\nfunction DashboardView(props: Props) {\n  const {\n    pollInterval,\n    listQueuesAsync,\n    queues,\n    listQueueStatsAsync,\n    dailyStatsKey,\n  } = props;\n  const classes = useStyles();\n\n  usePolling(listQueuesAsync, pollInterval);\n\n  // Refetch queue stats if a queue is added or deleted.\n  const qnames = queues\n    .map((q) => q.queue)\n    .sort()\n    .join(\",\");\n\n  useEffect(() => {\n    listQueueStatsAsync();\n  }, [listQueueStatsAsync, qnames]);\n\n  const processedStats = queues.map((q) => ({\n    queue: q.queue,\n    succeeded: q.processed - q.failed,\n    failed: q.failed,\n  }));\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3}>\n        {props.error.length > 0 && (\n          <Grid item xs={12}>\n            <Alert severity=\"error\">\n              <AlertTitle>Error</AlertTitle>\n              Could not retrieve queues live data —{\" \"}\n              <strong>See the logs for details</strong>\n            </Alert>\n          </Grid>\n        )}\n        <Grid item xs={6}>\n          <Paper className={classes.paper} variant=\"outlined\">\n            <div className={classes.chartHeader}>\n              <div className={classes.chartHeaderTitle}>\n                <Typography variant=\"h6\">Queue Size</Typography>\n                <Tooltip\n                  title={\n                    <div>\n                      <div className={classes.tooltipSection}>\n                        Total number of tasks in the queue\n                      </div>\n                      <div className={classes.tooltipSection}>\n                        <strong>Active</strong>: number of tasks currently being\n                        processed\n                      </div>\n                      <div className={classes.tooltipSection}>\n                        <strong>Pending</strong>: number of tasks ready to be\n                        processed\n                      </div>\n                      <div className={classes.tooltipSection}>\n                        <strong>Scheduled</strong>: number of tasks scheduled to\n                        be processed in the future\n                      </div>\n                      <div className={classes.tooltipSection}>\n                        <strong>Retry</strong>: number of tasks scheduled to be\n                        retried in the future\n                      </div>\n                      <div>\n                        <strong>Archived</strong>: number of tasks exhausted\n                        their retries\n                      </div>\n                    </div>\n                  }\n                >\n                  <InfoIcon fontSize=\"small\" className={classes.infoIcon} />\n                </Tooltip>\n              </div>\n            </div>\n            <div className={classes.chartContainer}>\n              <QueueSizeChart data={queues} />\n            </div>\n          </Paper>\n        </Grid>\n\n        <Grid item xs={6}>\n          <Paper className={classes.paper} variant=\"outlined\">\n            <div className={classes.chartHeader}>\n              <div className={classes.chartHeaderTitle}>\n                <Typography variant=\"h6\">Tasks Processed</Typography>\n                <Tooltip\n                  title={\n                    <div>\n                      <div className={classes.tooltipSection}>\n                        Total number of tasks processed in a given day (UTC)\n                      </div>\n                      <div className={classes.tooltipSection}>\n                        <strong>Succeeded</strong>: number of tasks successfully\n                        processed\n                      </div>\n                      <div>\n                        <strong>Failed</strong>: number of tasks failed to be\n                        processed\n                      </div>\n                    </div>\n                  }\n                >\n                  <InfoIcon fontSize=\"small\" className={classes.infoIcon} />\n                </Tooltip>\n              </div>\n              <div>\n                <SplitButton\n                  options={[\n                    { label: \"Today\", key: \"today\" },\n                    { label: \"Last 7d\", key: \"last-7d\" },\n                    { label: \"Last 30d\", key: \"last-30d\" },\n                    { label: \"Last 90d\", key: \"last-90d\" },\n                  ]}\n                  initialSelectedKey={dailyStatsKey}\n                  onSelect={(key) =>\n                    props.dailyStatsKeyChange(key as DailyStatsKey)\n                  }\n                />\n              </div>\n            </div>\n            <div className={classes.chartContainer}>\n              {dailyStatsKey === \"today\" && (\n                <ProcessedTasksChart data={processedStats} />\n              )}\n              {dailyStatsKey === \"last-7d\" && (\n                <DailyStatsChart data={props.queueStats} numDays={7} />\n              )}\n              {dailyStatsKey === \"last-30d\" && (\n                <DailyStatsChart data={props.queueStats} numDays={30} />\n              )}\n              {dailyStatsKey === \"last-90d\" && (\n                <DailyStatsChart data={props.queueStats} numDays={90} />\n              )}\n            </div>\n          </Paper>\n        </Grid>\n\n        <Grid item xs={12} className={classes.tableContainer}>\n          <Paper className={classes.paper} variant=\"outlined\">\n            {/* TODO: Add loading indicator  */}\n            <QueuesOverviewTable\n              queues={queues}\n              onPauseClick={props.pauseQueueAsync}\n              onResumeClick={props.resumeQueueAsync}\n              onDeleteClick={props.deleteQueueAsync}\n            />\n          </Paper>\n        </Grid>\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(DashboardView);\n","import {\n  DAILY_STATS_KEY_CHANGE,\n  POLL_INTERVAL_CHANGE,\n  SettingsActionTypes,\n  TASK_ROWS_PER_PAGE_CHANGE,\n  THEME_PREFERENCE_CHANGE,\n  TOGGLE_DRAWER,\n} from \"../actions/settingsActions\";\nimport { defaultPageSize } from \"../components/TablePaginationActions\"\nimport { DailyStatsKey, defaultDailyStatsKey } from \"../views/DashboardView\";\n\nexport enum ThemePreference {\n  SystemDefault,\n  Always,\n  Never,\n}\n\nexport interface SettingsState {\n  // Time duration between data refresh.\n  pollInterval: number;\n\n  // UI theme setting.\n  themePreference: ThemePreference;\n\n  // Whether the drawer (i.e. sidebar) is open or not.\n  isDrawerOpen: boolean;\n\n  // Number of tasks displayed in task table.\n  taskRowsPerPage: number,\n\n  // Type of the chart displayed for \"Processed Tasks\" section in dashboard.\n  dailyStatsChartType: DailyStatsKey;\n}\n\nexport const initialState: SettingsState = {\n  pollInterval: 8,\n  themePreference: ThemePreference.SystemDefault,\n  isDrawerOpen: true,\n  taskRowsPerPage: defaultPageSize,\n  dailyStatsChartType: defaultDailyStatsKey,\n};\n\nfunction settingsReducer(\n  state = initialState,\n  action: SettingsActionTypes\n): SettingsState {\n  switch (action.type) {\n    case POLL_INTERVAL_CHANGE:\n      return {\n        ...state,\n        pollInterval: action.value,\n      };\n\n    case THEME_PREFERENCE_CHANGE:\n      return {\n        ...state,\n        themePreference: action.value,\n      };\n\n    case TOGGLE_DRAWER:\n      return {\n        ...state,\n        isDrawerOpen: !state.isDrawerOpen,\n      };\n\n    case TASK_ROWS_PER_PAGE_CHANGE:\n      return {\n        ...state,\n        taskRowsPerPage: action.value,\n      }\n\n    case DAILY_STATS_KEY_CHANGE:\n      return {\n        ...state,\n        dailyStatsChartType: action.value,\n      }\n\n    default:\n      return state;\n  }\n}\n\nexport default settingsReducer;\n","import { createTheme, Theme } from \"@material-ui/core/styles\";\nimport { ThemePreference } from \"./reducers/settingsReducer\";\nimport useMediaQuery from \"@material-ui/core/useMediaQuery\";\n\nexport function useTheme(themePreference: ThemePreference): Theme {\n  let prefersDarkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n  if (themePreference === ThemePreference.Always) {\n    prefersDarkMode = true;\n  } else if (themePreference === ThemePreference.Never) {\n    prefersDarkMode = false;\n  }\n  return createTheme({\n    // Got color palette from https://htmlcolors.com/palette/31/stripe\n    palette: {\n      primary: {\n        main: \"#4379FF\",\n      },\n      secondary: {\n        main: \"#97FBD1\",\n      },\n      background: {\n        default: \"#f5f7f9\",\n      },\n      type: prefersDarkMode ? \"dark\" : \"light\",\n    },\n  });\n}\n\nexport function isDarkTheme(theme: Theme): boolean {\n  return theme.palette.type === \"dark\";\n}\n","export const CLOSE_SNACKBAR = \"CLOSE_SNACKBAR\";\n\ninterface CloseSnakbarAction {\n  type: typeof CLOSE_SNACKBAR;\n}\n\n// Union of all snackbar related action types\nexport type SnackbarActionTypes = CloseSnakbarAction;\n\nexport function closeSnackbar() {\n  return { type: CLOSE_SNACKBAR };\n}\n","import React, { ReactElement } from \"react\";\nimport clsx from \"clsx\";\nimport ListItem from \"@material-ui/core/ListItem\";\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\nimport ListItemText from \"@material-ui/core/ListItemText\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport {\n  useRouteMatch,\n  Link as RouterLink,\n  LinkProps as RouterLinkProps,\n} from \"react-router-dom\";\nimport { isDarkTheme } from \"../theme\";\n\nconst useStyles = makeStyles((theme) => ({\n  listItem: {\n    borderTopRightRadius: \"24px\",\n    borderBottomRightRadius: \"24px\",\n  },\n  selected: {\n    backgroundColor: isDarkTheme(theme)\n      ? `${theme.palette.secondary.main}30`\n      : `${theme.palette.primary.main}30`,\n  },\n  selectedText: {\n    fontWeight: 600,\n    color: isDarkTheme(theme)\n      ? theme.palette.secondary.main\n      : theme.palette.primary.main,\n  },\n  selectedIcon: {\n    color: isDarkTheme(theme)\n      ? theme.palette.secondary.main\n      : theme.palette.primary.main,\n  },\n}));\n\ninterface Props {\n  to: string;\n  primary: string;\n  icon?: ReactElement;\n}\n\n// Note: See https://material-ui.com/guides/composition/ for details.\nfunction ListItemLink(props: Props): ReactElement {\n  const classes = useStyles();\n  const { icon, primary, to } = props;\n  const isMatch = useRouteMatch({\n    path: to,\n    strict: true,\n    sensitive: true,\n    exact: true,\n  });\n  const renderLink = React.useMemo(\n    () =>\n      React.forwardRef<any, Omit<RouterLinkProps, \"to\">>((itemProps, ref) => (\n        <RouterLink to={to} ref={ref} {...itemProps} />\n      )),\n    [to]\n  );\n  return (\n    <li>\n      <Tooltip title={primary} placement=\"right\">\n        <ListItem\n          button\n          component={renderLink}\n          className={clsx(classes.listItem, isMatch && classes.selected)}\n        >\n          {icon && (\n            <ListItemIcon className={clsx(isMatch && classes.selectedIcon)}>\n              {icon}\n            </ListItemIcon>\n          )}\n          <ListItemText\n            primary={primary}\n            classes={{\n              primary: isMatch ? classes.selectedText : undefined,\n            }}\n          />\n        </ListItem>\n      </Tooltip>\n    </li>\n  );\n}\n\nexport default ListItemLink;\n","import React from \"react\";\nimport { useTheme, Theme } from \"@material-ui/core/styles\";\nimport ReactSyntaxHighlighter from \"react-syntax-highlighter\";\nimport styleDark from \"react-syntax-highlighter/dist/esm/styles/hljs/atom-one-dark\";\nimport styleLight from \"react-syntax-highlighter/dist/esm/styles/hljs/atom-one-light\";\nimport { isDarkTheme } from \"../theme\";\n\ninterface Props {\n  language: string;\n  children: string;\n  customStyle?: object;\n}\n\n// Theme aware syntax-highlighter component.\nexport default function SyntaxHighlighter(props: Props) {\n  const theme = useTheme<Theme>();\n  const style = isDarkTheme(theme) ? styleDark : styleLight;\n  return (\n    <ReactSyntaxHighlighter\n      language={props.language}\n      style={style}\n      customStyle={props.customStyle}\n    >\n      {props.children}\n    </ReactSyntaxHighlighter>\n  );\n}\n","import { Dispatch } from \"@reduxjs/toolkit\";\nimport {\n  listSchedulerEnqueueEvents,\n  ListSchedulerEnqueueEventsResponse,\n  listSchedulerEntries,\n  ListSchedulerEntriesResponse,\n} from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of scheduler-entry related action types.\nexport const LIST_SCHEDULER_ENTRIES_BEGIN = \"LIST_SCHEDULER_ENTRIES_BEGIN\";\nexport const LIST_SCHEDULER_ENTRIES_SUCCESS = \"LIST_SCHEDULER_ENTRIES_SUCCESS\";\nexport const LIST_SCHEDULER_ENTRIES_ERROR = \"LIST_SCHEDULER_ENTRIES_ERROR\";\nexport const LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN =\n  \"LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN\";\nexport const LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS =\n  \"LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS\";\nexport const LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR =\n  \"LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR\";\n\ninterface ListSchedulerEntriesBeginAction {\n  type: typeof LIST_SCHEDULER_ENTRIES_BEGIN;\n}\n\ninterface ListSchedulerEntriesSuccessAction {\n  type: typeof LIST_SCHEDULER_ENTRIES_SUCCESS;\n  payload: ListSchedulerEntriesResponse;\n}\n\ninterface ListSchedulerEntriesErrorAction {\n  type: typeof LIST_SCHEDULER_ENTRIES_ERROR;\n  error: string; // error description\n}\n\ninterface ListSchedulerEnqueueEventBeginAction {\n  type: typeof LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN;\n  entryId: string;\n}\n\ninterface ListSchedulerEnqueueEventSuccessAction {\n  type: typeof LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS;\n  entryId: string;\n  payload: ListSchedulerEnqueueEventsResponse;\n}\n\ninterface ListSchedulerEnqueueEventErrorAction {\n  type: typeof LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR;\n  entryId: string;\n  error: string;\n}\n\n// Union of all scheduler-entry related actions.\nexport type SchedulerEntriesActionTypes =\n  | ListSchedulerEntriesBeginAction\n  | ListSchedulerEntriesSuccessAction\n  | ListSchedulerEntriesErrorAction\n  | ListSchedulerEnqueueEventBeginAction\n  | ListSchedulerEnqueueEventSuccessAction\n  | ListSchedulerEnqueueEventErrorAction;\n\nexport function listSchedulerEntriesAsync() {\n  return async (dispatch: Dispatch<SchedulerEntriesActionTypes>) => {\n    dispatch({ type: LIST_SCHEDULER_ENTRIES_BEGIN });\n    try {\n      const response = await listSchedulerEntries();\n      dispatch({\n        type: LIST_SCHEDULER_ENTRIES_SUCCESS,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        `listSchedulerEnqueueEventsAsync: ${toErrorStringWithHttpStatus(error)}`\n      );\n      dispatch({\n        type: LIST_SCHEDULER_ENTRIES_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listSchedulerEnqueueEventsAsync(entryId: string) {\n  return async (dispatch: Dispatch<SchedulerEntriesActionTypes>) => {\n    dispatch({ type: LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN, entryId });\n    try {\n      const response = await listSchedulerEnqueueEvents(entryId);\n      dispatch({\n        type: LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS,\n        payload: response,\n        entryId,\n      });\n    } catch (error) {\n      console.error(\n        \"listSchedulerEnqueueEventsAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR,\n        error: toErrorString(error),\n        entryId,\n      });\n    }\n  };\n}\n","import uniqBy from \"lodash.uniqby\";\nimport {\n  LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN,\n  LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR,\n  LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS,\n  LIST_SCHEDULER_ENTRIES_BEGIN,\n  LIST_SCHEDULER_ENTRIES_ERROR,\n  LIST_SCHEDULER_ENTRIES_SUCCESS,\n  SchedulerEntriesActionTypes,\n} from \"../actions/schedulerEntriesActions\";\nimport { SchedulerEnqueueEvent, SchedulerEntry } from \"../api\";\n\ninterface SchedulerEntriesState {\n  loading: boolean;\n  data: SchedulerEntry[];\n  error: string; // error description\n  enqueueEventsByEntryId: {\n    [entryId: string]: { data: SchedulerEnqueueEvent[]; loading: boolean };\n  };\n}\n\nexport function getEnqueueEventsEntry(\n  state: SchedulerEntriesState,\n  entryId: string\n): { data: SchedulerEnqueueEvent[]; loading: boolean } {\n  return state.enqueueEventsByEntryId[entryId] || { data: [], loading: false };\n}\n\nconst initialState: SchedulerEntriesState = {\n  loading: false,\n  data: [],\n  error: \"\",\n  enqueueEventsByEntryId: {},\n};\n\nfunction schedulerEntriesReducer(\n  state = initialState,\n  action: SchedulerEntriesActionTypes\n): SchedulerEntriesState {\n  switch (action.type) {\n    case LIST_SCHEDULER_ENTRIES_BEGIN:\n      return {\n        ...state,\n        loading: true,\n      };\n    case LIST_SCHEDULER_ENTRIES_SUCCESS:\n      return {\n        ...state,\n        error: \"\",\n        loading: false,\n        data: action.payload.entries,\n      };\n    case LIST_SCHEDULER_ENTRIES_ERROR:\n      return {\n        ...state,\n        loading: false,\n        error: action.error,\n      };\n    case LIST_SCHEDULER_ENQUEUE_EVENTS_BEGIN: {\n      const entry = getEnqueueEventsEntry(state, action.entryId);\n      return {\n        ...state,\n        enqueueEventsByEntryId: {\n          ...state.enqueueEventsByEntryId,\n          [action.entryId]: {\n            ...entry,\n            loading: true,\n          },\n        },\n      };\n    }\n    case LIST_SCHEDULER_ENQUEUE_EVENTS_SUCCESS: {\n      const sortByEnqueuedAt = (\n        e1: SchedulerEnqueueEvent,\n        e2: SchedulerEnqueueEvent\n      ): number => {\n        return Date.parse(e2.enqueued_at) - Date.parse(e1.enqueued_at);\n      };\n      const entry = getEnqueueEventsEntry(state, action.entryId);\n      const newData = uniqBy(\n        [...entry.data, ...action.payload.events],\n        \"task_id\"\n      ).sort(sortByEnqueuedAt);\n      return {\n        ...state,\n        enqueueEventsByEntryId: {\n          ...state.enqueueEventsByEntryId,\n          [action.entryId]: {\n            loading: false,\n            data: newData,\n          },\n        },\n      };\n    }\n    case LIST_SCHEDULER_ENQUEUE_EVENTS_ERROR: {\n      const entry = getEnqueueEventsEntry(state, action.entryId);\n      return {\n        ...state,\n        enqueueEventsByEntryId: {\n          ...state.enqueueEventsByEntryId,\n          [action.entryId]: {\n            ...entry,\n            loading: false,\n          },\n        },\n      };\n    }\n    default:\n      return state;\n  }\n}\n\nexport default schedulerEntriesReducer;\n","import React, { useEffect } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport { AppState } from \"../store\";\nimport { getEnqueueEventsEntry } from \"../reducers/schedulerEntriesReducer\";\nimport { listSchedulerEnqueueEventsAsync } from \"../actions/schedulerEntriesActions\";\nimport { timeAgo } from \"../utils\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    height: \"80vh\",\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n}));\n\nfunction mapStateToProps(state: AppState, ownProps: Props) {\n  return {\n    events: getEnqueueEventsEntry(state.schedulerEntries, ownProps.entryId),\n  };\n}\n\nconst connector = connect(mapStateToProps, { listSchedulerEnqueueEventsAsync });\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  entryId: string; // Scheduler Entry ID\n}\n\nfunction SchedulerEnqueueEventsTable(props: Props & ReduxProps) {\n  const classes = useStyles();\n  const { listSchedulerEnqueueEventsAsync, entryId, events } = props;\n\n  useEffect(() => {\n    listSchedulerEnqueueEventsAsync(entryId);\n  }, [entryId, listSchedulerEnqueueEventsAsync]);\n\n  // TODO: loading state UI\n\n  // TODO: \"Load More\" button OR infinite scroll\n\n  return (\n    <TableContainer className={classes.table}>\n      <Table\n        stickyHeader\n        aria-label=\"scheduler enqueue events table\"\n        size=\"small\"\n      >\n        <TableHead>\n          <TableRow>\n            <TableCell classes={{ stickyHeader: classes.stickyHeaderCell }}>\n              Enqueued\n            </TableCell>\n            <TableCell classes={{ stickyHeader: classes.stickyHeaderCell }}>\n              Task ID\n            </TableCell>\n          </TableRow>\n        </TableHead>\n        <TableBody>\n          {events.data.map((e) => (\n            <TableRow key={e.task_id}>\n              <TableCell component=\"th\" scope=\"row\">\n                {timeAgo(e.enqueued_at)}\n              </TableCell>\n              <TableCell>{e.task_id}</TableCell>\n            </TableRow>\n          ))}\n        </TableBody>\n      </Table>\n    </TableContainer>\n  );\n}\n\nexport default connector(SchedulerEnqueueEventsTable);\n","import React, { useState } from \"react\";\nimport clsx from \"clsx\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Modal from \"@material-ui/core/Modal\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport HistoryIcon from \"@material-ui/icons/History\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport { SortDirection, SortableTableColumn } from \"../types/table\";\nimport TableSortLabel from \"@material-ui/core/TableSortLabel\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport { SchedulerEntry } from \"../api\";\nimport { timeAgo, durationBefore, prettifyPayload } from \"../utils\";\nimport SchedulerEnqueueEventsTable from \"./SchedulerEnqueueEventsTable\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  noBorder: {\n    border: \"none\",\n  },\n  fixedCell: {\n    position: \"sticky\",\n    zIndex: 1,\n    left: 0,\n    background: theme.palette.background.paper,\n  },\n  modal: {\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  modalContent: {\n    background: theme.palette.background.paper,\n    padding: theme.spacing(2),\n    width: \"540px\",\n    outline: \"none\",\n    borderRadius: theme.shape.borderRadius,\n  },\n  eventsTable: {\n    maxHeight: \"80vh\",\n  },\n}));\n\nenum SortBy {\n  EntryId,\n  Spec,\n  Type,\n  Payload,\n  Options,\n  NextEnqueue,\n  PrevEnqueue,\n\n  None,\n}\n\nconst colConfigs: SortableTableColumn<SortBy>[] = [\n  {\n    label: \"Entry ID\",\n    key: \"entry_id\",\n    sortBy: SortBy.EntryId,\n    align: \"left\",\n  },\n  {\n    label: \"Spec\",\n    key: \"spec\",\n    sortBy: SortBy.Spec,\n    align: \"left\",\n  },\n  {\n    label: \"Type\",\n    key: \"type\",\n    sortBy: SortBy.Type,\n    align: \"left\",\n  },\n  {\n    label: \"Payload\",\n    key: \"task_payload\",\n    sortBy: SortBy.Payload,\n    align: \"left\",\n  },\n  {\n    label: \"Options\",\n    key: \"options\",\n    sortBy: SortBy.Options,\n    align: \"left\",\n  },\n  {\n    label: \"Next Enqueue\",\n    key: \"next_enqueue\",\n    sortBy: SortBy.NextEnqueue,\n    align: \"left\",\n  },\n  {\n    label: \"Prev Enqueue\",\n    key: \"prev_enqueue\",\n    sortBy: SortBy.PrevEnqueue,\n    align: \"left\",\n  },\n  {\n    label: \"\",\n    key: \"show_history\",\n    sortBy: SortBy.None,\n    align: \"left\",\n  },\n];\n\n// sortEntries takes a array of entries and return a sorted array.\n// It returns a new array and leave the original array untouched.\nfunction sortEntries(\n  entries: SchedulerEntry[],\n  cmpFn: (first: SchedulerEntry, second: SchedulerEntry) => number\n): SchedulerEntry[] {\n  let copy = [...entries];\n  copy.sort(cmpFn);\n  return copy;\n}\n\ninterface Props {\n  entries: SchedulerEntry[];\n}\n\nexport default function SchedulerEntriesTable(props: Props) {\n  const classes = useStyles();\n  const [sortBy, setSortBy] = useState<SortBy>(SortBy.EntryId);\n  const [sortDir, setSortDir] = useState<SortDirection>(SortDirection.Asc);\n  const [activeEntryId, setActiveEntryId] = useState<string>(\"\");\n\n  const createSortClickHandler = (sortKey: SortBy) => (e: React.MouseEvent) => {\n    if (sortKey === sortBy) {\n      // Toggle sort direction.\n      const nextSortDir =\n        sortDir === SortDirection.Asc ? SortDirection.Desc : SortDirection.Asc;\n      setSortDir(nextSortDir);\n    } else {\n      // Change the sort key.\n      setSortBy(sortKey);\n    }\n  };\n\n  const cmpFunc = (e1: SchedulerEntry, e2: SchedulerEntry): number => {\n    let isE1Smaller: boolean;\n    switch (sortBy) {\n      case SortBy.EntryId:\n        if (e1.id === e2.id) return 0;\n        isE1Smaller = e1.id < e2.id;\n        break;\n      case SortBy.Spec:\n        if (e1.spec === e2.spec) return 0;\n        isE1Smaller = e1.spec < e2.spec;\n        break;\n      case SortBy.Type:\n        if (e1.task_type === e2.task_type) return 0;\n        isE1Smaller = e1.task_type < e2.task_type;\n        break;\n      case SortBy.Payload:\n        if (e1.task_payload === e2.task_payload) return 0;\n        isE1Smaller = e1.task_payload < e2.task_payload;\n        break;\n      case SortBy.Options:\n        if (e1.options === e2.options) return 0;\n        isE1Smaller = e1.options < e2.options;\n        break;\n      case SortBy.NextEnqueue:\n        if (e1.next_enqueue_at === e2.next_enqueue_at) return 0;\n        isE1Smaller = e1.next_enqueue_at < e2.next_enqueue_at;\n        break;\n      case SortBy.PrevEnqueue:\n        const e1PrevEnqueueAt = e1.prev_enqueue_at || \"\";\n        const e2PrevEnqueueAt = e2.prev_enqueue_at || \"\";\n        if (e1PrevEnqueueAt === e2PrevEnqueueAt) return 0;\n        isE1Smaller = e1PrevEnqueueAt < e2PrevEnqueueAt;\n        break;\n      default:\n        // eslint-disable-next-line no-throw-literal\n        throw `Unexpected order by value: ${sortBy}`;\n    }\n    if (sortDir === SortDirection.Asc) {\n      return isE1Smaller ? -1 : 1;\n    } else {\n      return isE1Smaller ? 1 : -1;\n    }\n  };\n\n  if (props.entries.length === 0) {\n    return (\n      <Alert severity=\"info\">\n        <AlertTitle>Info</AlertTitle>\n        No entries found at this time.\n      </Alert>\n    );\n  }\n\n  return (\n    <>\n      <TableContainer>\n        <Table className={classes.table} aria-label=\"scheduler entries table\">\n          <TableHead>\n            <TableRow>\n              {colConfigs.map((cfg, i) => (\n                <TableCell\n                  key={cfg.key}\n                  align={cfg.align}\n                  className={clsx(i === 0 && classes.fixedCell)}\n                >\n                  <TableSortLabel\n                    active={cfg.sortBy === sortBy}\n                    direction={sortDir}\n                    onClick={createSortClickHandler(cfg.sortBy)}\n                  >\n                    {cfg.label}\n                  </TableSortLabel>\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {sortEntries(props.entries, cmpFunc).map((entry, idx) => (\n              <Row\n                key={entry.id}\n                entry={entry}\n                isLastRow={idx === props.entries.length - 1}\n                onShowHistoryClick={() => setActiveEntryId(entry.id)}\n              />\n            ))}\n          </TableBody>\n        </Table>\n        <Modal\n          open={activeEntryId !== \"\"}\n          onClose={() => setActiveEntryId(\"\")}\n          className={classes.modal}\n        >\n          <div className={classes.modalContent}>\n            <Typography variant=\"h6\" gutterBottom color=\"textPrimary\">\n              Recent History\n            </Typography>\n            <SchedulerEnqueueEventsTable entryId={activeEntryId} />\n          </div>\n        </Modal>\n      </TableContainer>\n    </>\n  );\n}\n\ninterface RowProps {\n  entry: SchedulerEntry;\n  isLastRow: boolean;\n  onShowHistoryClick: () => void;\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  rowRoot: {\n    \"& > *\": {\n      borderBottom: \"unset\",\n    },\n  },\n  noBorder: {\n    border: \"none\",\n  },\n}));\n\nfunction Row(props: RowProps) {\n  const { entry, isLastRow } = props;\n  const classes = useRowStyles();\n  return (\n    <TableRow className={classes.rowRoot}>\n      <TableCell\n        component=\"th\"\n        scope=\"row\"\n        className={clsx(isLastRow && classes.noBorder)}\n      >\n        {entry.id}\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        {entry.spec}\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        {entry.task_type}\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        <SyntaxHighlighter language=\"json\">\n          {prettifyPayload(entry.task_payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        <SyntaxHighlighter language=\"go\">\n          {entry.options.length > 0 ? entry.options.join(\", \") : \"No options\"}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        {durationBefore(entry.next_enqueue_at)}\n      </TableCell>\n      <TableCell className={clsx(isLastRow && classes.noBorder)}>\n        {entry.prev_enqueue_at ? timeAgo(entry.prev_enqueue_at) : \"N/A\"}\n      </TableCell>\n      <TableCell>\n        <Tooltip title=\"See History\">\n          <IconButton\n            aria-label=\"expand row\"\n            size=\"small\"\n            onClick={props.onShowHistoryClick}\n          >\n            <HistoryIcon />\n          </IconButton>\n        </Tooltip>\n      </TableCell>\n    </TableRow>\n  );\n}\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\nimport SchedulerEntriesTable from \"../components/SchedulerEntriesTable\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport { AppState } from \"../store\";\nimport { listSchedulerEntriesAsync } from \"../actions/schedulerEntriesActions\";\nimport { usePolling } from \"../hooks\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  paper: {\n    padding: theme.spacing(2),\n    display: \"flex\",\n    overflow: \"auto\",\n    flexDirection: \"column\",\n  },\n  heading: {\n    paddingLeft: theme.spacing(2),\n    marginBottom: theme.spacing(1),\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.schedulerEntries.loading,\n    error: state.schedulerEntries.error,\n    entries: state.schedulerEntries.data,\n    pollInterval: state.settings.pollInterval,\n  };\n}\n\nconst connector = connect(mapStateToProps, { listSchedulerEntriesAsync });\n\ntype Props = ConnectedProps<typeof connector>;\n\nfunction SchedulersView(props: Props) {\n  const { pollInterval, listSchedulerEntriesAsync } = props;\n  const classes = useStyles();\n\n  usePolling(listSchedulerEntriesAsync, pollInterval);\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3}>\n        {props.error === \"\" ? (\n          <Grid item xs={12}>\n            <Paper className={classes.paper} variant=\"outlined\">\n              <Typography variant=\"h6\" className={classes.heading}>\n                Scheduler Entries\n              </Typography>\n              <SchedulerEntriesTable entries={props.entries} />\n            </Paper>\n          </Grid>\n        ) : (\n          <Grid item xs={12}>\n            <Alert severity=\"error\">\n              <AlertTitle>Error</AlertTitle>\n              Could not retrieve scheduler entries live data —{\" \"}\n              <strong>See the logs for details</strong>\n            </Alert>\n          </Grid>\n        )}\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(SchedulersView);\n","import {\n  batchCancelActiveTasks,\n  BatchCancelTasksResponse,\n  batchDeleteArchivedTasks,\n  batchDeleteRetryTasks,\n  batchDeleteScheduledTasks,\n  batchDeleteCompletedTasks,\n  BatchDeleteTasksResponse,\n  batchArchiveRetryTasks,\n  batchArchiveScheduledTasks,\n  BatchArchiveTasksResponse,\n  batchRunArchivedTasks,\n  batchRunRetryTasks,\n  batchRunScheduledTasks,\n  BatchRunTasksResponse,\n  cancelActiveTask,\n  cancelAllActiveTasks,\n  deleteAllArchivedTasks,\n  deleteAllRetryTasks,\n  deleteAllScheduledTasks,\n  deleteAllCompletedTasks,\n  deleteArchivedTask,\n  deleteRetryTask,\n  deleteScheduledTask,\n  deleteCompletedTask,\n  archiveAllRetryTasks,\n  archiveAllScheduledTasks,\n  archiveRetryTask,\n  archiveScheduledTask,\n  listActiveTasks,\n  listArchivedTasks,\n  listPendingTasks,\n  ListTasksResponse,\n  listRetryTasks,\n  listScheduledTasks,\n  listCompletedTasks,\n  PaginationOptions,\n  runAllArchivedTasks,\n  runAllRetryTasks,\n  runAllScheduledTasks,\n  runArchivedTask,\n  runRetryTask,\n  runScheduledTask,\n  deletePendingTask,\n  batchDeletePendingTasks,\n  deleteAllPendingTasks,\n  archivePendingTask,\n  batchArchivePendingTasks,\n  archiveAllPendingTasks,\n  TaskInfo,\n  getTaskInfo,\n} from \"../api\";\nimport { Dispatch } from \"redux\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of tasks related action types.\nexport const GET_TASK_INFO_BEGIN = \"GET_TASK_INFO_BEGIN\";\nexport const GET_TASK_INFO_SUCCESS = \"GET_TASK_INFO_SUCCESS\";\nexport const GET_TASK_INFO_ERROR = \"GET_TASK_INFO_ERROR\";\nexport const LIST_ACTIVE_TASKS_BEGIN = \"LIST_ACTIVE_TASKS_BEGIN\";\nexport const LIST_ACTIVE_TASKS_SUCCESS = \"LIST_ACTIVE_TASKS_SUCCESS\";\nexport const LIST_ACTIVE_TASKS_ERROR = \"LIST_ACTIVE_TASKS_ERROR\";\nexport const LIST_PENDING_TASKS_BEGIN = \"LIST_PENDING_TASKS_BEGIN\";\nexport const LIST_PENDING_TASKS_SUCCESS = \"LIST_PENDING_TASKS_SUCCESS\";\nexport const LIST_PENDING_TASKS_ERROR = \"LIST_PENDING_TASKS_ERROR\";\nexport const LIST_SCHEDULED_TASKS_BEGIN = \"LIST_SCHEDULED_TASKS_BEGIN\";\nexport const LIST_SCHEDULED_TASKS_SUCCESS = \"LIST_SCHEDULED_TASKS_SUCCESS\";\nexport const LIST_SCHEDULED_TASKS_ERROR = \"LIST_SCHEDULED_TASKS_ERROR\";\nexport const LIST_RETRY_TASKS_BEGIN = \"LIST_RETRY_TASKS_BEGIN\";\nexport const LIST_RETRY_TASKS_SUCCESS = \"LIST_RETRY_TASKS_SUCCESS\";\nexport const LIST_RETRY_TASKS_ERROR = \"LIST_RETRY_TASKS_ERROR\";\nexport const LIST_ARCHIVED_TASKS_BEGIN = \"LIST_ARCHIVED_TASKS_BEGIN\";\nexport const LIST_ARCHIVED_TASKS_SUCCESS = \"LIST_ARCHIVED_TASKS_SUCCESS\";\nexport const LIST_ARCHIVED_TASKS_ERROR = \"LIST_ARCHIVED_TASKS_ERROR\";\nexport const LIST_COMPLETED_TASKS_BEGIN = \"LIST_COMPLETED_TASKS_BEGIN\";\nexport const LIST_COMPLETED_TASKS_SUCCESS = \"LIST_COMPLETED_TASKS_SUCCESS\";\nexport const LIST_COMPLETED_TASKS_ERROR = \"LIST_COMPLETED_TASKS_ERROR\";\nexport const CANCEL_ACTIVE_TASK_BEGIN = \"CANCEL_ACTIVE_TASK_BEGIN\";\nexport const CANCEL_ACTIVE_TASK_SUCCESS = \"CANCEL_ACTIVE_TASK_SUCCESS\";\nexport const CANCEL_ACTIVE_TASK_ERROR = \"CANCEL_ACTIVE_TASK_ERROR\";\nexport const CANCEL_ALL_ACTIVE_TASKS_BEGIN = \"CANCEL_ALL_ACTIVE_TASKS_BEGIN\";\nexport const CANCEL_ALL_ACTIVE_TASKS_SUCCESS =\n  \"CANCEL_ALL_ACTIVE_TASKS_SUCCESS\";\nexport const CANCEL_ALL_ACTIVE_TASKS_ERROR = \"CANCEL_ALL_ACTIVE_TASKS_ERROR\";\nexport const BATCH_CANCEL_ACTIVE_TASKS_BEGIN =\n  \"BATCH_CANCEL_ACTIVE_TASKS_BEGIN\";\nexport const BATCH_CANCEL_ACTIVE_TASKS_SUCCESS =\n  \"BATCH_CANCEL_ACTIVE_TASKS_SUCCESS\";\nexport const BATCH_CANCEL_ACTIVE_TASKS_ERROR =\n  \"BATCH_CANCEL_ACTIVE_TASKS_ERROR\";\nexport const RUN_SCHEDULED_TASK_BEGIN = \"RUN_SCHEDULED_TASK_BEGIN\";\nexport const RUN_SCHEDULED_TASK_SUCCESS = \"RUN_SCHEDULED_TASK_SUCCESS\";\nexport const RUN_SCHEDULED_TASK_ERROR = \"RUN_SCHEDULED_TASK_ERROR\";\nexport const RUN_RETRY_TASK_BEGIN = \"RUN_RETRY_TASK_BEGIN\";\nexport const RUN_RETRY_TASK_SUCCESS = \"RUN_RETRY_TASK_SUCCESS\";\nexport const RUN_RETRY_TASK_ERROR = \"RUN_RETRY_TASK_ERROR\";\nexport const RUN_ARCHIVED_TASK_BEGIN = \"RUN_ARCHIVED_TASK_BEGIN\";\nexport const RUN_ARCHIVED_TASK_SUCCESS = \"RUN_ARCHIVED_TASK_SUCCESS\";\nexport const RUN_ARCHIVED_TASK_ERROR = \"RUN_ARCHIVED_TASK_ERROR\";\nexport const DELETE_PENDING_TASK_BEGIN = \"DELETE_PENDING_TASK_BEGIN\";\nexport const DELETE_PENDING_TASK_SUCCESS = \"DELETE_PENDING_TASK_SUCCESS\";\nexport const DELETE_PENDING_TASK_ERROR = \"DELETE_PENDING_TASK_ERROR\";\nexport const ARCHIVE_PENDING_TASK_BEGIN = \"ARCHIVE_PENDING_TASK_BEGIN\";\nexport const ARCHIVE_PENDING_TASK_SUCCESS = \"ARCHIVE_PENDING_TASK_SUCCESS\";\nexport const ARCHIVE_PENDING_TASK_ERROR = \"ARCHIVE_PENDING_TASK_ERROR\";\nexport const DELETE_SCHEDULED_TASK_BEGIN = \"DELETE_SCHEDULED_TASK_BEGIN\";\nexport const DELETE_SCHEDULED_TASK_SUCCESS = \"DELETE_SCHEDULED_TASK_SUCCESS\";\nexport const DELETE_SCHEDULED_TASK_ERROR = \"DELETE_SCHEDULED_TASK_ERROR\";\nexport const ARCHIVE_SCHEDULED_TASK_BEGIN = \"ARCHIVE_SCHEDULED_TASK_BEGIN\";\nexport const ARCHIVE_SCHEDULED_TASK_SUCCESS = \"ARCHIVE_SCHEDULED_TASK_SUCCESS\";\nexport const ARCHIVE_SCHEDULED_TASK_ERROR = \"ARCHIVE_SCHEDULED_TASK_ERROR\";\nexport const ARCHIVE_RETRY_TASK_BEGIN = \"ARCHIVE_RETRY_TASK_BEGIN\";\nexport const ARCHIVE_RETRY_TASK_SUCCESS = \"ARCHIVE_RETRY_TASK_SUCCESS\";\nexport const ARCHIVE_RETRY_TASK_ERROR = \"ARCHIVE_RETRY_TASK_ERROR\";\nexport const BATCH_ARCHIVE_PENDING_TASKS_BEGIN =\n  \"BATCH_ARCHIVE_PENDING_TASKS_BEGIN\";\nexport const BATCH_ARCHIVE_PENDING_TASKS_SUCCESS =\n  \"BATCH_ARCHIVE_PENDING_TASKS_SUCCESS\";\nexport const BATCH_ARCHIVE_PENDING_TASKS_ERROR =\n  \"BATCH_RUN_PENDING_TASKS_ERROR\";\nexport const BATCH_DELETE_PENDING_TASKS_BEGIN =\n  \"BATCH_DELETE_PENDING_TASKS_BEGIN\";\nexport const BATCH_DELETE_PENDING_TASKS_SUCCESS =\n  \"BATCH_DELETE_PENDING_TASKS_SUCCESS\";\nexport const BATCH_DELETE_PENDING_TASKS_ERROR =\n  \"BATCH_DELETE_PENDING_TASKS_ERROR\";\nexport const DELETE_ALL_PENDING_TASKS_BEGIN = \"DELETE_ALL_PENDING_TASKS_BEGIN\";\nexport const DELETE_ALL_PENDING_TASKS_SUCCESS =\n  \"DELETE_ALL_PENDING_TASKS_SUCCESS\";\nexport const DELETE_ALL_PENDING_TASKS_ERROR = \"DELETE_ALL_PENDING_TASKS_ERROR\";\nexport const ARCHIVE_ALL_PENDING_TASKS_BEGIN =\n  \"ARCHIVE_ALL_PENDING_TASKS_BEGIN\";\nexport const ARCHIVE_ALL_PENDING_TASKS_SUCCESS =\n  \"ARCHIVE_ALL_PENDING_TASKS_SUCCESS\";\nexport const ARCHIVE_ALL_PENDING_TASKS_ERROR =\n  \"ARCHIVE_ALL_PENDING_TASKS_ERROR\";\nexport const BATCH_RUN_SCHEDULED_TASKS_BEGIN =\n  \"BATCH_RUN_SCHEDULED_TASKS_BEGIN\";\nexport const BATCH_RUN_SCHEDULED_TASKS_SUCCESS =\n  \"BATCH_RUN_SCHEDULED_TASKS_SUCCESS\";\nexport const BATCH_RUN_SCHEDULED_TASKS_ERROR =\n  \"BATCH_RUN_SCHEDULED_TASKS_ERROR\";\nexport const BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN =\n  \"BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN\";\nexport const BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS =\n  \"BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS\";\nexport const BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR =\n  \"BATCH_RUN_SCHEDULED_TASKS_ERROR\";\nexport const BATCH_DELETE_SCHEDULED_TASKS_BEGIN =\n  \"BATCH_DELETE_SCHEDULED_TASKS_BEGIN\";\nexport const BATCH_DELETE_SCHEDULED_TASKS_SUCCESS =\n  \"BATCH_DELETE_SCHEDULED_TASKS_SUCCESS\";\nexport const BATCH_DELETE_SCHEDULED_TASKS_ERROR =\n  \"BATCH_DELETE_SCHEDULED_TASKS_ERROR\";\nexport const RUN_ALL_SCHEDULED_TASKS_BEGIN = \"RUN_ALL_SCHEDULED_TASKS_BEGIN\";\nexport const RUN_ALL_SCHEDULED_TASKS_SUCCESS =\n  \"RUN_ALL_SCHEDULED_TASKS_SUCCESS\";\nexport const RUN_ALL_SCHEDULED_TASKS_ERROR = \"RUN_ALL_SCHEDULED_TASKS_ERROR\";\nexport const ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN =\n  \"ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN\";\nexport const ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS =\n  \"ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS\";\nexport const ARCHIVE_ALL_SCHEDULED_TASKS_ERROR =\n  \"ARCHIVE_ALL_SCHEDULED_TASKS_ERROR\";\nexport const DELETE_ALL_SCHEDULED_TASKS_BEGIN =\n  \"DELETE_ALL_SCHEDULED_TASKS_BEGIN\";\nexport const DELETE_ALL_SCHEDULED_TASKS_SUCCESS =\n  \"DELETE_ALL_SCHEDULED_TASKS_SUCCESS\";\nexport const DELETE_ALL_SCHEDULED_TASKS_ERROR =\n  \"DELETE_ALL_SCHEDULED_TASKS_ERROR\";\nexport const DELETE_RETRY_TASK_BEGIN = \"DELETE_RETRY_TASK_BEGIN\";\nexport const DELETE_RETRY_TASK_SUCCESS = \"DELETE_RETRY_TASK_SUCCESS\";\nexport const DELETE_RETRY_TASK_ERROR = \"DELETE_RETRY_TASK_ERROR\";\nexport const BATCH_RUN_RETRY_TASKS_BEGIN = \"BATCH_RUN_RETRY_TASKS_BEGIN\";\nexport const BATCH_RUN_RETRY_TASKS_SUCCESS = \"BATCH_RUN_RETRY_TASKS_SUCCESS\";\nexport const BATCH_RUN_RETRY_TASKS_ERROR = \"BATCH_RUN_RETRY_TASKS_ERROR\";\nexport const BATCH_ARCHIVE_RETRY_TASKS_BEGIN =\n  \"BATCH_ARCHIVE_RETRY_TASKS_BEGIN\";\nexport const BATCH_ARCHIVE_RETRY_TASKS_SUCCESS =\n  \"BATCH_ARCHIVE_RETRY_TASKS_SUCCESS\";\nexport const BATCH_ARCHIVE_RETRY_TASKS_ERROR =\n  \"BATCH_ARCHIVE_RETRY_TASKS_ERROR\";\nexport const BATCH_DELETE_RETRY_TASKS_BEGIN = \"BATCH_DELETE_RETRY_TASKS_BEGIN\";\nexport const BATCH_DELETE_RETRY_TASKS_SUCCESS =\n  \"BATCH_DELETE_RETRY_TASKS_SUCCESS\";\nexport const BATCH_DELETE_RETRY_TASKS_ERROR = \"BATCH_DELETE_RETRY_TASKS_ERROR\";\nexport const RUN_ALL_RETRY_TASKS_BEGIN = \"RUN_ALL_RETRY_TASKS_BEGIN\";\nexport const RUN_ALL_RETRY_TASKS_SUCCESS = \"RUN_ALL_RETRY_TASKS_SUCCESS\";\nexport const RUN_ALL_RETRY_TASKS_ERROR = \"RUN_ALL_RETRY_TASKS_ERROR\";\nexport const ARCHIVE_ALL_RETRY_TASKS_BEGIN = \"ARCHIVE_ALL_RETRY_TASKS_BEGIN\";\nexport const ARCHIVE_ALL_RETRY_TASKS_SUCCESS =\n  \"ARCHIVE_ALL_RETRY_TASKS_SUCCESS\";\nexport const ARCHIVE_ALL_RETRY_TASKS_ERROR = \"ARCHIVE_ALL_RETRY_TASKS_ERROR\";\nexport const DELETE_ALL_RETRY_TASKS_BEGIN = \"DELETE_ALL_RETRY_TASKS_BEGIN\";\nexport const DELETE_ALL_RETRY_TASKS_SUCCESS = \"DELETE_ALL_RETRY_TASKS_SUCCESS\";\nexport const DELETE_ALL_RETRY_TASKS_ERROR = \"DELETE_ALL_RETRY_TASKS_ERROR\";\nexport const DELETE_ARCHIVED_TASK_BEGIN = \"DELETE_ARCHIVED_TASK_BEGIN\";\nexport const DELETE_ARCHIVED_TASK_SUCCESS = \"DELETE_ARCHIVED_TASK_SUCCESS\";\nexport const DELETE_ARCHIVED_TASK_ERROR = \"DELETE_ARCHIVED_TASK_ERROR\";\nexport const BATCH_RUN_ARCHIVED_TASKS_BEGIN = \"BATCH_RUN_ARCHIVED_TASKS_BEGIN\";\nexport const BATCH_RUN_ARCHIVED_TASKS_SUCCESS =\n  \"BATCH_RUN_ARCHIVED_TASKS_SUCCESS\";\nexport const BATCH_RUN_ARCHIVED_TASKS_ERROR = \"BATCH_RUN_ARCHIVED_TASKS_ERROR\";\nexport const BATCH_DELETE_ARCHIVED_TASKS_BEGIN =\n  \"BATCH_DELETE_ARCHIVED_TASKS_BEGIN\";\nexport const BATCH_DELETE_ARCHIVED_TASKS_SUCCESS =\n  \"BATCH_DELETE_ARCHIVED_TASKS_SUCCESS\";\nexport const BATCH_DELETE_ARCHIVED_TASKS_ERROR =\n  \"BATCH_DELETE_ARCHIVED_TASKS_ERROR\";\nexport const RUN_ALL_ARCHIVED_TASKS_BEGIN = \"RUN_ALL_ARCHIVED_TASKS_BEGIN\";\nexport const RUN_ALL_ARCHIVED_TASKS_SUCCESS = \"RUN_ALL_ARCHIVED_TASKS_SUCCESS\";\nexport const RUN_ALL_ARCHIVED_TASKS_ERROR = \"RUN_ALL_ARCHIVED_TASKS_ERROR\";\nexport const DELETE_ALL_ARCHIVED_TASKS_BEGIN =\n  \"DELETE_ALL_ARCHIVED_TASKS_BEGIN\";\nexport const DELETE_ALL_ARCHIVED_TASKS_SUCCESS =\n  \"DELETE_ALL_ARCHIVED_TASKS_SUCCESS\";\nexport const DELETE_ALL_ARCHIVED_TASKS_ERROR =\n  \"DELETE_ALL_ARCHIVED_TASKS_ERROR\";\nexport const DELETE_COMPLETED_TASK_BEGIN = \"DELETE_COMPLETED_TASK_BEGIN\";\nexport const DELETE_COMPLETED_TASK_SUCCESS = \"DELETE_COMPLETED_TASK_SUCCESS\";\nexport const DELETE_COMPLETED_TASK_ERROR = \"DELETE_COMPLETED_TASK_ERROR\";\nexport const DELETE_ALL_COMPLETED_TASKS_BEGIN =\n  \"DELETE_ALL_COMPLETED_TASKS_BEGIN\";\nexport const DELETE_ALL_COMPLETED_TASKS_SUCCESS =\n  \"DELETE_ALL_COMPLETED_TASKS_SUCCESS\";\nexport const DELETE_ALL_COMPLETED_TASKS_ERROR =\n  \"DELETE_ALL_COMPLETED_TASKS_ERROR\";\nexport const BATCH_DELETE_COMPLETED_TASKS_BEGIN =\n  \"BATCH_DELETE_COMPLETED_TASKS_BEGIN\";\nexport const BATCH_DELETE_COMPLETED_TASKS_SUCCESS =\n  \"BATCH_DELETE_COMPLETED_TASKS_SUCCESS\";\nexport const BATCH_DELETE_COMPLETED_TASKS_ERROR =\n  \"BATCH_DELETE_COMPLETED_TASKS_ERROR\";\n\ninterface GetTaskInfoBeginAction {\n  type: typeof GET_TASK_INFO_BEGIN;\n}\n\ninterface GetTaskInfoErrorAction {\n  type: typeof GET_TASK_INFO_ERROR;\n  error: string; // error description\n}\n\ninterface GetTaskInfoSuccessAction {\n  type: typeof GET_TASK_INFO_SUCCESS;\n  payload: TaskInfo;\n}\n\ninterface ListActiveTasksBeginAction {\n  type: typeof LIST_ACTIVE_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListActiveTasksSuccessAction {\n  type: typeof LIST_ACTIVE_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListActiveTasksErrorAction {\n  type: typeof LIST_ACTIVE_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface ListPendingTasksBeginAction {\n  type: typeof LIST_PENDING_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListPendingTasksSuccessAction {\n  type: typeof LIST_PENDING_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListPendingTasksErrorAction {\n  type: typeof LIST_PENDING_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface ListScheduledTasksBeginAction {\n  type: typeof LIST_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListScheduledTasksSuccessAction {\n  type: typeof LIST_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListScheduledTasksErrorAction {\n  type: typeof LIST_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface ListRetryTasksBeginAction {\n  type: typeof LIST_RETRY_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListRetryTasksSuccessAction {\n  type: typeof LIST_RETRY_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListRetryTasksErrorAction {\n  type: typeof LIST_RETRY_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface ListArchivedTasksBeginAction {\n  type: typeof LIST_ARCHIVED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListArchivedTasksSuccessAction {\n  type: typeof LIST_ARCHIVED_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListArchivedTasksErrorAction {\n  type: typeof LIST_ARCHIVED_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface ListCompletedTasksBeginAction {\n  type: typeof LIST_COMPLETED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ListCompletedTasksSuccessAction {\n  type: typeof LIST_COMPLETED_TASKS_SUCCESS;\n  queue: string;\n  payload: ListTasksResponse;\n}\n\ninterface ListCompletedTasksErrorAction {\n  type: typeof LIST_COMPLETED_TASKS_ERROR;\n  queue: string;\n  error: string; // error description\n}\n\ninterface CancelActiveTaskBeginAction {\n  type: typeof CANCEL_ACTIVE_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface CancelActiveTaskSuccessAction {\n  type: typeof CANCEL_ACTIVE_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface CancelActiveTaskErrorAction {\n  type: typeof CANCEL_ACTIVE_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface CancelAllActiveTasksBeginAction {\n  type: typeof CANCEL_ALL_ACTIVE_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface CancelAllActiveTasksSuccessAction {\n  type: typeof CANCEL_ALL_ACTIVE_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface CancelAllActiveTasksErrorAction {\n  type: typeof CANCEL_ALL_ACTIVE_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface BatchCancelActiveTasksBeginAction {\n  type: typeof BATCH_CANCEL_ACTIVE_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchCancelActiveTasksSuccessAction {\n  type: typeof BATCH_CANCEL_ACTIVE_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchCancelTasksResponse;\n}\n\ninterface BatchCancelActiveTasksErrorAction {\n  type: typeof BATCH_CANCEL_ACTIVE_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface DeletePendingTaskBeginAction {\n  type: typeof DELETE_PENDING_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeletePendingTaskSuccessAction {\n  type: typeof DELETE_PENDING_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeletePendingTaskErrorAction {\n  type: typeof DELETE_PENDING_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchDeletePendingTasksBeginAction {\n  type: typeof BATCH_DELETE_PENDING_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchDeletePendingTasksSuccessAction {\n  type: typeof BATCH_DELETE_PENDING_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchDeleteTasksResponse;\n}\n\ninterface BatchDeletePendingTasksErrorAction {\n  type: typeof BATCH_DELETE_PENDING_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface DeleteAllPendingTasksBeginAction {\n  type: typeof DELETE_ALL_PENDING_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface DeleteAllPendingTasksSuccessAction {\n  type: typeof DELETE_ALL_PENDING_TASKS_SUCCESS;\n  queue: string;\n  deleted: number;\n}\n\ninterface DeleteAllPendingTasksErrorAction {\n  type: typeof DELETE_ALL_PENDING_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface ArchivePendingTaskBeginAction {\n  type: typeof ARCHIVE_PENDING_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchivePendingTaskSuccessAction {\n  type: typeof ARCHIVE_PENDING_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchivePendingTaskErrorAction {\n  type: typeof ARCHIVE_PENDING_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchArchivePendingTasksBeginAction {\n  type: typeof BATCH_ARCHIVE_PENDING_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchArchivePendingTasksSuccessAction {\n  type: typeof BATCH_ARCHIVE_PENDING_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchArchiveTasksResponse;\n}\n\ninterface BatchArchivePendingTasksErrorAction {\n  type: typeof BATCH_ARCHIVE_PENDING_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface ArchiveAllPendingTasksBeginAction {\n  type: typeof ARCHIVE_ALL_PENDING_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ArchiveAllPendingTasksSuccessAction {\n  type: typeof ARCHIVE_ALL_PENDING_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface ArchiveAllPendingTasksErrorAction {\n  type: typeof ARCHIVE_ALL_PENDING_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface RunScheduledTaskBeginAction {\n  type: typeof RUN_SCHEDULED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunScheduledTaskSuccessAction {\n  type: typeof RUN_SCHEDULED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunScheduledTaskErrorAction {\n  type: typeof RUN_SCHEDULED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface ArchiveScheduledTaskBeginAction {\n  type: typeof ARCHIVE_SCHEDULED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchiveScheduledTaskSuccessAction {\n  type: typeof ARCHIVE_SCHEDULED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchiveScheduledTaskErrorAction {\n  type: typeof ARCHIVE_SCHEDULED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface RunRetryTaskBeginAction {\n  type: typeof RUN_RETRY_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunRetryTaskSuccessAction {\n  type: typeof RUN_RETRY_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunRetryTaskErrorAction {\n  type: typeof RUN_RETRY_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface ArchiveRetryTaskBeginAction {\n  type: typeof ARCHIVE_RETRY_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchiveRetryTaskSuccessAction {\n  type: typeof ARCHIVE_RETRY_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface ArchiveRetryTaskErrorAction {\n  type: typeof ARCHIVE_RETRY_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface RunArchivedTaskBeginAction {\n  type: typeof RUN_ARCHIVED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunArchivedTaskSuccessAction {\n  type: typeof RUN_ARCHIVED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface RunArchivedTaskErrorAction {\n  type: typeof RUN_ARCHIVED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface DeleteScheduledTaskBeginAction {\n  type: typeof DELETE_SCHEDULED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteScheduledTaskSuccessAction {\n  type: typeof DELETE_SCHEDULED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteScheduledTaskErrorAction {\n  type: typeof DELETE_SCHEDULED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchDeleteScheduledTasksBeginAction {\n  type: typeof BATCH_DELETE_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchDeleteScheduledTasksSuccessAction {\n  type: typeof BATCH_DELETE_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchDeleteTasksResponse;\n}\n\ninterface BatchDeleteScheduledTasksErrorAction {\n  type: typeof BATCH_DELETE_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface BatchRunScheduledTasksBeginAction {\n  type: typeof BATCH_RUN_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchRunScheduledTasksSuccessAction {\n  type: typeof BATCH_RUN_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchRunTasksResponse;\n}\n\ninterface BatchRunScheduledTasksErrorAction {\n  type: typeof BATCH_RUN_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface RunAllScheduledTasksBeginAction {\n  type: typeof RUN_ALL_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface RunAllScheduledTasksSuccessAction {\n  type: typeof RUN_ALL_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface RunAllScheduledTasksErrorAction {\n  type: typeof RUN_ALL_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface BatchArchiveScheduledTasksBeginAction {\n  type: typeof BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchArchiveScheduledTasksSuccessAction {\n  type: typeof BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchArchiveTasksResponse;\n}\n\ninterface BatchArchiveScheduledTasksErrorAction {\n  type: typeof BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface ArchiveAllScheduledTasksBeginAction {\n  type: typeof ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ArchiveAllScheduledTasksSuccessAction {\n  type: typeof ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface ArchiveAllScheduledTasksErrorAction {\n  type: typeof ARCHIVE_ALL_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteAllScheduledTasksBeginAction {\n  type: typeof DELETE_ALL_SCHEDULED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface DeleteAllScheduledTasksSuccessAction {\n  type: typeof DELETE_ALL_SCHEDULED_TASKS_SUCCESS;\n  queue: string;\n  deleted: number;\n}\n\ninterface DeleteAllScheduledTasksErrorAction {\n  type: typeof DELETE_ALL_SCHEDULED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteRetryTaskBeginAction {\n  type: typeof DELETE_RETRY_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteRetryTaskSuccessAction {\n  type: typeof DELETE_RETRY_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteRetryTaskErrorAction {\n  type: typeof DELETE_RETRY_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchDeleteRetryTasksBeginAction {\n  type: typeof BATCH_DELETE_RETRY_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchDeleteRetryTasksSuccessAction {\n  type: typeof BATCH_DELETE_RETRY_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchDeleteTasksResponse;\n}\n\ninterface BatchDeleteRetryTasksErrorAction {\n  type: typeof BATCH_DELETE_RETRY_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface BatchRunRetryTasksBeginAction {\n  type: typeof BATCH_RUN_RETRY_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchRunRetryTasksSuccessAction {\n  type: typeof BATCH_RUN_RETRY_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchRunTasksResponse;\n}\n\ninterface BatchRunRetryTasksErrorAction {\n  type: typeof BATCH_RUN_RETRY_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface RunAllRetryTasksBeginAction {\n  type: typeof RUN_ALL_RETRY_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface RunAllRetryTasksSuccessAction {\n  type: typeof RUN_ALL_RETRY_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface RunAllRetryTasksErrorAction {\n  type: typeof RUN_ALL_RETRY_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface BatchArchiveRetryTasksBeginAction {\n  type: typeof BATCH_ARCHIVE_RETRY_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchArchiveRetryTasksSuccessAction {\n  type: typeof BATCH_ARCHIVE_RETRY_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchArchiveTasksResponse;\n}\n\ninterface BatchArchiveRetryTasksErrorAction {\n  type: typeof BATCH_ARCHIVE_RETRY_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface ArchiveAllRetryTasksBeginAction {\n  type: typeof ARCHIVE_ALL_RETRY_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface ArchiveAllRetryTasksSuccessAction {\n  type: typeof ARCHIVE_ALL_RETRY_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface ArchiveAllRetryTasksErrorAction {\n  type: typeof ARCHIVE_ALL_RETRY_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteAllRetryTasksBeginAction {\n  type: typeof DELETE_ALL_RETRY_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface DeleteAllRetryTasksSuccessAction {\n  type: typeof DELETE_ALL_RETRY_TASKS_SUCCESS;\n  queue: string;\n  deleted: number;\n}\n\ninterface DeleteAllRetryTasksErrorAction {\n  type: typeof DELETE_ALL_RETRY_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteArchivedTaskBeginAction {\n  type: typeof DELETE_ARCHIVED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteArchivedTaskSuccessAction {\n  type: typeof DELETE_ARCHIVED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteArchivedTaskErrorAction {\n  type: typeof DELETE_ARCHIVED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchDeleteArchivedTasksBeginAction {\n  type: typeof BATCH_DELETE_ARCHIVED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchDeleteArchivedTasksSuccessAction {\n  type: typeof BATCH_DELETE_ARCHIVED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchDeleteTasksResponse;\n}\n\ninterface BatchDeleteArchivedTasksErrorAction {\n  type: typeof BATCH_DELETE_ARCHIVED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface BatchRunArchivedTasksBeginAction {\n  type: typeof BATCH_RUN_ARCHIVED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchRunArchivedTasksSuccessAction {\n  type: typeof BATCH_RUN_ARCHIVED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchRunTasksResponse;\n}\n\ninterface BatchRunArchivedTasksErrorAction {\n  type: typeof BATCH_RUN_ARCHIVED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface RunAllArchivedTasksBeginAction {\n  type: typeof RUN_ALL_ARCHIVED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface RunAllArchivedTasksSuccessAction {\n  type: typeof RUN_ALL_ARCHIVED_TASKS_SUCCESS;\n  queue: string;\n}\n\ninterface RunAllArchivedTasksErrorAction {\n  type: typeof RUN_ALL_ARCHIVED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteAllArchivedTasksBeginAction {\n  type: typeof DELETE_ALL_ARCHIVED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface DeleteAllArchivedTasksSuccessAction {\n  type: typeof DELETE_ALL_ARCHIVED_TASKS_SUCCESS;\n  queue: string;\n  deleted: number;\n}\n\ninterface DeleteAllArchivedTasksErrorAction {\n  type: typeof DELETE_ALL_ARCHIVED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\ninterface DeleteCompletedTaskBeginAction {\n  type: typeof DELETE_COMPLETED_TASK_BEGIN;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteCompletedTaskSuccessAction {\n  type: typeof DELETE_COMPLETED_TASK_SUCCESS;\n  queue: string;\n  taskId: string;\n}\n\ninterface DeleteCompletedTaskErrorAction {\n  type: typeof DELETE_COMPLETED_TASK_ERROR;\n  queue: string;\n  taskId: string;\n  error: string;\n}\n\ninterface BatchDeleteCompletedTasksBeginAction {\n  type: typeof BATCH_DELETE_COMPLETED_TASKS_BEGIN;\n  queue: string;\n  taskIds: string[];\n}\n\ninterface BatchDeleteCompletedTasksSuccessAction {\n  type: typeof BATCH_DELETE_COMPLETED_TASKS_SUCCESS;\n  queue: string;\n  payload: BatchDeleteTasksResponse;\n}\n\ninterface BatchDeleteCompletedTasksErrorAction {\n  type: typeof BATCH_DELETE_COMPLETED_TASKS_ERROR;\n  queue: string;\n  taskIds: string[];\n  error: string;\n}\n\ninterface DeleteAllCompletedTasksBeginAction {\n  type: typeof DELETE_ALL_COMPLETED_TASKS_BEGIN;\n  queue: string;\n}\n\ninterface DeleteAllCompletedTasksSuccessAction {\n  type: typeof DELETE_ALL_COMPLETED_TASKS_SUCCESS;\n  queue: string;\n  deleted: number;\n}\n\ninterface DeleteAllCompletedTasksErrorAction {\n  type: typeof DELETE_ALL_COMPLETED_TASKS_ERROR;\n  queue: string;\n  error: string;\n}\n\n// Union of all tasks related action types.\nexport type TasksActionTypes =\n  | GetTaskInfoBeginAction\n  | GetTaskInfoErrorAction\n  | GetTaskInfoSuccessAction\n  | ListActiveTasksBeginAction\n  | ListActiveTasksSuccessAction\n  | ListActiveTasksErrorAction\n  | ListPendingTasksBeginAction\n  | ListPendingTasksSuccessAction\n  | ListPendingTasksErrorAction\n  | ListScheduledTasksBeginAction\n  | ListScheduledTasksSuccessAction\n  | ListScheduledTasksErrorAction\n  | ListRetryTasksBeginAction\n  | ListRetryTasksSuccessAction\n  | ListRetryTasksErrorAction\n  | ListArchivedTasksBeginAction\n  | ListArchivedTasksSuccessAction\n  | ListArchivedTasksErrorAction\n  | ListCompletedTasksBeginAction\n  | ListCompletedTasksSuccessAction\n  | ListCompletedTasksErrorAction\n  | CancelActiveTaskBeginAction\n  | CancelActiveTaskSuccessAction\n  | CancelActiveTaskErrorAction\n  | CancelAllActiveTasksBeginAction\n  | CancelAllActiveTasksSuccessAction\n  | CancelAllActiveTasksErrorAction\n  | BatchCancelActiveTasksBeginAction\n  | BatchCancelActiveTasksSuccessAction\n  | BatchCancelActiveTasksErrorAction\n  | DeletePendingTaskBeginAction\n  | DeletePendingTaskSuccessAction\n  | DeletePendingTaskErrorAction\n  | BatchDeletePendingTasksBeginAction\n  | BatchDeletePendingTasksSuccessAction\n  | BatchDeletePendingTasksErrorAction\n  | DeleteAllPendingTasksBeginAction\n  | DeleteAllPendingTasksSuccessAction\n  | DeleteAllPendingTasksErrorAction\n  | ArchivePendingTaskBeginAction\n  | ArchivePendingTaskSuccessAction\n  | ArchivePendingTaskErrorAction\n  | BatchArchivePendingTasksBeginAction\n  | BatchArchivePendingTasksSuccessAction\n  | BatchArchivePendingTasksErrorAction\n  | ArchiveAllPendingTasksBeginAction\n  | ArchiveAllPendingTasksSuccessAction\n  | ArchiveAllPendingTasksErrorAction\n  | RunScheduledTaskBeginAction\n  | RunScheduledTaskSuccessAction\n  | RunScheduledTaskErrorAction\n  | RunRetryTaskBeginAction\n  | RunRetryTaskSuccessAction\n  | RunRetryTaskErrorAction\n  | RunArchivedTaskBeginAction\n  | RunArchivedTaskSuccessAction\n  | RunArchivedTaskErrorAction\n  | ArchiveScheduledTaskBeginAction\n  | ArchiveScheduledTaskSuccessAction\n  | ArchiveScheduledTaskErrorAction\n  | ArchiveRetryTaskBeginAction\n  | ArchiveRetryTaskSuccessAction\n  | ArchiveRetryTaskErrorAction\n  | DeleteScheduledTaskBeginAction\n  | DeleteScheduledTaskSuccessAction\n  | DeleteScheduledTaskErrorAction\n  | BatchDeleteScheduledTasksBeginAction\n  | BatchDeleteScheduledTasksSuccessAction\n  | BatchDeleteScheduledTasksErrorAction\n  | BatchRunScheduledTasksBeginAction\n  | BatchRunScheduledTasksSuccessAction\n  | BatchRunScheduledTasksErrorAction\n  | RunAllScheduledTasksBeginAction\n  | RunAllScheduledTasksSuccessAction\n  | RunAllScheduledTasksErrorAction\n  | BatchArchiveScheduledTasksBeginAction\n  | BatchArchiveScheduledTasksSuccessAction\n  | BatchArchiveScheduledTasksErrorAction\n  | ArchiveAllScheduledTasksBeginAction\n  | ArchiveAllScheduledTasksSuccessAction\n  | ArchiveAllScheduledTasksErrorAction\n  | DeleteAllScheduledTasksBeginAction\n  | DeleteAllScheduledTasksSuccessAction\n  | DeleteAllScheduledTasksErrorAction\n  | DeleteRetryTaskBeginAction\n  | DeleteRetryTaskSuccessAction\n  | DeleteRetryTaskErrorAction\n  | BatchDeleteRetryTasksBeginAction\n  | BatchDeleteRetryTasksSuccessAction\n  | BatchDeleteRetryTasksErrorAction\n  | BatchRunRetryTasksBeginAction\n  | BatchRunRetryTasksSuccessAction\n  | BatchRunRetryTasksErrorAction\n  | RunAllRetryTasksBeginAction\n  | RunAllRetryTasksSuccessAction\n  | RunAllRetryTasksErrorAction\n  | BatchArchiveRetryTasksBeginAction\n  | BatchArchiveRetryTasksSuccessAction\n  | BatchArchiveRetryTasksErrorAction\n  | ArchiveAllRetryTasksBeginAction\n  | ArchiveAllRetryTasksSuccessAction\n  | ArchiveAllRetryTasksErrorAction\n  | DeleteAllRetryTasksBeginAction\n  | DeleteAllRetryTasksSuccessAction\n  | DeleteAllRetryTasksErrorAction\n  | DeleteArchivedTaskBeginAction\n  | DeleteArchivedTaskSuccessAction\n  | DeleteArchivedTaskErrorAction\n  | BatchDeleteArchivedTasksBeginAction\n  | BatchDeleteArchivedTasksSuccessAction\n  | BatchDeleteArchivedTasksErrorAction\n  | BatchRunArchivedTasksBeginAction\n  | BatchRunArchivedTasksSuccessAction\n  | BatchRunArchivedTasksErrorAction\n  | RunAllArchivedTasksBeginAction\n  | RunAllArchivedTasksSuccessAction\n  | RunAllArchivedTasksErrorAction\n  | DeleteAllArchivedTasksBeginAction\n  | DeleteAllArchivedTasksSuccessAction\n  | DeleteAllArchivedTasksErrorAction\n  | DeleteCompletedTaskBeginAction\n  | DeleteCompletedTaskSuccessAction\n  | DeleteCompletedTaskErrorAction\n  | BatchDeleteCompletedTasksBeginAction\n  | BatchDeleteCompletedTasksSuccessAction\n  | BatchDeleteCompletedTasksErrorAction\n  | DeleteAllCompletedTasksBeginAction\n  | DeleteAllCompletedTasksSuccessAction\n  | DeleteAllCompletedTasksErrorAction;\n\nexport function getTaskInfoAsync(qname: string, id: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: GET_TASK_INFO_BEGIN });\n    try {\n      const response = await getTaskInfo(qname, id);\n      dispatch({\n        type: GET_TASK_INFO_SUCCESS,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\"getTaskInfoAsync: \", toErrorStringWithHttpStatus(error));\n      dispatch({\n        type: GET_TASK_INFO_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listActiveTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: LIST_ACTIVE_TASKS_BEGIN, queue: qname });\n    try {\n      const response = await listActiveTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_ACTIVE_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listActiveTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_ACTIVE_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listPendingTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: LIST_PENDING_TASKS_BEGIN, queue: qname });\n    try {\n      const response = await listPendingTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_PENDING_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listPendingTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_PENDING_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listScheduledTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: LIST_SCHEDULED_TASKS_BEGIN, queue: qname });\n    try {\n      const response = await listScheduledTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_SCHEDULED_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_SCHEDULED_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listRetryTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: LIST_RETRY_TASKS_BEGIN, queue: qname });\n    try {\n      const response = await listRetryTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_RETRY_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_RETRY_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listArchivedTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: LIST_ARCHIVED_TASKS_BEGIN, queue: qname });\n    try {\n      const response = await listArchivedTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_ARCHIVED_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listArchivedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_ARCHIVED_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function listCompletedTasksAsync(\n  qname: string,\n  pageOpts?: PaginationOptions\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    try {\n      dispatch({ type: LIST_COMPLETED_TASKS_BEGIN, queue: qname });\n      const response = await listCompletedTasks(qname, pageOpts);\n      dispatch({\n        type: LIST_COMPLETED_TASKS_SUCCESS,\n        queue: qname,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"listCompletedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: LIST_COMPLETED_TASKS_ERROR,\n        queue: qname,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n\nexport function cancelActiveTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: CANCEL_ACTIVE_TASK_BEGIN, queue, taskId });\n    try {\n      await cancelActiveTask(queue, taskId);\n      dispatch({ type: CANCEL_ACTIVE_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"cancelActiveTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: CANCEL_ACTIVE_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function cancelAllActiveTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: CANCEL_ALL_ACTIVE_TASKS_BEGIN, queue });\n    try {\n      await cancelAllActiveTasks(queue);\n      dispatch({ type: CANCEL_ALL_ACTIVE_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"cancelAllActiveTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: CANCEL_ALL_ACTIVE_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function batchCancelActiveTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_CANCEL_ACTIVE_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchCancelActiveTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_CANCEL_ACTIVE_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchCancelActiveTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_CANCEL_ACTIVE_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function runScheduledTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_SCHEDULED_TASK_BEGIN, queue, taskId });\n    try {\n      await runScheduledTask(queue, taskId);\n      dispatch({ type: RUN_SCHEDULED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"runScheduledTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: RUN_SCHEDULED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function runRetryTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_RETRY_TASK_BEGIN, queue, taskId });\n    try {\n      await runRetryTask(queue, taskId);\n      dispatch({ type: RUN_RETRY_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\"runRetryTaskAsync: \", toErrorStringWithHttpStatus(error));\n      dispatch({\n        type: RUN_RETRY_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function archivePendingTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_PENDING_TASK_BEGIN, queue, taskId });\n    try {\n      await archivePendingTask(queue, taskId);\n      dispatch({ type: ARCHIVE_PENDING_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"archivePendingTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_PENDING_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function archiveScheduledTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_SCHEDULED_TASK_BEGIN, queue, taskId });\n    try {\n      await archiveScheduledTask(queue, taskId);\n      dispatch({ type: ARCHIVE_SCHEDULED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"archiveScheduledTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_SCHEDULED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function archiveRetryTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_RETRY_TASK_BEGIN, queue, taskId });\n    try {\n      await archiveRetryTask(queue, taskId);\n      dispatch({ type: ARCHIVE_RETRY_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"archiveRetryTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_RETRY_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function runArchivedTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_ARCHIVED_TASK_BEGIN, queue, taskId });\n    try {\n      await runArchivedTask(queue, taskId);\n      dispatch({ type: RUN_ARCHIVED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"runArchivedTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: RUN_ARCHIVED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function deletePendingTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_PENDING_TASK_BEGIN, queue, taskId });\n    try {\n      await deletePendingTask(queue, taskId);\n      dispatch({ type: DELETE_PENDING_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"deletePendingTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_PENDING_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function batchDeletePendingTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_DELETE_PENDING_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchDeletePendingTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_DELETE_PENDING_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchDeletePendingTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_DELETE_PENDING_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function deleteScheduledTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_SCHEDULED_TASK_BEGIN, queue, taskId });\n    try {\n      await deleteScheduledTask(queue, taskId);\n      dispatch({ type: DELETE_SCHEDULED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"deleteScheduledTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_SCHEDULED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function batchDeleteScheduledTasksAsync(\n  queue: string,\n  taskIds: string[]\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_DELETE_SCHEDULED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchDeleteScheduledTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_DELETE_SCHEDULED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchDeleteScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_DELETE_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchRunScheduledTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_RUN_SCHEDULED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchRunScheduledTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_RUN_SCHEDULED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchRunScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_RUN_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchArchiveScheduledTasksAsync(\n  queue: string,\n  taskIds: string[]\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchArchiveScheduledTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchArchiveScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchArchivePendingTasksAsync(\n  queue: string,\n  taskIds: string[]\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_ARCHIVE_PENDING_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchArchivePendingTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_ARCHIVE_PENDING_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchArchivePendingTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_ARCHIVE_PENDING_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function archiveAllPendingTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_ALL_PENDING_TASKS_BEGIN, queue });\n    try {\n      await archiveAllPendingTasks(queue);\n      dispatch({ type: ARCHIVE_ALL_PENDING_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"archiveAllPendingTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_ALL_PENDING_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function deleteAllPendingTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ALL_PENDING_TASKS_BEGIN, queue });\n    try {\n      const response = await deleteAllPendingTasks(queue);\n      dispatch({\n        type: DELETE_ALL_PENDING_TASKS_SUCCESS,\n        deleted: response.deleted,\n        queue,\n      });\n    } catch (error) {\n      console.error(\n        \"deleteAllPendingTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ALL_PENDING_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function deleteAllScheduledTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ALL_SCHEDULED_TASKS_BEGIN, queue });\n    try {\n      const response = await deleteAllScheduledTasks(queue);\n      dispatch({\n        type: DELETE_ALL_SCHEDULED_TASKS_SUCCESS,\n        deleted: response.deleted,\n        queue,\n      });\n    } catch (error) {\n      console.error(\n        \"deleteAllScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ALL_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function runAllScheduledTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_ALL_SCHEDULED_TASKS_BEGIN, queue });\n    try {\n      await runAllScheduledTasks(queue);\n      dispatch({ type: RUN_ALL_SCHEDULED_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"runAllScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: RUN_ALL_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function archiveAllScheduledTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN, queue });\n    try {\n      await archiveAllScheduledTasks(queue);\n      dispatch({ type: ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"archiveAllScheduledTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_ALL_SCHEDULED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function deleteRetryTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_RETRY_TASK_BEGIN, queue, taskId });\n    try {\n      await deleteRetryTask(queue, taskId);\n      dispatch({ type: DELETE_RETRY_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"deleteRetryTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_RETRY_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function batchDeleteRetryTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_DELETE_RETRY_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchDeleteRetryTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_DELETE_RETRY_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchDeleteRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_DELETE_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchRunRetryTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_RUN_RETRY_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchRunRetryTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_RUN_RETRY_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchRunRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_RUN_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchArchiveRetryTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_ARCHIVE_RETRY_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchArchiveRetryTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_ARCHIVE_RETRY_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchArchiveRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_ARCHIVE_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function deleteAllRetryTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ALL_RETRY_TASKS_BEGIN, queue });\n    try {\n      const response = await deleteAllRetryTasks(queue);\n      dispatch({\n        type: DELETE_ALL_RETRY_TASKS_SUCCESS,\n        deleted: response.deleted,\n        queue,\n      });\n    } catch (error) {\n      console.error(\n        \"deleteAllRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ALL_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function runAllRetryTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_ALL_RETRY_TASKS_BEGIN, queue });\n    try {\n      await runAllRetryTasks(queue);\n      dispatch({ type: RUN_ALL_RETRY_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"runAllRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: RUN_ALL_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function archiveAllRetryTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: ARCHIVE_ALL_RETRY_TASKS_BEGIN, queue });\n    try {\n      await archiveAllRetryTasks(queue);\n      dispatch({ type: ARCHIVE_ALL_RETRY_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"archiveAllRetryTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: ARCHIVE_ALL_RETRY_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function deleteArchivedTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ARCHIVED_TASK_BEGIN, queue, taskId });\n    try {\n      await deleteArchivedTask(queue, taskId);\n      dispatch({ type: DELETE_ARCHIVED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"deleteArchivedTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ARCHIVED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function batchDeleteArchivedTasksAsync(\n  queue: string,\n  taskIds: string[]\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_DELETE_ARCHIVED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchDeleteArchivedTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_DELETE_ARCHIVED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchDeleteArchivedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_DELETE_ARCHIVED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function batchRunArchivedTasksAsync(queue: string, taskIds: string[]) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_RUN_ARCHIVED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchRunArchivedTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_RUN_ARCHIVED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchRunArchivedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_RUN_ARCHIVED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function deleteAllArchivedTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ALL_ARCHIVED_TASKS_BEGIN, queue });\n    try {\n      const response = await deleteAllArchivedTasks(queue);\n      dispatch({\n        type: DELETE_ALL_ARCHIVED_TASKS_SUCCESS,\n        deleted: response.deleted,\n        queue,\n      });\n    } catch (error) {\n      console.error(\n        \"deleteAllArchivedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ALL_ARCHIVED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function runAllArchivedTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: RUN_ALL_ARCHIVED_TASKS_BEGIN, queue });\n    try {\n      await runAllArchivedTasks(queue);\n      dispatch({ type: RUN_ALL_ARCHIVED_TASKS_SUCCESS, queue });\n    } catch (error) {\n      console.error(\n        \"runAllArchivedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: RUN_ALL_ARCHIVED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n\nexport function deleteCompletedTaskAsync(queue: string, taskId: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_COMPLETED_TASK_BEGIN, queue, taskId });\n    try {\n      await deleteCompletedTask(queue, taskId);\n      dispatch({ type: DELETE_COMPLETED_TASK_SUCCESS, queue, taskId });\n    } catch (error) {\n      console.error(\n        \"deleteCompletedTaskAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_COMPLETED_TASK_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskId,\n      });\n    }\n  };\n}\n\nexport function batchDeleteCompletedTasksAsync(\n  queue: string,\n  taskIds: string[]\n) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: BATCH_DELETE_COMPLETED_TASKS_BEGIN, queue, taskIds });\n    try {\n      const response = await batchDeleteCompletedTasks(queue, taskIds);\n      dispatch({\n        type: BATCH_DELETE_COMPLETED_TASKS_SUCCESS,\n        queue: queue,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(\n        \"batchDeleteCompletedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: BATCH_DELETE_COMPLETED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n        taskIds,\n      });\n    }\n  };\n}\n\nexport function deleteAllCompletedTasksAsync(queue: string) {\n  return async (dispatch: Dispatch<TasksActionTypes>) => {\n    dispatch({ type: DELETE_ALL_COMPLETED_TASKS_BEGIN, queue });\n    try {\n      const response = await deleteAllCompletedTasks(queue);\n      dispatch({\n        type: DELETE_ALL_COMPLETED_TASKS_SUCCESS,\n        deleted: response.deleted,\n        queue,\n      });\n    } catch (error) {\n      console.error(\n        \"deleteAllCompletedTasksAsync: \",\n        toErrorStringWithHttpStatus(error)\n      );\n      dispatch({\n        type: DELETE_ALL_COMPLETED_TASKS_ERROR,\n        error: toErrorString(error),\n        queue,\n      });\n    }\n  };\n}\n","import React, { useState } from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Menu from \"@material-ui/core/Menu\";\nimport MenuItem from \"@material-ui/core/MenuItem\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\n\nconst useStyles = makeStyles((theme) => ({\n  actionsContainer: {\n    display: \"flex\",\n    padding: \"4px\",\n  },\n  moreIcon: {\n    marginRight: \"8px\",\n  },\n  iconGroup: {\n    paddingLeft: theme.spacing(1),\n    borderLeft: `1px solid ${theme.palette.grey[100]}`,\n  },\n}));\n\ninterface MenuItemAction {\n  label: string;\n  onClick: () => void;\n  disabled: boolean;\n}\n\ninterface IconButtonAction {\n  icon: React.ReactElement;\n  tooltip: string;\n  onClick: () => void;\n  disabled: boolean;\n}\n\ninterface Props {\n  menuItemActions: MenuItemAction[];\n  iconButtonActions: IconButtonAction[];\n  showIconButtons: boolean;\n}\n\nexport default function TableActions(props: Props) {\n  const classes = useStyles();\n  const [menuAnchor, setMenuAnchor] = useState<null | HTMLElement>(null);\n\n  const handleMenuClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n    setMenuAnchor(event.currentTarget);\n  };\n\n  const closeMenu = () => setMenuAnchor(null);\n\n  return (\n    <div className={classes.actionsContainer}>\n      <Tooltip title=\"More Actions\">\n        <IconButton\n          aria-label=\"actions\"\n          className={classes.moreIcon}\n          onClick={handleMenuClick}\n        >\n          <MoreHorizIcon />\n        </IconButton>\n      </Tooltip>\n      <Menu\n        id=\"action-menu\"\n        keepMounted\n        anchorEl={menuAnchor}\n        open={Boolean(menuAnchor)}\n        onClose={closeMenu}\n      >\n        {props.menuItemActions.map((action) => (\n          <MenuItem\n            key={action.label}\n            onClick={() => {\n              action.onClick();\n              closeMenu();\n            }}\n            disabled={action.disabled}\n          >\n            {action.label}\n          </MenuItem>\n        ))}\n      </Menu>\n      {props.showIconButtons && (\n        <div className={classes.iconGroup}>\n          {props.iconButtonActions.map((action) => (\n            <Tooltip key={action.tooltip} title={action.tooltip}>\n              <IconButton onClick={action.onClick} disabled={action.disabled}>\n                {action.icon}\n              </IconButton>\n            </Tooltip>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n","import React, { useState, useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport {\n  listActiveTasksAsync,\n  cancelActiveTaskAsync,\n  batchCancelActiveTasksAsync,\n  cancelAllActiveTasksAsync,\n} from \"../actions/tasksActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport { AppState } from \"../store\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport TableActions from \"./TableActions\";\nimport { usePolling } from \"../hooks\";\nimport { ActiveTaskExtended } from \"../reducers/tasksReducer\";\nimport { durationBefore, timeAgo, uuidPrefix, prettifyPayload } from \"../utils\";\nimport { TableColumn } from \"../types/table\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.activeTasks.loading,\n    error: state.tasks.activeTasks.error,\n    tasks: state.tasks.activeTasks.data,\n    batchActionPending: state.tasks.activeTasks.batchActionPending,\n    allActionPending: state.tasks.activeTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  listActiveTasksAsync,\n  cancelActiveTaskAsync,\n  batchCancelActiveTasksAsync,\n  cancelAllActiveTasksAsync,\n  taskRowsPerPageChange,\n};\n\nconst columns: TableColumn[] = [\n  { key: \"id\", label: \"ID\", align: \"left\" },\n  { key: \"type\", label: \"Type\", align: \"left\" },\n  { key: \"payload\", label: \"Payload\", align: \"left\" },\n  { key: \"status\", label: \"Status\", align: \"left\" },\n  { key: \"start-time\", label: \"Started\", align: \"left\" },\n  { key: \"deadline\", label: \"Deadline\", align: \"left\" },\n  { key: \"actions\", label: \"Actions\", align: \"center\" },\n];\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string; // name of the queue\n}\n\nfunction ActiveTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listActiveTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleCancelAllClick = () => {\n    props.cancelAllActiveTasksAsync(queue);\n  };\n\n  const handleBatchCancelClick = () => {\n    props\n      .batchCancelActiveTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listActiveTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listActiveTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No active tasks at this time.\n      </Alert>\n    );\n  }\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Cancel\",\n            icon: <CancelIcon />,\n            onClick: handleBatchCancelClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Cancel All\",\n            onClick: handleCancelAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"active tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.key}\n                  align={col.align}\n                  classes={{ stickyHeader: classes.stickyHeaderCell }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {/* TODO: loading and empty state */}\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                onCancelClick={() => {\n                  props.cancelActiveTaskAsync(queue, task.id);\n                }}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.tasks.length}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n}));\n\ninterface RowProps {\n  task: ActiveTaskExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onCancelClick: () => void;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>{task.canceling ? \"Canceling\" : \"Running\"}</TableCell>\n      <TableCell>\n        {task.start_time === \"-\" ? \"just now\" : timeAgo(task.start_time)}\n      </TableCell>\n      <TableCell>\n        {task.deadline === \"-\" ? \"-\" : durationBefore(task.deadline)}\n      </TableCell>\n      <TableCell\n        align=\"center\"\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Cancel\">\n              <IconButton\n                onClick={props.onCancelClick}\n                disabled={task.requestPending || task.canceling}\n                size=\"small\"\n              >\n                <CancelIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default connector(ActiveTasksTable);\n","import React, { useCallback, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport ArchiveIcon from \"@material-ui/icons/Archive\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport TableActions from \"./TableActions\";\nimport {\n  listPendingTasksAsync,\n  deletePendingTaskAsync,\n  batchDeletePendingTasksAsync,\n  deleteAllPendingTasksAsync,\n  archivePendingTaskAsync,\n  batchArchivePendingTasksAsync,\n  archiveAllPendingTasksAsync,\n} from \"../actions/tasksActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport { AppState } from \"../store\";\nimport { usePolling } from \"../hooks\";\nimport { uuidPrefix, prettifyPayload } from \"../utils\";\nimport { TableColumn } from \"../types/table\";\nimport { TaskInfoExtended } from \"../reducers/tasksReducer\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.pendingTasks.loading,\n    error: state.tasks.pendingTasks.error,\n    tasks: state.tasks.pendingTasks.data,\n    batchActionPending: state.tasks.pendingTasks.batchActionPending,\n    allActionPending: state.tasks.pendingTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  listPendingTasksAsync,\n  deletePendingTaskAsync,\n  batchDeletePendingTasksAsync,\n  deleteAllPendingTasksAsync,\n  archivePendingTaskAsync,\n  batchArchivePendingTasksAsync,\n  archiveAllPendingTasksAsync,\n  taskRowsPerPageChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string;\n  totalTaskCount: number; // total number of pending tasks\n}\n\nfunction PendingTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listPendingTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleDeleteAllClick = () => {\n    props.deleteAllPendingTasksAsync(queue);\n  };\n\n  const handleArchiveAllClick = () => {\n    props.archiveAllPendingTasksAsync(queue);\n  };\n\n  const handleBatchDeleteClick = () => {\n    props\n      .batchDeletePendingTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchArchiveClick = () => {\n    props\n      .batchArchivePendingTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listPendingTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listPendingTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No pending tasks at this time.\n      </Alert>\n    );\n  }\n\n  const columns: TableColumn[] = [\n    { key: \"id\", label: \"ID\", align: \"left\" },\n    { key: \"type\", label: \"Type\", align: \"left\" },\n    { key: \"paylod\", label: \"Payload\", align: \"left\" },\n    { key: \"retried\", label: \"Retried\", align: \"right\" },\n    { key: \"max_retry\", label: \"Max Retry\", align: \"right\" },\n    { key: \"actions\", label: \"Actions\", align: \"center\" },\n  ];\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Delete\",\n            icon: <DeleteIcon />,\n            onClick: handleBatchDeleteClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Archive\",\n            icon: <ArchiveIcon />,\n            onClick: handleBatchArchiveClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Delete All\",\n            onClick: handleDeleteAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Archive All\",\n            onClick: handleArchiveAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"pending tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.key}\n                  align={col.align}\n                  classes={{\n                    stickyHeader: classes.stickyHeaderCell,\n                  }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                allActionPending={props.allActionPending}\n                onDeleteClick={() =>\n                  props.deletePendingTaskAsync(queue, task.id)\n                }\n                onArchiveClick={() => {\n                  props.archivePendingTaskAsync(queue, task.id);\n                }}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.totalTaskCount}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n  actionCell: {\n    width: \"96px\",\n  },\n  actionButton: {\n    marginLeft: 3,\n    marginRight: 3,\n  },\n}));\n\ninterface RowProps {\n  task: TaskInfoExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onDeleteClick: () => void;\n  onArchiveClick: () => void;\n  allActionPending: boolean;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell align=\"right\">{task.retried}</TableCell>\n      <TableCell align=\"right\">{task.max_retry}</TableCell>\n      <TableCell\n        align=\"center\"\n        className={classes.actionCell}\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Delete\">\n              <IconButton\n                onClick={props.onDeleteClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <DeleteIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Archive\">\n              <IconButton\n                onClick={props.onArchiveClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <ArchiveIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default connector(PendingTasksTable);\n","import React, { useState, useCallback } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport PlayArrowIcon from \"@material-ui/icons/PlayArrow\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport ArchiveIcon from \"@material-ui/icons/Archive\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport {\n  batchDeleteScheduledTasksAsync,\n  batchRunScheduledTasksAsync,\n  batchArchiveScheduledTasksAsync,\n  deleteAllScheduledTasksAsync,\n  runAllScheduledTasksAsync,\n  archiveAllScheduledTasksAsync,\n  listScheduledTasksAsync,\n  deleteScheduledTaskAsync,\n  runScheduledTaskAsync,\n  archiveScheduledTaskAsync,\n} from \"../actions/tasksActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport { AppState } from \"../store\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport TableActions from \"./TableActions\";\nimport { durationBefore, uuidPrefix, prettifyPayload } from \"../utils\";\nimport { usePolling } from \"../hooks\";\nimport { TaskInfoExtended } from \"../reducers/tasksReducer\";\nimport { TableColumn } from \"../types/table\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.scheduledTasks.loading,\n    error: state.tasks.scheduledTasks.error,\n    tasks: state.tasks.scheduledTasks.data,\n    batchActionPending: state.tasks.scheduledTasks.batchActionPending,\n    allActionPending: state.tasks.scheduledTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  listScheduledTasksAsync,\n  batchDeleteScheduledTasksAsync,\n  batchRunScheduledTasksAsync,\n  batchArchiveScheduledTasksAsync,\n  deleteAllScheduledTasksAsync,\n  runAllScheduledTasksAsync,\n  archiveAllScheduledTasksAsync,\n  deleteScheduledTaskAsync,\n  runScheduledTaskAsync,\n  archiveScheduledTaskAsync,\n  taskRowsPerPageChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string; // name of the queue.\n  totalTaskCount: number; // totoal number of scheduled tasks.\n}\n\nfunction ScheduledTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listScheduledTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleRunAllClick = () => {\n    props.runAllScheduledTasksAsync(queue);\n  };\n\n  const handleDeleteAllClick = () => {\n    props.deleteAllScheduledTasksAsync(queue);\n  };\n\n  const handleArchiveAllClick = () => {\n    props.archiveAllScheduledTasksAsync(queue);\n  };\n\n  const handleBatchRunClick = () => {\n    props\n      .batchRunScheduledTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchDeleteClick = () => {\n    props\n      .batchDeleteScheduledTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchArchiveClick = () => {\n    props\n      .batchArchiveScheduledTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listScheduledTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listScheduledTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No scheduled tasks at this time.\n      </Alert>\n    );\n  }\n\n  const columns: TableColumn[] = [\n    { key: \"id\", label: \"ID\", align: \"left\" },\n    { key: \"type\", label: \"Type\", align: \"left\" },\n    { key: \"payload\", label: \"Payload\", align: \"left\" },\n    { key: \"process_in\", label: \"Process In\", align: \"left\" },\n    { key: \"actions\", label: \"Actions\", align: \"center\" },\n  ];\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Delete\",\n            icon: <DeleteIcon />,\n            onClick: handleBatchDeleteClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Archive\",\n            icon: <ArchiveIcon />,\n            onClick: handleBatchArchiveClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Run\",\n            icon: <PlayArrowIcon />,\n            onClick: handleBatchRunClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Delete All\",\n            onClick: handleDeleteAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Archive All\",\n            onClick: handleArchiveAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Run All\",\n            onClick: handleRunAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"scheduled tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.label}\n                  align={col.align}\n                  classes={{ stickyHeader: classes.stickyHeaderCell }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                allActionPending={props.allActionPending}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                onRunClick={() => {\n                  props.runScheduledTaskAsync(queue, task.id);\n                }}\n                onDeleteClick={() => {\n                  props.deleteScheduledTaskAsync(queue, task.id);\n                }}\n                onArchiveClick={() => {\n                  props.archiveScheduledTaskAsync(queue, task.id);\n                }}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.totalTaskCount}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n  actionCell: {\n    width: \"140px\",\n  },\n  actionButton: {\n    marginLeft: 3,\n    marginRight: 3,\n  },\n}));\n\ninterface RowProps {\n  task: TaskInfoExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onRunClick: () => void;\n  onDeleteClick: () => void;\n  onArchiveClick: () => void;\n  allActionPending: boolean;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>{durationBefore(task.next_process_at)}</TableCell>\n      <TableCell\n        align=\"center\"\n        className={classes.actionCell}\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Delete\">\n              <IconButton\n                onClick={props.onDeleteClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <DeleteIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Archive\">\n              <IconButton\n                onClick={props.onArchiveClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <ArchiveIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Run\">\n              <IconButton\n                onClick={props.onRunClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <PlayArrowIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\nexport default connector(ScheduledTasksTable);\n","import React, { useCallback, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport PlayArrowIcon from \"@material-ui/icons/PlayArrow\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport ArchiveIcon from \"@material-ui/icons/Archive\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport {\n  batchDeleteRetryTasksAsync,\n  batchRunRetryTasksAsync,\n  batchArchiveRetryTasksAsync,\n  deleteAllRetryTasksAsync,\n  runAllRetryTasksAsync,\n  archiveAllRetryTasksAsync,\n  listRetryTasksAsync,\n  deleteRetryTaskAsync,\n  runRetryTaskAsync,\n  archiveRetryTaskAsync,\n} from \"../actions/tasksActions\";\nimport { AppState } from \"../store\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport TableActions from \"./TableActions\";\nimport { durationBefore, uuidPrefix, prettifyPayload } from \"../utils\";\nimport { usePolling } from \"../hooks\";\nimport { TaskInfoExtended } from \"../reducers/tasksReducer\";\nimport { TableColumn } from \"../types/table\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.retryTasks.loading,\n    error: state.tasks.retryTasks.error,\n    tasks: state.tasks.retryTasks.data,\n    batchActionPending: state.tasks.retryTasks.batchActionPending,\n    allActionPending: state.tasks.retryTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  batchDeleteRetryTasksAsync,\n  batchRunRetryTasksAsync,\n  batchArchiveRetryTasksAsync,\n  deleteAllRetryTasksAsync,\n  runAllRetryTasksAsync,\n  archiveAllRetryTasksAsync,\n  listRetryTasksAsync,\n  deleteRetryTaskAsync,\n  runRetryTaskAsync,\n  archiveRetryTaskAsync,\n  taskRowsPerPageChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string; // name of the queue.\n  totalTaskCount: number; // totoal number of scheduled tasks.\n}\n\nfunction RetryTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listRetryTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleRunAllClick = () => {\n    props.runAllRetryTasksAsync(queue);\n  };\n\n  const handleDeleteAllClick = () => {\n    props.deleteAllRetryTasksAsync(queue);\n  };\n\n  const handleArchiveAllClick = () => {\n    props.archiveAllRetryTasksAsync(queue);\n  };\n\n  const handleBatchRunClick = () => {\n    props\n      .batchRunRetryTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchDeleteClick = () => {\n    props\n      .batchDeleteRetryTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchArchiveClick = () => {\n    props\n      .batchArchiveRetryTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listRetryTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listRetryTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No retry tasks at this time.\n      </Alert>\n    );\n  }\n\n  const columns: TableColumn[] = [\n    { key: \"id\", label: \"ID\", align: \"left\" },\n    { key: \"type\", label: \"Type\", align: \"left\" },\n    { key: \"payload\", label: \"Payload\", align: \"left\" },\n    { key: \"retry_in\", label: \"Retry In\", align: \"left\" },\n    { key: \"last_error\", label: \"Last Error\", align: \"left\" },\n    { key: \"retried\", label: \"Retried\", align: \"right\" },\n    { key: \"max_retry\", label: \"Max Retry\", align: \"right\" },\n    { key: \"actions\", label: \"Actions\", align: \"center\" },\n  ];\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Delete\",\n            icon: <DeleteIcon />,\n            onClick: handleBatchDeleteClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Archive\",\n            icon: <ArchiveIcon />,\n            onClick: handleBatchArchiveClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Run\",\n            icon: <PlayArrowIcon />,\n            onClick: handleBatchRunClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Delete All\",\n            onClick: handleDeleteAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Archive All\",\n            onClick: handleArchiveAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Run All\",\n            onClick: handleRunAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"retry tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.label}\n                  align={col.align}\n                  classes={{ stickyHeader: classes.stickyHeaderCell }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                allActionPending={props.allActionPending}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                onRunClick={() => {\n                  props.runRetryTaskAsync(task.queue, task.id);\n                }}\n                onDeleteClick={() => {\n                  props.deleteRetryTaskAsync(task.queue, task.id);\n                }}\n                onArchiveClick={() => {\n                  props.archiveRetryTaskAsync(task.queue, task.id);\n                }}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.totalTaskCount}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n  actionCell: {\n    width: \"140px\",\n  },\n  actionButton: {\n    marginLeft: 3,\n    marginRight: 3,\n  },\n}));\n\ninterface RowProps {\n  task: TaskInfoExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onDeleteClick: () => void;\n  onRunClick: () => void;\n  onArchiveClick: () => void;\n  allActionPending: boolean;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>{durationBefore(task.next_process_at)}</TableCell>\n      <TableCell>{task.error_message}</TableCell>\n      <TableCell align=\"right\">{task.retried}</TableCell>\n      <TableCell align=\"right\">{task.max_retry}</TableCell>\n      <TableCell\n        align=\"center\"\n        className={classes.actionCell}\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Delete\">\n              <IconButton\n                onClick={props.onDeleteClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <DeleteIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Archive\">\n              <IconButton\n                onClick={props.onArchiveClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <ArchiveIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Run\">\n              <IconButton\n                onClick={props.onRunClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n                className={classes.actionButton}\n              >\n                <PlayArrowIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default connector(RetryTasksTable);\n","import React, { useCallback, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Paper from \"@material-ui/core/Paper\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport PlayArrowIcon from \"@material-ui/icons/PlayArrow\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport { AppState } from \"../store\";\nimport {\n  batchDeleteArchivedTasksAsync,\n  batchRunArchivedTasksAsync,\n  deleteArchivedTaskAsync,\n  deleteAllArchivedTasksAsync,\n  listArchivedTasksAsync,\n  runArchivedTaskAsync,\n  runAllArchivedTasksAsync,\n} from \"../actions/tasksActions\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport TableActions from \"./TableActions\";\nimport { timeAgo, uuidPrefix, prettifyPayload } from \"../utils\";\nimport { usePolling } from \"../hooks\";\nimport { TaskInfoExtended } from \"../reducers/tasksReducer\";\nimport { TableColumn } from \"../types/table\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.archivedTasks.loading,\n    error: state.tasks.archivedTasks.error,\n    tasks: state.tasks.archivedTasks.data,\n    batchActionPending: state.tasks.archivedTasks.batchActionPending,\n    allActionPending: state.tasks.archivedTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  listArchivedTasksAsync,\n  runArchivedTaskAsync,\n  runAllArchivedTasksAsync,\n  deleteArchivedTaskAsync,\n  deleteAllArchivedTasksAsync,\n  batchRunArchivedTasksAsync,\n  batchDeleteArchivedTasksAsync,\n  taskRowsPerPageChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string; // name of the queue.\n  totalTaskCount: number; // totoal number of archived tasks.\n}\n\nfunction ArchivedTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listArchivedTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleRunAllClick = () => {\n    props.runAllArchivedTasksAsync(queue);\n  };\n\n  const handleDeleteAllClick = () => {\n    props.deleteAllArchivedTasksAsync(queue);\n  };\n\n  const handleBatchRunClick = () => {\n    props\n      .batchRunArchivedTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const handleBatchDeleteClick = () => {\n    props\n      .batchDeleteArchivedTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listArchivedTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listArchivedTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No archived tasks at this time.\n      </Alert>\n    );\n  }\n\n  const columns: TableColumn[] = [\n    { key: \"id\", label: \"ID\", align: \"left\" },\n    { key: \"type\", label: \"Type\", align: \"left\" },\n    { key: \"payload\", label: \"Payload\", align: \"left\" },\n    { key: \"last_failed\", label: \"Last Failed\", align: \"left\" },\n    { key: \"last_error\", label: \"Last Error\", align: \"left\" },\n    { key: \"actions\", label: \"Actions\", align: \"center\" },\n  ];\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Delete\",\n            icon: <DeleteIcon />,\n            onClick: handleBatchDeleteClick,\n            disabled: props.batchActionPending,\n          },\n          {\n            tooltip: \"Run\",\n            icon: <PlayArrowIcon />,\n            onClick: handleBatchRunClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Delete All\",\n            onClick: handleDeleteAllClick,\n            disabled: props.allActionPending,\n          },\n          {\n            label: \"Run All\",\n            onClick: handleRunAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"archived tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.key}\n                  align={col.align}\n                  classes={{ stickyHeader: classes.stickyHeaderCell }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                onRunClick={() => {\n                  props.runArchivedTaskAsync(queue, task.id);\n                }}\n                onDeleteClick={() => {\n                  props.deleteArchivedTaskAsync(queue, task.id);\n                }}\n                allActionPending={props.allActionPending}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.totalTaskCount}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n  actionCell: {\n    width: \"96px\",\n  },\n  actionButton: {\n    marginLeft: 3,\n    marginRight: 3,\n  },\n}));\n\ninterface RowProps {\n  task: TaskInfoExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onRunClick: () => void;\n  onDeleteClick: () => void;\n  allActionPending: boolean;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>{timeAgo(task.last_failed_at)}</TableCell>\n      <TableCell>{task.error_message}</TableCell>\n      <TableCell\n        align=\"center\"\n        className={classes.actionCell}\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Delete\">\n              <IconButton\n                className={classes.actionButton}\n                onClick={props.onDeleteClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n              >\n                <DeleteIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n            <Tooltip title=\"Run\">\n              <IconButton\n                className={classes.actionButton}\n                onClick={props.onRunClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n              >\n                <PlayArrowIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default connector(ArchivedTasksTable);\n","import React, { useCallback, useState } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport Paper from \"@material-ui/core/Paper\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport DeleteIcon from \"@material-ui/icons/Delete\";\nimport MoreHorizIcon from \"@material-ui/icons/MoreHoriz\";\nimport TableFooter from \"@material-ui/core/TableFooter\";\nimport TablePagination from \"@material-ui/core/TablePagination\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport { AppState } from \"../store\";\nimport {\n  listCompletedTasksAsync,\n  deleteAllCompletedTasksAsync,\n  deleteCompletedTaskAsync,\n  batchDeleteCompletedTasksAsync,\n} from \"../actions/tasksActions\";\nimport TablePaginationActions, {\n  rowsPerPageOptions,\n} from \"./TablePaginationActions\";\nimport { taskRowsPerPageChange } from \"../actions/settingsActions\";\nimport TableActions from \"./TableActions\";\nimport {\n  durationFromSeconds,\n  stringifyDuration,\n  timeAgo,\n  uuidPrefix,\n  prettifyPayload\n} from \"../utils\";\nimport { usePolling } from \"../hooks\";\nimport { TaskInfoExtended } from \"../reducers/tasksReducer\";\nimport { TableColumn } from \"../types/table\";\nimport { taskDetailsPath } from \"../paths\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  stickyHeaderCell: {\n    background: theme.palette.background.paper,\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  pagination: {\n    border: \"none\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.completedTasks.loading,\n    error: state.tasks.completedTasks.error,\n    tasks: state.tasks.completedTasks.data,\n    batchActionPending: state.tasks.completedTasks.batchActionPending,\n    allActionPending: state.tasks.completedTasks.allActionPending,\n    pollInterval: state.settings.pollInterval,\n    pageSize: state.settings.taskRowsPerPage,\n  };\n}\n\nconst mapDispatchToProps = {\n  listCompletedTasksAsync,\n  deleteCompletedTaskAsync,\n  deleteAllCompletedTasksAsync,\n  batchDeleteCompletedTasksAsync,\n  taskRowsPerPageChange,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string; // name of the queue.\n  totalTaskCount: number; // totoal number of completed tasks.\n}\n\nfunction CompletedTasksTable(props: Props & ReduxProps) {\n  const { pollInterval, listCompletedTasksAsync, queue, pageSize } = props;\n  const classes = useStyles();\n  const [page, setPage] = useState(0);\n  const [selectedIds, setSelectedIds] = useState<string[]>([]);\n  const [activeTaskId, setActiveTaskId] = useState<string>(\"\");\n\n  const handlePageChange = (\n    event: React.MouseEvent<HTMLButtonElement> | null,\n    newPage: number\n  ) => {\n    setPage(newPage);\n  };\n\n  const handleRowsPerPageChange = (\n    event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>\n  ) => {\n    props.taskRowsPerPageChange(parseInt(event.target.value, 10));\n    setPage(0);\n  };\n\n  const handleSelectAllClick = (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (event.target.checked) {\n      const newSelected = props.tasks.map((t) => t.id);\n      setSelectedIds(newSelected);\n    } else {\n      setSelectedIds([]);\n    }\n  };\n\n  const handleDeleteAllClick = () => {\n    props.deleteAllCompletedTasksAsync(queue);\n  };\n\n  const handleBatchDeleteClick = () => {\n    props\n      .batchDeleteCompletedTasksAsync(queue, selectedIds)\n      .then(() => setSelectedIds([]));\n  };\n\n  const fetchData = useCallback(() => {\n    const pageOpts = { page: page + 1, size: pageSize };\n    listCompletedTasksAsync(queue, pageOpts);\n  }, [page, pageSize, queue, listCompletedTasksAsync]);\n\n  usePolling(fetchData, pollInterval);\n\n  if (props.error.length > 0) {\n    return (\n      <Alert severity=\"error\" className={classes.alert}>\n        <AlertTitle>Error</AlertTitle>\n        {props.error}\n      </Alert>\n    );\n  }\n  if (props.tasks.length === 0) {\n    return (\n      <Alert severity=\"info\" className={classes.alert}>\n        <AlertTitle>Info</AlertTitle>\n        No completed tasks at this time.\n      </Alert>\n    );\n  }\n\n  const columns: TableColumn[] = [\n    { key: \"id\", label: \"ID\", align: \"left\" },\n    { key: \"type\", label: \"Type\", align: \"left\" },\n    { key: \"payload\", label: \"Payload\", align: \"left\" },\n    { key: \"completed_at\", label: \"Completed\", align: \"left\" },\n    { key: \"result\", label: \"Result\", align: \"left\" },\n    { key: \"ttl\", label: \"TTL\", align: \"left\" },\n    { key: \"actions\", label: \"Actions\", align: \"center\" },\n  ];\n\n  const rowCount = props.tasks.length;\n  const numSelected = selectedIds.length;\n  return (\n    <div>\n      <TableActions\n        showIconButtons={numSelected > 0}\n        iconButtonActions={[\n          {\n            tooltip: \"Delete\",\n            icon: <DeleteIcon />,\n            onClick: handleBatchDeleteClick,\n            disabled: props.batchActionPending,\n          },\n        ]}\n        menuItemActions={[\n          {\n            label: \"Delete All\",\n            onClick: handleDeleteAllClick,\n            disabled: props.allActionPending,\n          },\n        ]}\n      />\n      <TableContainer component={Paper}>\n        <Table\n          stickyHeader={true}\n          className={classes.table}\n          aria-label=\"archived tasks table\"\n          size=\"small\"\n        >\n          <TableHead>\n            <TableRow>\n              <TableCell\n                padding=\"checkbox\"\n                classes={{ stickyHeader: classes.stickyHeaderCell }}\n              >\n                <IconButton>\n                  <Checkbox\n                    indeterminate={numSelected > 0 && numSelected < rowCount}\n                    checked={rowCount > 0 && numSelected === rowCount}\n                    onChange={handleSelectAllClick}\n                    inputProps={{\n                      \"aria-label\": \"select all tasks shown in the table\",\n                    }}\n                  />\n                </IconButton>\n              </TableCell>\n              {columns.map((col) => (\n                <TableCell\n                  key={col.key}\n                  align={col.align}\n                  classes={{ stickyHeader: classes.stickyHeaderCell }}\n                >\n                  {col.label}\n                </TableCell>\n              ))}\n            </TableRow>\n          </TableHead>\n          <TableBody>\n            {props.tasks.map((task) => (\n              <Row\n                key={task.id}\n                task={task}\n                isSelected={selectedIds.includes(task.id)}\n                onSelectChange={(checked: boolean) => {\n                  if (checked) {\n                    setSelectedIds(selectedIds.concat(task.id));\n                  } else {\n                    setSelectedIds(selectedIds.filter((id) => id !== task.id));\n                  }\n                }}\n                onDeleteClick={() => {\n                  props.deleteCompletedTaskAsync(queue, task.id);\n                }}\n                allActionPending={props.allActionPending}\n                onActionCellEnter={() => setActiveTaskId(task.id)}\n                onActionCellLeave={() => setActiveTaskId(\"\")}\n                showActions={activeTaskId === task.id}\n              />\n            ))}\n          </TableBody>\n          <TableFooter>\n            <TableRow>\n              <TablePagination\n                rowsPerPageOptions={rowsPerPageOptions}\n                colSpan={columns.length + 1}\n                count={props.totalTaskCount}\n                rowsPerPage={pageSize}\n                page={page}\n                SelectProps={{\n                  inputProps: { \"aria-label\": \"rows per page\" },\n                  native: true,\n                }}\n                onPageChange={handlePageChange}\n                onRowsPerPageChange={handleRowsPerPageChange}\n                ActionsComponent={TablePaginationActions}\n                className={classes.pagination}\n              />\n            </TableRow>\n          </TableFooter>\n        </Table>\n      </TableContainer>\n    </div>\n  );\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  root: {\n    cursor: \"pointer\",\n    \"&:hover\": {\n      boxShadow: theme.shadows[2],\n    },\n    \"&:hover .MuiTableCell-root\": {\n      borderBottomColor: theme.palette.background.paper,\n    },\n  },\n  actionCell: {\n    width: \"96px\",\n  },\n  actionButton: {\n    marginLeft: 3,\n    marginRight: 3,\n  },\n}));\n\ninterface RowProps {\n  task: TaskInfoExtended;\n  isSelected: boolean;\n  onSelectChange: (checked: boolean) => void;\n  onDeleteClick: () => void;\n  allActionPending: boolean;\n  showActions: boolean;\n  onActionCellEnter: () => void;\n  onActionCellLeave: () => void;\n}\n\nfunction Row(props: RowProps) {\n  const { task } = props;\n  const classes = useRowStyles();\n  const history = useHistory();\n  return (\n    <TableRow\n      key={task.id}\n      className={classes.root}\n      selected={props.isSelected}\n      onClick={() => history.push(taskDetailsPath(task.queue, task.id))}\n    >\n      <TableCell padding=\"checkbox\" onClick={(e) => e.stopPropagation()}>\n        <IconButton>\n          <Checkbox\n            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>\n              props.onSelectChange(event.target.checked)\n            }\n            checked={props.isSelected}\n          />\n        </IconButton>\n      </TableCell>\n      <TableCell component=\"th\" scope=\"row\">\n        {uuidPrefix(task.id)}\n      </TableCell>\n      <TableCell>{task.type}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.payload)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>{timeAgo(task.completed_at)}</TableCell>\n      <TableCell>\n        <SyntaxHighlighter\n          language=\"json\"\n          customStyle={{ margin: 0, maxWidth: 400 }}\n        >\n          {prettifyPayload(task.result)}\n        </SyntaxHighlighter>\n      </TableCell>\n      <TableCell>\n        {task.ttl_seconds > 0\n          ? `${stringifyDuration(durationFromSeconds(task.ttl_seconds))} left`\n          : `expired`}\n      </TableCell>\n      <TableCell\n        align=\"center\"\n        className={classes.actionCell}\n        onMouseEnter={props.onActionCellEnter}\n        onMouseLeave={props.onActionCellLeave}\n        onClick={(e) => e.stopPropagation()}\n      >\n        {props.showActions ? (\n          <React.Fragment>\n            <Tooltip title=\"Delete\">\n              <IconButton\n                className={classes.actionButton}\n                onClick={props.onDeleteClick}\n                disabled={task.requestPending || props.allActionPending}\n                size=\"small\"\n              >\n                <DeleteIcon fontSize=\"small\" />\n              </IconButton>\n            </Tooltip>\n          </React.Fragment>\n        ) : (\n          <IconButton size=\"small\" onClick={props.onActionCellEnter}>\n            <MoreHorizIcon fontSize=\"small\" />\n          </IconButton>\n        )}\n      </TableCell>\n    </TableRow>\n  );\n}\n\nexport default connector(CompletedTasksTable);\n","import React, { useState } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Chip from \"@material-ui/core/Chip\";\nimport InputBase from \"@material-ui/core/InputBase\";\nimport SearchIcon from \"@material-ui/icons/Search\";\nimport ActiveTasksTable from \"./ActiveTasksTable\";\nimport PendingTasksTable from \"./PendingTasksTable\";\nimport ScheduledTasksTable from \"./ScheduledTasksTable\";\nimport RetryTasksTable from \"./RetryTasksTable\";\nimport ArchivedTasksTable from \"./ArchivedTasksTable\";\nimport CompletedTasksTable from \"./CompletedTasksTable\";\nimport { useHistory } from \"react-router-dom\";\nimport { queueDetailsPath, taskDetailsPath } from \"../paths\";\nimport { QueueInfo } from \"../reducers/queuesReducer\";\nimport { AppState } from \"../store\";\nimport { isDarkTheme } from \"../theme\";\n\ninterface TabPanelProps {\n  children?: React.ReactNode;\n  selected: string; // currently selected value\n  value: string; // tab panel will be shown if selected value equals to the value\n}\n\nfunction TabPanel(props: TabPanelProps) {\n  const { children, value, selected, ...other } = props;\n\n  return (\n    <div\n      role=\"tabpanel\"\n      hidden={value !== selected}\n      id={`scrollable-auto-tabpanel-${selected}`}\n      aria-labelledby={`scrollable-auto-tab-${selected}`}\n      style={{ flex: 1, overflowY: \"scroll\" }}\n      {...other}\n    >\n      {value === selected && children}\n    </div>\n  );\n}\n\nfunction mapStatetoProps(state: AppState, ownProps: Props) {\n  // TODO: Add loading state for each queue.\n  const queueInfo = state.queues.data.find(\n    (q: QueueInfo) => q.name === ownProps.queue\n  );\n  const currentStats = queueInfo\n    ? queueInfo.currentStats\n    : {\n        queue: ownProps.queue,\n        paused: false,\n        size: 0,\n        active: 0,\n        pending: 0,\n        scheduled: 0,\n        retry: 0,\n        archived: 0,\n        completed: 0,\n        processed: 0,\n        failed: 0,\n        timestamp: \"n/a\",\n      };\n  return { currentStats };\n}\n\nconst connector = connect(mapStatetoProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props {\n  queue: string;\n  selected: string;\n}\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    width: \"100%\",\n    height: \"100%\",\n    background: theme.palette.background.paper,\n  },\n  header: {\n    display: \"flex\",\n    alignItems: \"center\",\n    paddingTop: theme.spacing(1),\n  },\n  heading: {\n    paddingTop: theme.spacing(1),\n    paddingBottom: theme.spacing(1),\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2),\n  },\n  chip: {\n    marginLeft: theme.spacing(1),\n  },\n  taskcount: {\n    fontSize: \"12px\",\n    color: theme.palette.text.secondary,\n    background: isDarkTheme(theme)\n      ? \"#303030\"\n      : theme.palette.background.default,\n    textAlign: \"center\",\n    padding: \"3px 6px\",\n    borderRadius: \"10px\",\n    marginLeft: \"2px\",\n  },\n  searchbar: {\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2),\n  },\n  search: {\n    position: \"relative\",\n    width: \"312px\",\n    borderRadius: \"18px\",\n    backgroundColor: isDarkTheme(theme) ? \"#303030\" : theme.palette.grey[100],\n    \"&:hover, &:focus\": {\n      backgroundColor: isDarkTheme(theme) ? \"#303030\" : theme.palette.grey[200],\n    },\n  },\n  searchIcon: {\n    padding: theme.spacing(0, 2),\n    height: \"100%\",\n    position: \"absolute\",\n    pointerEvents: \"none\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  inputRoot: {\n    color: \"inherit\",\n    width: \"100%\",\n  },\n  inputInput: {\n    padding: theme.spacing(1, 1, 1, 0),\n    // vertical padding + font size from searchIcon\n    paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,\n    width: \"100%\",\n    fontSize: \"0.85rem\",\n  },\n}));\n\nfunction TasksTable(props: Props & ReduxProps) {\n  const { currentStats } = props;\n  const classes = useStyles();\n  const history = useHistory();\n  const chips = [\n    { key: \"active\", label: \"Active\", count: currentStats.active },\n    { key: \"pending\", label: \"Pending\", count: currentStats.pending },\n    { key: \"scheduled\", label: \"Scheduled\", count: currentStats.scheduled },\n    { key: \"retry\", label: \"Retry\", count: currentStats.retry },\n    { key: \"archived\", label: \"Archived\", count: currentStats.archived },\n    { key: \"completed\", label: \"Completed\", count: currentStats.completed },\n  ];\n\n  const [searchQuery, setSearchQuery] = useState<string>(\"\");\n\n  return (\n    <Paper variant=\"outlined\" className={classes.container}>\n      <div className={classes.header}>\n        <Typography color=\"textPrimary\" className={classes.heading}>\n          Tasks\n        </Typography>\n        <div>\n          {chips.map((c) => (\n            <Chip\n              key={c.key}\n              className={classes.chip}\n              label={\n                <div>\n                  {c.label} <span className={classes.taskcount}>{c.count}</span>\n                </div>\n              }\n              variant=\"outlined\"\n              color={props.selected === c.key ? \"primary\" : \"default\"}\n              onClick={() => history.push(queueDetailsPath(props.queue, c.key))}\n            />\n          ))}\n        </div>\n        <div className={classes.searchbar}>\n          <div className={classes.search}>\n            <div className={classes.searchIcon}>\n              <SearchIcon />\n            </div>\n            <InputBase\n              placeholder=\"Search by ID\"\n              classes={{\n                root: classes.inputRoot,\n                input: classes.inputInput,\n              }}\n              value={searchQuery}\n              onChange={(e) => {\n                setSearchQuery(e.target.value);\n              }}\n              inputProps={{\n                \"aria-label\": \"search\",\n                onKeyDown: (e) => {\n                  if (e.key === \"Enter\") {\n                    history.push(\n                      taskDetailsPath(props.queue, searchQuery.trim())\n                    );\n                  }\n                },\n              }}\n            />\n          </div>\n        </div>\n      </div>\n      <TabPanel value=\"active\" selected={props.selected}>\n        <ActiveTasksTable queue={props.queue} />\n      </TabPanel>\n      <TabPanel value=\"pending\" selected={props.selected}>\n        <PendingTasksTable\n          queue={props.queue}\n          totalTaskCount={currentStats.pending}\n        />\n      </TabPanel>\n      <TabPanel value=\"scheduled\" selected={props.selected}>\n        <ScheduledTasksTable\n          queue={props.queue}\n          totalTaskCount={currentStats.scheduled}\n        />\n      </TabPanel>\n      <TabPanel value=\"retry\" selected={props.selected}>\n        <RetryTasksTable\n          queue={props.queue}\n          totalTaskCount={currentStats.retry}\n        />\n      </TabPanel>\n      <TabPanel value=\"archived\" selected={props.selected}>\n        <ArchivedTasksTable\n          queue={props.queue}\n          totalTaskCount={currentStats.archived}\n        />\n      </TabPanel>\n      <TabPanel value=\"completed\" selected={props.selected}>\n        <CompletedTasksTable\n          queue={props.queue}\n          totalTaskCount={currentStats.completed}\n        />\n      </TabPanel>\n    </Paper>\n  );\n}\n\nexport default connector(TasksTable);\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Typography from \"@material-ui/core/Typography\";\nimport prettyBytes from \"pretty-bytes\";\nimport { AppState } from \"../store\";\nimport { percentage } from \"../utils\";\n\nconst useStyles = makeStyles((theme) => ({\n  banner: {\n    paddingTop: theme.spacing(2),\n    paddingBottom: theme.spacing(2),\n    display: \"flex\",\n  },\n  bannerItem: {\n    flexGrow: 1,\n    borderLeft: `1px solid ${theme.palette.divider}`,\n    paddingLeft: theme.spacing(2),\n    paddingRight: theme.spacing(2),\n  },\n}));\n\ninterface Props {\n  qname: string;\n}\n\nfunction mapStateToProps(state: AppState, ownProps: Props) {\n  const queueInfo = state.queues.data.find((q) => q.name === ownProps.qname);\n  return {\n    queue: queueInfo?.currentStats,\n  };\n}\n\nconst connector = connect(mapStateToProps);\n\ntype ReduxProps = ConnectedProps<typeof connector>;\n\nfunction QueueInfoBanner(props: Props & ReduxProps) {\n  const classes = useStyles();\n  const { queue, qname } = props;\n  return (\n    <div className={classes.banner}>\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Queue name\n        </Typography>\n        <Typography color=\"textSecondary\">{qname}</Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Queue state\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? (queue.paused ? \"paused\" : \"run\") : \"-\"}\n        </Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Queue size\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? queue.size : \"-\"}\n        </Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Memory usage\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? prettyBytes(queue.memory_usage_bytes) : \"-\"}\n        </Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Processed\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? queue.processed : \"-\"}\n        </Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Failed\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? queue.failed : \"-\"}\n        </Typography>\n      </div>\n\n      <div className={classes.bannerItem}>\n        <Typography variant=\"subtitle2\" color=\"textPrimary\" gutterBottom>\n          Error rate\n        </Typography>\n        <Typography color=\"textSecondary\">\n          {queue ? percentage(queue.failed, queue.processed) : \"-\"}\n        </Typography>\n      </div>\n    </div>\n  );\n}\n\nexport default connector(QueueInfoBanner);\n","import React, { useState } from \"react\";\nimport { Link, useHistory } from \"react-router-dom\";\nimport { emphasize, withStyles, Theme } from \"@material-ui/core/styles\";\nimport Breadcrumbs from \"@material-ui/core/Breadcrumbs\";\nimport Chip from \"@material-ui/core/Chip\";\nimport Menu from \"@material-ui/core/Menu\";\nimport MenuItem from \"@material-ui/core/MenuItem\";\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\nimport { paths, queueDetailsPath } from \"../paths\";\nimport { isDarkTheme } from \"../theme\";\n\nconst StyledBreadcrumb = withStyles((theme: Theme) => ({\n  root: {\n    backgroundColor: isDarkTheme(theme)\n      ? \"#303030\"\n      : theme.palette.background.default,\n    height: theme.spacing(3),\n    color: theme.palette.text.secondary,\n    fontWeight: theme.typography.fontWeightRegular,\n    \"&:hover, &:focus\": {\n      backgroundColor: theme.palette.action.hover,\n    },\n    \"&:active\": {\n      boxShadow: theme.shadows[1],\n      backgroundColor: emphasize(theme.palette.action.hover, 0.12),\n    },\n  },\n}))(Chip) as typeof Chip; // Note: need a type cast here because https://github.com/Microsoft/TypeScript/issues/26591\n\ninterface Props {\n  // All queue names.\n  queues: string[];\n  // Name of the queue currently selected.\n  queueName: string;\n  // ID of the task currently selected (optional).\n  taskId?: string;\n}\n\nexport default function QueueBreadcrumbs(props: Props) {\n  const history = useHistory();\n  const [anchorEl, setAnchorEl] = useState<null | Element>(null);\n\n  const handleClick = (event: React.MouseEvent<Element, MouseEvent>) => {\n    event.preventDefault();\n    setAnchorEl(event.currentTarget);\n  };\n\n  const closeMenu = () => {\n    setAnchorEl(null);\n  };\n\n  return (\n    <>\n      <Breadcrumbs aria-label=\"breadcrumb\">\n        <StyledBreadcrumb\n          component={Link}\n          to={paths.HOME}\n          label=\"Queues\"\n          onClick={() => history.push(paths.HOME)}\n        />\n        <StyledBreadcrumb\n          label={props.queueName}\n          deleteIcon={<ExpandMoreIcon />}\n          onClick={handleClick}\n          onDelete={handleClick}\n        />\n        {props.taskId && <StyledBreadcrumb label={`task:${props.taskId}`} />}\n      </Breadcrumbs>\n      <Menu\n        id=\"queue-breadcrumb-menu\"\n        anchorEl={anchorEl}\n        keepMounted\n        open={Boolean(anchorEl)}\n        onClose={closeMenu}\n      >\n        {props.queues.sort().map((qname) => (\n          <MenuItem\n            key={qname}\n            onClick={() => {\n              history.push(queueDetailsPath(qname));\n              closeMenu();\n            }}\n          >\n            {qname}\n          </MenuItem>\n        ))}\n      </Menu>\n    </>\n  );\n}\n","import React, { useEffect } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Container from \"@material-ui/core/Container\";\nimport Grid from \"@material-ui/core/Grid\";\nimport TasksTable from \"../components/TasksTable\";\nimport QueueInfoBanner from \"../components/QueueInfoBanner\";\nimport QueueBreadCrumb from \"../components/QueueBreadcrumb\";\nimport { useParams } from \"react-router-dom\";\nimport { listQueuesAsync } from \"../actions/queuesActions\";\nimport { AppState } from \"../store\";\nimport { QueueDetailsRouteParams } from \"../paths\";\nimport { useQuery } from \"../hooks\";\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    queues: state.queues.data.map((q) => q.name),\n  };\n}\n\nconst connector = connect(mapStateToProps, { listQueuesAsync });\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(2),\n  },\n  breadcrumbs: {\n    marginBottom: theme.spacing(2),\n  },\n  banner: {\n    marginBottom: theme.spacing(2),\n  },\n  tasksTable: {\n    marginBottom: theme.spacing(4),\n  },\n}));\n\nconst validStatus = [\n  \"active\",\n  \"pending\",\n  \"scheduled\",\n  \"retry\",\n  \"archived\",\n  \"completed\",\n];\nconst defaultStatus = \"active\";\n\nfunction TasksView(props: ConnectedProps<typeof connector>) {\n  const classes = useStyles();\n  const { qname } = useParams<QueueDetailsRouteParams>();\n  const query = useQuery();\n  let selected = query.get(\"status\");\n  if (!selected || !validStatus.includes(selected)) {\n    selected = defaultStatus;\n  }\n  const { listQueuesAsync } = props;\n\n  useEffect(() => {\n    listQueuesAsync();\n  }, [listQueuesAsync]);\n\n  return (\n    <Container maxWidth=\"lg\">\n      <Grid container spacing={0} className={classes.container}>\n        <Grid item xs={12} className={classes.breadcrumbs}>\n          <QueueBreadCrumb queues={props.queues} queueName={qname} />\n        </Grid>\n        <Grid item xs={12} className={classes.banner}>\n          <QueueInfoBanner qname={qname} />\n        </Grid>\n        <Grid item xs={12} className={classes.tasksTable}>\n          <TasksTable queue={qname} selected={selected} />\n        </Grid>\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(TasksView);\n","import React, { useMemo, useEffect } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Container from \"@material-ui/core/Container\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Button from \"@material-ui/core/Button\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport ArrowBackIcon from \"@material-ui/icons/ArrowBack\";\nimport { useParams } from \"react-router-dom\";\nimport QueueBreadCrumb from \"../components/QueueBreadcrumb\";\nimport { AppState } from \"../store\";\nimport { getTaskInfoAsync } from \"../actions/tasksActions\";\nimport { TaskDetailsRouteParams } from \"../paths\";\nimport { usePolling } from \"../hooks\";\nimport { listQueuesAsync } from \"../actions/queuesActions\";\nimport SyntaxHighlighter from \"../components/SyntaxHighlighter\";\nimport { durationFromSeconds, stringifyDuration, timeAgo, prettifyPayload } from \"../utils\";\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.tasks.taskInfo.loading,\n    error: state.tasks.taskInfo.error,\n    taskInfo: state.tasks.taskInfo.data,\n    pollInterval: state.settings.pollInterval,\n    queues: state.queues.data.map((q) => q.name), // FIXME: This data may not be available\n  };\n}\n\nconst connector = connect(mapStateToProps, {\n  getTaskInfoAsync,\n  listQueuesAsync,\n});\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(2),\n  },\n  alert: {\n    borderTopLeftRadius: 0,\n    borderTopRightRadius: 0,\n  },\n  paper: {\n    padding: theme.spacing(2),\n    marginTop: theme.spacing(2),\n  },\n  breadcrumbs: {\n    marginBottom: theme.spacing(2),\n  },\n  infoRow: {\n    display: \"flex\",\n    alignItems: \"center\",\n    paddingTop: theme.spacing(1),\n  },\n  infoKeyCell: {\n    width: \"140px\",\n  },\n  infoValueCell: {\n    width: \"auto\",\n  },\n  footer: {\n    paddingTop: theme.spacing(3),\n    paddingBottom: theme.spacing(3),\n  },\n}));\n\ntype Props = ConnectedProps<typeof connector>;\n\nfunction TaskDetailsView(props: Props) {\n  const classes = useStyles();\n  const { qname, taskId } = useParams<TaskDetailsRouteParams>();\n  const { getTaskInfoAsync, pollInterval, listQueuesAsync, taskInfo } = props;\n  const history = useHistory();\n\n  const fetchTaskInfo = useMemo(() => {\n    return () => {\n      getTaskInfoAsync(qname, taskId);\n    };\n  }, [qname, taskId, getTaskInfoAsync]);\n\n  usePolling(fetchTaskInfo, pollInterval);\n\n  // Fetch queues data to populate props.queues\n  useEffect(() => {\n    listQueuesAsync();\n  }, [listQueuesAsync]);\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={0}>\n        <Grid item xs={12} className={classes.breadcrumbs}>\n          <QueueBreadCrumb\n            queues={props.queues}\n            queueName={qname}\n            taskId={taskId}\n          />\n        </Grid>\n        <Grid item xs={12} md={6}>\n          {props.error ? (\n            <Alert severity=\"error\" className={classes.alert}>\n              <AlertTitle>Error</AlertTitle>\n              {props.error}\n            </Alert>\n          ) : (\n            <Paper className={classes.paper} variant=\"outlined\">\n              <Typography variant=\"h6\">Task Info</Typography>\n              <div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    ID:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.id}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    Type:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.type}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    State:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.state}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    Queue:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.queue}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    Retry:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.retried}/{taskInfo?.max_retry}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    Last Failure:{\" \"}\n                  </Typography>\n                  <Typography className={classes.infoValueCell}>\n                    {taskInfo?.last_failed_at ? (\n                      <Typography>\n                        {taskInfo?.error_message} ({taskInfo?.last_failed_at})\n                      </Typography>\n                    ) : (\n                      <Typography> - </Typography>\n                    )}\n                  </Typography>\n                </div>\n                <div className={classes.infoRow}>\n                  <Typography\n                    variant=\"subtitle2\"\n                    className={classes.infoKeyCell}\n                  >\n                    Next Process Time:{\" \"}\n                  </Typography>\n                  {taskInfo?.next_process_at ? (\n                    <Typography>{taskInfo?.next_process_at}</Typography>\n                  ) : (\n                    <Typography> - </Typography>\n                  )}\n                </div>\n              </div>\n              <div className={classes.infoRow}>\n                <Typography variant=\"subtitle2\" className={classes.infoKeyCell}>\n                  Timeout:{\" \"}\n                </Typography>\n                <Typography className={classes.infoValueCell}>\n                  {taskInfo?.timeout_seconds ? (\n                    <Typography>{taskInfo?.timeout_seconds} seconds</Typography>\n                  ) : (\n                    <Typography> - </Typography>\n                  )}\n                </Typography>\n              </div>\n              <div className={classes.infoRow}>\n                <Typography variant=\"subtitle2\" className={classes.infoKeyCell}>\n                  Deadline:{\" \"}\n                </Typography>\n                <Typography className={classes.infoValueCell}>\n                  {taskInfo?.deadline ? (\n                    <Typography>{taskInfo?.deadline}</Typography>\n                  ) : (\n                    <Typography> - </Typography>\n                  )}\n                </Typography>\n              </div>\n              <div className={classes.infoRow}>\n                <Typography variant=\"subtitle2\" className={classes.infoKeyCell}>\n                  Payload:{\" \"}\n                </Typography>\n                <div className={classes.infoValueCell}>\n                  {taskInfo?.payload && (\n                    <SyntaxHighlighter\n                      language=\"json\"\n                      customStyle={{ margin: 0, maxWidth: 400 }}\n                    >\n                      {prettifyPayload(taskInfo.payload)}\n                    </SyntaxHighlighter>\n                  )}\n                </div>\n              </div>\n              {\n                /* Completed Task Only */ taskInfo?.state === \"completed\" && (\n                  <>\n                    <div className={classes.infoRow}>\n                      <Typography\n                        variant=\"subtitle2\"\n                        className={classes.infoKeyCell}\n                      >\n                        Completed:{\" \"}\n                      </Typography>\n                      <div className={classes.infoValueCell}>\n                        <Typography>\n                          {timeAgo(taskInfo.completed_at)} (\n                          {taskInfo.completed_at})\n                        </Typography>\n                      </div>\n                    </div>\n                    <div className={classes.infoRow}>\n                      <Typography\n                        variant=\"subtitle2\"\n                        className={classes.infoKeyCell}\n                      >\n                        Result:{\" \"}\n                      </Typography>\n                      <div className={classes.infoValueCell}>\n                        <SyntaxHighlighter\n                          language=\"json\"\n                          customStyle={{ margin: 0, maxWidth: 400 }}\n                        >\n                          {prettifyPayload(taskInfo.result)}\n                        </SyntaxHighlighter>\n                      </div>\n                    </div>\n                    <div className={classes.infoRow}>\n                      <Typography\n                        variant=\"subtitle2\"\n                        className={classes.infoKeyCell}\n                      >\n                        TTL:{\" \"}\n                      </Typography>\n                      <Typography className={classes.infoValueCell}>\n                        <Typography>\n                          {taskInfo.ttl_seconds > 0\n                            ? `${stringifyDuration(\n                                durationFromSeconds(taskInfo.ttl_seconds)\n                              )} left`\n                            : \"expired\"}\n                        </Typography>\n                      </Typography>\n                    </div>\n                  </>\n                )\n              }\n            </Paper>\n          )}\n          <div className={classes.footer}>\n            <Button\n              startIcon={<ArrowBackIcon />}\n              onClick={() => history.goBack()}\n            >\n              Go Back\n            </Button>\n          </div>\n        </Grid>\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(TaskDetailsView);\n","import React, { useState } from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Slider from \"@material-ui/core/Slider\";\nimport { pollIntervalChange, selectTheme } from \"../actions/settingsActions\";\nimport { AppState } from \"../store\";\nimport FormControl from \"@material-ui/core/FormControl/FormControl\";\nimport Select from \"@material-ui/core/Select\";\nimport MenuItem from \"@material-ui/core/MenuItem\";\nimport { ThemePreference } from \"../reducers/settingsReducer\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  paper: {\n    padding: theme.spacing(2),\n    display: \"flex\",\n    overflow: \"auto\",\n    flexDirection: \"column\",\n  },\n  formControl: {\n    margin: theme.spacing(1),\n    display: \"flex\",\n    justifyContent: \"space-between\",\n    flexDirection: \"row\",\n    alignItems: \"center\",\n  },\n  selectEmpty: {\n    marginTop: theme.spacing(2),\n  },\n  select: {\n    width: \"200px\",\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    pollInterval: state.settings.pollInterval,\n    themePreference: state.settings.themePreference,\n  };\n}\n\nconst mapDispatchToProps = { pollIntervalChange, selectTheme };\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype PropsFromRedux = ConnectedProps<typeof connector>;\n\nfunction SettingsView(props: PropsFromRedux) {\n  const classes = useStyles();\n\n  const [sliderValue, setSliderValue] = useState(props.pollInterval);\n  const handleSliderValueChange = (event: any, val: number | number[]) => {\n    setSliderValue(val as number);\n  };\n\n  const handleSliderValueCommited = (event: any, val: number | number[]) => {\n    props.pollIntervalChange(val as number);\n  };\n\n  const handleThemeChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n    props.selectTheme(event.target.value as ThemePreference);\n  };\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3} justify=\"center\">\n        <Grid item xs={1} />\n        <Grid item xs={6}>\n          <Typography variant=\"h5\" color=\"textPrimary\">\n            Settings\n          </Typography>\n        </Grid>\n        <Grid item xs={5} />\n\n        <Grid item xs={1} />\n        <Grid item xs={6}>\n          <Paper className={classes.paper} variant=\"outlined\">\n            <Typography color=\"textPrimary\">Polling Interval</Typography>\n            <Typography gutterBottom color=\"textSecondary\" variant=\"subtitle1\">\n              Web UI will fetch live data with the specified interval\n            </Typography>\n            <Typography gutterBottom color=\"textSecondary\" variant=\"subtitle1\">\n              Currently: Every{\" \"}\n              {sliderValue === 1 ? \"second\" : `${sliderValue} seconds`}\n            </Typography>\n            <Slider\n              value={sliderValue}\n              onChange={handleSliderValueChange}\n              onChangeCommitted={handleSliderValueCommited}\n              aria-labelledby=\"continuous-slider\"\n              valueLabelDisplay=\"auto\"\n              step={1}\n              marks={true}\n              min={2}\n              max={20}\n            />\n          </Paper>\n        </Grid>\n        <Grid xs={5} />\n\n        <Grid item xs={1} />\n        <Grid item xs={6}>\n          <Paper className={classes.paper} variant=\"outlined\">\n            <FormControl variant=\"outlined\" className={classes.formControl}>\n              <Typography color=\"textPrimary\">Dark Theme</Typography>\n              <Select\n                labelId=\"theme-label\"\n                id=\"theme-selected\"\n                value={props.themePreference}\n                onChange={handleThemeChange}\n                label=\"theme preference\"\n                className={classes.select}\n              >\n                <MenuItem value={ThemePreference.SystemDefault}>\n                  System Default\n                </MenuItem>\n                <MenuItem value={ThemePreference.Always}>Always</MenuItem>\n                <MenuItem value={ThemePreference.Never}>Never</MenuItem>\n              </Select>\n            </FormControl>\n          </Paper>\n        </Grid>\n        <Grid item xs={5} />\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(SettingsView);\n","import React, { useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport clsx from \"clsx\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Box from \"@material-ui/core/Box\";\nimport Collapse from \"@material-ui/core/Collapse\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport TableSortLabel from \"@material-ui/core/TableSortLabel\";\nimport Tooltip from \"@material-ui/core/Tooltip\";\nimport KeyboardArrowDownIcon from \"@material-ui/icons/KeyboardArrowDown\";\nimport KeyboardArrowUpIcon from \"@material-ui/icons/KeyboardArrowUp\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"./SyntaxHighlighter\";\nimport { ServerInfo } from \"../api\";\nimport { SortDirection, SortableTableColumn } from \"../types/table\";\nimport { timeAgo, uuidPrefix, prettifyPayload } from \"../utils\";\nimport { queueDetailsPath } from \"../paths\";\nimport Typography from \"@material-ui/core/Typography\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n  fixedCell: {\n    position: \"sticky\",\n    zIndex: 1,\n    left: 0,\n    background: theme.palette.background.paper,\n  },\n}));\n\nenum SortBy {\n  HostPID,\n  Status,\n  ActiveWorkers,\n  Queues,\n  Started,\n}\nconst colConfigs: SortableTableColumn<SortBy>[] = [\n  {\n    label: \"Host:PID\",\n    key: \"host\",\n    sortBy: SortBy.HostPID,\n    align: \"left\",\n  },\n  {\n    label: \"Started\",\n    key: \"started\",\n    sortBy: SortBy.Started,\n    align: \"left\",\n  },\n  {\n    label: \"Status\",\n    key: \"status\",\n    sortBy: SortBy.Status,\n    align: \"left\",\n  },\n  {\n    label: \"Queues\",\n    key: \"queues\",\n    sortBy: SortBy.Queues,\n    align: \"left\",\n  },\n  {\n    label: \"Active Workers\",\n    key: \"workers\",\n    sortBy: SortBy.ActiveWorkers,\n    align: \"left\",\n  },\n];\n\n// sortServers takes a array of server-infos and return a sorted array.\n// It returns a new array and leave the original array untouched.\nfunction sortServerInfos(\n  entries: ServerInfo[],\n  cmpFn: (first: ServerInfo, second: ServerInfo) => number\n): ServerInfo[] {\n  let copy = [...entries];\n  copy.sort(cmpFn);\n  return copy;\n}\n\ninterface Props {\n  servers: ServerInfo[];\n}\n\nexport default function ServersTable(props: Props) {\n  const classes = useStyles();\n  const [sortBy, setSortBy] = useState<SortBy>(SortBy.HostPID);\n  const [sortDir, setSortDir] = useState<SortDirection>(SortDirection.Asc);\n\n  const createSortClickHandler = (sortKey: SortBy) => (e: React.MouseEvent) => {\n    if (sortKey === sortBy) {\n      // Toggle sort direction.\n      const nextSortDir =\n        sortDir === SortDirection.Asc ? SortDirection.Desc : SortDirection.Asc;\n      setSortDir(nextSortDir);\n    } else {\n      // Change the sort key.\n      setSortBy(sortKey);\n    }\n  };\n\n  const cmpFunc = (s1: ServerInfo, s2: ServerInfo): number => {\n    let isS1Smaller = false;\n    switch (sortBy) {\n      case SortBy.HostPID:\n        if (s1.host === s2.host && s1.pid === s2.pid) return 0;\n        if (s1.host === s2.host) {\n          isS1Smaller = s1.pid < s2.pid;\n        } else {\n          isS1Smaller = s1.host < s2.host;\n        }\n        break;\n      case SortBy.Started:\n        const s1StartTime = Date.parse(s1.start_time);\n        const s2StartTime = Date.parse(s2.start_time);\n        if (s1StartTime === s2StartTime) return 0;\n        isS1Smaller = s1StartTime < s2StartTime;\n        break;\n      case SortBy.Status:\n        if (s1.status === s2.status) return 0;\n        isS1Smaller = s1.status < s2.status;\n        break;\n      case SortBy.Queues:\n        const s1Queues = Object.keys(s1.queue_priorities).join(\",\");\n        const s2Queues = Object.keys(s2.queue_priorities).join(\",\");\n        if (s1Queues === s2Queues) return 0;\n        isS1Smaller = s1Queues < s2Queues;\n        break;\n      case SortBy.ActiveWorkers:\n        if (s1.active_workers.length === s2.active_workers.length) {\n          return 0;\n        }\n        isS1Smaller = s1.active_workers.length < s2.active_workers.length;\n        break;\n      default:\n        // eslint-disable-next-line no-throw-literal\n        throw `Unexpected order by value: ${sortBy}`;\n    }\n    if (sortDir === SortDirection.Asc) {\n      return isS1Smaller ? -1 : 1;\n    } else {\n      return isS1Smaller ? 1 : -1;\n    }\n  };\n\n  if (props.servers.length === 0) {\n    return (\n      <Alert severity=\"info\">\n        <AlertTitle>Info</AlertTitle>\n        No servers found at this time.\n      </Alert>\n    );\n  }\n\n  return (\n    <TableContainer>\n      <Table className={classes.table} aria-label=\"server info table\">\n        <TableHead>\n          <TableRow>\n            {colConfigs.map((cfg, i) => (\n              <TableCell\n                key={cfg.key}\n                align={cfg.align}\n                className={clsx(i === 0 && classes.fixedCell)}\n              >\n                <TableSortLabel\n                  active={cfg.sortBy === sortBy}\n                  direction={sortDir}\n                  onClick={createSortClickHandler(cfg.sortBy)}\n                >\n                  {cfg.label}\n                </TableSortLabel>\n              </TableCell>\n            ))}\n            <TableCell />\n          </TableRow>\n        </TableHead>\n        <TableBody>\n          {sortServerInfos(props.servers, cmpFunc).map((srv) => (\n            <Row key={srv.id} server={srv} />\n          ))}\n        </TableBody>\n      </Table>\n    </TableContainer>\n  );\n}\ninterface RowProps {\n  server: ServerInfo;\n}\n\nconst useRowStyles = makeStyles((theme) => ({\n  rowRoot: {\n    \"& > *\": {\n      borderBottom: \"unset\",\n    },\n  },\n  noBorder: {\n    border: \"none\",\n  },\n  link: {\n    color: theme.palette.text.primary,\n  },\n}));\n\nfunction Row(props: RowProps) {\n  const classes = useRowStyles();\n  const { server } = props;\n  const [open, setOpen] = useState<boolean>(false);\n  const qnames = Object.keys(server.queue_priorities);\n  return (\n    <React.Fragment>\n      <TableRow className={classes.rowRoot}>\n        <TableCell>\n          {server.host}:{server.pid}\n        </TableCell>\n        <TableCell>{timeAgo(server.start_time)}</TableCell>\n        <TableCell>{server.status}</TableCell>\n        <TableCell>\n          {qnames.map((qname, idx) => (\n            <span key={qname}>\n              <Link to={queueDetailsPath(qname)} className={classes.link}>\n                {qname}\n              </Link>\n              {idx === qnames.length - 1 ? \"\" : \", \"}\n            </span>\n          ))}\n        </TableCell>\n        <TableCell>\n          {server.active_workers.length}/{server.concurrency}\n        </TableCell>\n        <TableCell>\n          <Tooltip title={open ? \"Hide Details\" : \"Show Details\"}>\n            <IconButton\n              aria-label=\"expand row\"\n              size=\"small\"\n              onClick={() => setOpen(!open)}\n            >\n              {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}\n            </IconButton>\n          </Tooltip>\n        </TableCell>\n      </TableRow>\n      <TableRow className={classes.rowRoot}>\n        <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}>\n          <Collapse in={open} timeout=\"auto\" unmountOnExit>\n            <Grid container spacing={2}>\n              <Grid item xs={9}>\n                <Typography\n                  variant=\"subtitle1\"\n                  gutterBottom\n                  color=\"textSecondary\"\n                >\n                  Active Workers\n                </Typography>\n                <Table size=\"small\" aria-label=\"active workers\">\n                  <TableHead>\n                    <TableRow>\n                      <TableCell>Task ID</TableCell>\n                      <TableCell>Task Payload</TableCell>\n                      <TableCell>Queue</TableCell>\n                      <TableCell>Started</TableCell>\n                    </TableRow>\n                  </TableHead>\n                  <TableBody>\n                    {server.active_workers.map((worker) => (\n                      <TableRow key={worker.task_id}>\n                        <TableCell component=\"th\" scope=\"row\">\n                          {uuidPrefix(worker.task_id)}\n                        </TableCell>\n                        <TableCell>\n                          <SyntaxHighlighter\n                            language=\"json\"\n                            customStyle={{ margin: 0 }}\n                          >\n                            {prettifyPayload(worker.task_payload)}\n                          </SyntaxHighlighter>\n                        </TableCell>\n                        <TableCell>{worker.queue}</TableCell>\n                        <TableCell>{timeAgo(worker.start_time)}</TableCell>\n                      </TableRow>\n                    ))}\n                  </TableBody>\n                </Table>\n              </Grid>\n              <Grid item xs={3}>\n                <Typography\n                  variant=\"subtitle1\"\n                  gutterBottom\n                  color=\"textSecondary\"\n                >\n                  Queue Priority\n                </Typography>\n                <Table size=\"small\" aria-label=\"active workers\">\n                  <TableHead>\n                    <TableRow>\n                      <TableCell>Queue</TableCell>\n                      <TableCell align=\"right\">Priority</TableCell>\n                    </TableRow>\n                  </TableHead>\n                  <TableBody>\n                    {qnames.map((qname) => (\n                      <TableRow key={qname}>\n                        <TableCell>\n                          <Link\n                            to={queueDetailsPath(qname)}\n                            className={classes.link}\n                          >\n                            {qname}\n                          </Link>\n                        </TableCell>\n                        <TableCell align=\"right\">\n                          {server.queue_priorities[qname]}\n                        </TableCell>\n                      </TableRow>\n                    ))}\n                  </TableBody>\n                </Table>\n                <Box margin={2}>\n                  <Typography variant=\"subtitle2\" component=\"span\">\n                    Strict Priority:{\" \"}\n                  </Typography>\n                  <Typography variant=\"button\" component=\"span\">\n                    {server.strict_priority_enabled ? \"ON\" : \"OFF\"}\n                  </Typography>\n                </Box>\n              </Grid>\n            </Grid>\n          </Collapse>\n        </TableCell>\n      </TableRow>\n    </React.Fragment>\n  );\n}\n","import { Dispatch } from \"redux\";\nimport { listServers, ListServersResponse } from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of server related action types.\nexport const LIST_SERVERS_BEGIN = \"LIST_SERVERS_BEGIN\";\nexport const LIST_SERVERS_SUCCESS = \"LIST_SERVERS_SUCCESS\";\nexport const LIST_SERVERS_ERROR = \"LIST_SERVERS_ERROR\";\n\ninterface ListServersBeginAction {\n  type: typeof LIST_SERVERS_BEGIN;\n}\ninterface ListServersSuccessAction {\n  type: typeof LIST_SERVERS_SUCCESS;\n  payload: ListServersResponse;\n}\ninterface ListServersErrorAction {\n  type: typeof LIST_SERVERS_ERROR;\n  error: string; // error description\n}\n\n// Union of all server related actions.\nexport type ServersActionTypes =\n  | ListServersBeginAction\n  | ListServersSuccessAction\n  | ListServersErrorAction;\n\nexport function listServersAsync() {\n  return async (dispatch: Dispatch<ServersActionTypes>) => {\n    dispatch({ type: LIST_SERVERS_BEGIN });\n    try {\n      const response = await listServers();\n      dispatch({\n        type: LIST_SERVERS_SUCCESS,\n        payload: response,\n      });\n    } catch (error) {\n      console.error(`listServersAsync: ${toErrorStringWithHttpStatus(error)}`);\n      dispatch({\n        type: LIST_SERVERS_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Paper from \"@material-ui/core/Paper\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport ServersTable from \"../components/ServersTable\";\nimport { listServersAsync } from \"../actions/serversActions\";\nimport { AppState } from \"../store\";\nimport { usePolling } from \"../hooks\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  paper: {\n    padding: theme.spacing(2),\n    display: \"flex\",\n    overflow: \"auto\",\n    flexDirection: \"column\",\n  },\n  heading: {\n    paddingLeft: theme.spacing(2),\n    marginBottom: theme.spacing(1),\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.servers.loading,\n    error: state.servers.error,\n    servers: state.servers.data,\n    pollInterval: state.settings.pollInterval,\n  };\n}\n\nconst connector = connect(mapStateToProps, { listServersAsync });\n\ntype Props = ConnectedProps<typeof connector>;\n\nfunction ServersView(props: Props) {\n  const { pollInterval, listServersAsync } = props;\n  const classes = useStyles();\n\n  usePolling(listServersAsync, pollInterval);\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3}>\n        {props.error === \"\" ? (\n          <Grid item xs={12}>\n            <Paper className={classes.paper} variant=\"outlined\">\n              <Typography variant=\"h6\" className={classes.heading}>\n                Servers\n              </Typography>\n              <ServersTable servers={props.servers} />\n            </Paper>\n          </Grid>\n        ) : (\n          <Grid item xs={12}>\n            <Alert severity=\"error\">\n              <AlertTitle>Error</AlertTitle>\n              Could not retrieve servers live data —{\" \"}\n              <strong>See the logs for details</strong>\n            </Alert>\n          </Grid>\n        )}\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(ServersView);\n","import { Dispatch } from \"redux\";\nimport { getRedisInfo, RedisInfoResponse } from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of redis-info related action types.\nexport const GET_REDIS_INFO_BEGIN = \"GET_REDIS_INFO_BEGIN\";\nexport const GET_REDIS_INFO_SUCCESS = \"GET_REDIS_INFO_SUCCESS\";\nexport const GET_REDIS_INFO_ERROR = \"GET_REDIS_INFO_ERROR\";\n\ninterface GetRedisInfoBeginAction {\n  type: typeof GET_REDIS_INFO_BEGIN;\n}\n\ninterface GetRedisInfoSuccessAction {\n  type: typeof GET_REDIS_INFO_SUCCESS;\n  payload: RedisInfoResponse;\n}\n\ninterface GetRedisInfoErrorAction {\n  type: typeof GET_REDIS_INFO_ERROR;\n  error: string;\n}\n\n// Union of all redis-info related actions.\nexport type RedisInfoActionTypes =\n  | GetRedisInfoBeginAction\n  | GetRedisInfoErrorAction\n  | GetRedisInfoSuccessAction;\n\nexport function getRedisInfoAsync() {\n  return async (dispatch: Dispatch<RedisInfoActionTypes>) => {\n    dispatch({ type: GET_REDIS_INFO_BEGIN });\n    try {\n      const response = await getRedisInfo();\n      dispatch({ type: GET_REDIS_INFO_SUCCESS, payload: response });\n    } catch (error) {\n      console.error(`getRedisInfoAsync: ${toErrorStringWithHttpStatus(error)}`);\n      dispatch({\n        type: GET_REDIS_INFO_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Table from \"@material-ui/core/Table\";\nimport TableBody from \"@material-ui/core/TableBody\";\nimport TableCell from \"@material-ui/core/TableCell\";\nimport TableContainer from \"@material-ui/core/TableContainer\";\nimport TableHead from \"@material-ui/core/TableHead\";\nimport TableRow from \"@material-ui/core/TableRow\";\nimport { QueueLocation } from \"../api\";\n\nconst useStyles = makeStyles((theme) => ({\n  table: {\n    minWidth: 650,\n  },\n}));\n\ninterface Props {\n  queueLocations: QueueLocation[];\n}\n\nexport default function QueueLocationTable(props: Props) {\n  const classes = useStyles();\n\n  return (\n    <TableContainer>\n      <Table className={classes.table} aria-label=\"queue location table\">\n        <TableHead>\n          <TableRow>\n            <TableCell>Queue</TableCell>\n            <TableCell>KeySlot</TableCell>\n            <TableCell>Node Addresses</TableCell>\n          </TableRow>\n        </TableHead>\n        <TableBody>\n          {props.queueLocations.map((loc) => (\n            <TableRow key={loc.queue}>\n              <TableCell component=\"th\" scope=\"row\">\n                {loc.queue}\n              </TableCell>\n              <TableCell>{loc.keyslot}</TableCell>\n              <TableCell>{loc.nodes.join(\", \")}</TableCell>\n            </TableRow>\n          ))}\n        </TableBody>\n      </Table>\n    </TableContainer>\n  );\n}\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Card from \"@material-ui/core/Card\";\nimport CardContent from \"@material-ui/core/CardContent\";\nimport Alert from \"@material-ui/lab/Alert\";\nimport AlertTitle from \"@material-ui/lab/AlertTitle\";\nimport SyntaxHighlighter from \"../components/SyntaxHighlighter\";\nimport { getRedisInfoAsync } from \"../actions/redisInfoActions\";\nimport { usePolling } from \"../hooks\";\nimport { AppState } from \"../store\";\nimport { timeAgoUnix } from \"../utils\";\nimport { RedisInfo } from \"../api\";\nimport QueueLocationTable from \"../components/QueueLocationTable\";\nimport Link from \"@material-ui/core/Link\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.redis.loading,\n    error: state.redis.error,\n    redisInfo: state.redis.data,\n    redisAddress: state.redis.address,\n    redisInfoRaw: state.redis.rawData,\n    redisClusterEnabled: state.redis.cluster,\n    redisClusterNodesRaw: state.redis.rawClusterNodes,\n    queueLocations: state.redis.queueLocations,\n    pollInterval: state.settings.pollInterval,\n    themePreference: state.settings.themePreference,\n  };\n}\n\nconst connector = connect(mapStateToProps, { getRedisInfoAsync });\ntype Props = ConnectedProps<typeof connector>;\n\nfunction RedisInfoView(props: Props) {\n  const classes = useStyles();\n  const {\n    pollInterval,\n    getRedisInfoAsync,\n    redisInfo,\n    redisInfoRaw,\n    redisClusterEnabled,\n    redisClusterNodesRaw,\n    queueLocations,\n  } = props;\n  usePolling(getRedisInfoAsync, pollInterval);\n\n  // Metrics to show\n  // - Used Memory\n  // - Memory Fragmentation Ratio\n  // - Connected Clients\n  // - Connected Replicas (slaves)\n  // - Persistence (rdb_last_save_time, rdb_changes_since_last_save)\n  // - Errors (rejected_connections)\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3}>\n        {props.error === \"\" ? (\n          <>\n            <Grid item xs={12}>\n              <Typography variant=\"h5\" color=\"textPrimary\">\n                {redisClusterEnabled ? \"Redis Cluster Info\" : \"Redis Info\"}\n              </Typography>\n              {!redisClusterEnabled && (\n                <Typography variant=\"subtitle1\" color=\"textSecondary\">\n                  Connected to: {props.redisAddress}\n                </Typography>\n              )}\n            </Grid>\n            {queueLocations && queueLocations.length > 0 && (\n              <Grid item xs={12}>\n                <Typography variant=\"h6\" color=\"textSecondary\">\n                  Queue Location in Cluster\n                </Typography>\n                <QueueLocationTable queueLocations={queueLocations} />\n              </Grid>\n            )}\n            {redisClusterNodesRaw && (\n              <>\n                <Grid item xs={12}>\n                  <Typography variant=\"h6\" color=\"textSecondary\">\n                    <Link\n                      href=\"https://redis.io/commands/cluster-nodes\"\n                      target=\"_\"\n                    >\n                      CLUSTER NODES\n                    </Link>{\" \"}\n                    Command Output\n                  </Typography>\n                  <SyntaxHighlighter language=\"yaml\">\n                    {redisClusterNodesRaw}\n                  </SyntaxHighlighter>\n                </Grid>\n              </>\n            )}\n            {redisInfo && !redisClusterEnabled && (\n              <RedisMetricCards redisInfo={redisInfo} />\n            )}\n            {redisInfoRaw && (\n              <>\n                <Grid item xs={6}>\n                  <Typography variant=\"h6\" color=\"textSecondary\">\n                    {redisClusterEnabled ? (\n                      <Link\n                        href=\"https://redis.io/commands/cluster-info\"\n                        target=\"_\"\n                      >\n                        CLUSTER INFO\n                      </Link>\n                    ) : (\n                      <Link href=\"https://redis.io/commands/info\" target=\"_\">\n                        INFO\n                      </Link>\n                    )}{\" \"}\n                    Command Output\n                  </Typography>\n                  <SyntaxHighlighter language=\"yaml\">\n                    {redisInfoRaw}\n                  </SyntaxHighlighter>\n                </Grid>\n              </>\n            )}\n          </>\n        ) : (\n          <Grid item xs={12}>\n            <Alert severity=\"error\">\n              <AlertTitle>Error</AlertTitle>\n              Could not retrieve redis live data —{\" \"}\n              <strong>See the logs for details</strong>\n            </Alert>\n          </Grid>\n        )}\n      </Grid>\n    </Container>\n  );\n}\n\nfunction RedisMetricCards(props: { redisInfo: RedisInfo }) {\n  const { redisInfo } = props;\n  return (\n    <>\n      <Grid item xs={12}>\n        <Typography variant=\"h6\" color=\"textSecondary\">\n          Server\n        </Typography>\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard title=\"Version\" content={redisInfo.redis_version} />\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Uptime\"\n          content={`${redisInfo.uptime_in_days} days`}\n        />\n      </Grid>\n      <Grid item xs={6} />\n      <Grid item xs={12}>\n        <Typography variant=\"h6\" color=\"textSecondary\">\n          Memory\n        </Typography>\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard title=\"Used Memory\" content={redisInfo.used_memory_human} />\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Peak Memory Used\"\n          content={redisInfo.used_memory_peak_human}\n        />\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Memory Fragmentation Ratio\"\n          content={redisInfo.mem_fragmentation_ratio}\n        />\n      </Grid>\n      <Grid item xs={3} />\n      <Grid item xs={12}>\n        <Typography variant=\"h6\" color=\"textSecondary\">\n          Connections\n        </Typography>\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Connected Clients\"\n          content={redisInfo.connected_clients}\n        />\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Connected Replicas\"\n          content={redisInfo.connected_slaves}\n        />\n      </Grid>\n      <Grid item xs={6} />\n      <Grid item xs={12}>\n        <Typography variant=\"h6\" color=\"textSecondary\">\n          Persistence\n        </Typography>\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Last Save to Disk\"\n          content={timeAgoUnix(parseInt(redisInfo.rdb_last_save_time))}\n        />\n      </Grid>\n      <Grid item xs={3}>\n        <MetricCard\n          title=\"Number of Changes Since Last Dump\"\n          content={redisInfo.rdb_changes_since_last_save}\n        />\n      </Grid>\n      <Grid item xs={6} />\n    </>\n  );\n}\n\ninterface MetricCardProps {\n  title: string;\n  content: string;\n}\n\nfunction MetricCard(props: MetricCardProps) {\n  return (\n    <Card variant=\"outlined\">\n      <CardContent>\n        <Typography\n          gutterBottom\n          color=\"textPrimary\"\n          variant=\"h5\"\n          align=\"center\"\n        >\n          {props.content}\n        </Typography>\n        <Typography color=\"textSecondary\" variant=\"subtitle2\" align=\"center\">\n          {props.title}\n        </Typography>\n      </CardContent>\n    </Card>\n  );\n}\n\nexport default connector(RedisInfoView);\n","import { Dispatch } from \"redux\";\nimport { getMetrics, MetricsResponse } from \"../api\";\nimport { toErrorString, toErrorStringWithHttpStatus } from \"../utils\";\n\n// List of metrics related action types.\nexport const GET_METRICS_BEGIN = \"GET_METRICS_BEGIN\";\nexport const GET_METRICS_SUCCESS = \"GET_METRICS_SUCCESS\";\nexport const GET_METRICS_ERROR = \"GET_METRICS_ERROR\";\n\ninterface GetMetricsBeginAction {\n  type: typeof GET_METRICS_BEGIN;\n}\n\ninterface GetMetricsSuccessAction {\n  type: typeof GET_METRICS_SUCCESS;\n  payload: MetricsResponse;\n}\n\ninterface GetMetricsErrorAction {\n  type: typeof GET_METRICS_ERROR;\n  error: string;\n}\n\n// Union of all metrics related actions.\nexport type MetricsActionTypes =\n  | GetMetricsBeginAction\n  | GetMetricsSuccessAction\n  | GetMetricsErrorAction;\n\nexport function getMetricsAsync(\n  endTime: number,\n  duration: number,\n  queues: string[]\n) {\n  return async (dispatch: Dispatch<MetricsActionTypes>) => {\n    dispatch({ type: GET_METRICS_BEGIN });\n    try {\n      const response = await getMetrics(endTime, duration, queues);\n      dispatch({ type: GET_METRICS_SUCCESS, payload: response });\n    } catch (error) {\n      console.error(`getMetricsAsync: ${toErrorStringWithHttpStatus(error)}`);\n      dispatch({\n        type: GET_METRICS_ERROR,\n        error: toErrorString(error),\n      });\n    }\n  };\n}\n","import { useTheme } from \"@material-ui/core/styles\";\nimport React from \"react\";\nimport {\n  LineChart,\n  Line,\n  XAxis,\n  YAxis,\n  CartesianGrid,\n  Tooltip,\n  Legend,\n  ResponsiveContainer,\n} from \"recharts\";\nimport { Metrics } from \"../api\";\n\ninterface Props {\n  data: Metrics[];\n\n  // both startTime and endTime are in unix time (seconds)\n  startTime: number;\n  endTime: number;\n\n  // (optional): Tick formatter function for YAxis\n  yAxisTickFormatter?: (val: number) => string;\n}\n\n// interface that rechart understands.\ninterface ChartData {\n  timestamp: number;\n  [qname: string]: number;\n}\n\nfunction toChartData(metrics: Metrics[]): ChartData[] {\n  if (metrics.length === 0) {\n    return [];\n  }\n  let byTimestamp: { [key: number]: ChartData } = {};\n  for (let x of metrics) {\n    for (let [ts, val] of x.values) {\n      if (!byTimestamp[ts]) {\n        byTimestamp[ts] = { timestamp: ts };\n      }\n      const qname = x.metric.queue;\n      if (qname) {\n        byTimestamp[ts][qname] = parseFloat(val);\n      }\n    }\n  }\n  return Object.values(byTimestamp);\n}\n\nconst lineColors = [\n  \"#2085ec\",\n  \"#72b4eb\",\n  \"#0a417a\",\n  \"#8464a0\",\n  \"#cea9bc\",\n  \"#323232\",\n];\n\nfunction QueueMetricsChart(props: Props) {\n  const theme = useTheme();\n\n  const data = toChartData(props.data);\n  const keys = props.data.map((x) => x.metric.queue);\n  return (\n    <ResponsiveContainer height={260}>\n      <LineChart data={data}>\n        <CartesianGrid strokeDasharray=\"3 3\" />\n        <XAxis\n          minTickGap={10}\n          dataKey=\"timestamp\"\n          domain={[props.startTime, props.endTime]}\n          tickFormatter={(timestamp: number) =>\n            new Date(timestamp * 1000).toLocaleTimeString()\n          }\n          type=\"number\"\n          scale=\"time\"\n          stroke={theme.palette.text.secondary}\n        />\n        <YAxis\n          tickFormatter={props.yAxisTickFormatter}\n          stroke={theme.palette.text.secondary}\n        />\n        <Tooltip\n          labelFormatter={(timestamp: number) => {\n            return new Date(timestamp * 1000).toLocaleTimeString();\n          }}\n        />\n        <Legend />\n        {keys.map((key, idx) => (\n          <Line\n            key={key}\n            type=\"monotone\"\n            dataKey={key}\n            stroke={lineColors[idx % lineColors.length]}\n            dot={false}\n          />\n        ))}\n      </LineChart>\n    </ResponsiveContainer>\n  );\n}\n\nQueueMetricsChart.defaultProps = {\n  yAxisTickFormatter: (val: number) => val.toString(),\n};\n\nexport default QueueMetricsChart;\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\nimport Button, { ButtonProps } from \"@material-ui/core/Button\";\nimport ButtonGroup from \"@material-ui/core/ButtonGroup\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Popover from \"@material-ui/core/Popover\";\nimport Radio from \"@material-ui/core/Radio\";\nimport RadioGroup from \"@material-ui/core/RadioGroup\";\nimport Checkbox from \"@material-ui/core/Checkbox\";\nimport FormControlLabel from \"@material-ui/core/FormControlLabel\";\nimport FormControl from \"@material-ui/core/FormControl\";\nimport FormGroup from \"@material-ui/core/FormGroup\";\nimport FormLabel from \"@material-ui/core/FormLabel\";\nimport TextField from \"@material-ui/core/TextField\";\nimport Typography from \"@material-ui/core/Typography\";\nimport ArrowLeftIcon from \"@material-ui/icons/ArrowLeft\";\nimport ArrowRightIcon from \"@material-ui/icons/ArrowRight\";\nimport FilterListIcon from \"@material-ui/icons/FilterList\";\nimport dayjs from \"dayjs\";\nimport { currentUnixtime, parseDuration } from \"../utils\";\nimport { AppState } from \"../store\";\nimport { isDarkTheme } from \"../theme\";\n\nfunction mapStateToProps(state: AppState) {\n  return { pollInterval: state.settings.pollInterval };\n}\n\nconst connector = connect(mapStateToProps);\ntype ReduxProps = ConnectedProps<typeof connector>;\n\ninterface Props extends ReduxProps {\n  // Specifies the endtime in Unix time seconds.\n  endTimeSec: number;\n  onEndTimeChange: (t: number, isEndTimeFixed: boolean) => void;\n\n  // Specifies the duration in seconds.\n  durationSec: number;\n  onDurationChange: (d: number, isEndTimeFixed: boolean) => void;\n\n  // All available queues.\n  queues: string[];\n  // Selected queues.\n  selectedQueues: string[];\n  addQueue: (qname: string) => void;\n  removeQueue: (qname: string) => void;\n}\n\ninterface State {\n  endTimeOption: EndTimeOption;\n  durationOption: DurationOption;\n  customEndTime: string; // text shown in input field\n  customDuration: string; // text shown in input field\n  customEndTimeError: string;\n  customDurationError: string;\n}\n\ntype EndTimeOption = \"real_time\" | \"freeze_at_now\" | \"custom\";\ntype DurationOption = \"1h\" | \"6h\" | \"1d\" | \"8d\" | \"30d\" | \"custom\";\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    display: \"flex\",\n    alignItems: \"center\",\n  },\n  endTimeCaption: {\n    marginRight: theme.spacing(1),\n  },\n  shiftButtons: {\n    marginLeft: theme.spacing(1),\n  },\n  buttonGroupRoot: {\n    height: 29,\n    position: \"relative\",\n    top: 1,\n  },\n  endTimeShiftControls: {\n    padding: theme.spacing(1),\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    borderBottomColor: theme.palette.divider,\n    borderBottomWidth: 1,\n    borderBottomStyle: \"solid\",\n  },\n  leftShiftButtons: {\n    display: \"flex\",\n    alignItems: \"center\",\n    marginRight: theme.spacing(2),\n  },\n  rightShiftButtons: {\n    display: \"flex\",\n    alignItems: \"center\",\n    marginLeft: theme.spacing(2),\n  },\n  controlsContainer: {\n    display: \"flex\",\n    justifyContent: \"flex-end\",\n  },\n  controlSelectorBox: {\n    display: \"flex\",\n    minWidth: 490,\n    padding: theme.spacing(2),\n  },\n  controlEndTimeSelector: {\n    width: \"50%\",\n  },\n  controlDurationSelector: {\n    width: \"50%\",\n  },\n  radioButtonRoot: {\n    paddingTop: theme.spacing(0.5),\n    paddingBottom: theme.spacing(0.5),\n    paddingLeft: theme.spacing(1),\n    paddingRight: theme.spacing(1),\n  },\n  formControlLabel: {\n    fontSize: 14,\n  },\n  buttonLabel: {\n    textTransform: \"none\",\n    fontSize: 12,\n  },\n  formControlRoot: {\n    width: \"100%\",\n    margin: 0,\n  },\n  formLabel: {\n    fontSize: 14,\n    fontWeight: 500,\n    marginBottom: theme.spacing(1),\n  },\n  customInputField: {\n    marginTop: theme.spacing(1),\n  },\n  filterButton: {\n    marginLeft: theme.spacing(1),\n  },\n  queueFilters: {\n    padding: theme.spacing(2),\n    maxHeight: 400,\n  },\n  checkbox: {\n    padding: 6,\n  },\n}));\n\n// minute, hour, day in seconds\nconst minute = 60;\nconst hour = 60 * minute;\nconst day = 24 * hour;\n\nfunction getInitialState(endTimeSec: number, durationSec: number): State {\n  let endTimeOption: EndTimeOption = \"real_time\";\n  let customEndTime = \"\";\n  let durationOption: DurationOption = \"1h\";\n  let customDuration = \"\";\n\n  const now = currentUnixtime();\n  // Account for 1s difference, may just happen to elapse 1s\n  // between the parent component's render and this component's render.\n  if (now <= endTimeSec && endTimeSec <= now + 1) {\n    endTimeOption = \"real_time\";\n  } else {\n    endTimeOption = \"custom\";\n    customEndTime = new Date(endTimeSec * 1000).toISOString();\n  }\n\n  switch (durationSec) {\n    case 1 * hour:\n      durationOption = \"1h\";\n      break;\n    case 6 * hour:\n      durationOption = \"6h\";\n      break;\n    case 1 * day:\n      durationOption = \"1d\";\n      break;\n    case 8 * day:\n      durationOption = \"8d\";\n      break;\n    case 30 * day:\n      durationOption = \"30d\";\n      break;\n    default:\n      durationOption = \"custom\";\n      customDuration = durationSec + \"s\";\n  }\n\n  return {\n    endTimeOption,\n    customEndTime,\n    customEndTimeError: \"\",\n    durationOption,\n    customDuration,\n    customDurationError: \"\",\n  };\n}\n\nfunction MetricsFetchControls(props: Props) {\n  const classes = useStyles();\n\n  const [state, setState] = React.useState<State>(\n    getInitialState(props.endTimeSec, props.durationSec)\n  );\n  const [timePopoverAnchorElem, setTimePopoverAnchorElem] =\n    React.useState<HTMLButtonElement | null>(null);\n\n  const [queuePopoverAnchorElem, setQueuePopoverAnchorElem] =\n    React.useState<HTMLButtonElement | null>(null);\n\n  const handleEndTimeOptionChange = (\n    event: React.ChangeEvent<HTMLInputElement>\n  ) => {\n    const selectedOpt = (event.target as HTMLInputElement)\n      .value as EndTimeOption;\n    setState((prevState) => ({\n      ...prevState,\n      endTimeOption: selectedOpt,\n      customEndTime: \"\",\n      customEndTimeError: \"\",\n    }));\n    switch (selectedOpt) {\n      case \"real_time\":\n        props.onEndTimeChange(currentUnixtime(), /*isEndTimeFixed=*/ false);\n        break;\n      case \"freeze_at_now\":\n        props.onEndTimeChange(currentUnixtime(), /*isEndTimeFixed=*/ true);\n        break;\n      case \"custom\":\n      // No-op\n    }\n  };\n\n  const handleDurationOptionChange = (\n    event: React.ChangeEvent<HTMLInputElement>\n  ) => {\n    const selectedOpt = (event.target as HTMLInputElement)\n      .value as DurationOption;\n    setState((prevState) => ({\n      ...prevState,\n      durationOption: selectedOpt,\n      customDuration: \"\",\n      customDurationError: \"\",\n    }));\n    const isEndTimeFixed = state.endTimeOption !== \"real_time\";\n    switch (selectedOpt) {\n      case \"1h\":\n        props.onDurationChange(1 * hour, isEndTimeFixed);\n        break;\n      case \"6h\":\n        props.onDurationChange(6 * hour, isEndTimeFixed);\n        break;\n      case \"1d\":\n        props.onDurationChange(1 * day, isEndTimeFixed);\n        break;\n      case \"8d\":\n        props.onDurationChange(8 * day, isEndTimeFixed);\n        break;\n      case \"30d\":\n        props.onDurationChange(30 * day, isEndTimeFixed);\n        break;\n      case \"custom\":\n      // No-op\n    }\n  };\n\n  const handleCustomDurationChange = (\n    event: React.ChangeEvent<HTMLInputElement>\n  ) => {\n    event.persist(); // https://reactjs.org/docs/legacy-event-pooling.html\n    setState((prevState) => ({\n      ...prevState,\n      customDuration: event.target.value,\n    }));\n  };\n\n  const handleCustomEndTimeChange = (\n    event: React.ChangeEvent<HTMLInputElement>\n  ) => {\n    event.persist(); // https://reactjs.org/docs/legacy-event-pooling.html\n    setState((prevState) => ({\n      ...prevState,\n      customEndTime: event.target.value,\n    }));\n  };\n\n  const handleCustomDurationKeyDown = (\n    event: React.KeyboardEvent<HTMLInputElement>\n  ) => {\n    if (event.key === \"Enter\") {\n      try {\n        const d = parseDuration(state.customDuration);\n        setState((prevState) => ({\n          ...prevState,\n          durationOption: \"custom\",\n          customDurationError: \"\",\n        }));\n        props.onDurationChange(d, state.endTimeOption !== \"real_time\");\n      } catch (error) {\n        setState((prevState) => ({\n          ...prevState,\n          customDurationError: \"Duration invalid\",\n        }));\n      }\n    }\n  };\n\n  const handleCustomEndTimeKeyDown = (\n    event: React.KeyboardEvent<HTMLInputElement>\n  ) => {\n    if (event.key === \"Enter\") {\n      const timeUsecOrNaN = Date.parse(state.customEndTime);\n      if (isNaN(timeUsecOrNaN)) {\n        setState((prevState) => ({\n          ...prevState,\n          customEndTimeError: \"End time invalid\",\n        }));\n        return;\n      }\n      setState((prevState) => ({\n        ...prevState,\n        endTimeOption: \"custom\",\n        customEndTimeError: \"\",\n      }));\n      props.onEndTimeChange(\n        Math.floor(timeUsecOrNaN / 1000),\n        /* isEndTimeFixed= */ true\n      );\n    }\n  };\n\n  const handleOpenTimePopover = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    setTimePopoverAnchorElem(event.currentTarget);\n  };\n\n  const handleCloseTimePopover = () => {\n    setTimePopoverAnchorElem(null);\n  };\n\n  const handleOpenQueuePopover = (\n    event: React.MouseEvent<HTMLButtonElement>\n  ) => {\n    setQueuePopoverAnchorElem(event.currentTarget);\n  };\n\n  const handleCloseQueuePopover = () => {\n    setQueuePopoverAnchorElem(null);\n  };\n\n  const isTimePopoverOpen = Boolean(timePopoverAnchorElem);\n  const isQueuePopoverOpen = Boolean(queuePopoverAnchorElem);\n\n  React.useEffect(() => {\n    if (state.endTimeOption === \"real_time\") {\n      const id = setInterval(() => {\n        props.onEndTimeChange(currentUnixtime(), /*isEndTimeFixed=*/ false);\n      }, props.pollInterval * 1000);\n      return () => clearInterval(id);\n    }\n  });\n\n  const shiftBy = (deltaSec: number) => {\n    return () => {\n      const now = currentUnixtime();\n      const endTime = props.endTimeSec + deltaSec;\n      if (now <= endTime) {\n        setState((prevState) => ({\n          ...prevState,\n          customEndTime: \"\",\n          endTimeOption: \"real_time\",\n        }));\n        props.onEndTimeChange(now, /*isEndTimeFixed=*/ false);\n        return;\n      }\n      setState((prevState) => ({\n        ...prevState,\n        endTimeOption: \"custom\",\n        customEndTime: new Date(endTime * 1000).toISOString(),\n      }));\n      props.onEndTimeChange(endTime, /*isEndTimeFixed=*/ true);\n    };\n  };\n\n  return (\n    <div className={classes.root}>\n      <Typography\n        variant=\"caption\"\n        color=\"textPrimary\"\n        className={classes.endTimeCaption}\n      >\n        {formatTime(props.endTimeSec)}\n      </Typography>\n      <div>\n        <Button\n          aria-describedby={isTimePopoverOpen ? \"time-popover\" : undefined}\n          variant=\"outlined\"\n          color=\"primary\"\n          onClick={handleOpenTimePopover}\n          size=\"small\"\n          classes={{\n            label: classes.buttonLabel,\n          }}\n        >\n          {state.endTimeOption === \"real_time\" ? \"Realtime\" : \"Historical\"}:{\" \"}\n          {state.durationOption === \"custom\"\n            ? state.customDuration\n            : state.durationOption}\n        </Button>\n        <Popover\n          id={isTimePopoverOpen ? \"time-popover\" : undefined}\n          open={isTimePopoverOpen}\n          anchorEl={timePopoverAnchorElem}\n          onClose={handleCloseTimePopover}\n          anchorOrigin={{\n            vertical: \"bottom\",\n            horizontal: \"center\",\n          }}\n          transformOrigin={{\n            vertical: \"top\",\n            horizontal: \"center\",\n          }}\n        >\n          <div className={classes.endTimeShiftControls}>\n            <div className={classes.leftShiftButtons}>\n              <ShiftButton\n                direction=\"left\"\n                text=\"2h\"\n                onClick={shiftBy(-2 * hour)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"left\"\n                text=\"1h\"\n                onClick={shiftBy(-1 * hour)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"left\"\n                text=\"30m\"\n                onClick={shiftBy(-30 * minute)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"left\"\n                text=\"15m\"\n                onClick={shiftBy(-15 * minute)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"left\"\n                text=\"5m\"\n                onClick={shiftBy(-5 * minute)}\n                dense={true}\n              />\n            </div>\n            <div className={classes.rightShiftButtons}>\n              <ShiftButton\n                direction=\"right\"\n                text=\"5m\"\n                onClick={shiftBy(5 * minute)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"right\"\n                text=\"15m\"\n                onClick={shiftBy(15 * minute)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"right\"\n                text=\"30m\"\n                onClick={shiftBy(30 * minute)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"right\"\n                text=\"1h\"\n                onClick={shiftBy(1 * hour)}\n                dense={true}\n              />\n              <ShiftButton\n                direction=\"right\"\n                text=\"2h\"\n                onClick={shiftBy(2 * hour)}\n                dense={true}\n              />\n            </div>\n          </div>\n          <div className={classes.controlSelectorBox}>\n            <div className={classes.controlEndTimeSelector}>\n              <FormControl\n                component=\"fieldset\"\n                margin=\"dense\"\n                classes={{ root: classes.formControlRoot }}\n              >\n                <FormLabel className={classes.formLabel} component=\"legend\">\n                  End Time\n                </FormLabel>\n                <RadioGroup\n                  aria-label=\"end_time\"\n                  name=\"end_time\"\n                  value={state.endTimeOption}\n                  onChange={handleEndTimeOptionChange}\n                >\n                  <RadioInput value=\"real_time\" label=\"Real Time\" />\n                  <RadioInput value=\"freeze_at_now\" label=\"Freeze at now\" />\n                  <RadioInput value=\"custom\" label=\"Custom End Time\" />\n                </RadioGroup>\n                <div className={classes.customInputField}>\n                  <TextField\n                    id=\"custom-endtime\"\n                    label=\"yyyy-mm-dd hh:mm:ssz\"\n                    variant=\"outlined\"\n                    size=\"small\"\n                    onChange={handleCustomEndTimeChange}\n                    value={state.customEndTime}\n                    onKeyDown={handleCustomEndTimeKeyDown}\n                    error={state.customEndTimeError !== \"\"}\n                    helperText={state.customEndTimeError}\n                  />\n                </div>\n              </FormControl>\n            </div>\n            <div className={classes.controlDurationSelector}>\n              <FormControl\n                component=\"fieldset\"\n                margin=\"dense\"\n                classes={{ root: classes.formControlRoot }}\n              >\n                <FormLabel className={classes.formLabel} component=\"legend\">\n                  Duration\n                </FormLabel>\n                <RadioGroup\n                  aria-label=\"duration\"\n                  name=\"duration\"\n                  value={state.durationOption}\n                  onChange={handleDurationOptionChange}\n                >\n                  <RadioInput value=\"1h\" label=\"1h\" />\n                  <RadioInput value=\"6h\" label=\"6h\" />\n                  <RadioInput value=\"1d\" label=\"1 day\" />\n                  <RadioInput value=\"8d\" label=\"8 days\" />\n                  <RadioInput value=\"30d\" label=\"30 days\" />\n                  <RadioInput value=\"custom\" label=\"Custom Duration\" />\n                </RadioGroup>\n                <div className={classes.customInputField}>\n                  <TextField\n                    id=\"custom-duration\"\n                    label=\"duration\"\n                    variant=\"outlined\"\n                    size=\"small\"\n                    onChange={handleCustomDurationChange}\n                    value={state.customDuration}\n                    onKeyDown={handleCustomDurationKeyDown}\n                    error={state.customDurationError !== \"\"}\n                    helperText={state.customDurationError}\n                  />\n                </div>\n              </FormControl>\n            </div>\n          </div>\n        </Popover>\n      </div>\n      <div className={classes.shiftButtons}>\n        <ButtonGroup\n          classes={{ root: classes.buttonGroupRoot }}\n          size=\"small\"\n          color=\"primary\"\n          aria-label=\"shift buttons\"\n        >\n          <ShiftButton\n            direction=\"left\"\n            text={\n              state.durationOption === \"custom\" ? \"1h\" : state.durationOption\n            }\n            color=\"primary\"\n            onClick={\n              state.durationOption === \"custom\"\n                ? shiftBy(-1 * hour)\n                : shiftBy(-props.durationSec)\n            }\n          />\n          <ShiftButton\n            direction=\"right\"\n            text={\n              state.durationOption === \"custom\" ? \"1h\" : state.durationOption\n            }\n            color=\"primary\"\n            onClick={\n              state.durationOption === \"custom\"\n                ? shiftBy(1 * hour)\n                : shiftBy(props.durationSec)\n            }\n          />\n        </ButtonGroup>\n      </div>\n      <div className={classes.filterButton}>\n        <IconButton\n          aria-label=\"filter\"\n          size=\"small\"\n          onClick={handleOpenQueuePopover}\n        >\n          <FilterListIcon />\n        </IconButton>\n        <Popover\n          id={isQueuePopoverOpen ? \"queue-popover\" : undefined}\n          open={isQueuePopoverOpen}\n          anchorEl={queuePopoverAnchorElem}\n          onClose={handleCloseQueuePopover}\n          anchorOrigin={{\n            vertical: \"bottom\",\n            horizontal: \"center\",\n          }}\n          transformOrigin={{\n            vertical: \"top\",\n            horizontal: \"center\",\n          }}\n        >\n          <FormControl className={classes.queueFilters}>\n            <FormLabel className={classes.formLabel} component=\"legend\">\n              Queues\n            </FormLabel>\n            <FormGroup>\n              {props.queues.map((qname) => (\n                <FormControlLabel\n                  key={qname}\n                  control={\n                    <Checkbox\n                      size=\"small\"\n                      checked={props.selectedQueues.includes(qname)}\n                      onChange={() => {\n                        if (props.selectedQueues.includes(qname)) {\n                          props.removeQueue(qname);\n                        } else {\n                          props.addQueue(qname);\n                        }\n                      }}\n                      name={qname}\n                      className={classes.checkbox}\n                    />\n                  }\n                  label={qname}\n                  classes={{ label: classes.formControlLabel }}\n                />\n              ))}\n            </FormGroup>\n          </FormControl>\n        </Popover>\n      </div>\n    </div>\n  );\n}\n\n/****************** Helper functions/components *******************/\n\nfunction formatTime(unixtime: number): string {\n  const tz = new Date(unixtime * 1000)\n    .toLocaleTimeString(\"en-us\", { timeZoneName: \"short\" })\n    .split(\" \")[2];\n  return dayjs.unix(unixtime).format(\"ddd, DD MMM YYYY HH:mm:ss \") + tz;\n}\n\ninterface RadioInputProps {\n  value: string;\n  label: string;\n}\n\nfunction RadioInput(props: RadioInputProps) {\n  const classes = useStyles();\n  return (\n    <FormControlLabel\n      classes={{ label: classes.formControlLabel }}\n      value={props.value}\n      control={\n        <Radio size=\"small\" classes={{ root: classes.radioButtonRoot }} />\n      }\n      label={props.label}\n    />\n  );\n}\n\ninterface ShiftButtonProps extends ButtonProps {\n  text: string;\n  onClick: () => void;\n  direction: \"left\" | \"right\";\n  dense?: boolean;\n}\n\nconst useShiftButtonStyles = makeStyles((theme: Theme) => ({\n  root: {\n    minWidth: 40,\n    fontWeight: (props: ShiftButtonProps) => (props.dense ? 400 : 500),\n  },\n  label: { fontSize: 12, textTransform: \"none\" },\n  iconRoot: {\n    marginRight: (props: ShiftButtonProps) =>\n      props.direction === \"left\" ? (props.dense ? -8 : -4) : 0,\n    marginLeft: (props: ShiftButtonProps) =>\n      props.direction === \"right\" ? (props.dense ? -8 : -4) : 0,\n    color: (props: ShiftButtonProps) =>\n      props.color\n        ? props.color\n        : theme.palette.grey[isDarkTheme(theme) ? 200 : 700],\n  },\n}));\n\nfunction ShiftButton(props: ShiftButtonProps) {\n  const classes = useShiftButtonStyles(props);\n  return (\n    <Button\n      {...props}\n      classes={{\n        root: classes.root,\n        label: classes.label,\n      }}\n      size=\"small\"\n    >\n      {props.direction === \"left\" && (\n        <ArrowLeftIcon classes={{ root: classes.iconRoot }} />\n      )}\n      {props.text}\n      {props.direction === \"right\" && (\n        <ArrowRightIcon classes={{ root: classes.iconRoot }} />\n      )}\n    </Button>\n  );\n}\n\nShiftButton.defaultProps = {\n  dense: false,\n};\n\nexport default connect(mapStateToProps)(MetricsFetchControls);\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport { useHistory } from \"react-router-dom\";\nimport queryString from \"query-string\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Container from \"@material-ui/core/Container\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Typography from \"@material-ui/core/Typography\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport InfoIcon from \"@material-ui/icons/Info\";\nimport prettyBytes from \"pretty-bytes\";\nimport { getMetricsAsync } from \"../actions/metricsActions\";\nimport { listQueuesAsync } from \"../actions/queuesActions\";\nimport { AppState } from \"../store\";\nimport QueueMetricsChart from \"../components/QueueMetricsChart\";\nimport Tooltip from \"../components/Tooltip\";\nimport { currentUnixtime } from \"../utils\";\nimport MetricsFetchControls from \"../components/MetricsFetchControls\";\nimport { useQuery } from \"../hooks\";\nimport { PrometheusMetricsResponse } from \"../api\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    marginTop: 30,\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  controlsContainer: {\n    display: \"flex\",\n    justifyContent: \"flex-end\",\n    position: \"fixed\",\n    background: theme.palette.background.paper,\n    zIndex: theme.zIndex.appBar,\n    right: 0,\n    top: 64, // app-bar height\n    width: \"100%\",\n    padding: theme.spacing(2),\n  },\n  chartInfo: {\n    display: \"flex\",\n    alignItems: \"center\",\n    marginBottom: theme.spacing(1),\n  },\n  infoIcon: {\n    marginLeft: theme.spacing(1),\n    color: theme.palette.grey[500],\n    cursor: \"pointer\",\n  },\n  errorMessage: {\n    marginLeft: \"auto\",\n    display: \"flex\",\n    alignItems: \"center\",\n  },\n  warningIcon: {\n    color: \"#ff6700\",\n    marginRight: 6,\n  },\n}));\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    loading: state.metrics.loading,\n    error: state.metrics.error,\n    data: state.metrics.data,\n    pollInterval: state.settings.pollInterval,\n    queues: state.queues.data.map((q) => q.name),\n  };\n}\n\nconst connector = connect(mapStateToProps, {\n  getMetricsAsync,\n  listQueuesAsync,\n});\ntype Props = ConnectedProps<typeof connector>;\n\nconst ENDTIME_URL_PARAM_KEY = \"end\";\nconst DURATION_URL_PARAM_KEY = \"duration\";\n\nfunction MetricsView(props: Props) {\n  const classes = useStyles();\n  const history = useHistory();\n  const query = useQuery();\n\n  const endTimeStr = query.get(ENDTIME_URL_PARAM_KEY);\n  const endTime = endTimeStr ? parseFloat(endTimeStr) : currentUnixtime(); // default to now\n\n  const durationStr = query.get(DURATION_URL_PARAM_KEY);\n  const duration = durationStr ? parseFloat(durationStr) : 60 * 60; // default to 1h\n\n  const { pollInterval, getMetricsAsync, listQueuesAsync, data } = props;\n\n  const [endTimeSec, setEndTimeSec] = React.useState(endTime);\n  const [durationSec, setDurationSec] = React.useState(duration);\n  const [selectedQueues, setSelectedQueues] = React.useState<string[]>([]);\n\n  const handleEndTimeChange = (endTime: number, isEndTimeFixed: boolean) => {\n    const urlQuery = isEndTimeFixed\n      ? {\n          [ENDTIME_URL_PARAM_KEY]: endTime,\n          [DURATION_URL_PARAM_KEY]: durationSec,\n        }\n      : {\n          [DURATION_URL_PARAM_KEY]: durationSec,\n        };\n    history.push({\n      ...history.location,\n      search: queryString.stringify(urlQuery),\n    });\n    setEndTimeSec(endTime);\n  };\n\n  const handleDurationChange = (duration: number, isEndTimeFixed: boolean) => {\n    const urlQuery = isEndTimeFixed\n      ? {\n          [ENDTIME_URL_PARAM_KEY]: endTimeSec,\n          [DURATION_URL_PARAM_KEY]: duration,\n        }\n      : {\n          [DURATION_URL_PARAM_KEY]: duration,\n        };\n    history.push({\n      ...history.location,\n      search: queryString.stringify(urlQuery),\n    });\n    setDurationSec(duration);\n  };\n\n  const handleAddQueue = (qname: string) => {\n    if (selectedQueues.includes(qname)) {\n      return;\n    }\n    setSelectedQueues(selectedQueues.concat(qname));\n  };\n\n  const handleRemoveQueue = (qname: string) => {\n    if (selectedQueues.length === 1) {\n      return; // ensure that selected queues doesn't go down to zero once user selected\n    }\n    if (selectedQueues.length === 0) {\n      // when user first select filter (remove once of the queues),\n      // we need to lazily initialize the selectedQueues with the rest (all queues but the selected one).\n      setSelectedQueues(props.queues.filter((q) => q !== qname));\n      return;\n    }\n    setSelectedQueues(selectedQueues.filter((q) => q !== qname));\n  };\n\n  React.useEffect(() => {\n    listQueuesAsync();\n  }, [listQueuesAsync]);\n\n  React.useEffect(() => {\n    getMetricsAsync(endTimeSec, durationSec, selectedQueues);\n  }, [pollInterval, getMetricsAsync, durationSec, endTimeSec, selectedQueues]);\n\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <div className={classes.controlsContainer}>\n        <MetricsFetchControls\n          endTimeSec={endTimeSec}\n          onEndTimeChange={handleEndTimeChange}\n          durationSec={durationSec}\n          onDurationChange={handleDurationChange}\n          queues={props.queues}\n          selectedQueues={\n            // If none are selected (e.g. initial state), no filters should apply.\n            selectedQueues.length === 0 ? props.queues : selectedQueues\n          }\n          addQueue={handleAddQueue}\n          removeQueue={handleRemoveQueue}\n        />\n      </div>\n      <Grid container spacing={3}>\n        {data?.tasks_processed_per_second && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Tasks Processed\"\n              description=\"Number of tasks processed (both succeeded and failed) per second.\"\n              metrics={data.tasks_processed_per_second}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.tasks_failed_per_second && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Tasks Failed\"\n              description=\"Number of tasks failed per second.\"\n              metrics={data.tasks_failed_per_second}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.error_rate && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Error Rate\"\n              description=\"Rate of task failures\"\n              metrics={data.error_rate}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.queue_size && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Queue Size\"\n              description=\"Total number of tasks in a given queue.\"\n              metrics={data.queue_size}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.queue_latency_seconds && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Queue Latency\"\n              description=\"Latency of queue, measured by the oldest pending task in the queue.\"\n              metrics={data.queue_latency_seconds}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n              yAxisTickFormatter={(val: number) => val + \"s\"}\n            />\n          </Grid>\n        )}\n        {data?.queue_size && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Queue Memory Usage (approx)\"\n              description=\"Memory usage by queue. Approximate value by sampling a few tasks in a queue.\"\n              metrics={data.queue_memory_usage_approx_bytes}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n              yAxisTickFormatter={(val: number) => {\n                try {\n                  return prettyBytes(val);\n                } catch (error) {\n                  return val + \"B\";\n                }\n              }}\n            />\n          </Grid>\n        )}\n        {data?.pending_tasks_by_queue && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Pending Tasks\"\n              description=\"Number of pending tasks in a given queue.\"\n              metrics={data.pending_tasks_by_queue}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.retry_tasks_by_queue && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Retry Tasks\"\n              description=\"Number of retry tasks in a given queue.\"\n              metrics={data.retry_tasks_by_queue}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n        {data?.archived_tasks_by_queue && (\n          <Grid item xs={12}>\n            <ChartRow\n              title=\"Archived Tasks\"\n              description=\"Number of archived tasks in a given queue.\"\n              metrics={data.archived_tasks_by_queue}\n              endTime={endTimeSec}\n              startTime={endTimeSec - durationSec}\n            />\n          </Grid>\n        )}\n      </Grid>\n    </Container>\n  );\n}\n\nexport default connector(MetricsView);\n\n/******** Helper components ********/\n\ninterface ChartRowProps {\n  title: string;\n  description: string;\n  metrics: PrometheusMetricsResponse;\n  endTime: number;\n  startTime: number;\n  yAxisTickFormatter?: (val: number) => string;\n}\n\nfunction ChartRow(props: ChartRowProps) {\n  const classes = useStyles();\n  return (\n    <>\n      <div className={classes.chartInfo}>\n        <Typography color=\"textPrimary\">{props.title}</Typography>\n        <Tooltip title={<div>{props.description}</div>}>\n          <InfoIcon fontSize=\"small\" className={classes.infoIcon} />\n        </Tooltip>\n        {props.metrics.status === \"error\" && (\n          <div className={classes.errorMessage}>\n            <WarningIcon fontSize=\"small\" className={classes.warningIcon} />\n            <Typography color=\"textSecondary\">\n              Failed to get metrics data: {props.metrics.error}\n            </Typography>\n          </div>\n        )}\n      </div>\n      <QueueMetricsChart\n        data={\n          props.metrics.status === \"error\"\n            ? []\n            : props.metrics.data?.result || []\n        }\n        endTime={props.endTime}\n        startTime={props.startTime}\n        yAxisTickFormatter={props.yAxisTickFormatter}\n      />\n    </>\n  );\n}\n","import React from \"react\";\nimport Container from \"@material-ui/core/Container\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Grid from \"@material-ui/core/Grid\";\nimport Typography from \"@material-ui/core/Typography\";\n\nconst useStyles = makeStyles((theme) => ({\n  container: {\n    paddingTop: theme.spacing(4),\n    paddingBottom: theme.spacing(4),\n  },\n  headingText: {\n    fontWeight: \"bold\",\n  },\n}));\n\nexport default function PageNotFoundView() {\n  const classes = useStyles();\n  return (\n    <Container maxWidth=\"lg\" className={classes.container}>\n      <Grid container spacing={3}>\n        <Grid item xs={12}>\n          <Typography\n            variant=\"h5\"\n            align=\"center\"\n            className={classes.headingText}\n          >\n            Oops!\n          </Typography>\n          <Typography variant=\"subtitle1\" color=\"textSecondary\" align=\"center\">\n            404 - Page Not Found\n          </Typography>\n        </Grid>\n      </Grid>\n    </Container>\n  );\n}\n","import React from \"react\";\nimport { connect, ConnectedProps } from \"react-redux\";\nimport clsx from \"clsx\";\nimport { BrowserRouter as Router, Switch, Route } from \"react-router-dom\";\nimport { makeStyles, Theme, ThemeProvider } from \"@material-ui/core/styles\";\nimport AppBar from \"@material-ui/core/AppBar\";\nimport Drawer from \"@material-ui/core/Drawer\";\nimport Toolbar from \"@material-ui/core/Toolbar\";\nimport List from \"@material-ui/core/List\";\nimport ListItem from \"@material-ui/core/ListItem\";\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\nimport ListItemText from \"@material-ui/core/ListItemText\";\nimport Snackbar from \"@material-ui/core/Snackbar\";\nimport SnackbarContent from \"@material-ui/core/SnackbarContent\";\nimport Typography from \"@material-ui/core/Typography\";\nimport IconButton from \"@material-ui/core/IconButton\";\nimport Slide from \"@material-ui/core/Slide\";\nimport { TransitionProps } from \"@material-ui/core/transitions\";\nimport MenuIcon from \"@material-ui/icons/Menu\";\nimport BarChartIcon from \"@material-ui/icons/BarChart\";\nimport LayersIcon from \"@material-ui/icons/Layers\";\nimport SettingsIcon from \"@material-ui/icons/Settings\";\nimport ScheduleIcon from \"@material-ui/icons/Schedule\";\nimport FeedbackIcon from \"@material-ui/icons/Feedback\";\nimport TimelineIcon from \"@material-ui/icons/Timeline\";\nimport DoubleArrowIcon from \"@material-ui/icons/DoubleArrow\";\nimport CloseIcon from \"@material-ui/icons/Close\";\nimport { AppState } from \"./store\";\nimport { paths } from \"./paths\";\nimport { isDarkTheme, useTheme } from \"./theme\";\nimport { closeSnackbar } from \"./actions/snackbarActions\";\nimport { toggleDrawer } from \"./actions/settingsActions\";\nimport ListItemLink from \"./components/ListItemLink\";\nimport SchedulersView from \"./views/SchedulersView\";\nimport DashboardView from \"./views/DashboardView\";\nimport TasksView from \"./views/TasksView\";\nimport TaskDetailsView from \"./views/TaskDetailsView\";\nimport SettingsView from \"./views/SettingsView\";\nimport ServersView from \"./views/ServersView\";\nimport RedisInfoView from \"./views/RedisInfoView\";\nimport MetricsView from \"./views/MetricsView\";\nimport PageNotFoundView from \"./views/PageNotFoundView\";\n\nconst drawerWidth = 220;\n\n// FIXME: For some reason, the following code does not work:\n//     makeStyles(theme => ({ /* use theme here */}));\n// Using closure to work around this problem.\nconst useStyles = (theme: Theme) =>\n  makeStyles({\n    root: {\n      display: \"flex\",\n    },\n    toolbar: {\n      paddingRight: 24, // keep right padding when drawer closed\n    },\n    toolbarIcon: {\n      display: \"flex\",\n      alignItems: \"center\",\n      justifyContent: \"flex-end\",\n      padding: \"0 8px\",\n      ...theme.mixins.toolbar,\n    },\n    appBar: {\n      backgroundColor: theme.palette.background.paper,\n      zIndex: theme.zIndex.drawer + 1,\n    },\n    menuButton: {\n      marginRight: theme.spacing(1),\n      color: isDarkTheme(theme)\n        ? theme.palette.grey[100]\n        : theme.palette.grey[700],\n    },\n    menuButtonHidden: {\n      display: \"none\",\n    },\n    title: {\n      flexGrow: 1,\n    },\n    drawerPaper: {\n      position: \"relative\",\n      whiteSpace: \"nowrap\",\n      width: drawerWidth,\n      transition: theme.transitions.create(\"width\", {\n        easing: theme.transitions.easing.sharp,\n        duration: theme.transitions.duration.enteringScreen,\n      }),\n      border: \"none\",\n    },\n    drawerPaperClose: {\n      overflowX: \"hidden\",\n      transition: theme.transitions.create(\"width\", {\n        easing: theme.transitions.easing.sharp,\n        duration: theme.transitions.duration.leavingScreen,\n      }),\n      width: theme.spacing(7),\n      [theme.breakpoints.up(\"sm\")]: {\n        width: theme.spacing(9),\n      },\n    },\n    snackbar: {\n      background: theme.palette.grey[\"A400\"],\n      color: \"#ffffff\",\n    },\n    snackbarCloseIcon: {\n      color: theme.palette.grey[400],\n    },\n    appBarSpacer: theme.mixins.toolbar,\n    mainContainer: {\n      display: \"flex\",\n      width: \"100vw\",\n    },\n    content: {\n      flex: 1,\n      height: \"100vh\",\n      overflow: \"hidden\",\n      background: theme.palette.background.paper,\n    },\n    contentWrapper: {\n      height: \"100%\",\n      display: \"flex\",\n      paddingTop: \"64px\", // app-bar height\n      overflow: \"scroll\",\n    },\n    sidebarContainer: {\n      display: \"flex\",\n      justifyContent: \"space-between\",\n      height: \"100%\",\n      flexDirection: \"column\",\n    },\n    listItem: {\n      borderTopRightRadius: \"24px\",\n      borderBottomRightRadius: \"24px\",\n    },\n  });\n\nfunction mapStateToProps(state: AppState) {\n  return {\n    snackbar: state.snackbar,\n    themePreference: state.settings.themePreference,\n    isDrawerOpen: state.settings.isDrawerOpen,\n  };\n}\n\nconst mapDispatchToProps = {\n  closeSnackbar,\n  toggleDrawer,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nfunction SlideUpTransition(props: TransitionProps) {\n  return <Slide {...props} direction=\"up\" />;\n}\n\nfunction App(props: ConnectedProps<typeof connector>) {\n  const theme = useTheme(props.themePreference);\n  const classes = useStyles(theme)();\n  return (\n    <ThemeProvider theme={theme}>\n      <Router>\n        <div className={classes.root}>\n          <AppBar\n            position=\"absolute\"\n            className={classes.appBar}\n            variant=\"outlined\"\n          >\n            <Toolbar className={classes.toolbar}>\n              <IconButton\n                edge=\"start\"\n                color=\"inherit\"\n                aria-label=\"open drawer\"\n                onClick={props.toggleDrawer}\n                className={classes.menuButton}\n              >\n                <MenuIcon />\n              </IconButton>\n              <Typography\n                component=\"h1\"\n                variant=\"h6\"\n                noWrap\n                className={classes.title}\n                color=\"textPrimary\"\n              >\n                Asynq Monitoring\n              </Typography>\n            </Toolbar>\n          </AppBar>\n          <div className={classes.mainContainer}>\n            <Drawer\n              variant=\"permanent\"\n              classes={{\n                paper: clsx(\n                  classes.drawerPaper,\n                  !props.isDrawerOpen && classes.drawerPaperClose\n                ),\n              }}\n              open={props.isDrawerOpen}\n            >\n              <Snackbar\n                anchorOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\n                open={props.snackbar.isOpen}\n                autoHideDuration={6000}\n                onClose={props.closeSnackbar}\n                TransitionComponent={SlideUpTransition}\n              >\n                <SnackbarContent\n                  message={props.snackbar.message}\n                  className={classes.snackbar}\n                  action={\n                    <IconButton\n                      size=\"small\"\n                      aria-label=\"close\"\n                      color=\"inherit\"\n                      onClick={props.closeSnackbar}\n                    >\n                      <CloseIcon\n                        className={classes.snackbarCloseIcon}\n                        fontSize=\"small\"\n                      />\n                    </IconButton>\n                  }\n                />\n              </Snackbar>\n              <div className={classes.appBarSpacer} />\n              <div className={classes.sidebarContainer}>\n                <List>\n                  <div>\n                    <ListItemLink\n                      to={paths.HOME}\n                      primary=\"Queues\"\n                      icon={<BarChartIcon />}\n                    />\n                    <ListItemLink\n                      to={paths.SERVERS}\n                      primary=\"Servers\"\n                      icon={<DoubleArrowIcon />}\n                    />\n                    <ListItemLink\n                      to={paths.SCHEDULERS}\n                      primary=\"Schedulers\"\n                      icon={<ScheduleIcon />}\n                    />\n                    <ListItemLink\n                      to={paths.REDIS}\n                      primary=\"Redis\"\n                      icon={<LayersIcon />}\n                    />\n                    {window.PROMETHEUS_SERVER_ADDRESS && (\n                      <ListItemLink\n                        to={paths.QUEUE_METRICS}\n                        primary=\"Metrics\"\n                        icon={<TimelineIcon />}\n                      />\n                    )}\n                  </div>\n                </List>\n                <List>\n                  <ListItemLink\n                    to={paths.SETTINGS}\n                    primary=\"Settings\"\n                    icon={<SettingsIcon />}\n                  />\n                  <ListItem\n                    button\n                    component=\"a\"\n                    className={classes.listItem}\n                    href=\"https://github.com/hibiken/asynqmon/issues\"\n                    target=\"_blank\"\n                  >\n                    <ListItemIcon>\n                      <FeedbackIcon />\n                    </ListItemIcon>\n                    <ListItemText primary=\"Send Feedback\" />\n                  </ListItem>\n                </List>\n              </div>\n            </Drawer>\n            <main className={classes.content}>\n              <div className={classes.contentWrapper}>\n                <Switch>\n                  <Route exact path={paths.TASK_DETAILS}>\n                    <TaskDetailsView />\n                  </Route>\n                  <Route exact path={paths.QUEUE_DETAILS}>\n                    <TasksView />\n                  </Route>\n                  <Route exact path={paths.SCHEDULERS}>\n                    <SchedulersView />\n                  </Route>\n                  <Route exact path={paths.SERVERS}>\n                    <ServersView />\n                  </Route>\n                  <Route exact path={paths.REDIS}>\n                    <RedisInfoView />\n                  </Route>\n                  <Route exact path={paths.SETTINGS}>\n                    <SettingsView />\n                  </Route>\n                  <Route exact path={paths.HOME}>\n                    <DashboardView />\n                  </Route>\n                  <Route exact path={paths.QUEUE_METRICS}>\n                    <MetricsView />\n                  </Route>\n                  <Route path=\"*\">\n                    <PageNotFoundView />\n                  </Route>\n                </Switch>\n              </div>\n            </main>\n          </div>\n        </div>\n      </Router>\n    </ThemeProvider>\n  );\n}\n\nexport default connector(App);\n","import {\n  LIST_QUEUES_SUCCESS,\n  LIST_QUEUES_BEGIN,\n  QueuesActionTypes,\n  PAUSE_QUEUE_BEGIN,\n  PAUSE_QUEUE_SUCCESS,\n  PAUSE_QUEUE_ERROR,\n  RESUME_QUEUE_BEGIN,\n  RESUME_QUEUE_ERROR,\n  RESUME_QUEUE_SUCCESS,\n  DELETE_QUEUE_BEGIN,\n  DELETE_QUEUE_ERROR,\n  DELETE_QUEUE_SUCCESS,\n  LIST_QUEUES_ERROR,\n} from \"../actions/queuesActions\";\nimport {\n  BATCH_DELETE_ARCHIVED_TASKS_SUCCESS,\n  BATCH_DELETE_RETRY_TASKS_SUCCESS,\n  BATCH_DELETE_SCHEDULED_TASKS_SUCCESS,\n  BATCH_ARCHIVE_RETRY_TASKS_SUCCESS,\n  BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS,\n  BATCH_RUN_ARCHIVED_TASKS_SUCCESS,\n  BATCH_RUN_RETRY_TASKS_SUCCESS,\n  BATCH_RUN_SCHEDULED_TASKS_SUCCESS,\n  DELETE_ALL_ARCHIVED_TASKS_SUCCESS,\n  DELETE_ALL_RETRY_TASKS_SUCCESS,\n  DELETE_ALL_SCHEDULED_TASKS_SUCCESS,\n  DELETE_ARCHIVED_TASK_SUCCESS,\n  DELETE_RETRY_TASK_SUCCESS,\n  DELETE_SCHEDULED_TASK_SUCCESS,\n  ARCHIVE_ALL_RETRY_TASKS_SUCCESS,\n  ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS,\n  ARCHIVE_RETRY_TASK_SUCCESS,\n  ARCHIVE_SCHEDULED_TASK_SUCCESS,\n  LIST_ACTIVE_TASKS_SUCCESS,\n  LIST_ARCHIVED_TASKS_SUCCESS,\n  LIST_PENDING_TASKS_SUCCESS,\n  LIST_RETRY_TASKS_SUCCESS,\n  LIST_SCHEDULED_TASKS_SUCCESS,\n  RUN_ALL_ARCHIVED_TASKS_SUCCESS,\n  RUN_ALL_RETRY_TASKS_SUCCESS,\n  RUN_ALL_SCHEDULED_TASKS_SUCCESS,\n  RUN_ARCHIVED_TASK_SUCCESS,\n  RUN_RETRY_TASK_SUCCESS,\n  RUN_SCHEDULED_TASK_SUCCESS,\n  TasksActionTypes,\n  ARCHIVE_PENDING_TASK_SUCCESS,\n  DELETE_PENDING_TASK_SUCCESS,\n  BATCH_ARCHIVE_PENDING_TASKS_SUCCESS,\n  BATCH_DELETE_PENDING_TASKS_SUCCESS,\n  ARCHIVE_ALL_PENDING_TASKS_SUCCESS,\n  DELETE_ALL_PENDING_TASKS_SUCCESS,\n  DELETE_COMPLETED_TASK_SUCCESS,\n  DELETE_ALL_COMPLETED_TASKS_SUCCESS,\n  BATCH_DELETE_COMPLETED_TASKS_SUCCESS,\n} from \"../actions/tasksActions\";\nimport { Queue } from \"../api\";\n\ninterface QueuesState {\n  loading: boolean;\n  data: QueueInfo[];\n  error: string;\n}\n\nexport interface QueueInfo {\n  name: string; // name of the queue.\n  currentStats: Queue;\n  requestPending: boolean; // indicates pause/resume/delete action is pending on this queue\n}\n\nconst initialState: QueuesState = { data: [], loading: false, error: \"\" };\n\nfunction queuesReducer(\n  state = initialState,\n  action: QueuesActionTypes | TasksActionTypes\n): QueuesState {\n  switch (action.type) {\n    case LIST_QUEUES_BEGIN:\n      return { ...state, loading: true };\n\n    case LIST_QUEUES_SUCCESS:\n      const { queues } = action.payload;\n      return {\n        ...state,\n        loading: false,\n        error: \"\",\n        data: queues.map((q: Queue) => ({\n          name: q.queue,\n          currentStats: q,\n          requestPending: false,\n        })),\n      };\n\n    case LIST_QUEUES_ERROR:\n      return {\n        ...state,\n        loading: false,\n        error: action.error,\n      };\n\n    case DELETE_QUEUE_BEGIN:\n    case PAUSE_QUEUE_BEGIN:\n    case RESUME_QUEUE_BEGIN: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return { ...queueInfo, requestPending: true };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_QUEUE_SUCCESS: {\n      const newData = state.data.filter(\n        (queueInfo) => queueInfo.name !== action.queue\n      );\n      return { ...state, data: newData };\n    }\n\n    case PAUSE_QUEUE_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          requestPending: false,\n          currentStats: { ...queueInfo.currentStats, paused: true },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RESUME_QUEUE_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          requestPending: false,\n          currentStats: { ...queueInfo.currentStats, paused: false },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_QUEUE_ERROR:\n    case PAUSE_QUEUE_ERROR:\n    case RESUME_QUEUE_ERROR: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          requestPending: false,\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case LIST_ACTIVE_TASKS_SUCCESS:\n    case LIST_PENDING_TASKS_SUCCESS:\n    case LIST_SCHEDULED_TASKS_SUCCESS:\n    case LIST_RETRY_TASKS_SUCCESS:\n    case LIST_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.data\n        .filter((queueInfo) => queueInfo.name !== action.queue)\n        .concat({\n          name: action.queue,\n          currentStats: action.payload.stats,\n          requestPending: false,\n        });\n      return { ...state, data: newData };\n    }\n\n    case RUN_SCHEDULED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending: queueInfo.currentStats.pending + 1,\n            scheduled: queueInfo.currentStats.scheduled - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RUN_RETRY_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending: queueInfo.currentStats.pending + 1,\n            retry: queueInfo.currentStats.retry - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RUN_ARCHIVED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending: queueInfo.currentStats.pending + 1,\n            archived: queueInfo.currentStats.archived - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_PENDING_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived: queueInfo.currentStats.archived + 1,\n            pending: queueInfo.currentStats.pending - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_SCHEDULED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived: queueInfo.currentStats.archived + 1,\n            scheduled: queueInfo.currentStats.scheduled - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_RETRY_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived: queueInfo.currentStats.archived + 1,\n            retry: queueInfo.currentStats.retry - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_PENDING_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - 1,\n            pending: queueInfo.currentStats.pending - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_SCHEDULED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - 1,\n            scheduled: queueInfo.currentStats.scheduled - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_ARCHIVE_PENDING_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.archived +\n              action.payload.archived_ids.length,\n            pending:\n              queueInfo.currentStats.pending -\n              action.payload.archived_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_DELETE_PENDING_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size:\n              queueInfo.currentStats.size - action.payload.deleted_ids.length,\n            pending:\n              queueInfo.currentStats.pending -\n              action.payload.deleted_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_ALL_PENDING_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.archived + queueInfo.currentStats.pending,\n            pending: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ALL_PENDING_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - action.deleted,\n            pending: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_RUN_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending +\n              action.payload.pending_ids.length,\n            scheduled:\n              queueInfo.currentStats.scheduled -\n              action.payload.pending_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.archived +\n              action.payload.archived_ids.length,\n            scheduled:\n              queueInfo.currentStats.scheduled -\n              action.payload.archived_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_DELETE_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size:\n              queueInfo.currentStats.size - action.payload.deleted_ids.length,\n            scheduled:\n              queueInfo.currentStats.scheduled -\n              action.payload.deleted_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RUN_ALL_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending + queueInfo.currentStats.scheduled,\n            scheduled: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.archived +\n              queueInfo.currentStats.scheduled,\n            scheduled: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ALL_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - action.deleted,\n            scheduled: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_RETRY_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - 1,\n            retry: queueInfo.currentStats.retry - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_RUN_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending +\n              action.payload.pending_ids.length,\n            retry:\n              queueInfo.currentStats.retry - action.payload.pending_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_ARCHIVE_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.pending +\n              action.payload.archived_ids.length,\n            retry:\n              queueInfo.currentStats.retry - action.payload.archived_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_DELETE_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size:\n              queueInfo.currentStats.size - action.payload.deleted_ids.length,\n            retry:\n              queueInfo.currentStats.retry - action.payload.deleted_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RUN_ALL_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending + queueInfo.currentStats.retry,\n            retry: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case ARCHIVE_ALL_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            archived:\n              queueInfo.currentStats.archived + queueInfo.currentStats.retry,\n            retry: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ALL_RETRY_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - action.deleted,\n            retry: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ARCHIVED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - 1,\n            archived: queueInfo.currentStats.archived - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_COMPLETED_TASK_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - 1,\n            completed: queueInfo.currentStats.completed - 1,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_RUN_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending +\n              action.payload.pending_ids.length,\n            archived:\n              queueInfo.currentStats.archived -\n              action.payload.pending_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_DELETE_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size:\n              queueInfo.currentStats.size - action.payload.deleted_ids.length,\n            archived:\n              queueInfo.currentStats.archived -\n              action.payload.deleted_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case BATCH_DELETE_COMPLETED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size:\n              queueInfo.currentStats.size - action.payload.deleted_ids.length,\n            completed:\n              queueInfo.currentStats.completed -\n              action.payload.deleted_ids.length,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case RUN_ALL_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            pending:\n              queueInfo.currentStats.pending + queueInfo.currentStats.archived,\n            archived: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ALL_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - action.deleted,\n            archived: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    case DELETE_ALL_COMPLETED_TASKS_SUCCESS: {\n      const newData = state.data.map((queueInfo) => {\n        if (queueInfo.name !== action.queue) {\n          return queueInfo;\n        }\n        return {\n          ...queueInfo,\n          currentStats: {\n            ...queueInfo.currentStats,\n            size: queueInfo.currentStats.size - action.deleted,\n            completed: 0,\n          },\n        };\n      });\n      return { ...state, data: newData };\n    }\n\n    default:\n      return state;\n  }\n}\n\nexport default queuesReducer;\n","import {\n  LIST_ACTIVE_TASKS_BEGIN,\n  LIST_ACTIVE_TASKS_SUCCESS,\n  LIST_ACTIVE_TASKS_ERROR,\n  TasksActionTypes,\n  LIST_PENDING_TASKS_BEGIN,\n  LIST_PENDING_TASKS_SUCCESS,\n  LIST_PENDING_TASKS_ERROR,\n  LIST_SCHEDULED_TASKS_BEGIN,\n  LIST_SCHEDULED_TASKS_SUCCESS,\n  LIST_SCHEDULED_TASKS_ERROR,\n  LIST_RETRY_TASKS_BEGIN,\n  LIST_RETRY_TASKS_SUCCESS,\n  LIST_RETRY_TASKS_ERROR,\n  LIST_ARCHIVED_TASKS_BEGIN,\n  LIST_ARCHIVED_TASKS_SUCCESS,\n  LIST_ARCHIVED_TASKS_ERROR,\n  LIST_COMPLETED_TASKS_BEGIN,\n  LIST_COMPLETED_TASKS_SUCCESS,\n  LIST_COMPLETED_TASKS_ERROR,\n  CANCEL_ACTIVE_TASK_BEGIN,\n  CANCEL_ACTIVE_TASK_SUCCESS,\n  CANCEL_ACTIVE_TASK_ERROR,\n  DELETE_RETRY_TASK_BEGIN,\n  DELETE_RETRY_TASK_SUCCESS,\n  DELETE_RETRY_TASK_ERROR,\n  DELETE_SCHEDULED_TASK_BEGIN,\n  DELETE_SCHEDULED_TASK_SUCCESS,\n  DELETE_SCHEDULED_TASK_ERROR,\n  DELETE_ARCHIVED_TASK_BEGIN,\n  DELETE_ARCHIVED_TASK_SUCCESS,\n  DELETE_ARCHIVED_TASK_ERROR,\n  BATCH_DELETE_ARCHIVED_TASKS_BEGIN,\n  BATCH_DELETE_ARCHIVED_TASKS_SUCCESS,\n  BATCH_DELETE_ARCHIVED_TASKS_ERROR,\n  RUN_ARCHIVED_TASK_BEGIN,\n  RUN_ARCHIVED_TASK_SUCCESS,\n  RUN_ARCHIVED_TASK_ERROR,\n  BATCH_RUN_ARCHIVED_TASKS_BEGIN,\n  BATCH_RUN_ARCHIVED_TASKS_ERROR,\n  BATCH_RUN_ARCHIVED_TASKS_SUCCESS,\n  DELETE_ALL_ARCHIVED_TASKS_BEGIN,\n  DELETE_ALL_ARCHIVED_TASKS_SUCCESS,\n  DELETE_ALL_ARCHIVED_TASKS_ERROR,\n  RUN_ALL_ARCHIVED_TASKS_BEGIN,\n  RUN_ALL_ARCHIVED_TASKS_ERROR,\n  RUN_ALL_ARCHIVED_TASKS_SUCCESS,\n  BATCH_DELETE_RETRY_TASKS_ERROR,\n  BATCH_RUN_RETRY_TASKS_ERROR,\n  BATCH_DELETE_RETRY_TASKS_SUCCESS,\n  BATCH_RUN_RETRY_TASKS_SUCCESS,\n  BATCH_DELETE_RETRY_TASKS_BEGIN,\n  BATCH_RUN_RETRY_TASKS_BEGIN,\n  DELETE_ALL_RETRY_TASKS_ERROR,\n  RUN_ALL_RETRY_TASKS_ERROR,\n  DELETE_ALL_RETRY_TASKS_SUCCESS,\n  RUN_ALL_RETRY_TASKS_SUCCESS,\n  DELETE_ALL_RETRY_TASKS_BEGIN,\n  RUN_ALL_RETRY_TASKS_BEGIN,\n  BATCH_DELETE_SCHEDULED_TASKS_ERROR,\n  BATCH_RUN_SCHEDULED_TASKS_ERROR,\n  BATCH_DELETE_SCHEDULED_TASKS_SUCCESS,\n  BATCH_RUN_SCHEDULED_TASKS_SUCCESS,\n  BATCH_DELETE_SCHEDULED_TASKS_BEGIN,\n  BATCH_RUN_SCHEDULED_TASKS_BEGIN,\n  DELETE_ALL_SCHEDULED_TASKS_ERROR,\n  RUN_ALL_SCHEDULED_TASKS_ERROR,\n  DELETE_ALL_SCHEDULED_TASKS_SUCCESS,\n  RUN_ALL_SCHEDULED_TASKS_SUCCESS,\n  DELETE_ALL_SCHEDULED_TASKS_BEGIN,\n  RUN_ALL_SCHEDULED_TASKS_BEGIN,\n  RUN_RETRY_TASK_BEGIN,\n  RUN_RETRY_TASK_SUCCESS,\n  RUN_RETRY_TASK_ERROR,\n  RUN_SCHEDULED_TASK_BEGIN,\n  RUN_SCHEDULED_TASK_SUCCESS,\n  RUN_SCHEDULED_TASK_ERROR,\n  ARCHIVE_SCHEDULED_TASK_BEGIN,\n  ARCHIVE_SCHEDULED_TASK_SUCCESS,\n  ARCHIVE_SCHEDULED_TASK_ERROR,\n  ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN,\n  ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS,\n  ARCHIVE_ALL_SCHEDULED_TASKS_ERROR,\n  BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN,\n  BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR,\n  BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS,\n  ARCHIVE_RETRY_TASK_BEGIN,\n  ARCHIVE_RETRY_TASK_SUCCESS,\n  ARCHIVE_RETRY_TASK_ERROR,\n  ARCHIVE_ALL_RETRY_TASKS_BEGIN,\n  ARCHIVE_ALL_RETRY_TASKS_SUCCESS,\n  ARCHIVE_ALL_RETRY_TASKS_ERROR,\n  BATCH_ARCHIVE_RETRY_TASKS_SUCCESS,\n  BATCH_ARCHIVE_RETRY_TASKS_BEGIN,\n  BATCH_ARCHIVE_RETRY_TASKS_ERROR,\n  BATCH_CANCEL_ACTIVE_TASKS_BEGIN,\n  BATCH_CANCEL_ACTIVE_TASKS_SUCCESS,\n  BATCH_CANCEL_ACTIVE_TASKS_ERROR,\n  CANCEL_ALL_ACTIVE_TASKS_BEGIN,\n  CANCEL_ALL_ACTIVE_TASKS_SUCCESS,\n  CANCEL_ALL_ACTIVE_TASKS_ERROR,\n  ARCHIVE_PENDING_TASK_BEGIN,\n  DELETE_PENDING_TASK_BEGIN,\n  ARCHIVE_PENDING_TASK_SUCCESS,\n  DELETE_PENDING_TASK_SUCCESS,\n  ARCHIVE_PENDING_TASK_ERROR,\n  DELETE_PENDING_TASK_ERROR,\n  ARCHIVE_ALL_PENDING_TASKS_BEGIN,\n  DELETE_ALL_PENDING_TASKS_BEGIN,\n  ARCHIVE_ALL_PENDING_TASKS_SUCCESS,\n  DELETE_ALL_PENDING_TASKS_SUCCESS,\n  ARCHIVE_ALL_PENDING_TASKS_ERROR,\n  DELETE_ALL_PENDING_TASKS_ERROR,\n  BATCH_ARCHIVE_PENDING_TASKS_BEGIN,\n  BATCH_DELETE_PENDING_TASKS_BEGIN,\n  BATCH_ARCHIVE_PENDING_TASKS_SUCCESS,\n  BATCH_DELETE_PENDING_TASKS_SUCCESS,\n  BATCH_ARCHIVE_PENDING_TASKS_ERROR,\n  BATCH_DELETE_PENDING_TASKS_ERROR,\n  GET_TASK_INFO_BEGIN,\n  GET_TASK_INFO_ERROR,\n  GET_TASK_INFO_SUCCESS,\n  DELETE_COMPLETED_TASK_BEGIN,\n  DELETE_COMPLETED_TASK_ERROR,\n  DELETE_COMPLETED_TASK_SUCCESS,\n  DELETE_ALL_COMPLETED_TASKS_BEGIN,\n  DELETE_ALL_COMPLETED_TASKS_ERROR,\n  DELETE_ALL_COMPLETED_TASKS_SUCCESS,\n  BATCH_DELETE_COMPLETED_TASKS_BEGIN,\n  BATCH_DELETE_COMPLETED_TASKS_ERROR,\n  BATCH_DELETE_COMPLETED_TASKS_SUCCESS,\n} from \"../actions/tasksActions\";\nimport { TaskInfo } from \"../api\";\n\nexport interface ActiveTaskExtended extends TaskInfo {\n  // Indicates that a request has been sent for this\n  // task and awaiting for a response.\n  requestPending: boolean;\n\n  // Incidates that a cancelation signal has been\n  // published for this task.\n  canceling: boolean;\n}\n\nexport interface TaskInfoExtended extends TaskInfo {\n  // Indicates that a request has been sent for this\n  // task and awaiting for a response.\n  requestPending: boolean;\n}\n\ninterface TasksState {\n  activeTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: ActiveTaskExtended[];\n  };\n  pendingTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: TaskInfoExtended[];\n  };\n  scheduledTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: TaskInfoExtended[];\n  };\n  retryTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: TaskInfoExtended[];\n  };\n  archivedTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: TaskInfoExtended[];\n  };\n  completedTasks: {\n    loading: boolean;\n    batchActionPending: boolean;\n    allActionPending: boolean;\n    error: string;\n    data: TaskInfoExtended[];\n  };\n  taskInfo: {\n    loading: boolean;\n    error: string;\n    data?: TaskInfo;\n  };\n}\n\nconst initialState: TasksState = {\n  activeTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  pendingTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  scheduledTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  retryTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  archivedTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  completedTasks: {\n    loading: false,\n    batchActionPending: false,\n    allActionPending: false,\n    error: \"\",\n    data: [],\n  },\n  taskInfo: {\n    loading: false,\n    error: \"\",\n  },\n};\n\nfunction tasksReducer(\n  state = initialState,\n  action: TasksActionTypes\n): TasksState {\n  switch (action.type) {\n    case GET_TASK_INFO_BEGIN:\n      return {\n        ...state,\n        taskInfo: {\n          ...state.taskInfo,\n          loading: true,\n        },\n      };\n\n    case GET_TASK_INFO_ERROR:\n      return {\n        ...state,\n        taskInfo: {\n          loading: false,\n          error: action.error,\n        },\n      };\n\n    case GET_TASK_INFO_SUCCESS:\n      return {\n        ...state,\n        taskInfo: {\n          loading: false,\n          error: \"\",\n          data: action.payload,\n        },\n      };\n\n    case LIST_ACTIVE_TASKS_BEGIN:\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_ACTIVE_TASKS_SUCCESS:\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            canceling: false,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_ACTIVE_TASKS_ERROR:\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case LIST_PENDING_TASKS_BEGIN:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_PENDING_TASKS_SUCCESS:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_PENDING_TASKS_ERROR:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case LIST_SCHEDULED_TASKS_BEGIN:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_SCHEDULED_TASKS_SUCCESS:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_SCHEDULED_TASKS_ERROR:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case LIST_RETRY_TASKS_BEGIN:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_RETRY_TASKS_SUCCESS:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_RETRY_TASKS_ERROR:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case LIST_ARCHIVED_TASKS_BEGIN:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_ARCHIVED_TASKS_SUCCESS:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_ARCHIVED_TASKS_ERROR:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case LIST_COMPLETED_TASKS_BEGIN:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          loading: true,\n        },\n      };\n\n    case LIST_COMPLETED_TASKS_SUCCESS:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          loading: false,\n          error: \"\",\n          data: action.payload.tasks.map((task) => ({\n            ...task,\n            requestPending: false,\n          })),\n        },\n      };\n\n    case LIST_COMPLETED_TASKS_ERROR:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          loading: false,\n          error: action.error,\n          data: [],\n        },\n      };\n\n    case DELETE_COMPLETED_TASK_BEGIN:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          data: state.completedTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: true };\n          }),\n        },\n      };\n\n    case DELETE_COMPLETED_TASK_SUCCESS:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          data: state.completedTasks.data.filter(\n            (task) => task.id !== action.taskId\n          ),\n        },\n      };\n\n    case DELETE_COMPLETED_TASK_ERROR:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          data: state.completedTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: false };\n          }),\n        },\n      };\n\n    case DELETE_ALL_COMPLETED_TASKS_BEGIN:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          allActionPending: true,\n        },\n      };\n\n    case DELETE_ALL_COMPLETED_TASKS_SUCCESS:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          allActionPending: false,\n          data: [],\n        },\n      };\n\n    case DELETE_ALL_COMPLETED_TASKS_ERROR:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          allActionPending: false,\n        },\n      };\n\n    case BATCH_DELETE_COMPLETED_TASKS_BEGIN:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          batchActionPending: true,\n          data: state.completedTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: true,\n            };\n          }),\n        },\n      };\n\n    case BATCH_DELETE_COMPLETED_TASKS_SUCCESS: {\n      const newData = state.completedTasks.data.filter(\n        (task) => !action.payload.deleted_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_DELETE_COMPLETED_TASKS_ERROR:\n      return {\n        ...state,\n        completedTasks: {\n          ...state.completedTasks,\n          batchActionPending: false,\n          data: state.completedTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: false,\n            };\n          }),\n        },\n      };\n\n    case CANCEL_ACTIVE_TASK_BEGIN: {\n      const newData = state.activeTasks.data.map((task) => {\n        if (task.id !== action.taskId) {\n          return task;\n        }\n        return { ...task, requestPending: true };\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          data: newData,\n        },\n      };\n    }\n\n    case CANCEL_ACTIVE_TASK_SUCCESS: {\n      const newData = state.activeTasks.data.map((task) => {\n        if (task.id !== action.taskId) {\n          return task;\n        }\n        return { ...task, requestPending: false, canceling: true };\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          data: newData,\n        },\n      };\n    }\n\n    case CANCEL_ACTIVE_TASK_ERROR:\n      const newData = state.activeTasks.data.map((task) => {\n        if (task.id !== action.taskId) {\n          return task;\n        }\n        return { ...task, requestPending: false };\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          data: newData,\n        },\n      };\n\n    case BATCH_CANCEL_ACTIVE_TASKS_BEGIN: {\n      const newData = state.activeTasks.data.map((task) => {\n        if (!action.taskIds.includes(task.id)) {\n          return task;\n        }\n        return { ...task, requestPending: true };\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          batchActionPending: true,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_CANCEL_ACTIVE_TASKS_SUCCESS: {\n      const newData = state.activeTasks.data.map((task) => {\n        if (action.payload.canceled_ids.includes(task.id)) {\n          return { ...task, canceling: true, requestPending: false };\n        }\n        if (action.payload.error_ids.includes(task.id)) {\n          return { ...task, requestPending: false };\n        }\n        return task;\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_CANCEL_ACTIVE_TASKS_ERROR: {\n      const newData = state.activeTasks.data.map((task) => {\n        return { ...task, requestPending: false };\n      });\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case CANCEL_ALL_ACTIVE_TASKS_BEGIN: {\n      const newData = state.activeTasks.data.map((task) => ({\n        ...task,\n        requestPending: true,\n      }));\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          allActionPending: true,\n          data: newData,\n        },\n      };\n    }\n\n    case CANCEL_ALL_ACTIVE_TASKS_SUCCESS: {\n      const newData = state.activeTasks.data.map((task) => ({\n        ...task,\n        requestPending: false,\n        canceling: true,\n      }));\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          allActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case CANCEL_ALL_ACTIVE_TASKS_ERROR: {\n      const newData = state.activeTasks.data.map((task) => ({\n        ...task,\n        requestPending: false,\n      }));\n      return {\n        ...state,\n        activeTasks: {\n          ...state.activeTasks,\n          allActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case ARCHIVE_PENDING_TASK_BEGIN:\n    case DELETE_PENDING_TASK_BEGIN:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          data: state.pendingTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: true };\n          }),\n        },\n      };\n\n    case ARCHIVE_PENDING_TASK_SUCCESS:\n    case DELETE_PENDING_TASK_SUCCESS:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          data: state.pendingTasks.data.filter(\n            (task) => task.id !== action.taskId\n          ),\n        },\n      };\n\n    case ARCHIVE_PENDING_TASK_ERROR:\n    case DELETE_PENDING_TASK_ERROR:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          data: state.pendingTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: false };\n          }),\n        },\n      };\n\n    case ARCHIVE_ALL_PENDING_TASKS_BEGIN:\n    case DELETE_ALL_PENDING_TASKS_BEGIN:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          allActionPending: true,\n        },\n      };\n\n    case ARCHIVE_ALL_PENDING_TASKS_SUCCESS:\n    case DELETE_ALL_PENDING_TASKS_SUCCESS:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          allActionPending: false,\n          data: [],\n        },\n      };\n\n    case ARCHIVE_ALL_PENDING_TASKS_ERROR:\n    case DELETE_ALL_PENDING_TASKS_ERROR:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          allActionPending: false,\n        },\n      };\n\n    case BATCH_ARCHIVE_PENDING_TASKS_BEGIN:\n    case BATCH_DELETE_PENDING_TASKS_BEGIN:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          batchActionPending: true,\n          data: state.pendingTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: true,\n            };\n          }),\n        },\n      };\n\n    case BATCH_ARCHIVE_PENDING_TASKS_SUCCESS: {\n      const newData = state.pendingTasks.data.filter(\n        (task) => !action.payload.archived_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_DELETE_PENDING_TASKS_SUCCESS: {\n      const newData = state.pendingTasks.data.filter(\n        (task) => !action.payload.deleted_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_ARCHIVE_PENDING_TASKS_ERROR:\n    case BATCH_DELETE_PENDING_TASKS_ERROR:\n      return {\n        ...state,\n        pendingTasks: {\n          ...state.pendingTasks,\n          batchActionPending: false,\n          data: state.pendingTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: false,\n            };\n          }),\n        },\n      };\n\n    case RUN_SCHEDULED_TASK_BEGIN:\n    case ARCHIVE_SCHEDULED_TASK_BEGIN:\n    case DELETE_SCHEDULED_TASK_BEGIN:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          data: state.scheduledTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: true };\n          }),\n        },\n      };\n\n    case RUN_SCHEDULED_TASK_SUCCESS:\n    case ARCHIVE_SCHEDULED_TASK_SUCCESS:\n    case DELETE_SCHEDULED_TASK_SUCCESS:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          data: state.scheduledTasks.data.filter(\n            (task) => task.id !== action.taskId\n          ),\n        },\n      };\n\n    case RUN_SCHEDULED_TASK_ERROR:\n    case ARCHIVE_SCHEDULED_TASK_ERROR:\n    case DELETE_SCHEDULED_TASK_ERROR:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          data: state.scheduledTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: false };\n          }),\n        },\n      };\n\n    case RUN_ALL_SCHEDULED_TASKS_BEGIN:\n    case ARCHIVE_ALL_SCHEDULED_TASKS_BEGIN:\n    case DELETE_ALL_SCHEDULED_TASKS_BEGIN:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          allActionPending: true,\n        },\n      };\n\n    case RUN_ALL_SCHEDULED_TASKS_SUCCESS:\n    case ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS:\n    case DELETE_ALL_SCHEDULED_TASKS_SUCCESS:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          allActionPending: false,\n          data: [],\n        },\n      };\n\n    case RUN_ALL_SCHEDULED_TASKS_ERROR:\n    case ARCHIVE_ALL_SCHEDULED_TASKS_ERROR:\n    case DELETE_ALL_SCHEDULED_TASKS_ERROR:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          allActionPending: false,\n        },\n      };\n\n    case BATCH_RUN_SCHEDULED_TASKS_BEGIN:\n    case BATCH_ARCHIVE_SCHEDULED_TASKS_BEGIN:\n    case BATCH_DELETE_SCHEDULED_TASKS_BEGIN:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          batchActionPending: true,\n          data: state.scheduledTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: true,\n            };\n          }),\n        },\n      };\n\n    case BATCH_RUN_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.scheduledTasks.data.filter(\n        (task) => !action.payload.pending_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.scheduledTasks.data.filter(\n        (task) => !action.payload.archived_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_DELETE_SCHEDULED_TASKS_SUCCESS: {\n      const newData = state.scheduledTasks.data.filter(\n        (task) => !action.payload.deleted_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_RUN_SCHEDULED_TASKS_ERROR:\n    case BATCH_ARCHIVE_SCHEDULED_TASKS_ERROR:\n    case BATCH_DELETE_SCHEDULED_TASKS_ERROR:\n      return {\n        ...state,\n        scheduledTasks: {\n          ...state.scheduledTasks,\n          batchActionPending: false,\n          data: state.scheduledTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: false,\n            };\n          }),\n        },\n      };\n\n    case RUN_RETRY_TASK_BEGIN:\n    case ARCHIVE_RETRY_TASK_BEGIN:\n    case DELETE_RETRY_TASK_BEGIN:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          data: state.retryTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: true };\n          }),\n        },\n      };\n\n    case RUN_RETRY_TASK_SUCCESS:\n    case ARCHIVE_RETRY_TASK_SUCCESS:\n    case DELETE_RETRY_TASK_SUCCESS:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          data: state.retryTasks.data.filter(\n            (task) => task.id !== action.taskId\n          ),\n        },\n      };\n\n    case RUN_RETRY_TASK_ERROR:\n    case ARCHIVE_RETRY_TASK_ERROR:\n    case DELETE_RETRY_TASK_ERROR:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          data: state.retryTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: false };\n          }),\n        },\n      };\n\n    case RUN_ALL_RETRY_TASKS_BEGIN:\n    case ARCHIVE_ALL_RETRY_TASKS_BEGIN:\n    case DELETE_ALL_RETRY_TASKS_BEGIN:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          allActionPending: true,\n        },\n      };\n\n    case RUN_ALL_RETRY_TASKS_SUCCESS:\n    case ARCHIVE_ALL_RETRY_TASKS_SUCCESS:\n    case DELETE_ALL_RETRY_TASKS_SUCCESS:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          allActionPending: false,\n          data: [],\n        },\n      };\n\n    case RUN_ALL_RETRY_TASKS_ERROR:\n    case ARCHIVE_ALL_RETRY_TASKS_ERROR:\n    case DELETE_ALL_RETRY_TASKS_ERROR:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          allActionPending: false,\n        },\n      };\n\n    case BATCH_RUN_RETRY_TASKS_BEGIN:\n    case BATCH_ARCHIVE_RETRY_TASKS_BEGIN:\n    case BATCH_DELETE_RETRY_TASKS_BEGIN:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          batchActionPending: true,\n          data: state.retryTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: true,\n            };\n          }),\n        },\n      };\n\n    case BATCH_RUN_RETRY_TASKS_SUCCESS: {\n      const newData = state.retryTasks.data.filter(\n        (task) => !action.payload.pending_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_ARCHIVE_RETRY_TASKS_SUCCESS: {\n      const newData = state.retryTasks.data.filter(\n        (task) => !action.payload.archived_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_DELETE_RETRY_TASKS_SUCCESS: {\n      const newData = state.retryTasks.data.filter(\n        (task) => !action.payload.deleted_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_RUN_RETRY_TASKS_ERROR:\n    case BATCH_ARCHIVE_RETRY_TASKS_ERROR:\n    case BATCH_DELETE_RETRY_TASKS_ERROR:\n      return {\n        ...state,\n        retryTasks: {\n          ...state.retryTasks,\n          batchActionPending: false,\n          data: state.retryTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: false,\n            };\n          }),\n        },\n      };\n\n    case RUN_ARCHIVED_TASK_BEGIN:\n    case DELETE_ARCHIVED_TASK_BEGIN:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          data: state.archivedTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: true };\n          }),\n        },\n      };\n\n    case RUN_ARCHIVED_TASK_SUCCESS:\n    case DELETE_ARCHIVED_TASK_SUCCESS:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          data: state.archivedTasks.data.filter(\n            (task) => task.id !== action.taskId\n          ),\n        },\n      };\n\n    case RUN_ARCHIVED_TASK_ERROR:\n    case DELETE_ARCHIVED_TASK_ERROR:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          data: state.archivedTasks.data.map((task) => {\n            if (task.id !== action.taskId) {\n              return task;\n            }\n            return { ...task, requestPending: false };\n          }),\n        },\n      };\n\n    case RUN_ALL_ARCHIVED_TASKS_BEGIN:\n    case DELETE_ALL_ARCHIVED_TASKS_BEGIN:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          allActionPending: true,\n        },\n      };\n\n    case RUN_ALL_ARCHIVED_TASKS_SUCCESS:\n    case DELETE_ALL_ARCHIVED_TASKS_SUCCESS:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          allActionPending: false,\n          data: [],\n        },\n      };\n\n    case RUN_ALL_ARCHIVED_TASKS_ERROR:\n    case DELETE_ALL_ARCHIVED_TASKS_ERROR:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          allActionPending: false,\n        },\n      };\n\n    case BATCH_RUN_ARCHIVED_TASKS_BEGIN:\n    case BATCH_DELETE_ARCHIVED_TASKS_BEGIN:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          batchActionPending: true,\n          data: state.archivedTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: true,\n            };\n          }),\n        },\n      };\n\n    case BATCH_RUN_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.archivedTasks.data.filter(\n        (task) => !action.payload.pending_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_DELETE_ARCHIVED_TASKS_SUCCESS: {\n      const newData = state.archivedTasks.data.filter(\n        (task) => !action.payload.deleted_ids.includes(task.id)\n      );\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          batchActionPending: false,\n          data: newData,\n        },\n      };\n    }\n\n    case BATCH_RUN_ARCHIVED_TASKS_ERROR:\n    case BATCH_DELETE_ARCHIVED_TASKS_ERROR:\n      return {\n        ...state,\n        archivedTasks: {\n          ...state.archivedTasks,\n          batchActionPending: false,\n          data: state.archivedTasks.data.map((task) => {\n            if (!action.taskIds.includes(task.id)) {\n              return task;\n            }\n            return {\n              ...task,\n              requestPending: false,\n            };\n          }),\n        },\n      };\n\n    default:\n      return state;\n  }\n}\n\nexport default tasksReducer;\n","import {\n  LIST_SERVERS_BEGIN,\n  LIST_SERVERS_ERROR,\n  LIST_SERVERS_SUCCESS,\n  ServersActionTypes,\n} from \"../actions/serversActions\";\nimport { ServerInfo } from \"../api\";\n\ninterface ServersState {\n  loading: boolean;\n  error: string;\n  data: ServerInfo[];\n}\n\nconst initialState: ServersState = {\n  loading: false,\n  error: \"\",\n  data: [],\n};\n\nexport default function serversReducer(\n  state = initialState,\n  action: ServersActionTypes\n): ServersState {\n  switch (action.type) {\n    case LIST_SERVERS_BEGIN:\n      return {\n        ...state,\n        loading: true,\n      };\n\n    case LIST_SERVERS_SUCCESS:\n      return {\n        loading: false,\n        error: \"\",\n        data: action.payload.servers,\n      };\n\n    case LIST_SERVERS_ERROR:\n      return {\n        ...state,\n        error: action.error,\n        loading: false,\n      };\n\n    default:\n      return state;\n  }\n}\n","import {\n  CLOSE_SNACKBAR,\n  SnackbarActionTypes,\n} from \"../actions/snackbarActions\";\nimport {\n  BATCH_CANCEL_ACTIVE_TASKS_SUCCESS,\n  BATCH_DELETE_ARCHIVED_TASKS_SUCCESS,\n  BATCH_DELETE_RETRY_TASKS_SUCCESS,\n  BATCH_DELETE_SCHEDULED_TASKS_SUCCESS,\n  BATCH_ARCHIVE_RETRY_TASKS_SUCCESS,\n  BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS,\n  BATCH_RUN_ARCHIVED_TASKS_SUCCESS,\n  BATCH_RUN_RETRY_TASKS_SUCCESS,\n  BATCH_RUN_SCHEDULED_TASKS_SUCCESS,\n  CANCEL_ALL_ACTIVE_TASKS_SUCCESS,\n  DELETE_ALL_ARCHIVED_TASKS_SUCCESS,\n  DELETE_ALL_RETRY_TASKS_SUCCESS,\n  DELETE_ALL_SCHEDULED_TASKS_SUCCESS,\n  DELETE_ARCHIVED_TASK_SUCCESS,\n  DELETE_RETRY_TASK_SUCCESS,\n  DELETE_SCHEDULED_TASK_SUCCESS,\n  ARCHIVE_ALL_RETRY_TASKS_SUCCESS,\n  ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS,\n  ARCHIVE_RETRY_TASK_SUCCESS,\n  ARCHIVE_SCHEDULED_TASK_SUCCESS,\n  RUN_ALL_ARCHIVED_TASKS_SUCCESS,\n  RUN_ALL_RETRY_TASKS_SUCCESS,\n  RUN_ALL_SCHEDULED_TASKS_SUCCESS,\n  RUN_ARCHIVED_TASK_SUCCESS,\n  RUN_RETRY_TASK_SUCCESS,\n  RUN_SCHEDULED_TASK_SUCCESS,\n  TasksActionTypes,\n  ARCHIVE_PENDING_TASK_SUCCESS,\n  DELETE_PENDING_TASK_SUCCESS,\n  BATCH_ARCHIVE_PENDING_TASKS_SUCCESS,\n  BATCH_DELETE_PENDING_TASKS_SUCCESS,\n  ARCHIVE_ALL_PENDING_TASKS_SUCCESS,\n  DELETE_ALL_PENDING_TASKS_SUCCESS,\n  DELETE_COMPLETED_TASK_SUCCESS,\n  DELETE_ALL_COMPLETED_TASKS_SUCCESS,\n  BATCH_DELETE_COMPLETED_TASKS_SUCCESS,\n} from \"../actions/tasksActions\";\n\ninterface SnackbarState {\n  isOpen: boolean;\n  message: string;\n}\n\nconst initialState: SnackbarState = {\n  isOpen: false,\n  message: \"\",\n};\n\nfunction snackbarReducer(\n  state = initialState,\n  action: TasksActionTypes | SnackbarActionTypes\n): SnackbarState {\n  switch (action.type) {\n    case CLOSE_SNACKBAR:\n      return {\n        // Note: We keep the message state unchanged for\n        // smoother transition animation.\n        ...state,\n        isOpen: false,\n      };\n\n    case BATCH_CANCEL_ACTIVE_TASKS_SUCCESS: {\n      const n = action.payload.canceled_ids.length;\n      return {\n        isOpen: true,\n        message: `Cancelation signal sent to ${n} ${\n          n === 1 ? \"task\" : \"tasks\"\n        }`,\n      };\n    }\n\n    case CANCEL_ALL_ACTIVE_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Cancelation signal sent to all tasks in ${action.queue} queue`,\n      };\n\n    case RUN_SCHEDULED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Scheduled task is now pending`,\n      };\n\n    case RUN_RETRY_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Retry task is now pending`,\n      };\n\n    case RUN_ARCHIVED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Archived task is now pending`,\n      };\n\n    case ARCHIVE_PENDING_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Pending task is now archived`,\n      };\n\n    case ARCHIVE_SCHEDULED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Scheduled task is now archived`,\n      };\n\n    case ARCHIVE_RETRY_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Retry task is now archived`,\n      };\n\n    case DELETE_PENDING_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Pending task deleted`,\n      };\n\n    case DELETE_SCHEDULED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Scheduled task deleted`,\n      };\n\n    case BATCH_RUN_SCHEDULED_TASKS_SUCCESS: {\n      const n = action.payload.pending_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} scheduled ${\n          n === 1 ? \"task is\" : \"tasks are\"\n        } now pending`,\n      };\n    }\n\n    case BATCH_ARCHIVE_PENDING_TASKS_SUCCESS: {\n      const n = action.payload.archived_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} pending ${\n          n === 1 ? \"task is\" : \"tasks are\"\n        } now archived`,\n      };\n    }\n\n    case BATCH_DELETE_PENDING_TASKS_SUCCESS: {\n      const n = action.payload.deleted_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} pending ${n === 1 ? \"task\" : \"tasks\"} deleted`,\n      };\n    }\n\n    case BATCH_ARCHIVE_SCHEDULED_TASKS_SUCCESS: {\n      const n = action.payload.archived_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} scheduled ${\n          n === 1 ? \"task is\" : \"tasks are\"\n        } now archived`,\n      };\n    }\n\n    case BATCH_DELETE_SCHEDULED_TASKS_SUCCESS: {\n      const n = action.payload.deleted_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} scheduled ${n === 1 ? \"task\" : \"tasks\"} deleted`,\n      };\n    }\n\n    case ARCHIVE_ALL_PENDING_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All pending tasks are now archived\",\n      };\n\n    case DELETE_ALL_PENDING_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All pending tasks deleted\",\n      };\n\n    case RUN_ALL_SCHEDULED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All scheduled tasks are now pending\",\n      };\n\n    case ARCHIVE_ALL_SCHEDULED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All scheduled tasks are now archived\",\n      };\n\n    case DELETE_ALL_SCHEDULED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All scheduled tasks deleted\",\n      };\n\n    case DELETE_RETRY_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Retry task deleted`,\n      };\n\n    case BATCH_RUN_RETRY_TASKS_SUCCESS: {\n      const n = action.payload.pending_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} retry ${n === 1 ? \"task is\" : \"tasks are\"} now pending`,\n      };\n    }\n\n    case BATCH_ARCHIVE_RETRY_TASKS_SUCCESS: {\n      const n = action.payload.archived_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} retry ${n === 1 ? \"task is\" : \"tasks are\"} now archived`,\n      };\n    }\n\n    case BATCH_DELETE_RETRY_TASKS_SUCCESS: {\n      const n = action.payload.deleted_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} retry ${n === 1 ? \"task\" : \"tasks\"} deleted`,\n      };\n    }\n\n    case RUN_ALL_RETRY_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All retry tasks are now pending\",\n      };\n\n    case ARCHIVE_ALL_RETRY_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All retry tasks are now archived\",\n      };\n\n    case DELETE_ALL_RETRY_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All retry tasks deleted\",\n      };\n\n    case DELETE_ARCHIVED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Archived task deleted`,\n      };\n\n    case BATCH_RUN_ARCHIVED_TASKS_SUCCESS: {\n      const n = action.payload.pending_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} archived ${\n          n === 1 ? \"task is\" : \"tasks are\"\n        } now pending`,\n      };\n    }\n\n    case BATCH_DELETE_ARCHIVED_TASKS_SUCCESS: {\n      const n = action.payload.deleted_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} archived ${n === 1 ? \"task\" : \"tasks\"} deleted`,\n      };\n    }\n\n    case RUN_ALL_ARCHIVED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All archived tasks are now pending\",\n      };\n\n    case DELETE_ALL_ARCHIVED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All archived tasks deleted\",\n      };\n\n    case DELETE_COMPLETED_TASK_SUCCESS:\n      return {\n        isOpen: true,\n        message: `Completed task deleted`,\n      };\n\n    case DELETE_ALL_COMPLETED_TASKS_SUCCESS:\n      return {\n        isOpen: true,\n        message: \"All completed tasks deleted\",\n      };\n\n    case BATCH_DELETE_COMPLETED_TASKS_SUCCESS:\n      const n = action.payload.deleted_ids.length;\n      return {\n        isOpen: true,\n        message: `${n} completed ${n === 1 ? \"task\" : \"tasks\"} deleted`,\n      };\n\n    default:\n      return state;\n  }\n}\n\nexport default snackbarReducer;\n","import {\n  LIST_QUEUES_SUCCESS,\n  QueuesActionTypes,\n} from \"../actions/queuesActions\";\nimport {\n  LIST_QUEUE_STATS_BEGIN,\n  LIST_QUEUE_STATS_ERROR,\n  LIST_QUEUE_STATS_SUCCESS,\n  QueueStatsActionTypes,\n} from \"../actions/queueStatsActions\";\nimport { DailyStat } from \"../api\";\n\ninterface QueueStatsState {\n  loading: boolean;\n  data: { [qname: string]: DailyStat[] };\n}\n\nconst initialState: QueueStatsState = {\n  loading: false,\n  data: {},\n};\n\nexport default function queueStatsReducer(\n  state = initialState,\n  action: QueueStatsActionTypes | QueuesActionTypes\n): QueueStatsState {\n  switch (action.type) {\n    case LIST_QUEUE_STATS_BEGIN:\n      return {\n        ...state,\n        loading: true,\n      };\n\n    case LIST_QUEUE_STATS_SUCCESS:\n      return {\n        data: action.payload.stats,\n        loading: false,\n      };\n\n    case LIST_QUEUE_STATS_ERROR:\n      return {\n        ...state,\n        loading: false,\n      };\n\n    case LIST_QUEUES_SUCCESS: {\n      // Copy to avoid mutation.\n      let newData = { ...state.data };\n      // Update today's stats with most up-to-date data.\n      for (const q of action.payload.queues) {\n        const stats = newData[q.queue];\n        if (!stats) {\n          continue;\n        }\n        const newStats = stats.map((stat) => {\n          if (isSameDate(stat.date, q.timestamp)) {\n            return {\n              ...stat,\n              processed: q.processed,\n              failed: q.failed,\n            };\n          }\n          return stat;\n        });\n        newData[q.queue] = newStats;\n      }\n      return { ...state, data: newData };\n    }\n\n    default:\n      return state;\n  }\n}\n\n// Returns true if two timestamps are from the same date.\nfunction isSameDate(ts1: string, ts2: string): boolean {\n  const date1 = new Date(ts1);\n  const date2 = new Date(ts2);\n  return (\n    date1.getUTCDate() === date2.getUTCDate() &&\n    date1.getUTCMonth() === date2.getUTCMonth() &&\n    date1.getUTCFullYear() === date2.getUTCFullYear()\n  );\n}\n","import {\n  GET_REDIS_INFO_BEGIN,\n  GET_REDIS_INFO_ERROR,\n  GET_REDIS_INFO_SUCCESS,\n  RedisInfoActionTypes,\n} from \"../actions/redisInfoActions\";\nimport { QueueLocation, RedisInfo } from \"../api\";\n\ninterface RedisInfoState {\n  loading: boolean;\n  error: string;\n  address: string;\n  data: RedisInfo | null;\n  rawData: string | null;\n  cluster: boolean;\n  rawClusterNodes: string | null;\n  queueLocations: QueueLocation[] | null;\n}\n\nconst initialState: RedisInfoState = {\n  loading: false,\n  error: \"\",\n  address: \"\",\n  data: null,\n  rawData: null,\n  cluster: false,\n  rawClusterNodes: null,\n  queueLocations: null,\n};\n\nexport default function redisInfoReducer(\n  state = initialState,\n  action: RedisInfoActionTypes\n): RedisInfoState {\n  switch (action.type) {\n    case GET_REDIS_INFO_BEGIN:\n      return {\n        ...state,\n        loading: true,\n      };\n\n    case GET_REDIS_INFO_ERROR:\n      return {\n        ...state,\n        loading: false,\n        error: action.error,\n      };\n\n    case GET_REDIS_INFO_SUCCESS:\n      return {\n        loading: false,\n        error: \"\",\n        address: action.payload.address,\n        data: action.payload.info,\n        rawData: action.payload.raw_info,\n        cluster: action.payload.cluster,\n        rawClusterNodes: action.payload.raw_cluster_nodes,\n        queueLocations: action.payload.queue_locations,\n      };\n\n    default:\n      return state;\n  }\n}\n","import {\n  GET_METRICS_BEGIN,\n  GET_METRICS_ERROR,\n  GET_METRICS_SUCCESS,\n  MetricsActionTypes,\n} from \"../actions/metricsActions\";\nimport { MetricsResponse } from \"../api\";\n\ninterface MetricsState {\n  loading: boolean;\n  error: string;\n  data: MetricsResponse | null;\n}\n\nconst initialState: MetricsState = {\n  loading: false,\n  error: \"\",\n  data: null,\n};\n\nexport default function metricsReducer(\n  state = initialState,\n  action: MetricsActionTypes\n): MetricsState {\n  switch (action.type) {\n    case GET_METRICS_BEGIN:\n      return {\n        ...state,\n        loading: true,\n      };\n\n    case GET_METRICS_ERROR:\n      return {\n        ...state,\n        loading: false,\n        error: action.error,\n      };\n\n    case GET_METRICS_SUCCESS:\n      return {\n        loading: false,\n        error: \"\",\n        data: action.payload,\n      };\n\n    default:\n      return state;\n  }\n}\n","import { initialState as settingsInitialState } from \"./reducers/settingsReducer\"\nimport { AppState } from \"./store\";\n\nconst LOCAL_STORAGE_KEY = \"asynqmon:state\";\n\nexport function loadState(): Partial<AppState> {\n  try {\n    const serializedState = localStorage.getItem(LOCAL_STORAGE_KEY);\n    if (serializedState === null) {\n      return {};\n    }\n    const savedState = JSON.parse(serializedState);\n    return {\n      settings: {\n        ...settingsInitialState,\n        ...(savedState.settings || {}),\n      }\n    }\n  } catch (err) {\n    console.log(\"loadState: could not load state \", err)\n    return {};\n  }\n}\n\nexport function saveState(state: AppState) {\n  try {\n    const serializedState = JSON.stringify({ settings: state.settings });\n    localStorage.setItem(LOCAL_STORAGE_KEY, serializedState);\n  } catch (err) {\n    console.error(\"saveState: could not save state: \", err);\n  }\n}\n","import { combineReducers, configureStore } from \"@reduxjs/toolkit\";\nimport settingsReducer from \"./reducers/settingsReducer\";\nimport queuesReducer from \"./reducers/queuesReducer\";\nimport tasksReducer from \"./reducers/tasksReducer\";\nimport serversReducer from \"./reducers/serversReducer\";\nimport schedulerEntriesReducer from \"./reducers/schedulerEntriesReducer\";\nimport snackbarReducer from \"./reducers/snackbarReducer\";\nimport queueStatsReducer from \"./reducers/queueStatsReducer\";\nimport redisInfoReducer from \"./reducers/redisInfoReducer\";\nimport metricsReducer from \"./reducers/metricsReducer\";\nimport { loadState } from \"./localStorage\";\n\nconst rootReducer = combineReducers({\n  settings: settingsReducer,\n  queues: queuesReducer,\n  tasks: tasksReducer,\n  servers: serversReducer,\n  schedulerEntries: schedulerEntriesReducer,\n  snackbar: snackbarReducer,\n  queueStats: queueStatsReducer,\n  redis: redisInfoReducer,\n  metrics: metricsReducer,\n});\n\nconst preloadedState = loadState();\n\n// AppState is the top-level application state maintained by redux store.\nexport type AppState = ReturnType<typeof rootReducer>;\n\nconst store = configureStore({\n  reducer: rootReducer,\n  preloadedState,\n});\n\nexport default store;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(\n      process.env.PUBLIC_URL,\n      window.location.href\n    );\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' }\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready\n      .then(registration => {\n        registration.unregister();\n      })\n      .catch(error => {\n        console.error(error.message);\n      });\n  }\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport CssBaseline from \"@material-ui/core/CssBaseline\";\nimport { Provider } from \"react-redux\";\nimport App from \"./App\";\nimport store from \"./store\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport { saveState } from \"./localStorage\";\nimport { SettingsState } from \"./reducers/settingsReducer\";\n\nlet currentSettings: SettingsState | undefined = undefined;\nstore.subscribe(() => {\n  const prevSettings = currentSettings;\n  currentSettings = store.getState().settings;\n\n  // Write to local-storage only when settings have changed.\n  if (prevSettings !== currentSettings) {\n    saveState(store.getState());\n  }\n});\n\nReactDOM.render(\n  <React.StrictMode>\n    <CssBaseline />\n    <Provider store={store}>\n      <App />\n    </Provider>\n  </React.StrictMode>,\n  document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n// TODO(hibiken): Look into this.\nserviceWorker.unregister();\n"],"sourceRoot":""}