浏览代码

got rid of the dead code (#2286)

Oleg Shur 2 年之前
父节点
当前提交
7d4e42c860
共有 31 个文件被更改,包括 33 次插入258 次删除
  1. 1 1
      kafka-ui-react-app/src/components/Brokers/Broker/BrokerLogdir/BrokerLogdir.tsx
  2. 0 24
      kafka-ui-react-app/src/components/ConsumerGroups/Details/ResetOffsets/ResetOffsets.styled.ts
  3. 0 35
      kafka-ui-react-app/src/components/ConsumerGroups/Details/ResetOffsets/__test__/fixtures.ts
  4. 1 17
      kafka-ui-react-app/src/components/KsqlDb/List/KsqlDbItem/KsqlDbItem.tsx
  5. 0 21
      kafka-ui-react-app/src/components/KsqlDb/Query/QueryForm/QueryForm.styled.ts
  6. 1 2
      kafka-ui-react-app/src/components/KsqlDb/Query/QueryForm/QueryForm.tsx
  7. 1 1
      kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx
  8. 1 1
      kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/InfoModal.tsx
  9. 2 2
      kafka-ui-react-app/src/components/Topics/Topic/Edit/__test__/fixtures.ts
  10. 1 1
      kafka-ui-react-app/src/components/common/Dropdown/DropdownItem.tsx
  11. 1 1
      kafka-ui-react-app/src/components/common/Switch/Switch.tsx
  12. 2 2
      kafka-ui-react-app/src/components/common/heading/Heading.styled.tsx
  13. 3 4
      kafka-ui-react-app/src/lib/paths.ts
  14. 0 4
      kafka-ui-react-app/src/redux/interfaces/alerts.ts
  15. 0 7
      kafka-ui-react-app/src/redux/interfaces/broker.ts
  16. 0 2
      kafka-ui-react-app/src/redux/interfaces/cluster.ts
  17. 0 1
      kafka-ui-react-app/src/redux/interfaces/index.ts
  18. 0 7
      kafka-ui-react-app/src/redux/interfaces/ksqlDb.ts
  19. 0 3
      kafka-ui-react-app/src/redux/interfaces/loader.ts
  20. 0 8
      kafka-ui-react-app/src/redux/interfaces/schema.ts
  21. 4 20
      kafka-ui-react-app/src/redux/interfaces/topic.ts
  22. 0 5
      kafka-ui-react-app/src/redux/reducers/consumerGroups/__test__/fixtures.ts
  23. 1 1
      kafka-ui-react-app/src/redux/reducers/consumerGroups/consumerGroupsSlice.ts
  24. 0 23
      kafka-ui-react-app/src/redux/reducers/ksqlDb/__test__/fixtures.ts
  25. 3 16
      kafka-ui-react-app/src/redux/reducers/ksqlDb/ksqlDbSlice.ts
  26. 2 2
      kafka-ui-react-app/src/redux/reducers/loader/loaderSlice.ts
  27. 0 14
      kafka-ui-react-app/src/redux/reducers/schemas/__test__/fixtures.ts
  28. 5 7
      kafka-ui-react-app/src/redux/reducers/schemas/schemasSlice.ts
  29. 1 1
      kafka-ui-react-app/src/redux/reducers/topicMessages/topicMessagesSlice.ts
  30. 1 23
      kafka-ui-react-app/src/redux/reducers/topics/selectors.ts
  31. 2 2
      kafka-ui-react-app/src/redux/reducers/topics/topicsSlice.ts

+ 1 - 1
kafka-ui-react-app/src/components/Brokers/Broker/BrokerLogdir/BrokerLogdir.tsx

@@ -7,7 +7,7 @@ import { useTableState } from 'lib/hooks/useTableState';
 import { ClusterBrokerParam } from 'lib/paths';
 import { useBrokerLogDirs } from 'lib/hooks/api/brokers';
 
-export interface BrokerLogdirState {
+interface BrokerLogdirState {
   name: string;
   error: string;
   topics: number;

+ 0 - 24
kafka-ui-react-app/src/components/ConsumerGroups/Details/ResetOffsets/ResetOffsets.styled.ts

@@ -1,4 +1,3 @@
-import ReactDatePicker from 'react-datepicker';
 import styled from 'styled-components';
 
 export const Wrapper = styled.div`
@@ -26,29 +25,6 @@ export const Wrapper = styled.div`
   }
 `;
 
-export const DatePickerInput = styled(ReactDatePicker)`
-  height: 32px;
-  border: 1px ${(props) => props.theme.select.borderColor.normal} solid;
-  border-radius: 4px;
-  font-size: 14px;
-  width: 50%;
-  padding-left: 12px;
-  color: ${(props) => props.theme.select.color.normal};
-
-  background-image: url('data:image/svg+xml,%3Csvg width="10" height="6" viewBox="0 0 10 6" fill="none" xmlns="http://www.w3.org/2000/svg"%3E%3Cpath d="M1 1L5 5L9 1" stroke="%23454F54"/%3E%3C/svg%3E%0A') !important;
-  background-repeat: no-repeat !important;
-  background-position-x: 96% !important;
-  background-position-y: 55% !important;
-  appearance: none !important;
-
-  &:hover {
-    cursor: pointer;
-  }
-  &:focus {
-    outline: none;
-  }
-`;
-
 export const MainSelectors = styled.div`
   display: flex;
   gap: 16px;

+ 0 - 35
kafka-ui-react-app/src/components/ConsumerGroups/Details/ResetOffsets/__test__/fixtures.ts

@@ -1,35 +0,0 @@
-export const expectedOutputs = {
-  EARLIEST: {
-    partitions: [0],
-    partitionsOffsets: [
-      {
-        offset: undefined,
-        partition: 0,
-      },
-    ],
-    resetType: 'EARLIEST',
-    topic: '__amazon_msk_canary',
-  },
-  LATEST: {
-    partitions: [0],
-    partitionsOffsets: [
-      {
-        offset: undefined,
-        partition: 0,
-      },
-    ],
-    resetType: 'LATEST',
-    topic: '__amazon_msk_canary',
-  },
-  OFFSET: {
-    partitions: [0],
-    partitionsOffsets: [
-      {
-        offset: '10',
-        partition: 0,
-      },
-    ],
-    resetType: 'OFFSET',
-    topic: '__amazon_msk_canary',
-  },
-};

+ 1 - 17
kafka-ui-react-app/src/components/KsqlDb/List/KsqlDbItem/KsqlDbItem.tsx

@@ -4,7 +4,6 @@ import { KsqlStreamDescription, KsqlTableDescription } from 'generated-sources';
 import { useTableState } from 'lib/hooks/useTableState';
 import { SmartTable } from 'components/common/SmartTable/SmartTable';
 import { TableColumn } from 'components/common/SmartTable/TableColumn';
-import { KsqlDescription } from 'redux/interfaces/ksqlDb';
 import { ksqlRowData } from 'components/KsqlDb/List/KsqlDbItem/utils/ksqlRowData';
 
 export enum KsqlDbItemType {
@@ -12,7 +11,7 @@ export enum KsqlDbItemType {
   Streams = 'streams',
 }
 
-export interface RowsType {
+interface RowsType {
   tables: KsqlTableDescription[];
   streams: KsqlStreamDescription[];
 }
@@ -22,13 +21,6 @@ export interface KsqlDbItemProps {
   rows: RowsType;
 }
 
-export type KsqlDescriptionAccessor = keyof KsqlDescription;
-
-export interface HeadersType {
-  Header: string;
-  accessor: KsqlDescriptionAccessor;
-}
-
 export interface KsqlTableState {
   name: string;
   topic: string;
@@ -37,14 +29,6 @@ export interface KsqlTableState {
   isWindowed: string;
 }
 
-export const headers: HeadersType[] = [
-  { Header: 'Name', accessor: 'name' },
-  { Header: 'Topic', accessor: 'topic' },
-  { Header: 'Key Format', accessor: 'keyFormat' },
-  { Header: 'Value Format', accessor: 'valueFormat' },
-  { Header: 'Is Windowed', accessor: 'isWindowed' },
-];
-
 const KsqlDbItem: React.FC<KsqlDbItemProps> = ({ type, fetching, rows }) => {
   const preparedRows = rows[type]?.map(ksqlRowData) || [];
   const tableState = useTableState<KsqlTableState, string>(preparedRows, {

+ 0 - 21
kafka-ui-react-app/src/components/KsqlDb/Query/QueryForm/QueryForm.styled.ts

@@ -1,6 +1,5 @@
 import styled, { css } from 'styled-components';
 import BaseSQLEditor from 'components/common/SQLEditor/SQLEditor';
-import BaseEditor from 'components/common/Editor/Editor';
 
 export const QueryWrapper = styled.div`
   padding: 16px;
@@ -60,30 +59,10 @@ export const DeleteButtonWrapper = styled.div`
   margin-top: 10px;
 `;
 
-export const LabelContainer = styled.div`
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-`;
-
 export const Fieldset = styled.fieldset`
   width: 50%;
 `;
 
-export const Editor = styled(BaseEditor)(
-  ({ readOnly, theme }) =>
-    readOnly &&
-    css`
-      &,
-      &.ace-tomorrow {
-        background: ${theme.ksqlDb.query.editor.readonly.background};
-      }
-      .ace-cursor {
-        ${theme.ksqlDb.query.editor.readonly.cursor}
-      }
-    `
-);
-
 export const SQLEditor = styled(BaseSQLEditor)(
   ({ readOnly, theme }) =>
     readOnly &&

+ 1 - 2
kafka-ui-react-app/src/components/KsqlDb/Query/QueryForm/QueryForm.tsx

@@ -17,8 +17,7 @@ export interface Props {
   handleSSECancel: () => void;
   submitHandler: (values: FormValues) => void;
 }
-
-export type StreamsPropertiesType = {
+type StreamsPropertiesType = {
   key: string;
   value: string;
 };

+ 1 - 1
kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/Filters.tsx

@@ -57,7 +57,7 @@ export interface MessageFilters {
   code: string;
 }
 
-export interface ActiveMessageFilter {
+interface ActiveMessageFilter {
   index: number;
   name: string;
   code: string;

+ 1 - 1
kafka-ui-react-app/src/components/Topics/Topic/Details/Messages/Filters/InfoModal.tsx

@@ -2,7 +2,7 @@ import React from 'react';
 import * as S from 'components/Topics/Topic/Details/Messages/Filters/Filters.styled';
 import { Button } from 'components/common/Button/Button';
 
-export interface InfoModalProps {
+interface InfoModalProps {
   toggleIsOpen(): void;
 }
 

+ 2 - 2
kafka-ui-react-app/src/components/Topics/Topic/Edit/__test__/fixtures.ts

@@ -4,7 +4,7 @@ import { TopicWithDetailedInfo } from 'redux/interfaces/topic';
 export const clusterName = 'testCluster';
 export const topicName = 'testTopic';
 
-export const config: TopicConfig[] = [
+const config: TopicConfig[] = [
   {
     name: 'compression.type',
     value: 'producer',
@@ -521,7 +521,7 @@ export const config: TopicConfig[] = [
   },
 ];
 
-export const partitions = [
+const partitions = [
   {
     partition: 0,
     leader: 2,

+ 1 - 1
kafka-ui-react-app/src/components/common/Dropdown/DropdownItem.tsx

@@ -2,7 +2,7 @@ import React, { PropsWithChildren } from 'react';
 
 import * as S from './Dropdown.styled';
 
-export interface DropdownItemProps {
+interface DropdownItemProps {
   onClick(): void;
   danger?: boolean;
 }

+ 1 - 1
kafka-ui-react-app/src/components/common/Switch/Switch.tsx

@@ -2,7 +2,7 @@ import React from 'react';
 
 import * as S from './Switch.styled';
 
-export interface SwitchProps {
+interface SwitchProps {
   onChange(): void;
   checked: boolean;
   name: string;

+ 2 - 2
kafka-ui-react-app/src/components/common/heading/Heading.styled.tsx

@@ -10,10 +10,10 @@ const HeadingBase = styled.h1<HeadingBaseProps>`
   ${({ theme, $level }) => theme.heading?.variants[$level]}
 `;
 
-export interface Props {
+interface HeadingProps {
   level?: HeadingLevel;
 }
-const Heading: React.FC<PropsWithChildren<Props>> = ({
+const Heading: React.FC<PropsWithChildren<HeadingProps>> = ({
   level = 1,
   ...rest
 }) => {

+ 3 - 4
kafka-ui-react-app/src/lib/paths.ts

@@ -1,6 +1,5 @@
-import { Connect, Connector } from 'generated-sources';
+import { Broker, Connect, Connector } from 'generated-sources';
 import {
-  BrokerId,
   ClusterName,
   ConsumerGroupID,
   SchemaName,
@@ -39,11 +38,11 @@ export const clusterBrokersPath = (
 
 export const clusterBrokerPath = (
   clusterName: ClusterName = RouteParams.clusterName,
-  brokerId: BrokerId | string = RouteParams.brokerId
+  brokerId: Broker['id'] | string = RouteParams.brokerId
 ) => `${clusterBrokersPath(clusterName)}/${brokerId}`;
 export const clusterBrokerMetricsPath = (
   clusterName: ClusterName = RouteParams.clusterName,
-  brokerId: BrokerId | string = RouteParams.brokerId
+  brokerId: Broker['id'] | string = RouteParams.brokerId
 ) =>
   `${clusterBrokerPath(
     clusterName,

+ 0 - 4
kafka-ui-react-app/src/redux/interfaces/alerts.ts

@@ -17,7 +17,3 @@ export interface Alert {
   response?: ServerResponse;
   createdAt: number;
 }
-
-export type Alerts = Alert[];
-
-export type AlertsState = Record<Alert['id'], Alert>;

+ 0 - 7
kafka-ui-react-app/src/redux/interfaces/broker.ts

@@ -1,7 +0,0 @@
-import { ClusterStats, Broker } from 'generated-sources';
-
-export type BrokerId = Broker['id'];
-
-export interface BrokersState extends ClusterStats {
-  items: Broker[];
-}

+ 0 - 2
kafka-ui-react-app/src/redux/interfaces/cluster.ts

@@ -1,5 +1,3 @@
 import { Cluster } from 'generated-sources';
 
 export type ClusterName = Cluster['name'];
-
-export type ClusterState = Cluster[];

+ 0 - 1
kafka-ui-react-app/src/redux/interfaces/index.ts

@@ -3,7 +3,6 @@ import { store } from 'redux/store';
 
 export * from './topic';
 export * from './cluster';
-export * from './broker';
 export * from './consumerGroup';
 export * from './schema';
 export * from './loader';

+ 0 - 7
kafka-ui-react-app/src/redux/interfaces/ksqlDb.ts

@@ -4,13 +4,6 @@ import {
   KsqlTableDescription,
 } from 'generated-sources';
 
-export interface KsqlTables {
-  data: {
-    headers: string[];
-    rows: string[][];
-  };
-}
-
 export interface KsqlState {
   tables: KsqlTableDescription[];
   streams: KsqlStreamDescription[];

+ 0 - 3
kafka-ui-react-app/src/redux/interfaces/loader.ts

@@ -1,8 +1,5 @@
 import { AsyncRequestStatus } from 'lib/constants';
 
-export interface LoaderState {
-  [key: string]: 'notFetched' | 'fetching' | 'fetched' | 'errorFetching';
-}
 export interface LoaderSliceState {
   [key: string]: AsyncRequestStatus;
 }

+ 0 - 8
kafka-ui-react-app/src/redux/interfaces/schema.ts

@@ -1,18 +1,10 @@
 import {
   CompatibilityLevelCompatibilityEnum,
   NewSchemaSubject,
-  SchemaSubject,
 } from 'generated-sources';
 
 export type SchemaName = string;
 
-export interface SchemasState {
-  byName: { [subject: string]: SchemaSubject };
-  allNames: SchemaName[];
-  currentSchemaVersions: SchemaSubject[];
-  globalSchemaCompatibilityLevel?: CompatibilityLevelCompatibilityEnum;
-}
-
 export interface NewSchemaSubjectRaw extends NewSchemaSubject {
   subject: string;
   compatibilityLevel: CompatibilityLevelCompatibilityEnum;

+ 4 - 20
kafka-ui-react-app/src/redux/interfaces/topic.ts

@@ -3,7 +3,6 @@ import {
   TopicDetails,
   TopicConfig,
   TopicCreation,
-  GetTopicMessagesRequest,
   ConsumerGroup,
   TopicColumnsToSort,
   TopicMessage,
@@ -14,30 +13,15 @@ import {
 
 export type TopicName = Topic['name'];
 
-export type CleanupPolicy = 'delete' | 'compact';
-
-export interface TopicConfigByName {
-  byName: TopicConfigParams;
-}
-
-export interface TopicConfigParams {
+interface TopicConfigParams {
   [paramName: string]: TopicConfig;
 }
 
-export interface TopicConfigValue {
-  name: TopicConfig['name'];
-  value: TopicConfig['value'];
-}
-
-export interface TopicMessageQueryParams {
-  q: GetTopicMessagesRequest['q'];
-  limit: GetTopicMessagesRequest['limit'];
-  seekType: GetTopicMessagesRequest['seekType'];
-  seekTo: GetTopicMessagesRequest['seekTo'];
-  seekDirection: GetTopicMessagesRequest['seekDirection'];
+export interface TopicConfigByName {
+  byName: TopicConfigParams;
 }
 
-export interface TopicFormCustomParams {
+interface TopicFormCustomParams {
   byIndex: TopicConfigParams;
   allIndexes: TopicName[];
 }

+ 0 - 5
kafka-ui-react-app/src/redux/reducers/consumerGroups/__test__/fixtures.ts

@@ -30,11 +30,6 @@ export const noConsumerGroupsResponse = {
   consumerGroups: [],
 };
 
-export const consumerGroupsPage = {
-  totalPages: 1,
-  consumerGroups,
-};
-
 export const consumerGroupPayload = {
   groupId: 'amazon.msk.canary.group.broker-1',
   members: 0,

+ 1 - 1
kafka-ui-react-app/src/redux/reducers/consumerGroups/consumerGroupsSlice.ts

@@ -139,7 +139,7 @@ const initialState: ConsumerGroupState = {
   ...consumerGroupsAdapter.getInitialState(),
 };
 
-export const consumerGroupsSlice = createSlice({
+const consumerGroupsSlice = createSlice({
   name: 'consumerGroups',
   initialState,
   reducers: {

+ 0 - 23
kafka-ui-react-app/src/redux/reducers/ksqlDb/__test__/fixtures.ts

@@ -39,26 +39,3 @@ export const fetchKsqlDbTablesPayload: {
     },
   ],
 };
-
-export const ksqlCommandResponse = {
-  header: 'Test header',
-  columnNames: [
-    'type',
-    'name',
-    'topic',
-    'keyFormat',
-    'valueFormat',
-    'isWindowed',
-  ],
-  rows: [
-    [
-      'STREAM',
-      'KSQL_PROCESSING_LOG',
-      'default_ksql_processing_log',
-      'KAFKA',
-      'JSON',
-      'false',
-    ],
-    ['STREAM', 'PAGEVIEWS', 'pageviews', 'KAFKA', 'AVRO', 'false'],
-  ],
-};

+ 3 - 16
kafka-ui-react-app/src/redux/reducers/ksqlDb/ksqlDbSlice.ts

@@ -1,22 +1,9 @@
 import { KsqlState } from 'redux/interfaces/ksqlDb';
 import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
-import { ExecuteKsqlRequest, Table as KsqlTable } from 'generated-sources';
+import { ExecuteKsqlRequest } from 'generated-sources';
 import { ClusterName } from 'redux/interfaces';
 import { ksqlDbApiClient } from 'lib/api';
 
-export const transformKsqlResponse = (
-  rawTable: Required<KsqlTable>
-): Dictionary<string>[] =>
-  rawTable.rows.map((row) =>
-    row.reduce(
-      (res, acc, index) => ({
-        ...res,
-        [rawTable.headers[index]]: acc,
-      }),
-      {} as Dictionary<string>
-    )
-  );
-
 const getTables = (clusterName: ClusterName) =>
   ksqlDbApiClient.listTables({
     clusterName,
@@ -56,13 +43,13 @@ export const executeKsql = createAsyncThunk(
   (params: ExecuteKsqlRequest) => ksqlDbApiClient.executeKsql(params)
 );
 
-export const initialState: KsqlState = {
+const initialState: KsqlState = {
   streams: [],
   tables: [],
   executionResult: null,
 };
 
-export const ksqlDbSlice = createSlice({
+const ksqlDbSlice = createSlice({
   name: 'ksqlDb',
   initialState,
   reducers: {

+ 2 - 2
kafka-ui-react-app/src/redux/reducers/loader/loaderSlice.ts

@@ -7,9 +7,9 @@ import {
 import { AsyncRequestStatus } from 'lib/constants';
 import { LoaderSliceState } from 'redux/interfaces';
 
-export const initialState: LoaderSliceState = {};
+const initialState: LoaderSliceState = {};
 
-export const loaderSlice = createSlice({
+const loaderSlice = createSlice({
   name: 'loader',
   initialState,
   reducers: {

+ 0 - 14
kafka-ui-react-app/src/redux/reducers/schemas/__test__/fixtures.ts

@@ -45,17 +45,3 @@ export const schemasFulfilledState = {
     entities: {},
   },
 };
-
-export const versionFulfilledState = {
-  totalPages: 1,
-  ids: [],
-  entities: {},
-  versions: {
-    latest: schemaVersion2,
-    ids: [schemaVersion1.id, schemaVersion2.id],
-    entities: {
-      [schemaVersion2.id]: schemaVersion2,
-      [schemaVersion1.id]: schemaVersion1,
-    },
-  },
-};

+ 5 - 7
kafka-ui-react-app/src/redux/reducers/schemas/schemasSlice.ts

@@ -106,15 +106,13 @@ const schemasSlice = createSlice({
   },
 });
 
-export const { selectAll: selectAllSchemas, selectById: selectSchemaById } =
+export const { selectAll: selectAllSchemas } =
   schemasAdapter.getSelectors<RootState>((state) => state.schemas);
 
-export const {
-  selectAll: selectAllSchemaVersions,
-  selectById: selectVersionSchemaByID,
-} = schemaVersionsAdapter.getSelectors<RootState>(
-  (state) => state.schemas.versions
-);
+export const { selectAll: selectAllSchemaVersions } =
+  schemaVersionsAdapter.getSelectors<RootState>(
+    (state) => state.schemas.versions
+  );
 
 const getSchemaVersions = (state: RootState) => state.schemas.versions;
 export const getSchemaLatest = createSelector(

+ 1 - 1
kafka-ui-react-app/src/redux/reducers/topicMessages/topicMessagesSlice.ts

@@ -47,7 +47,7 @@ export const initialState: TopicMessagesState = {
   isFetching: false,
 };
 
-export const topicMessagesSlice = createSlice({
+const topicMessagesSlice = createSlice({
   name: 'topicMessages',
   initialState,
   reducers: {

+ 1 - 23
kafka-ui-react-app/src/redux/reducers/topics/selectors.ts

@@ -1,10 +1,5 @@
 import { createSelector } from '@reduxjs/toolkit';
-import {
-  RootState,
-  TopicName,
-  TopicsState,
-  TopicConfigByName,
-} from 'redux/interfaces';
+import { RootState, TopicName, TopicsState } from 'redux/interfaces';
 import { CleanUpPolicy } from 'generated-sources';
 import { createFetchingSelector } from 'redux/reducers/loader/selectors';
 import {
@@ -157,23 +152,6 @@ export const getTopicConfig = createSelector(
   ({ config }) => config
 );
 
-export const getTopicConfigByParamName = createSelector(
-  getTopicConfig,
-  (config) => {
-    const byParamName: TopicConfigByName = {
-      byName: {},
-    };
-
-    if (config) {
-      config.forEach((param) => {
-        byParamName.byName[param.name] = param;
-      });
-    }
-
-    return byParamName;
-  }
-);
-
 export const getIsTopicDeletePolicy = createSelector(
   getTopicByName,
   (topic) => {

+ 2 - 2
kafka-ui-react-app/src/redux/reducers/topics/topicsSlice.ts

@@ -83,7 +83,7 @@ const topicReducer = (
   };
 };
 
-export const formatTopicCreation = (form: TopicFormData): TopicCreation => {
+const formatTopicCreation = (form: TopicFormData): TopicCreation => {
   const {
     name,
     partitions,
@@ -344,7 +344,7 @@ export const clearTopicsMessages = createAsyncThunk<
   }
 });
 
-export const initialState: TopicsState = {
+const initialState: TopicsState = {
   byName: {},
   allNames: [],
   totalPages: 1,