diff --git a/src/api/boris/index.ts b/src/api/boris/index.ts new file mode 100644 index 00000000..37db16cd --- /dev/null +++ b/src/api/boris/index.ts @@ -0,0 +1,16 @@ +import { API } from '~/constants/api'; +import { api, cleanResult } from '~/utils/api'; +import { IGetGithubIssuesResult, StatBackend } from '~/types/boris'; +import axios from 'axios'; + +export const getBorisBackendStats = () => + api.get(API.BORIS.GET_BACKEND_STATS).then(cleanResult); + +export const getGithubIssues = () => { + return axios + .get(API.BORIS.GITHUB_ISSUES, { + params: { state: 'all', sort: 'created' }, + }) + .then(result => result.data) + .catch(() => []); +}; diff --git a/src/redux/node/api.ts b/src/api/node/index.ts similarity index 96% rename from src/redux/node/api.ts rename to src/api/node/index.ts index eee36f4c..7370a7e6 100644 --- a/src/redux/node/api.ts +++ b/src/api/node/index.ts @@ -1,7 +1,7 @@ import { api, cleanResult } from '~/utils/api'; -import { IComment, INode } from '../types'; +import { IComment, INode } from '~/redux/types'; import { API } from '~/constants/api'; -import { COMMENTS_DISPLAY } from './constants'; +import { COMMENTS_DISPLAY } from '~/constants/node'; import { ApiDeleteNodeTagsRequest, ApiDeleteNodeTagsResult, @@ -23,7 +23,7 @@ import { ApiPostNodeTagsResult, GetNodeDiffRequest, GetNodeDiffResult, -} from '~/redux/node/types'; +} from '~/types/node'; import axios, { AxiosRequestConfig } from 'axios'; export type ApiPostNodeRequest = { node: INode }; diff --git a/src/components/boris/BorisSidebar/index.tsx b/src/components/boris/BorisSidebar/index.tsx index 30124438..418766ab 100644 --- a/src/components/boris/BorisSidebar/index.tsx +++ b/src/components/boris/BorisSidebar/index.tsx @@ -5,16 +5,17 @@ import { BorisContacts } from '~/components/boris/BorisContacts'; import { BorisStats } from '~/components/boris/BorisStats'; import { Group } from '~/components/containers/Group'; import { IUser } from '~/redux/auth/types'; -import { BorisUsageStats } from '~/redux/boris/reducer'; +import { BorisUsageStats } from '~/types/boris'; interface Props { user: IUser; isTester: boolean; stats: BorisUsageStats; setBetaTester: (val: boolean) => void; + isLoading: boolean; } -const BorisSidebar: FC = ({ user, stats, isTester, setBetaTester }) => ( +const BorisSidebar: FC = ({ user, stats, isLoading, isTester, setBetaTester }) => (
{user.is_user && } @@ -23,7 +24,7 @@ const BorisSidebar: FC = ({ user, stats, isTester, setBetaTester }) => (
- +
); diff --git a/src/components/boris/BorisStats/index.tsx b/src/components/boris/BorisStats/index.tsx index 62d3634b..97b09f9f 100644 --- a/src/components/boris/BorisStats/index.tsx +++ b/src/components/boris/BorisStats/index.tsx @@ -1,17 +1,18 @@ import React, { FC } from 'react'; -import { BorisUsageStats } from '~/redux/boris/reducer'; +import { BorisUsageStats } from '~/types/boris'; import { BorisStatsGit } from '../BorisStatsGit'; import { BorisStatsBackend } from '../BorisStatsBackend'; interface IProps { stats: BorisUsageStats; + isLoading: boolean; } -const BorisStats: FC = ({ stats }) => { +const BorisStats: FC = ({ stats, isLoading }) => { return ( <> - - + + ); }; diff --git a/src/components/boris/BorisStatsBackend/index.tsx b/src/components/boris/BorisStatsBackend/index.tsx index 2fbb779c..e5f0917f 100644 --- a/src/components/boris/BorisStatsBackend/index.tsx +++ b/src/components/boris/BorisStatsBackend/index.tsx @@ -1,72 +1,73 @@ import React, { FC } from 'react'; -import { IBorisState } from '~/redux/boris/reducer'; +import { StatBackend } from '~/types/boris'; import styles from './styles.module.scss'; import { sizeOf } from '~/utils/dom'; import { StatsRow } from '~/components/common/StatsRow'; import { SubTitle } from '~/components/common/SubTitle'; interface IProps { - stats: IBorisState['stats']; + stats: StatBackend; + isLoading: boolean; } -const BorisStatsBackend: FC = ({ stats: { is_loading, backend } }) => { - if (!backend && !is_loading) { +const BorisStatsBackend: FC = ({ isLoading, stats }) => { + if (!stats && !isLoading) { return null; } return (
- + Юнитс
    - - {backend.users.alive} + + {stats.users.alive} - - {backend.users.total - backend.users.alive} + + {stats.users.total - stats.users.alive}
- + Контент
    - - {backend.nodes.images} + + {stats.nodes.images} - - {backend.nodes.texts} + + {stats.nodes.texts} - - {backend.nodes.videos} + + {stats.nodes.videos} - - {backend.nodes.audios} + + {stats.nodes.audios} - - {backend.comments.total} + + {stats.comments.total}
- + Сторедж
    - - {backend.files.count} + + {stats.files.count} - - {sizeOf(backend.files.size)} + + {sizeOf(stats.files.size)}
diff --git a/src/components/boris/BorisStatsGit/index.tsx b/src/components/boris/BorisStatsGit/index.tsx index 5daa22f8..a4722902 100644 --- a/src/components/boris/BorisStatsGit/index.tsx +++ b/src/components/boris/BorisStatsGit/index.tsx @@ -1,27 +1,28 @@ import React, { FC, useMemo } from 'react'; -import { IBorisState } from '~/redux/boris/reducer'; +import { GithubIssue } from '~/types/boris'; import styles from './styles.module.scss'; import { Placeholder } from '~/components/placeholders/Placeholder'; import { BorisStatsGitCard } from '../BorisStatsGitCard'; interface IProps { - stats: IBorisState['stats']; + issues: GithubIssue[]; + isLoading: boolean; } -const BorisStatsGit: FC = ({ stats }) => { +const BorisStatsGit: FC = ({ issues, isLoading }) => { const open = useMemo( - () => stats.issues.filter(el => !el.pull_request && el.state === 'open').slice(0, 5), - [stats.issues] + () => issues.filter(el => !el.pull_request && el.state === 'open').slice(0, 5), + [issues] ); const closed = useMemo( - () => stats.issues.filter(el => !el.pull_request && el.state === 'closed').slice(0, 5), - [stats.issues] + () => issues.filter(el => !el.pull_request && el.state === 'closed').slice(0, 5), + [issues] ); - if (!stats.issues.length) return null; + if (!issues.length) return null; - if (stats.is_loading) { + if (isLoading) { return ( <>
diff --git a/src/components/boris/BorisStatsGitCard/index.tsx b/src/components/boris/BorisStatsGitCard/index.tsx index 4b5148f3..28b3c42c 100644 --- a/src/components/boris/BorisStatsGitCard/index.tsx +++ b/src/components/boris/BorisStatsGitCard/index.tsx @@ -1,14 +1,14 @@ import React, { FC, useMemo } from 'react'; import styles from './styles.module.scss'; import { getPrettyDate } from '~/utils/dom'; -import { IGithubIssue } from '~/redux/boris/types'; +import { GithubIssue } from '~/types/boris'; import classNames from 'classnames'; interface IProps { - data: IGithubIssue; + data: GithubIssue; } -const stateLabels: Record = { +const stateLabels: Record = { open: 'Ожидает', closed: 'Сделано', }; diff --git a/src/components/comment/CommentForm/index.tsx b/src/components/comment/CommentForm/index.tsx index 2fee8eed..41149477 100644 --- a/src/components/comment/CommentForm/index.tsx +++ b/src/components/comment/CommentForm/index.tsx @@ -10,7 +10,7 @@ import { CommentFormFormatButtons } from '~/components/comment/CommentFormFormat import { CommentFormAttaches } from '~/components/comment/CommentFormAttaches'; import { LoaderCircle } from '~/components/input/LoaderCircle'; import { IComment, INode } from '~/redux/types'; -import { EMPTY_COMMENT } from '~/redux/node/constants'; +import { EMPTY_COMMENT } from '~/constants/node'; import { UploadDropzone } from '~/components/upload/UploadDropzone'; import styles from './styles.module.scss'; import { ERROR_LITERAL } from '~/constants/errors'; diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx index 6ac2213f..44d44e11 100644 --- a/src/components/editors/AudioEditor/index.tsx +++ b/src/components/editors/AudioEditor/index.tsx @@ -3,7 +3,7 @@ import { UPLOAD_TYPES } from '~/redux/uploads/constants'; import { ImageGrid } from '../ImageGrid'; import { AudioGrid } from '../AudioGrid'; import styles from './styles.module.scss'; -import { NodeEditorProps } from '~/redux/node/types'; +import { NodeEditorProps } from '~/types/node'; import { useNodeImages } from '~/hooks/node/useNodeImages'; import { useNodeAudios } from '~/hooks/node/useNodeAudios'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; diff --git a/src/components/editors/EditorActionsPanel/index.tsx b/src/components/editors/EditorActionsPanel/index.tsx index da63841b..d6b7b6e7 100644 --- a/src/components/editors/EditorActionsPanel/index.tsx +++ b/src/components/editors/EditorActionsPanel/index.tsx @@ -1,6 +1,6 @@ import React, { createElement, FC } from 'react'; import styles from './styles.module.scss'; -import { NODE_PANEL_COMPONENTS } from '~/redux/node/constants'; +import { NODE_PANEL_COMPONENTS } from '~/constants/node'; import { has } from 'ramda'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; diff --git a/src/components/editors/EditorAudioUploadButton/index.tsx b/src/components/editors/EditorAudioUploadButton/index.tsx index 9a201c9a..c0c759ad 100644 --- a/src/components/editors/EditorAudioUploadButton/index.tsx +++ b/src/components/editors/EditorAudioUploadButton/index.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; type IProps = IEditorComponentProps & {}; diff --git a/src/components/editors/EditorFiller/index.tsx b/src/components/editors/EditorFiller/index.tsx index d49d750b..64887a0e 100644 --- a/src/components/editors/EditorFiller/index.tsx +++ b/src/components/editors/EditorFiller/index.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react'; import { Filler } from '~/components/containers/Filler'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; import styles from './styles.module.scss'; type IProps = IEditorComponentProps & {}; diff --git a/src/components/editors/EditorImageUploadButton/index.tsx b/src/components/editors/EditorImageUploadButton/index.tsx index 702284b1..fea764d2 100644 --- a/src/components/editors/EditorImageUploadButton/index.tsx +++ b/src/components/editors/EditorImageUploadButton/index.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; type IProps = IEditorComponentProps & {}; diff --git a/src/components/editors/EditorPublicSwitch/index.tsx b/src/components/editors/EditorPublicSwitch/index.tsx index fa94f004..b6a59b52 100644 --- a/src/components/editors/EditorPublicSwitch/index.tsx +++ b/src/components/editors/EditorPublicSwitch/index.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback } from 'react'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; import { Button } from '~/components/input/Button'; import { Icon } from '~/components/input/Icon'; import styles from './styles.module.scss'; diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index 42a45b37..96852330 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -2,7 +2,7 @@ import React, { ChangeEvent, FC, useCallback } from 'react'; import styles from './styles.module.scss'; import { Icon } from '~/components/input/Icon'; import { UPLOAD_TYPES } from '~/redux/uploads/constants'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; import { useFileUploaderContext } from '~/hooks/data/useFileUploader'; import { getFileType } from '~/utils/uploader'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; diff --git a/src/components/editors/EditorUploadCoverButton/index.tsx b/src/components/editors/EditorUploadCoverButton/index.tsx index caa49c63..9f1d43b8 100644 --- a/src/components/editors/EditorUploadCoverButton/index.tsx +++ b/src/components/editors/EditorUploadCoverButton/index.tsx @@ -5,7 +5,7 @@ import { path } from 'ramda'; import { getURL } from '~/utils/dom'; import { Icon } from '~/components/input/Icon'; import { PRESETS } from '~/constants/urls'; -import { IEditorComponentProps } from '~/redux/node/types'; +import { IEditorComponentProps } from '~/types/node'; import { useFileUploader } from '~/hooks/data/useFileUploader'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; import { getFileType } from '~/utils/uploader'; diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index 90b9e0c4..00cce5a6 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { ImageGrid } from '~/components/editors/ImageGrid'; import styles from './styles.module.scss'; -import { NodeEditorProps } from '~/redux/node/types'; +import { NodeEditorProps } from '~/types/node'; import { useFileUploaderContext } from '~/hooks/data/useFileUploader'; import { UploadDropzone } from '~/components/upload/UploadDropzone'; diff --git a/src/components/editors/TextEditor/index.tsx b/src/components/editors/TextEditor/index.tsx index acc5bd3a..bd539dd1 100644 --- a/src/components/editors/TextEditor/index.tsx +++ b/src/components/editors/TextEditor/index.tsx @@ -2,7 +2,7 @@ import React, { FC, useCallback } from 'react'; import styles from './styles.module.scss'; import { Textarea } from '~/components/input/Textarea'; import { path } from 'ramda'; -import { NodeEditorProps } from '~/redux/node/types'; +import { NodeEditorProps } from '~/types/node'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; type IProps = NodeEditorProps & {}; diff --git a/src/components/editors/VideoEditor/index.tsx b/src/components/editors/VideoEditor/index.tsx index d7c72066..a3621f6f 100644 --- a/src/components/editors/VideoEditor/index.tsx +++ b/src/components/editors/VideoEditor/index.tsx @@ -4,7 +4,7 @@ import { path } from 'ramda'; import { InputText } from '~/components/input/InputText'; import classnames from 'classnames'; import { getYoutubeThumb } from '~/utils/dom'; -import { NodeEditorProps } from '~/redux/node/types'; +import { NodeEditorProps } from '~/types/node'; import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; type IProps = NodeEditorProps & {}; diff --git a/src/components/flow/Cell/index.tsx b/src/components/flow/Cell/index.tsx index ad7917f5..b02d3976 100644 --- a/src/components/flow/Cell/index.tsx +++ b/src/components/flow/Cell/index.tsx @@ -7,7 +7,7 @@ import styles from './styles.module.scss'; import markdown from '~/styles/common/markdown.module.scss'; import { Icon } from '~/components/input/Icon'; import { PRESETS } from '~/constants/urls'; -import { NODE_TYPES } from '~/redux/node/constants'; +import { NODE_TYPES } from '~/constants/node'; import { Link } from 'react-router-dom'; import { CellShade } from '~/components/flow/CellShade'; diff --git a/src/components/lab/LabAudioBlock/index.tsx b/src/components/lab/LabAudioBlock/index.tsx index ddbbf792..42ff5b0a 100644 --- a/src/components/lab/LabAudioBlock/index.tsx +++ b/src/components/lab/LabAudioBlock/index.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { Placeholder } from '~/components/placeholders/Placeholder'; import { NodeAudioBlock } from '~/components/node/NodeAudioBlock'; diff --git a/src/components/lab/LabDescription/index.tsx b/src/components/lab/LabDescription/index.tsx index f71fe917..e5a3c6ed 100644 --- a/src/components/lab/LabDescription/index.tsx +++ b/src/components/lab/LabDescription/index.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import styles from './styles.module.scss'; import { Markdown } from '~/components/containers/Markdown'; import { formatText } from '~/utils/dom'; diff --git a/src/components/lab/LabImage/index.tsx b/src/components/lab/LabImage/index.tsx index 715d4991..452b3e3a 100644 --- a/src/components/lab/LabImage/index.tsx +++ b/src/components/lab/LabImage/index.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import SwiperCore, { A11y, Navigation, Pagination, SwiperOptions } from 'swiper'; import 'swiper/swiper.scss'; diff --git a/src/components/lab/LabLine/index.tsx b/src/components/lab/LabLine/index.tsx index 5096d117..92966e98 100644 --- a/src/components/lab/LabLine/index.tsx +++ b/src/components/lab/LabLine/index.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react'; import styles from './styles.module.scss'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; interface Props extends INodeComponentProps {} diff --git a/src/components/lab/LabNodeTitle/index.tsx b/src/components/lab/LabNodeTitle/index.tsx index ea84f065..0bcdf21c 100644 --- a/src/components/lab/LabNodeTitle/index.tsx +++ b/src/components/lab/LabNodeTitle/index.tsx @@ -4,7 +4,7 @@ import { Group } from '~/components/containers/Group'; import { Icon } from '~/components/input/Icon'; import Tippy from '@tippy.js/react'; import { useGotoNode } from '~/hooks/node/useGotoNode'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { Placeholder } from '~/components/placeholders/Placeholder'; const LabNodeTitle: FC = ({ node, isLoading }) => { diff --git a/src/components/lab/LabPad/index.tsx b/src/components/lab/LabPad/index.tsx index 45dd71da..74437ed1 100644 --- a/src/components/lab/LabPad/index.tsx +++ b/src/components/lab/LabPad/index.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react'; import styles from './styles.module.scss'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { useGotoNode } from '~/hooks/node/useGotoNode'; const LabPad: FC = ({ node }) => { diff --git a/src/components/lab/LabText/index.tsx b/src/components/lab/LabText/index.tsx index 9c562b0a..834ff233 100644 --- a/src/components/lab/LabText/index.tsx +++ b/src/components/lab/LabText/index.tsx @@ -1,6 +1,6 @@ import React, { FC, useMemo } from 'react'; import { Markdown } from '~/components/containers/Markdown'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { formatTextParagraphs } from '~/utils/dom'; import { path } from 'ramda'; import styles from './styles.module.scss'; diff --git a/src/components/lab/LabVideo/index.tsx b/src/components/lab/LabVideo/index.tsx index ff0c8c1f..d62478a7 100644 --- a/src/components/lab/LabVideo/index.tsx +++ b/src/components/lab/LabVideo/index.tsx @@ -1,5 +1,5 @@ import React, { FC } from 'react'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; import { Placeholder } from '~/components/placeholders/Placeholder'; diff --git a/src/components/node/NodeAudioBlock/index.tsx b/src/components/node/NodeAudioBlock/index.tsx index 8b909a1c..1da925ed 100644 --- a/src/components/node/NodeAudioBlock/index.tsx +++ b/src/components/node/NodeAudioBlock/index.tsx @@ -1,7 +1,7 @@ import React, { FC } from 'react'; import { AudioPlayer } from '~/components/media/AudioPlayer'; import styles from './styles.module.scss'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { useNodeAudios } from '~/hooks/node/useNodeAudios'; interface IProps extends INodeComponentProps {} diff --git a/src/components/node/NodeAudioImageBlock/index.tsx b/src/components/node/NodeAudioImageBlock/index.tsx index 819e85b0..ae430806 100644 --- a/src/components/node/NodeAudioImageBlock/index.tsx +++ b/src/components/node/NodeAudioImageBlock/index.tsx @@ -3,7 +3,7 @@ import styles from './styles.module.scss'; import { path } from 'ramda'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { useNodeImages } from '~/hooks/node/useNodeImages'; interface IProps extends INodeComponentProps {} diff --git a/src/components/node/NodeImageSwiperBlock/index.tsx b/src/components/node/NodeImageSwiperBlock/index.tsx index c7e5a8c1..3c169747 100644 --- a/src/components/node/NodeImageSwiperBlock/index.tsx +++ b/src/components/node/NodeImageSwiperBlock/index.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback, useState } from 'react'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import { Swiper, SwiperSlide } from 'swiper/react'; import 'swiper/swiper.scss'; diff --git a/src/components/node/NodeRelatedBlock/index.tsx b/src/components/node/NodeRelatedBlock/index.tsx index c4948cb7..de269461 100644 --- a/src/components/node/NodeRelatedBlock/index.tsx +++ b/src/components/node/NodeRelatedBlock/index.tsx @@ -3,7 +3,7 @@ import { NodeRelatedPlaceholder } from '~/components/node/NodeRelated/placeholde import { NodeRelated } from '~/components/node/NodeRelated'; import { URLS } from '~/constants/urls'; import { INode } from '~/redux/types'; -import { INodeRelated } from '~/redux/node/types'; +import { INodeRelated } from '~/types/node'; import { Link } from 'react-router-dom'; interface IProps { diff --git a/src/components/node/NodeTextBlock/index.tsx b/src/components/node/NodeTextBlock/index.tsx index a22daa3f..16ecb9c0 100644 --- a/src/components/node/NodeTextBlock/index.tsx +++ b/src/components/node/NodeTextBlock/index.tsx @@ -1,7 +1,7 @@ import React, { FC, useMemo } from 'react'; import { path } from 'ramda'; import { formatTextParagraphs } from '~/utils/dom'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; import classNames from 'classnames'; import styles from './styles.module.scss'; import markdown from '~/styles/common/markdown.module.scss'; diff --git a/src/components/node/NodeVideoBlock/index.tsx b/src/components/node/NodeVideoBlock/index.tsx index 2fd8df93..b722c96c 100644 --- a/src/components/node/NodeVideoBlock/index.tsx +++ b/src/components/node/NodeVideoBlock/index.tsx @@ -1,7 +1,7 @@ import React, { FC, useMemo } from 'react'; import styles from './styles.module.scss'; import { path } from 'ramda'; -import { INodeComponentProps } from '~/redux/node/constants'; +import { INodeComponentProps } from '~/constants/node'; interface IProps extends INodeComponentProps {} diff --git a/src/constants/api.ts b/src/constants/api.ts index 9b4d57ec..d03fdce4 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -46,6 +46,7 @@ export const API = { }, BORIS: { GET_BACKEND_STATS: '/stats/', + GITHUB_ISSUES: 'https://api.github.com/repos/muerwre/vault-frontend/issues', }, TAG: { NODES: `/tag/nodes`, diff --git a/src/constants/boris/constants.ts b/src/constants/boris/constants.ts new file mode 100644 index 00000000..a0cc8f3e --- /dev/null +++ b/src/constants/boris/constants.ts @@ -0,0 +1,22 @@ +import { StatBackend } from '~/types/boris'; + +export const initialBackendStats: StatBackend = { + users: { + total: 0, + alive: 0, + }, + nodes: { + images: 0, + audios: 0, + videos: 0, + texts: 0, + total: 0, + }, + comments: { + total: 0, + }, + files: { + count: 0, + size: 0, + }, +}; diff --git a/src/constants/dialogs.ts b/src/constants/dialogs.ts index 9df6f50a..50a0139c 100644 --- a/src/constants/dialogs.ts +++ b/src/constants/dialogs.ts @@ -1,4 +1,4 @@ -import { NODE_TYPES } from '~/redux/node/constants'; +import { NODE_TYPES } from '~/constants/node'; import { LoginDialog } from '~/containers/dialogs/LoginDialog'; import { LoadingDialog } from '~/containers/dialogs/LoadingDialog'; import { TestDialog } from '~/containers/dialogs/TestDialog'; diff --git a/src/constants/node.ts b/src/constants/node.ts deleted file mode 100644 index 0fdebad8..00000000 --- a/src/constants/node.ts +++ /dev/null @@ -1 +0,0 @@ -export const DEFAULT_DOMINANT_COLOR = '#000000'; diff --git a/src/redux/node/constants.ts b/src/constants/node/index.ts similarity index 95% rename from src/redux/node/constants.ts rename to src/constants/node/index.ts index 8fcc6edd..cc672ea9 100644 --- a/src/redux/node/constants.ts +++ b/src/constants/node/index.ts @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { IComment, INode, ValueOf } from '../types'; +import { IComment, INode, ValueOf } from 'src/redux/types'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { NodeAudioBlock } from '~/components/node/NodeAudioBlock'; import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; @@ -11,7 +11,7 @@ import { AudioEditor } from '~/components/editors/AudioEditor'; import { EditorImageUploadButton } from '~/components/editors/EditorImageUploadButton'; import { EditorAudioUploadButton } from '~/components/editors/EditorAudioUploadButton'; import { EditorUploadCoverButton } from '~/components/editors/EditorUploadCoverButton'; -import { IEditorComponentProps, NodeEditorProps } from '~/redux/node/types'; +import { IEditorComponentProps, NodeEditorProps } from '~/types/node'; import { EditorFiller } from '~/components/editors/EditorFiller'; import { EditorPublicSwitch } from '~/components/editors/EditorPublicSwitch'; import { NodeImageSwiperBlock } from '~/components/node/NodeImageSwiperBlock'; @@ -127,4 +127,6 @@ export const NODE_SETTINGS = { MAX_IMAGE_ASPECT: 1.2, }; +export const DEFAULT_DOMINANT_COLOR = '#000000'; + export const COMMENTS_DISPLAY = 25; diff --git a/src/containers/dialogs/EditorCreateDialog/index.tsx b/src/containers/dialogs/EditorCreateDialog/index.tsx index 9b75ef55..c8b5d081 100644 --- a/src/containers/dialogs/EditorCreateDialog/index.tsx +++ b/src/containers/dialogs/EditorCreateDialog/index.tsx @@ -1,5 +1,5 @@ import React, { FC, useCallback, useMemo, useRef } from 'react'; -import { EMPTY_NODE, NODE_TYPES } from '~/redux/node/constants'; +import { EMPTY_NODE, NODE_TYPES } from '~/constants/node'; import { EditorDialog } from '~/containers/dialogs/EditorDialog'; import { useHistory, useRouteMatch } from 'react-router'; import { values } from 'ramda'; diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 218cb9e2..dcabb3e8 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -1,7 +1,7 @@ import React, { createElement, FC, useCallback, useMemo, useState } from 'react'; import { IDialogProps } from '~/redux/modal/constants'; import styles from './styles.module.scss'; -import { NODE_EDITORS } from '~/redux/node/constants'; +import { NODE_EDITORS } from '~/constants/node'; import { BetterScrollDialog } from '../BetterScrollDialog'; import { CoverBackdrop } from '~/components/containers/CoverBackdrop'; import { prop } from 'ramda'; diff --git a/src/containers/lab/LabGrid/index.tsx b/src/containers/lab/LabGrid/index.tsx index 792cd8bc..620aeef8 100644 --- a/src/containers/lab/LabGrid/index.tsx +++ b/src/containers/lab/LabGrid/index.tsx @@ -2,7 +2,7 @@ import React, { FC, useMemo } from 'react'; import Masonry from 'react-masonry-css'; import styles from './styles.module.scss'; import { LabNode } from '~/components/lab/LabNode'; -import { EMPTY_NODE, NODE_TYPES } from '~/redux/node/constants'; +import { EMPTY_NODE, NODE_TYPES } from '~/constants/node'; import { values } from 'ramda'; import { useLabPagination } from '~/hooks/lab/useLabPagination'; import { useLabContext } from '~/utils/context/LabContextProvider'; diff --git a/src/hooks/boris/useBoris.ts b/src/hooks/boris/useBoris.ts index 17067d90..bdba2aea 100644 --- a/src/hooks/boris/useBoris.ts +++ b/src/hooks/boris/useBoris.ts @@ -2,13 +2,12 @@ import { useDispatch } from 'react-redux'; import { useCallback, useEffect } from 'react'; import isBefore from 'date-fns/isBefore'; import { authSetState, authSetUser } from '~/redux/auth/actions'; -import { borisLoadStats } from '~/redux/boris/actions'; import { useUser } from '~/hooks/user/userUser'; import { IComment } from '~/redux/types'; import { useShallowSelect } from '~/hooks/data/useShallowSelect'; import { selectAuthIsTester } from '~/redux/auth/selectors'; -import { selectBorisStats } from '~/redux/boris/selectors'; import { useRandomPhrase } from '~/constants/phrases'; +import { useBorisStats } from '~/hooks/boris/useBorisStats'; export const useBoris = (comments: IComment[]) => { const dispatch = useDispatch(); @@ -29,9 +28,7 @@ export const useBoris = (comments: IComment[]) => { dispatch(authSetUser({ last_seen_boris: last_comment.created_at })); }, [user.last_seen_boris, dispatch, comments]); - useEffect(() => { - dispatch(borisLoadStats()); - }, [dispatch]); + const { stats, isLoading: isLoadingStats } = useBorisStats(); const setIsBetaTester = useCallback( (is_tester: boolean) => { @@ -41,8 +38,7 @@ export const useBoris = (comments: IComment[]) => { ); const isTester = useShallowSelect(selectAuthIsTester); - const stats = useShallowSelect(selectBorisStats); const title = useRandomPhrase('BORIS_TITLE'); - return { setIsBetaTester, isTester, stats, title }; + return { setIsBetaTester, isTester, stats, title, isLoadingStats }; }; diff --git a/src/hooks/boris/useBorisStats.ts b/src/hooks/boris/useBorisStats.ts new file mode 100644 index 00000000..e9a86e8c --- /dev/null +++ b/src/hooks/boris/useBorisStats.ts @@ -0,0 +1,25 @@ +import useSWR from 'swr'; +import { API } from '~/constants/api'; +import { getBorisBackendStats, getGithubIssues } from '~/api/boris'; +import { BorisUsageStats } from '~/types/boris'; +import { initialBackendStats } from '~/constants/boris/constants'; + +export const useBorisStats = () => { + const { data: backend = initialBackendStats, isValidating: isValidatingBackend } = useSWR( + API.BORIS.GET_BACKEND_STATS, + () => getBorisBackendStats() + ); + + const { data: issues = [], isValidating: isValidatingGit } = useSWR(API.BORIS.GITHUB_ISSUES, () => + getGithubIssues() + ); + + const stats: BorisUsageStats = { + backend, + issues, + }; + + const isLoading = !backend && isValidatingBackend; + + return { stats, isLoading }; +}; diff --git a/src/hooks/comments/useGetComments.ts b/src/hooks/comments/useGetComments.ts index 832eec0d..93575a1b 100644 --- a/src/hooks/comments/useGetComments.ts +++ b/src/hooks/comments/useGetComments.ts @@ -3,8 +3,8 @@ import { IComment } from '~/redux/types'; import { API } from '~/constants/api'; import { flatten, isNil } from 'ramda'; import useSWRInfinite from 'swr/infinite'; -import { apiGetNodeComments } from '~/redux/node/api'; -import { COMMENTS_DISPLAY } from '~/redux/node/constants'; +import { apiGetNodeComments } from '~/api/node'; +import { COMMENTS_DISPLAY } from '~/constants/node'; import { useCallback } from 'react'; const getKey: (nodeId: number) => KeyLoader = (nodeId: number) => ( diff --git a/src/hooks/comments/useNodeComments.ts b/src/hooks/comments/useNodeComments.ts index 4976b864..9cc0241a 100644 --- a/src/hooks/comments/useNodeComments.ts +++ b/src/hooks/comments/useNodeComments.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react'; import { IComment } from '~/redux/types'; import { useGetComments } from '~/hooks/comments/useGetComments'; -import { apiLockComment, apiPostComment } from '~/redux/node/api'; +import { apiLockComment, apiPostComment } from '~/api/node'; import { showErrorToast } from '~/utils/errors/showToast'; export const useNodeComments = (nodeId: number) => { diff --git a/src/hooks/node/useCreateNode.ts b/src/hooks/node/useCreateNode.ts index 1f02c85a..11456369 100644 --- a/src/hooks/node/useCreateNode.ts +++ b/src/hooks/node/useCreateNode.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; import { INode } from '~/redux/types'; -import { apiPostNode } from '~/redux/node/api'; +import { apiPostNode } from '~/api/node'; import { selectFlowNodes } from '~/redux/flow/selectors'; import { flowSetNodes } from '~/redux/flow/actions'; import { selectLabListNodes } from '~/redux/lab/selectors'; diff --git a/src/hooks/node/useGetNodeRelated.ts b/src/hooks/node/useGetNodeRelated.ts index 12072e57..d5eed122 100644 --- a/src/hooks/node/useGetNodeRelated.ts +++ b/src/hooks/node/useGetNodeRelated.ts @@ -1,9 +1,9 @@ import { INode } from '~/redux/types'; import useSWR from 'swr'; -import { ApiGetNodeRelatedResult } from '~/redux/node/types'; +import { ApiGetNodeRelatedResult } from '~/types/node'; import { API } from '~/constants/api'; import { useCallback } from 'react'; -import { apiGetNodeRelated } from '~/redux/node/api'; +import { apiGetNodeRelated } from '~/api/node'; export const useGetNodeRelated = (id?: INode['id']) => { const { data, isValidating, mutate } = useSWR(API.NODE.RELATED(id), () => diff --git a/src/hooks/node/useLoadNode.ts b/src/hooks/node/useLoadNode.ts index f27f2774..9f7bc85c 100644 --- a/src/hooks/node/useLoadNode.ts +++ b/src/hooks/node/useLoadNode.ts @@ -1,11 +1,11 @@ import useSWR from 'swr'; -import { ApiGetNodeResponse } from '~/redux/node/types'; +import { ApiGetNodeResponse } from '~/types/node'; import { API } from '~/constants/api'; import { useOnNodeSeen } from '~/hooks/node/useOnNodeSeen'; -import { apiGetNode } from '~/redux/node/api'; +import { apiGetNode } from '~/api/node'; import { useCallback } from 'react'; import { INode } from '~/redux/types'; -import { EMPTY_NODE } from '~/redux/node/constants'; +import { EMPTY_NODE } from '~/constants/node'; export const useLoadNode = (id: number) => { const { data, isValidating, mutate } = useSWR(API.NODE.GET_NODE(id), () => diff --git a/src/hooks/node/useNodeActions.ts b/src/hooks/node/useNodeActions.ts index 795bd5da..aa9a48a7 100644 --- a/src/hooks/node/useNodeActions.ts +++ b/src/hooks/node/useNodeActions.ts @@ -3,7 +3,7 @@ import { useCallback } from 'react'; import { useDispatch } from 'react-redux'; import { modalShowDialog } from '~/redux/modal/actions'; import { NODE_EDITOR_DIALOGS } from '~/constants/dialogs'; -import { apiLockNode, apiPostNodeHeroic, apiPostNodeLike } from '~/redux/node/api'; +import { apiLockNode, apiPostNodeHeroic, apiPostNodeLike } from '~/api/node'; import { showErrorToast } from '~/utils/errors/showToast'; export const useNodeActions = (node: INode, update: (node: Partial) => Promise) => { diff --git a/src/hooks/node/useNodeBlocks.ts b/src/hooks/node/useNodeBlocks.ts index 2490df35..6e03f1f3 100644 --- a/src/hooks/node/useNodeBlocks.ts +++ b/src/hooks/node/useNodeBlocks.ts @@ -1,13 +1,7 @@ import { INode } from '~/redux/types'; import { createElement, FC, useCallback, useMemo } from 'react'; import { isNil, prop } from 'ramda'; -import { - INodeComponentProps, - LAB_PREVIEW_LAYOUT, - NODE_COMPONENTS, - NODE_HEADS, - NODE_INLINES, -} from '~/redux/node/constants'; +import { INodeComponentProps, LAB_PREVIEW_LAYOUT, NODE_COMPONENTS, NODE_HEADS, NODE_INLINES, } from '~/constants/node'; // useNodeBlocks returns head, block and inline blocks of node export const useNodeBlocks = (node: INode, isLoading: boolean) => { diff --git a/src/hooks/node/useNodeTags.ts b/src/hooks/node/useNodeTags.ts index a604480b..79b550b0 100644 --- a/src/hooks/node/useNodeTags.ts +++ b/src/hooks/node/useNodeTags.ts @@ -3,7 +3,7 @@ import { useCallback } from 'react'; import { ITag } from '~/redux/types'; import { URLS } from '~/constants/urls'; import { useLoadNode } from '~/hooks/node/useLoadNode'; -import { apiDeleteNodeTag, apiPostNodeTags } from '~/redux/node/api'; +import { apiDeleteNodeTag, apiPostNodeTags } from '~/api/node'; export const useNodeTags = (id: number) => { const { update } = useLoadNode(id); diff --git a/src/hooks/node/useUpdateNode.ts b/src/hooks/node/useUpdateNode.ts index 22fb7c61..ec58c78d 100644 --- a/src/hooks/node/useUpdateNode.ts +++ b/src/hooks/node/useUpdateNode.ts @@ -1,7 +1,7 @@ import { useLoadNode } from '~/hooks/node/useLoadNode'; import { useCallback } from 'react'; import { INode } from '~/redux/types'; -import { apiPostNode } from '~/redux/node/api'; +import { apiPostNode } from '~/api/node'; import { selectFlowNodes } from '~/redux/flow/selectors'; import { flowSetNodes } from '~/redux/flow/actions'; import { selectLabListNodes } from '~/redux/lab/selectors'; diff --git a/src/layouts/BorisLayout/index.tsx b/src/layouts/BorisLayout/index.tsx index 83456a9d..cd0a78e9 100644 --- a/src/layouts/BorisLayout/index.tsx +++ b/src/layouts/BorisLayout/index.tsx @@ -9,7 +9,7 @@ import { Card } from '~/components/containers/Card'; import { SidebarRouter } from '~/containers/main/SidebarRouter'; import { BorisSidebar } from '~/components/boris/BorisSidebar'; import { useUserContext } from '~/utils/context/UserContextProvider'; -import { BorisUsageStats } from '~/redux/boris/reducer'; +import { BorisUsageStats } from '~/types/boris'; import { Tabs } from '~/components/dialogs/Tabs'; import { Superpower } from '~/components/boris/Superpower'; import { BorisUIDemo } from '~/components/boris/BorisUIDemo'; @@ -19,9 +19,10 @@ type IProps = { setIsBetaTester: (val: boolean) => void; isTester: boolean; stats: BorisUsageStats; + isLoadingStats: boolean; }; -const BorisLayout: FC = ({ title, setIsBetaTester, isTester, stats }) => { +const BorisLayout: FC = ({ title, setIsBetaTester, isTester, stats, isLoadingStats }) => { const user = useUserContext(); return ( @@ -60,6 +61,7 @@ const BorisLayout: FC = ({ title, setIsBetaTester, isTester, stats }) => stats={stats} setBetaTester={setIsBetaTester} user={user} + isLoading={isLoadingStats} /> diff --git a/src/pages/boris.tsx b/src/pages/boris.tsx index fac0f490..2e291cdd 100644 --- a/src/pages/boris.tsx +++ b/src/pages/boris.tsx @@ -19,7 +19,7 @@ const BorisPage: VFC = () => { hasMore, isLoading: isLoadingComments, } = useNodeComments(696); - const { title, setIsBetaTester, isTester, stats } = useBoris(comments); + const { title, setIsBetaTester, isTester, stats, isLoadingStats } = useBoris(comments); return ( @@ -37,6 +37,7 @@ const BorisPage: VFC = () => { setIsBetaTester={setIsBetaTester} isTester={isTester} stats={stats} + isLoadingStats={isLoadingStats} /> diff --git a/src/redux/boris/actions.ts b/src/redux/boris/actions.ts deleted file mode 100644 index b25bd483..00000000 --- a/src/redux/boris/actions.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IBorisState } from './reducer'; -import { BORIS_ACTIONS } from './constants'; - -export const borisSet = (state: Partial) => ({ - type: BORIS_ACTIONS.SET_BORIS, - state, -}); - -export const borisSetStats = (stats: Partial) => ({ - type: BORIS_ACTIONS.SET_STATS, - stats, -}); - -export const borisLoadStats = () => ({ - type: BORIS_ACTIONS.LOAD_STATS, -}); diff --git a/src/redux/boris/api.ts b/src/redux/boris/api.ts deleted file mode 100644 index d8cc8867..00000000 --- a/src/redux/boris/api.ts +++ /dev/null @@ -1,20 +0,0 @@ -import git from '~/stats/git.json'; -import { API } from '~/constants/api'; -import { api, cleanResult } from '~/utils/api'; -import { IBorisState, IStatBackend } from './reducer'; -import axios from 'axios'; -import { IGetGithubIssuesResult } from '~/redux/boris/types'; - -export const getBorisGitStats = () => Promise.resolve(git); - -export const getBorisBackendStats = () => - api.get(API.BORIS.GET_BACKEND_STATS).then(cleanResult); - -export const getGithubIssues = () => { - return axios - .get('https://api.github.com/repos/muerwre/vault-frontend/issues', { - params: { state: 'all', sort: 'created' }, - }) - .then(result => result.data) - .catch(() => []); -}; diff --git a/src/redux/boris/constants.ts b/src/redux/boris/constants.ts deleted file mode 100644 index 7a59b4f1..00000000 --- a/src/redux/boris/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -const prefix = `BORIS.`; - -export const BORIS_ACTIONS = { - SET_BORIS: `${prefix}SET_BORIS`, - SET_STATS: `${prefix}SET_STATS`, - - LOAD_STATS: `${prefix}LOAD_STATS`, -}; diff --git a/src/redux/boris/handlers.ts b/src/redux/boris/handlers.ts deleted file mode 100644 index 7f8c7b65..00000000 --- a/src/redux/boris/handlers.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IBorisState } from './reducer'; -import { BORIS_ACTIONS } from './constants'; - -const borisSet = (current: IBorisState, { state }: ReturnType) => ({ - ...current, - ...state, -}); - -const borisSetStats = (state: IBorisState, { stats }: ReturnType) => ({ - ...state, - stats: { - ...state.stats, - ...stats, - }, -}); - -export const BORIS_HANDLERS = { - [BORIS_ACTIONS.SET_BORIS]: borisSet, - [BORIS_ACTIONS.SET_STATS]: borisSetStats, -}; diff --git a/src/redux/boris/reducer.ts b/src/redux/boris/reducer.ts deleted file mode 100644 index 6011418d..00000000 --- a/src/redux/boris/reducer.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { createReducer } from '~/utils/reducer'; -import { BORIS_HANDLERS } from './handlers'; -import { IGithubIssue } from '~/redux/boris/types'; - -export type IStatGitRow = { - commit: string; - subject: string; - timestamp: string; -}; - -export type IStatBackend = { - users: { - total: number; - alive: number; - }; - nodes: { - images: number; - audios: number; - videos: number; - texts: number; - total: number; - }; - comments: { - total: number; - }; - files: { - count: number; - size: number; - }; -}; - -export interface BorisUsageStats { - git: Partial[]; - issues: IGithubIssue[]; - backend: IStatBackend; - is_loading: boolean; -} -export type IBorisState = Readonly<{ - stats: BorisUsageStats; -}>; - -const initialBackendStats: IStatBackend = { - users: { - total: 0, - alive: 0, - }, - nodes: { - images: 0, - audios: 0, - videos: 0, - texts: 0, - total: 0, - }, - comments: { - total: 0, - }, - files: { - count: 0, - size: 0, - }, -}; - -const BORIS_INITIAL_STATE: IBorisState = { - stats: { - git: [], - issues: [], - backend: initialBackendStats, - is_loading: false, - }, -}; - -export default createReducer(BORIS_INITIAL_STATE, BORIS_HANDLERS); diff --git a/src/redux/boris/sagas.ts b/src/redux/boris/sagas.ts deleted file mode 100644 index b17e2c16..00000000 --- a/src/redux/boris/sagas.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { call, put, takeLatest } from 'redux-saga/effects'; -import { BORIS_ACTIONS } from './constants'; -import { borisSetStats } from './actions'; -import { getBorisBackendStats, getGithubIssues } from './api'; -import { Unwrap } from '../types'; - -function* loadStats() { - try { - yield put(borisSetStats({ is_loading: true })); - - const backend: Unwrap = yield call(getBorisBackendStats); - const issues: Unwrap = yield call(getGithubIssues); - - yield put(borisSetStats({ issues, backend })); - } catch (e) { - yield put(borisSetStats({ git: [], backend: undefined })); - } finally { - yield put(borisSetStats({ is_loading: false })); - } -} - -export default function* borisSaga() { - yield takeLatest(BORIS_ACTIONS.LOAD_STATS, loadStats); -} diff --git a/src/redux/boris/selectors.ts b/src/redux/boris/selectors.ts deleted file mode 100644 index 6c827414..00000000 --- a/src/redux/boris/selectors.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { IState } from '../store'; - -export const selectBoris = (state: IState) => state.boris; -export const selectBorisStats = (state: IState) => state.boris.stats; diff --git a/src/redux/boris/types.ts b/src/redux/boris/types.ts deleted file mode 100644 index 73552b25..00000000 --- a/src/redux/boris/types.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface IGithubIssue { - id: string; - url: string; - html_url: string; - body: string; - title: string; - state: 'open' | 'closed'; - created_at: string; - pull_request?: unknown; -} - -export type IGetGithubIssuesResult = IGithubIssue[]; diff --git a/src/redux/flow/api.ts b/src/redux/flow/api.ts index d826fb6b..98516836 100644 --- a/src/redux/flow/api.ts +++ b/src/redux/flow/api.ts @@ -1,7 +1,7 @@ import { api, cleanResult, configWithToken } from '~/utils/api'; import { INode, IResultWithStatus } from '../types'; import { API } from '~/constants/api'; -import { PostCellViewRequest, PostCellViewResult } from '~/redux/node/types'; +import { PostCellViewRequest, PostCellViewResult } from '~/types/node'; import { GetSearchResultsRequest, GetSearchResultsResult } from '~/redux/flow/types'; export const postNode = ({ diff --git a/src/redux/flow/sagas.ts b/src/redux/flow/sagas.ts index 3226d5d2..69a98cec 100644 --- a/src/redux/flow/sagas.ts +++ b/src/redux/flow/sagas.ts @@ -1,7 +1,7 @@ import { call, delay, put, race, select, take, takeLatest, takeLeading } from 'redux-saga/effects'; import { REHYDRATE } from 'redux-persist'; import { FLOW_ACTIONS } from './constants'; -import { getNodeDiff } from '../node/api'; +import { getNodeDiff } from '~/api/node'; import { flowChangeSearch, flowSetCellView, diff --git a/src/redux/store.ts b/src/redux/store.ts index 04636717..4eba1388 100644 --- a/src/redux/store.ts +++ b/src/redux/store.ts @@ -29,9 +29,6 @@ import { modalSaga } from './modal/sagas'; import { authLogout, authOpenProfile, gotAuthPostMessage } from './auth/actions'; -import boris, { IBorisState } from './boris/reducer'; -import borisSaga from './boris/sagas'; - import messages, { IMessagesState } from './messages'; import messagesSaga from './messages/sagas'; @@ -66,7 +63,6 @@ export interface IState { uploads: IUploadState; flow: IFlowState; player: IPlayerState; - boris: IBorisState; messages: IMessagesState; tag: ITagState; lab: ILabState; @@ -86,7 +82,6 @@ export const store = createStore( combineReducers({ auth: persistReducer(authPersistConfig, auth), modal, - boris, router: connectRouter(history), uploads, flow: persistReducer(flowPersistConfig, flow), @@ -107,7 +102,6 @@ export function configureStore(): { sagaMiddleware.run(flowSaga); sagaMiddleware.run(playerSaga); sagaMiddleware.run(modalSaga); - sagaMiddleware.run(borisSaga); sagaMiddleware.run(messagesSaga); sagaMiddleware.run(tagSaga); sagaMiddleware.run(labSaga); diff --git a/src/types/boris/index.ts b/src/types/boris/index.ts new file mode 100644 index 00000000..6b008b68 --- /dev/null +++ b/src/types/boris/index.ts @@ -0,0 +1,47 @@ +export interface GithubIssue { + id: string; + url: string; + html_url: string; + body: string; + title: string; + state: 'open' | 'closed'; + created_at: string; + pull_request?: unknown; +} + +export type IGetGithubIssuesResult = GithubIssue[]; + +export type IStatGitRow = { + commit: string; + subject: string; + timestamp: string; +}; + +export type StatBackend = { + users: { + total: number; + alive: number; + }; + nodes: { + images: number; + audios: number; + videos: number; + texts: number; + total: number; + }; + comments: { + total: number; + }; + files: { + count: number; + size: number; + }; +}; + +export interface BorisUsageStats { + issues: GithubIssue[]; + backend: StatBackend; +} +export type IBorisState = Readonly<{ + stats: BorisUsageStats; +}>; diff --git a/src/redux/node/types.ts b/src/types/node/index.ts similarity index 100% rename from src/redux/node/types.ts rename to src/types/node/index.ts diff --git a/src/utils/context/NodeContextProvider.tsx b/src/utils/context/NodeContextProvider.tsx index a664323d..637ce87f 100644 --- a/src/utils/context/NodeContextProvider.tsx +++ b/src/utils/context/NodeContextProvider.tsx @@ -1,5 +1,5 @@ import { INode } from '~/redux/types'; -import { EMPTY_NODE } from '~/redux/node/constants'; +import { EMPTY_NODE } from '~/constants/node'; import React, { createContext, FC, useContext } from 'react'; export interface NodeContextProps { diff --git a/src/utils/context/NodeRelatedContextProvider.tsx b/src/utils/context/NodeRelatedContextProvider.tsx index 0307651b..d35731fd 100644 --- a/src/utils/context/NodeRelatedContextProvider.tsx +++ b/src/utils/context/NodeRelatedContextProvider.tsx @@ -1,4 +1,4 @@ -import { INodeRelated } from '~/redux/node/types'; +import { INodeRelated } from '~/types/node'; import React, { createContext, FC, useContext } from 'react'; interface NodeRelatedProviderProps { diff --git a/src/utils/node.ts b/src/utils/node.ts index a9d2ba03..1a2d0169 100644 --- a/src/utils/node.ts +++ b/src/utils/node.ts @@ -2,7 +2,7 @@ import { USER_ROLES } from '~/redux/auth/constants'; import { ICommentGroup, INode } from '~/redux/types'; import { IUser } from '~/redux/auth/types'; import { path } from 'ramda'; -import { NODE_TYPES } from '~/redux/node/constants'; +import { NODE_TYPES } from '~/constants/node'; export const canEditNode = (node?: Partial, user?: Partial): boolean => path(['role'], user) === USER_ROLES.ADMIN || diff --git a/src/utils/providers/NodeRelatedProvider.tsx b/src/utils/providers/NodeRelatedProvider.tsx index 31d9c4ce..e2b24165 100644 --- a/src/utils/providers/NodeRelatedProvider.tsx +++ b/src/utils/providers/NodeRelatedProvider.tsx @@ -1,7 +1,7 @@ import React, { FC, useEffect } from 'react'; import { INode, ITag } from '~/redux/types'; import { NodeRelatedContextProvider } from '~/utils/context/NodeRelatedContextProvider'; -import { INodeRelated } from '~/redux/node/types'; +import { INodeRelated } from '~/types/node'; import { useGetNodeRelated } from '~/hooks/node/useGetNodeRelated'; interface NodeRelatedProviderProps {