From 26e6d8d41b00df5ee7361b89d706a72a86557a1e Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Sat, 8 Jan 2022 19:09:24 +0700 Subject: [PATCH 01/11] fixed quotes --- src/utils/providers/ProfileProvider.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/utils/providers/ProfileProvider.tsx b/src/utils/providers/ProfileProvider.tsx index d072709a..8320670e 100644 --- a/src/utils/providers/ProfileProvider.tsx +++ b/src/utils/providers/ProfileProvider.tsx @@ -1,11 +1,11 @@ -import { createContext, FC, useCallback, useContext } from "react"; -import { ApiUpdateUserRequest, IUser } from "~/redux/auth/types"; -import { useGetProfile } from "~/hooks/profile/useGetProfile"; -import { EMPTY_USER } from "~/redux/auth/constants"; -import { usePatchProfile } from "~/hooks/profile/usePatchProfile"; -import { useUser } from "~/hooks/user/userUser"; -import { useDispatch } from "react-redux"; -import { authSetUser } from "~/redux/auth/actions"; +import { createContext, FC, useCallback, useContext } from 'react'; +import { ApiUpdateUserRequest, IUser } from '~/redux/auth/types'; +import { useGetProfile } from '~/hooks/profile/useGetProfile'; +import { EMPTY_USER } from '~/redux/auth/constants'; +import { usePatchProfile } from '~/hooks/profile/usePatchProfile'; +import { useUser } from '~/hooks/user/userUser'; +import { useDispatch } from 'react-redux'; +import { authSetUser } from '~/redux/auth/actions'; interface ProfileProviderProps { username: string; From a4bb07e9cfcdae18007066dd1a718932a3f8c187 Mon Sep 17 00:00:00 2001 From: Fedor Katurov Date: Sun, 9 Jan 2022 19:03:01 +0700 Subject: [PATCH 02/11] removed redux completely --- package.json | 9 +- src/{redux/auth/api.ts => api/auth/index.ts} | 6 +- src/{redux => api}/auth/types.ts | 99 +---- src/api/flow/index.ts | 12 +- src/api/messages/types.ts | 2 +- src/api/node/index.ts | 2 +- src/api/uploads/types.ts | 2 +- .../auth/login/LoginDialogButtons/index.tsx | 38 ++ .../LoginDialogButtons/styles.module.scss | 0 .../LoginSocialRegisterButtons/index.tsx | 13 + .../styles.module.scss | 0 .../auth/restore/RestoreInvalidCode/index.tsx | 27 ++ .../RestoreInvalidCode/styles.module.scss | 35 ++ .../auth/restore/RestoreSent/index.tsx | 25 ++ .../restore/RestoreSent/styles.module.scss | 27 ++ .../auth/restore/RestoreSuccess/index.tsx | 27 ++ .../restore/RestoreSuccess/styles.module.scss | 27 ++ src/components/bars/PlayerBar/index.tsx | 14 +- src/components/bars/SubmitBar/index.tsx | 12 +- .../boris/BorisContactItem/index.tsx | 6 +- src/components/boris/BorisContacts/index.tsx | 6 +- src/components/boris/BorisSidebar/index.tsx | 21 +- src/components/boris/BorisStats/index.tsx | 8 +- .../boris/BorisStatsBackend/index.tsx | 12 +- src/components/boris/BorisStatsGit/index.tsx | 10 +- .../boris/BorisStatsGitCard/index.tsx | 10 +- .../boris/BorisSuperpowers/index.tsx | 6 +- src/components/boris/BorisUIDemo/index.tsx | 14 +- src/components/boris/Superpower/index.tsx | 10 +- src/components/comment/Comment/index.tsx | 16 +- .../comment/CommentAvatar/index.tsx | 14 +- .../comment/CommentContent/index.tsx | 30 +- .../comment/CommentEmbedBlock/index.tsx | 12 +- src/components/comment/CommentForm/index.tsx | 40 +- .../CommentFormAttachButtons/index.tsx | 8 +- .../comment/CommentFormAttaches/index.tsx | 2 +- .../CommentFormFormatButtons/index.tsx | 10 +- src/components/comment/CommentMenu/index.tsx | 4 +- .../comment/CommentTextBlock/index.tsx | 12 +- .../LocalCommentFormTextarea/index.tsx | 8 +- src/components/common/Avatar/index.tsx | 14 +- src/components/common/MenuDots/index.tsx | 10 +- src/components/common/SubTitle/index.tsx | 10 +- .../containers/Authorized/index.tsx | 9 +- .../containers/BlurWrapper/index.tsx | 6 +- src/components/containers/Card/index.tsx | 6 +- src/components/containers/CellGrid/index.tsx | 6 +- .../containers/CommentWrapper/index.tsx | 14 +- .../containers/CoverBackdrop/index.tsx | 12 +- src/components/containers/Filler/index.tsx | 6 +- src/components/containers/Grid/index.tsx | 6 +- src/components/containers/Group/index.tsx | 6 +- .../containers/InfiniteScroll/index.tsx | 4 +- src/components/containers/Markdown/index.tsx | 6 +- src/components/containers/Padder/index.tsx | 6 +- .../containers/PageCoverProvider/index.tsx | 12 +- .../PageCoverProvider/usePageCover.ts | 2 +- src/components/containers/Panel/index.tsx | 6 +- src/components/containers/Square/index.tsx | 8 +- src/components/containers/Sticky/index.tsx | 4 +- src/components/containers/TagField/index.tsx | 4 +- .../dialogs/BetterScrollDialog/index.tsx | 10 +- .../BetterScrollDialog/styles.module.scss | 0 src/components/dialogs/DialogTitle/index.tsx | 4 +- src/components/dialogs/ModalWrapper/index.tsx | 6 +- src/components/dialogs/Tabs/index.tsx | 6 +- src/components/editors/AudioEditor/index.tsx | 24 +- src/components/editors/AudioGrid/index.tsx | 16 +- .../editors/EditorAudioUploadButton/index.tsx | 8 +- .../editors/EditorConfirmClose/index.tsx | 8 +- src/components/editors/EditorFiller/index.tsx | 8 +- .../editors/EditorImageUploadButton/index.tsx | 8 +- .../editors/EditorPublicSwitch/index.tsx | 12 +- .../editors/EditorUploadButton/index.tsx | 18 +- .../editors/EditorUploadCoverButton/index.tsx | 20 +- src/components/editors/ImageEditor/index.tsx | 14 +- src/components/editors/ImageGrid/index.tsx | 16 +- .../editors/SortableAudioGrid/index.tsx | 2 +- .../editors/SortableImageGrid/index.tsx | 2 +- src/components/editors/TextEditor/index.tsx | 14 +- src/components/editors/VideoEditor/index.tsx | 16 +- src/components/flow/CellShade/index.tsx | 14 +- src/components/flow/FlowCell/index.tsx | 24 +- src/components/flow/FlowCellImage/index.tsx | 8 +- .../flow/FlowCellImageLazyLoad/index.tsx | 10 +- src/components/flow/FlowCellMenu/index.tsx | 14 +- src/components/flow/FlowCellText/index.tsx | 12 +- src/components/flow/FlowGrid/index.tsx | 18 +- src/components/flow/FlowRecent/index.tsx | 8 +- src/components/flow/FlowRecentItem/index.tsx | 18 +- .../flow/FlowSearchResults/index.tsx | 12 +- src/components/flow/FlowSwiperHero/index.tsx | 2 +- src/components/input/ArcProgress/index.tsx | 6 +- src/components/input/Button/index.tsx | 14 +- src/components/input/ButtonGroup/index.tsx | 6 +- src/components/input/DropHereIcon/index.tsx | 6 +- src/components/input/Icon/index.tsx | 4 +- src/components/input/InputText/index.tsx | 2 +- src/components/input/InputWrapper/index.tsx | 6 +- src/components/input/LoaderCircle/index.tsx | 10 +- .../input/LoaderCircleInner/index.tsx | 4 +- src/components/input/Textarea/index.tsx | 14 +- src/components/input/Toggle/index.tsx | 8 +- src/components/lab/LabBanner/index.tsx | 8 +- src/components/lab/LabBottomPanel/index.tsx | 24 +- src/components/lab/LabHead/index.tsx | 6 +- src/components/lab/LabHeadItem/index.tsx | 12 +- src/components/lab/LabHero/index.tsx | 18 +- src/components/lab/LabHeroes/index.tsx | 10 +- src/components/lab/LabLine/index.tsx | 8 +- src/components/lab/LabNode/index.tsx | 16 +- src/components/lab/LabTags/index.tsx | 10 +- src/components/main/Footer/index.tsx | 4 +- src/components/main/GodRays/index.tsx | 2 +- src/components/main/Header/index.tsx | 152 ------- src/components/main/Notifications/index.tsx | 84 ---- .../main/Notifications/styles.module.scss | 51 --- src/components/main/SidePane/index.tsx | 8 +- src/components/main/UserButton/index.tsx | 27 +- src/components/media/AudioPlayer/index.tsx | 16 +- src/components/media/ImagePreloader/index.tsx | 20 +- src/components/node/CommendDeleted/index.tsx | 8 +- src/components/node/MenuButton/index.tsx | 8 +- src/components/node/NodeAudioBlock/index.tsx | 10 +- .../node/NodeAudioImageBlock/index.tsx | 14 +- src/components/node/NodeAuthorBlock/index.tsx | 12 +- src/components/node/NodeCommentForm/index.tsx | 10 +- .../node/NodeDeletedBadge/index.tsx | 4 +- src/components/node/NodeNoComments/index.tsx | 12 +- src/components/node/NodeRelated/index.tsx | 12 +- .../node/NodeRelated/placeholder.tsx | 14 +- .../node/NodeRelatedBlock/index.tsx | 14 +- src/components/node/NodeRelatedItem/index.tsx | 18 +- src/components/node/NodeTags/index.tsx | 6 +- src/components/node/NodeTagsBlock/index.tsx | 6 +- .../node/NodeTagsPlaceholder/index.tsx | 6 +- src/components/node/NodeTextBlock/index.tsx | 14 +- src/components/node/NodeTitle/index.tsx | 16 +- src/components/node/NodeVideoBlock/index.tsx | 8 +- .../NotificationBubble/index.tsx | 12 +- .../NotificationMessage/index.tsx | 8 +- .../placeholders/Paragraph/index.tsx | 8 +- src/components/profile/Message/index.tsx | 16 +- .../profile/ProfileAccounts/index.tsx | 151 ------- .../profile/ProfileAccountsError/index.tsx | 10 +- .../profile/ProfileAvatar/index.tsx | 2 +- .../profile/ProfileDescription/index.tsx | 17 +- .../ProfileDescription/styles.module.scss | 2 + .../profile/ProfileSettings/index.tsx | 12 +- .../profile/ProfileSidebarMenu/index.tsx | 8 +- .../profile/ProfileSidebarSettings/index.tsx | 10 +- .../sidebar/TagSidebarList/index.tsx | 8 +- src/components/tags/Tag/index.tsx | 2 +- src/components/tags/TagAutocomplete/index.tsx | 12 +- .../tags/TagAutocompleteRow/index.tsx | 8 +- src/components/tags/TagWrapper/index.tsx | 8 +- src/components/upload/AudioUpload/index.tsx | 12 +- src/components/upload/ImageUpload/index.tsx | 12 +- .../upload/UploadDropzone/index.tsx | 16 +- src/constants/api.ts | 6 +- src/constants/auth/index.ts | 25 ++ src/constants/auth/socials.ts | 6 + src/constants/events.ts | 6 + src/constants/node/index.ts | 2 +- src/constants/phrases.ts | 5 + src/constants/uploads/index.ts | 2 +- src/constants/urls.ts | 2 +- src/containers/App.tsx | 24 +- src/containers/boris/BorisComments/index.tsx | 27 +- .../dialogs/EditorCreateDialog/index.tsx | 2 +- src/containers/dialogs/EditorDialog/index.tsx | 38 +- .../dialogs/EditorEditDialog/index.tsx | 2 +- src/containers/dialogs/LoginDialog/index.tsx | 108 ++--- .../dialogs/LoginDialogButtons/index.tsx | 28 -- .../LoginSocialRegisterButtons/index.tsx | 13 - .../LoginSocialRegisterDialog/index.tsx | 93 ++-- src/containers/dialogs/Modal/index.tsx | 12 +- src/containers/dialogs/PhotoSwipe/index.tsx | 5 +- .../dialogs/ProfileDialog/index.tsx | 10 +- .../dialogs/RestorePasswordDialog/index.tsx | 149 ++----- .../dialogs/RestoreRequestDialog/index.tsx | 101 ++--- .../RestoreRequestDialog/styles.module.scss | 26 -- src/containers/dialogs/TestDialog/index.tsx | 6 +- src/containers/flow/FlowStamp/index.tsx | 26 +- src/containers/lab/LabGrid/index.tsx | 16 +- src/containers/lab/LabStats/index.tsx | 18 +- src/containers/main/BottomContainer/index.tsx | 6 +- src/containers/main/Container/index.tsx | 6 +- src/containers/main/Header/index.tsx | 106 +++++ .../main/Header/styles.module.scss | 2 +- src/containers/main/MainLayout/index.tsx | 2 +- src/containers/main/MainRouter/index.tsx | 25 +- src/containers/main/SidebarRouter/index.tsx | 14 +- src/containers/node/NodeBottomBlock/index.tsx | 38 +- src/containers/node/NodeComments/index.tsx | 18 +- src/containers/player/PlayerView/index.tsx | 6 +- .../profile/ProfileAccounts/index.tsx | 89 ++++ .../ProfileAccounts/styles.module.scss | 2 +- src/containers/profile/ProfileInfo/index.tsx | 33 +- .../profile/ProfileLoader/index.tsx | 6 +- .../profile/ProfileMessages/index.tsx | 4 +- .../profile/ProfilePageLeft/index.tsx | 16 +- .../profile/ProfilePageStats/index.tsx | 15 +- src/containers/profile/ProfileTabs/index.tsx | 6 +- .../sidebars/SidebarWrapper/index.tsx | 10 +- src/containers/sidebars/TagSidebar/index.tsx | 2 +- src/containers/tags/Tags/index.tsx | 14 +- src/hooks/auth/useAuth.ts | 20 + src/hooks/auth/useLastSeenBoris.ts | 16 + src/hooks/auth/useLoginForm.ts | 48 ++ src/hooks/auth/useLoginLogoutRestore.ts | 20 + src/hooks/auth/useMessageEventReactions.ts | 53 +++ src/hooks/auth/useOAuth.ts | 101 +++++ .../usePatchUser.ts} | 20 +- src/hooks/auth/useRestoreCode.ts | 14 + src/hooks/auth/useRestorePasswordForm.ts | 56 +++ src/hooks/auth/useRestorePasswordRedirect.ts | 21 + src/hooks/auth/useRestoreRequestForm.ts | 40 ++ src/hooks/auth/useSocialRegisterForm.ts | 55 +++ src/hooks/auth/useUser.ts | 30 ++ .../{user => auth}/useUserDescription.ts | 2 +- src/hooks/boris/useBoris.ts | 37 +- src/hooks/boris/useBorisStats.ts | 4 +- src/hooks/comments/useCommentFormFormik.ts | 2 +- src/hooks/comments/useGetComments.ts | 2 +- src/hooks/comments/useNodeComments.ts | 2 +- src/hooks/data/usePersistedState.ts | 4 +- src/hooks/data/useShallowSelect.ts | 5 - src/hooks/data/useUploader.ts | 2 +- src/hooks/dom/useFormatWrapper.ts | 2 +- src/hooks/dom/useGlobalLoader.ts | 8 +- src/hooks/dom/useInputPasteUpload.ts | 4 +- src/hooks/dom/useScrollToTop.ts | 27 +- src/hooks/dom/useScrollTop.ts | 16 + src/hooks/flow/useFlowCellControls.ts | 2 +- src/hooks/flow/useFlowLayout.ts | 6 +- src/hooks/flow/useFlowLoader.ts | 3 +- src/hooks/flow/useFlowSetCellView.ts | 2 +- src/hooks/lab/useGetLabNodes.ts | 19 +- src/hooks/lab/useGetLabStats.ts | 27 +- src/hooks/messages/useMessages.ts | 2 +- src/hooks/metadata/useYoutubeMetadata.ts | 1 + src/hooks/navigation/useBlockBackButton.ts | 24 - src/hooks/navigation/useImageModal.ts | 2 +- src/hooks/node/useCreateNode.ts | 2 +- src/hooks/node/useGetNodeRelated.ts | 2 +- src/hooks/node/useGotoNode.ts | 8 +- src/hooks/node/useGrouppedComments.ts | 2 +- src/hooks/node/useLoadNode.ts | 2 +- src/hooks/node/useNodeActions.ts | 2 +- src/hooks/node/useNodeAudios.ts | 2 +- src/hooks/node/useNodeBlocks.ts | 8 +- src/hooks/node/useNodeCoverImage.ts | 2 +- src/hooks/node/useNodeFormFormik.ts | 2 +- src/hooks/node/useNodeImages.ts | 2 +- src/hooks/node/useNodePermissions.ts | 8 +- src/hooks/node/useNodeTags.ts | 2 +- src/hooks/node/useOnNodeSeen.ts | 8 +- src/hooks/node/useUpdateNode.ts | 4 +- src/hooks/profile/useGetProfile.ts | 6 +- src/hooks/profile/useProfileForm.ts | 2 +- src/hooks/search/useSearch.ts | 2 +- src/hooks/tag/useTagNodes.ts | 2 +- src/hooks/updates/useUpdates.ts | 17 + src/hooks/user/userUser.ts | 4 - src/index.tsx | 10 +- src/layouts/BorisLayout/index.tsx | 34 +- src/layouts/FlowLayout/index.tsx | 20 +- src/layouts/LabLayout/index.tsx | 20 +- src/layouts/NodeLayout/index.tsx | 32 +- src/layouts/ProfileLayout/index.tsx | 27 +- src/pages/index.tsx | 10 +- src/pages/lab.tsx | 6 +- src/pages/node/[id].tsx | 32 +- src/redux/auth/actions.ts | 136 ------ src/redux/auth/constants.ts | 84 ---- src/redux/auth/handlers.ts | 112 ----- src/redux/auth/index.ts | 59 --- src/redux/auth/sagas.ts | 411 ------------------ src/redux/auth/selectors.ts | 11 - src/redux/auth/transforms.ts | 20 - src/redux/store.ts | 90 ---- src/store/auth/AuthStore.ts | 43 ++ src/store/auth/useAuthStore.ts | 3 + src/store/flow/FlowStore.ts | 2 +- src/store/index.ts | 2 + src/store/lab/LabStore.ts | 2 +- src/store/uploader/UploaderStore.ts | 2 +- src/types/auth/index.ts | 30 ++ src/types/flow/index.ts | 2 +- src/{redux/types.ts => types/index.ts} | 60 +-- src/types/lab/index.ts | 2 +- src/types/node/index.ts | 2 +- src/types/tags/index.ts | 2 +- src/utils/api/index.ts | 62 ++- src/utils/context/CommentContextProvider.tsx | 2 +- src/utils/context/FlowContextProvider.tsx | 2 +- src/utils/context/LabContextProvider.tsx | 2 +- src/utils/context/NodeContextProvider.tsx | 2 +- .../context/NodeRelatedContextProvider.tsx | 4 +- src/utils/context/TagsContextProvider.tsx | 2 +- src/utils/context/UploaderContextProvider.tsx | 2 +- src/utils/context/UserContextProvider.tsx | 13 +- src/utils/dom.ts | 49 +-- src/utils/errors/getErrorMessage.ts | 6 +- src/utils/fn.ts | 2 +- src/utils/formatText.ts | 20 +- src/utils/node.ts | 14 +- src/utils/providers/AudioPlayerProvider.tsx | 12 +- src/utils/providers/AuthProvider.tsx | 29 ++ src/utils/providers/LabProvider.tsx | 6 +- src/utils/providers/MetadataProvider.tsx | 10 +- src/utils/providers/NodeRelatedProvider.tsx | 10 +- src/utils/providers/ProfileProvider.tsx | 37 +- src/utils/providers/SearchProvider.tsx | 2 +- src/utils/reducer.ts | 9 - src/utils/splitText.ts | 2 +- src/utils/tag.ts | 2 +- src/utils/trans.ts | 2 +- src/utils/uploader.ts | 6 +- src/utils/user.ts | 4 +- src/utils/validators.ts | 35 +- yarn.lock | 5 + 323 files changed, 2464 insertions(+), 3348 deletions(-) rename src/{redux/auth/api.ts => api/auth/index.ts} (94%) rename src/{redux => api}/auth/types.ts (51%) create mode 100644 src/components/auth/login/LoginDialogButtons/index.tsx rename src/{containers/dialogs => components/auth/login}/LoginDialogButtons/styles.module.scss (100%) create mode 100644 src/components/auth/oauth/LoginSocialRegisterButtons/index.tsx rename src/{containers/dialogs => components/auth/oauth}/LoginSocialRegisterButtons/styles.module.scss (100%) create mode 100644 src/components/auth/restore/RestoreInvalidCode/index.tsx create mode 100644 src/components/auth/restore/RestoreInvalidCode/styles.module.scss create mode 100644 src/components/auth/restore/RestoreSent/index.tsx create mode 100644 src/components/auth/restore/RestoreSent/styles.module.scss create mode 100644 src/components/auth/restore/RestoreSuccess/index.tsx create mode 100644 src/components/auth/restore/RestoreSuccess/styles.module.scss rename src/{containers => components}/dialogs/BetterScrollDialog/index.tsx (86%) rename src/{containers => components}/dialogs/BetterScrollDialog/styles.module.scss (100%) delete mode 100644 src/components/main/Header/index.tsx delete mode 100644 src/components/main/Notifications/index.tsx delete mode 100644 src/components/main/Notifications/styles.module.scss delete mode 100644 src/components/profile/ProfileAccounts/index.tsx create mode 100644 src/constants/auth/index.ts create mode 100644 src/constants/auth/socials.ts create mode 100644 src/constants/events.ts delete mode 100644 src/containers/dialogs/LoginDialogButtons/index.tsx delete mode 100644 src/containers/dialogs/LoginSocialRegisterButtons/index.tsx create mode 100644 src/containers/main/Header/index.tsx rename src/{components => containers}/main/Header/styles.module.scss (98%) create mode 100644 src/containers/profile/ProfileAccounts/index.tsx rename src/{components => containers}/profile/ProfileAccounts/styles.module.scss (97%) create mode 100644 src/hooks/auth/useAuth.ts create mode 100644 src/hooks/auth/useLastSeenBoris.ts create mode 100644 src/hooks/auth/useLoginForm.ts create mode 100644 src/hooks/auth/useLoginLogoutRestore.ts create mode 100644 src/hooks/auth/useMessageEventReactions.ts create mode 100644 src/hooks/auth/useOAuth.ts rename src/hooks/{profile/usePatchProfile.ts => auth/usePatchUser.ts} (61%) create mode 100644 src/hooks/auth/useRestoreCode.ts create mode 100644 src/hooks/auth/useRestorePasswordForm.ts create mode 100644 src/hooks/auth/useRestorePasswordRedirect.ts create mode 100644 src/hooks/auth/useRestoreRequestForm.ts create mode 100644 src/hooks/auth/useSocialRegisterForm.ts create mode 100644 src/hooks/auth/useUser.ts rename src/hooks/{user => auth}/useUserDescription.ts (93%) delete mode 100644 src/hooks/data/useShallowSelect.ts create mode 100644 src/hooks/dom/useScrollTop.ts delete mode 100644 src/hooks/navigation/useBlockBackButton.ts create mode 100644 src/hooks/updates/useUpdates.ts delete mode 100644 src/hooks/user/userUser.ts delete mode 100644 src/redux/auth/actions.ts delete mode 100644 src/redux/auth/constants.ts delete mode 100644 src/redux/auth/handlers.ts delete mode 100644 src/redux/auth/index.ts delete mode 100644 src/redux/auth/sagas.ts delete mode 100644 src/redux/auth/selectors.ts delete mode 100644 src/redux/auth/transforms.ts delete mode 100644 src/redux/store.ts create mode 100644 src/store/auth/AuthStore.ts create mode 100644 src/store/auth/useAuthStore.ts create mode 100644 src/types/auth/index.ts rename src/{redux/types.ts => types/index.ts} (69%) create mode 100644 src/utils/providers/AuthProvider.tsx delete mode 100644 src/utils/reducer.ts diff --git a/package.json b/package.json index 562936cd..4a424f81 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "body-scroll-lock": "^2.6.4", "classnames": "^2.2.6", "color2k": "^1.2.4", - "connected-react-router": "^6.5.2", "date-fns": "^2.4.1", "file-loader": "^6.2.0", "flexbin": "^0.2.0", @@ -22,7 +21,8 @@ "insane": "^2.6.2", "marked": "^2.0.0", "mobx": "^6.3.10", - "mobx-react": "^7.2.1", + "mobx-persist-store": "^1.0.4", + "mobx-react-lite": "^3.2.3", "next": "^12.0.7", "node-sass": "^4.14.1", "photoswipe": "^4.1.3", @@ -35,15 +35,11 @@ "react-lazyload": "^3.2.0", "react-masonry-css": "^1.0.16", "react-popper": "^2.2.3", - "react-redux": "^7.2.2", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", "react-scripts": "^5.0.0", "react-sortable-hoc": "^2.0.0", "react-sticky-box": "^0.9.3", - "redux": "^4.1.2", - "redux-persist": "^5.10.0", - "redux-saga": "^1.1.1", "sticky-sidebar": "^3.3.1", "swiper": "^6.8.4", "swr": "^1.0.1", @@ -83,7 +79,6 @@ "@types/marked": "^1.2.2", "@types/node": "^11.13.22", "@types/ramda": "^0.26.33", - "@types/react-redux": "^7.1.11", "@types/throttle-debounce": "^2.1.0", "@types/yup": "^0.29.11", "craco-alias": "^2.3.1", diff --git a/src/redux/auth/api.ts b/src/api/auth/index.ts similarity index 94% rename from src/redux/auth/api.ts rename to src/api/auth/index.ts index 0224759f..613e8adb 100644 --- a/src/redux/auth/api.ts +++ b/src/api/auth/index.ts @@ -21,7 +21,7 @@ import { ApiUpdateUserResult, ApiUserLoginRequest, ApiUserLoginResult, -} from './types'; +} from '~/api/auth/types'; export const apiUserLogin = ({ username, password }: ApiUserLoginRequest) => api @@ -41,9 +41,9 @@ export const apiAuthGetUpdates = ({ exclude_dialogs, last }: ApiAuthGetUpdatesRe export const apiUpdateUser = ({ user }: ApiUpdateUserRequest) => api.patch(API.USER.ME, user).then(cleanResult); -export const apiRequestRestoreCode = ({ field }: { field: string }) => +export const apiRequestRestoreCode = (field: string) => api - .post<{}>(API.USER.REQUEST_CODE(), { field }) + .post<{ field: string }>(API.USER.REQUEST_CODE(), { field }) .then(cleanResult); export const apiCheckRestoreCode = ({ code }: ApiCheckRestoreCodeRequest) => diff --git a/src/redux/auth/types.ts b/src/api/auth/types.ts similarity index 51% rename from src/redux/auth/types.ts rename to src/api/auth/types.ts index 652a4df5..7a0c17d5 100644 --- a/src/redux/auth/types.ts +++ b/src/api/auth/types.ts @@ -1,104 +1,16 @@ -import { IFile, INotification } from '../types'; - -export interface IToken { - access: string; - refresh: string; -} - -export interface IUser { - id: number; - username: string; - email: string; - role: string; - photo?: IFile; - cover?: IFile; - name: string; - fullname: string; - description: string; - - last_seen: string; - last_seen_messages: string; - last_seen_boris: string; - - is_activated: boolean; - is_user: boolean; -} - -export type ISocialProvider = 'vkontakte' | 'google'; - -export interface ISocialAccount { - provider: ISocialProvider; - id: string; - name: string; - photo: string; -} - -export type IAuthState = Readonly<{ - user: IUser; - token: string; - - is_tester: boolean; - - updates: { - last: string; - notifications: INotification[]; - boris_commented_at: string; - }; - - login: { - error: string; - is_loading: boolean; - is_registering: boolean; - }; - - profile: { - is_loading: boolean; - - user?: IUser; - patch_errors: Record; - - socials: { - accounts: ISocialAccount[]; - error: string; - is_loading: boolean; - }; - }; - - restore: { - code: string; - user?: Pick; - is_loading: boolean; - is_succesfull: boolean; - error: string; - }; - - register_social: { - errors: { - username: string; - password: string; - }; - error: string; - token: string; - is_loading: boolean; - }; -}>; - -export type ApiWithTokenRequest = { access: string }; +import { INotification } from '~/types'; +import { ISocialAccount, IUser } from '~/types/auth'; export type ApiUserLoginRequest = Record<'username' | 'password', string>; export type ApiUserLoginResult = { token: string; user: IUser }; - export type ApiAuthGetUserRequest = {}; export type ApiAuthGetUserResult = { user: IUser }; - export type ApiUpdateUserRequest = { user: Partial; }; export type ApiUpdateUserResult = { user: IUser; errors: Record, string> }; - export type ApiAuthGetUserProfileRequest = { username: string }; export type ApiAuthGetUserProfileResult = { user: IUser }; - export type ApiAuthGetUpdatesRequest = { exclude_dialogs: number; last: string; @@ -107,27 +19,20 @@ export type ApiAuthGetUpdatesResult = { notifications: INotification[]; boris: { commented_at: string }; }; - export type ApiCheckRestoreCodeRequest = { code: string }; export type ApiCheckRestoreCodeResult = { user: IUser }; - export type ApiRestoreCodeRequest = { code: string; password: string }; export type ApiRestoreCodeResult = { token: string; user: IUser }; - export type ApiGetSocialsResult = { accounts: ISocialAccount[] }; - export type ApiDropSocialRequest = { id: string; provider: string }; export type ApiDropSocialResult = { accounts: ISocialAccount[] }; - export type ApiAttachSocialRequest = { token: string }; export type ApiAttachSocialResult = { account: ISocialAccount }; - export type ApiLoginWithSocialRequest = { token: string; username?: string; password?: string; }; - export type ApiLoginWithSocialResult = { token: string; errors: Record; diff --git a/src/api/flow/index.ts b/src/api/flow/index.ts index fbfd3823..2a573e03 100644 --- a/src/api/flow/index.ts +++ b/src/api/flow/index.ts @@ -1,18 +1,8 @@ -import { api, cleanResult, configWithToken } from '~/utils/api'; -import { INode, IResultWithStatus } from 'src/redux/types'; +import { api, cleanResult } from '~/utils/api'; import { API } from '~/constants/api'; import { PostCellViewRequest, PostCellViewResult } from '~/types/node'; import { GetSearchResultsRequest, GetSearchResultsResult } from '~/types/flow'; -export const postNode = ({ - access, - node, -}: { - access: string; - node: INode; -}): Promise> => - api.post(API.NODE.SAVE, { node }, configWithToken(access)).then(cleanResult); - export const postCellView = ({ id, flow }: PostCellViewRequest) => api .post(API.NODE.SET_CELL_VIEW(id), { flow }) diff --git a/src/api/messages/types.ts b/src/api/messages/types.ts index 519e7057..e51d013c 100644 --- a/src/api/messages/types.ts +++ b/src/api/messages/types.ts @@ -1,4 +1,4 @@ -import { IMessage } from '~/redux/types'; +import { IMessage } from '~/types'; export type ApiGetUserMessagesRequest = { username: string; diff --git a/src/api/node/index.ts b/src/api/node/index.ts index 7370a7e6..cce95d1d 100644 --- a/src/api/node/index.ts +++ b/src/api/node/index.ts @@ -1,5 +1,5 @@ import { api, cleanResult } from '~/utils/api'; -import { IComment, INode } from '~/redux/types'; +import { IComment, INode } from '~/types'; import { API } from '~/constants/api'; import { COMMENTS_DISPLAY } from '~/constants/node'; import { diff --git a/src/api/uploads/types.ts b/src/api/uploads/types.ts index 0b6337de..58ec0a73 100644 --- a/src/api/uploads/types.ts +++ b/src/api/uploads/types.ts @@ -1,4 +1,4 @@ -import { IFile, IUploadProgressHandler } from '~/redux/types'; +import { IFile, IUploadProgressHandler } from '~/types'; import { UploadTarget, UploadType } from '~/constants/uploads'; export type ApiUploadFileRequest = { diff --git a/src/components/auth/login/LoginDialogButtons/index.tsx b/src/components/auth/login/LoginDialogButtons/index.tsx new file mode 100644 index 00000000..0f6ce91a --- /dev/null +++ b/src/components/auth/login/LoginDialogButtons/index.tsx @@ -0,0 +1,38 @@ +import React, { FC } from 'react'; +import { Button } from '~/components/input/Button'; +import { Grid } from '~/components/containers/Grid'; +import { Group } from '~/components/containers/Group'; +import styles from './styles.module.scss'; +import { OAuthProvider } from '~/types/auth'; + +interface IProps { + openOauthWindow: (provider: OAuthProvider) => void; +} + +const LoginDialogButtons: FC = ({ openOauthWindow }) => ( + + + + + + + + + +); + +export { LoginDialogButtons }; diff --git a/src/containers/dialogs/LoginDialogButtons/styles.module.scss b/src/components/auth/login/LoginDialogButtons/styles.module.scss similarity index 100% rename from src/containers/dialogs/LoginDialogButtons/styles.module.scss rename to src/components/auth/login/LoginDialogButtons/styles.module.scss diff --git a/src/components/auth/oauth/LoginSocialRegisterButtons/index.tsx b/src/components/auth/oauth/LoginSocialRegisterButtons/index.tsx new file mode 100644 index 00000000..832ab0b4 --- /dev/null +++ b/src/components/auth/oauth/LoginSocialRegisterButtons/index.tsx @@ -0,0 +1,13 @@ +import React, { FC } from 'react'; +import { Button } from '~/components/input/Button'; +import styles from './styles.module.scss'; + +interface IProps {} + +const LoginSocialRegisterButtons: FC = () => ( +
+ +
+); + +export { LoginSocialRegisterButtons }; diff --git a/src/containers/dialogs/LoginSocialRegisterButtons/styles.module.scss b/src/components/auth/oauth/LoginSocialRegisterButtons/styles.module.scss similarity index 100% rename from src/containers/dialogs/LoginSocialRegisterButtons/styles.module.scss rename to src/components/auth/oauth/LoginSocialRegisterButtons/styles.module.scss diff --git a/src/components/auth/restore/RestoreInvalidCode/index.tsx b/src/components/auth/restore/RestoreInvalidCode/index.tsx new file mode 100644 index 00000000..9218116b --- /dev/null +++ b/src/components/auth/restore/RestoreInvalidCode/index.tsx @@ -0,0 +1,27 @@ +import React, { VFC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Icon } from '~/components/input/Icon'; +import { ERROR_LITERAL, ERRORS } from '~/constants/errors'; +import { Button } from '~/components/input/Button'; + +interface RestoreInvalidCodeProps { + error: string; + onClose: () => void; +} + +const RestoreInvalidCode: VFC = ({ error, onClose }) => ( + + + +
{error || ERROR_LITERAL[ERRORS.CODE_IS_INVALID]}
+ +
+ + + +); + +export { RestoreInvalidCode }; diff --git a/src/components/auth/restore/RestoreInvalidCode/styles.module.scss b/src/components/auth/restore/RestoreInvalidCode/styles.module.scss new file mode 100644 index 00000000..e6f90011 --- /dev/null +++ b/src/components/auth/restore/RestoreInvalidCode/styles.module.scss @@ -0,0 +1,35 @@ +@import "src/styles/variables"; + +.error_shade { + @include outer_shadow(); + + background: $content_bg; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: $radius; + padding: $gap * 2; + box-sizing: border-box; + text-transform: uppercase; + font: $font_18_semibold; + text-align: center; + color: $wisegreen; + + svg { + fill: $wisegreen; + } +} + +.error_shade { + color: $red; + + svg { + fill: $red; + } +} diff --git a/src/components/auth/restore/RestoreSent/index.tsx b/src/components/auth/restore/RestoreSent/index.tsx new file mode 100644 index 00000000..0ee86882 --- /dev/null +++ b/src/components/auth/restore/RestoreSent/index.tsx @@ -0,0 +1,25 @@ +import React, { VFC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { Button } from '~/components/input/Button'; +import { Group } from '~/components/containers/Group'; + +interface RestoreSentProps { + onClose: () => void; +} + +const RestoreSent: VFC = ({ onClose }) => ( + + + +
Проверьте почту, мы отправили на неё код
+ +
+ + + +); + +export { RestoreSent }; diff --git a/src/components/auth/restore/RestoreSent/styles.module.scss b/src/components/auth/restore/RestoreSent/styles.module.scss new file mode 100644 index 00000000..38f949d7 --- /dev/null +++ b/src/components/auth/restore/RestoreSent/styles.module.scss @@ -0,0 +1,27 @@ +@import "src/styles/variables"; + +.shade { + @include outer_shadow(); + + background: $content_bg; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: $radius; + padding: $gap * 2; + box-sizing: border-box; + text-transform: uppercase; + font: $font_18_semibold; + text-align: center; + color: $wisegreen; + + svg { + fill: $wisegreen; + } +} diff --git a/src/components/auth/restore/RestoreSuccess/index.tsx b/src/components/auth/restore/RestoreSuccess/index.tsx new file mode 100644 index 00000000..d945d103 --- /dev/null +++ b/src/components/auth/restore/RestoreSuccess/index.tsx @@ -0,0 +1,27 @@ +import React, { VFC } from 'react'; +import { Icon } from '~/components/input/Icon'; +import { Button } from '~/components/input/Button'; +import { Group } from '~/components/containers/Group'; +import styles from './styles.module.scss'; + +interface RestoreSuccessProps { + username?: string; + onClick: () => void; +} + +const RestoreSuccess: VFC = ({ username, onClick }) => ( + + + +
Пароль обновлен
+
Добро пожаловать домой{username ? `, ~${username}` : ''}!
+ +
+ + + +); + +export { RestoreSuccess }; diff --git a/src/components/auth/restore/RestoreSuccess/styles.module.scss b/src/components/auth/restore/RestoreSuccess/styles.module.scss new file mode 100644 index 00000000..38f949d7 --- /dev/null +++ b/src/components/auth/restore/RestoreSuccess/styles.module.scss @@ -0,0 +1,27 @@ +@import "src/styles/variables"; + +.shade { + @include outer_shadow(); + + background: $content_bg; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + border-radius: $radius; + padding: $gap * 2; + box-sizing: border-box; + text-transform: uppercase; + font: $font_18_semibold; + text-align: center; + color: $wisegreen; + + svg { + fill: $wisegreen; + } +} diff --git a/src/components/bars/PlayerBar/index.tsx b/src/components/bars/PlayerBar/index.tsx index b983a150..eda08651 100644 --- a/src/components/bars/PlayerBar/index.tsx +++ b/src/components/bars/PlayerBar/index.tsx @@ -1,10 +1,10 @@ -import React, { useCallback, VFC } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { PlayerState } from "~/constants/player"; -import { path } from "ramda"; -import { IFile } from "~/redux/types"; -import { PlayerProgress } from "~/types/player"; +import React, { useCallback, VFC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { PlayerState } from '~/constants/player'; +import { path } from 'ramda'; +import { IFile } from '~/types'; +import { PlayerProgress } from '~/types/player'; interface Props { progress: PlayerProgress; diff --git a/src/components/bars/SubmitBar/index.tsx b/src/components/bars/SubmitBar/index.tsx index 4f5829db..e5b90f13 100644 --- a/src/components/bars/SubmitBar/index.tsx +++ b/src/components/bars/SubmitBar/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback, useState } from "react"; -import { Icon } from "~/components/input/Icon"; -import { Link } from "react-router-dom"; -import classNames from "classnames"; -import { useRouteMatch } from "react-router"; -import styles from "./styles.module.scss"; +import React, { FC, useCallback, useState } from 'react'; +import { Icon } from '~/components/input/Icon'; +import { Link } from 'react-router-dom'; +import classNames from 'classnames'; +import { useRouteMatch } from 'react-router'; +import styles from './styles.module.scss'; interface Props { isLab?: boolean; diff --git a/src/components/boris/BorisContactItem/index.tsx b/src/components/boris/BorisContactItem/index.tsx index 83326c40..65e001d2 100644 --- a/src/components/boris/BorisContactItem/index.tsx +++ b/src/components/boris/BorisContactItem/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; interface Props { icon: string; diff --git a/src/components/boris/BorisContacts/index.tsx b/src/components/boris/BorisContacts/index.tsx index 81ecedc8..b16a0b3c 100644 --- a/src/components/boris/BorisContacts/index.tsx +++ b/src/components/boris/BorisContacts/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import { BorisContactItem } from "~/components/boris/BorisContactItem"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import { BorisContactItem } from '~/components/boris/BorisContactItem'; +import styles from './styles.module.scss'; interface Props {} diff --git a/src/components/boris/BorisSidebar/index.tsx b/src/components/boris/BorisSidebar/index.tsx index 6f4d9273..3fb0b598 100644 --- a/src/components/boris/BorisSidebar/index.tsx +++ b/src/components/boris/BorisSidebar/index.tsx @@ -1,24 +1,23 @@ -import React, { FC } from "react"; -import styles from "~/layouts/BorisLayout/styles.module.scss"; -import { BorisSuperpowers } from "~/components/boris/BorisSuperpowers"; -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 "~/types/boris"; +import React, { FC } from 'react'; +import styles from '~/layouts/BorisLayout/styles.module.scss'; +import { BorisSuperpowers } from '~/components/boris/BorisSuperpowers'; +import { BorisContacts } from '~/components/boris/BorisContacts'; +import { BorisStats } from '~/components/boris/BorisStats'; +import { Group } from '~/components/containers/Group'; +import { BorisUsageStats } from '~/types/boris'; interface Props { - user: IUser; + isUser: boolean; isTester: boolean; stats: BorisUsageStats; setBetaTester: (val: boolean) => void; isLoading: boolean; } -const BorisSidebar: FC = ({ user, stats, isLoading, isTester, setBetaTester }) => ( +const BorisSidebar: FC = ({ isUser, stats, isLoading, isTester, setBetaTester }) => (
- {user.is_user && } + {isUser && }
diff --git a/src/components/boris/BorisStats/index.tsx b/src/components/boris/BorisStats/index.tsx index 9bce7b98..97b09f9f 100644 --- a/src/components/boris/BorisStats/index.tsx +++ b/src/components/boris/BorisStats/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import { BorisUsageStats } from "~/types/boris"; -import { BorisStatsGit } from "../BorisStatsGit"; -import { BorisStatsBackend } from "../BorisStatsBackend"; +import React, { FC } from 'react'; +import { BorisUsageStats } from '~/types/boris'; +import { BorisStatsGit } from '../BorisStatsGit'; +import { BorisStatsBackend } from '../BorisStatsBackend'; interface IProps { stats: BorisUsageStats; diff --git a/src/components/boris/BorisStatsBackend/index.tsx b/src/components/boris/BorisStatsBackend/index.tsx index b2d64d09..e5f0917f 100644 --- a/src/components/boris/BorisStatsBackend/index.tsx +++ b/src/components/boris/BorisStatsBackend/index.tsx @@ -1,9 +1,9 @@ -import React, { FC } from "react"; -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"; +import React, { FC } from 'react'; +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: StatBackend; diff --git a/src/components/boris/BorisStatsGit/index.tsx b/src/components/boris/BorisStatsGit/index.tsx index a6900d87..1f5aa0fd 100644 --- a/src/components/boris/BorisStatsGit/index.tsx +++ b/src/components/boris/BorisStatsGit/index.tsx @@ -1,8 +1,8 @@ -import React, { FC, useMemo } from "react"; -import { GithubIssue } from "~/types/boris"; -import styles from "./styles.module.scss"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import { BorisStatsGitCard } from "../BorisStatsGitCard"; +import React, { FC, useMemo } from 'react'; +import { GithubIssue } from '~/types/boris'; +import styles from './styles.module.scss'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import { BorisStatsGitCard } from '../BorisStatsGitCard'; interface IProps { issues: GithubIssue[]; diff --git a/src/components/boris/BorisStatsGitCard/index.tsx b/src/components/boris/BorisStatsGitCard/index.tsx index 6244c2e2..fde28291 100644 --- a/src/components/boris/BorisStatsGitCard/index.tsx +++ b/src/components/boris/BorisStatsGitCard/index.tsx @@ -1,8 +1,8 @@ -import React, { FC, useMemo } from "react"; -import styles from "./styles.module.scss"; -import { getPrettyDate } from "~/utils/dom"; -import { GithubIssue } from "~/types/boris"; -import classNames from "classnames"; +import React, { FC, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { getPrettyDate } from '~/utils/dom'; +import { GithubIssue } from '~/types/boris'; +import classNames from 'classnames'; interface IProps { data: GithubIssue; diff --git a/src/components/boris/BorisSuperpowers/index.tsx b/src/components/boris/BorisSuperpowers/index.tsx index 74c7348c..cf2530cb 100644 --- a/src/components/boris/BorisSuperpowers/index.tsx +++ b/src/components/boris/BorisSuperpowers/index.tsx @@ -1,6 +1,6 @@ -import React, { FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import { Toggle } from "~/components/input/Toggle"; +import React, { FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import { Toggle } from '~/components/input/Toggle'; interface IProps { active?: boolean; diff --git a/src/components/boris/BorisUIDemo/index.tsx b/src/components/boris/BorisUIDemo/index.tsx index b7c3c227..d8b3a0db 100644 --- a/src/components/boris/BorisUIDemo/index.tsx +++ b/src/components/boris/BorisUIDemo/index.tsx @@ -1,10 +1,10 @@ -import React, { FC, useState } from "react"; -import { Card } from "~/components/containers/Card"; -import styles from "./styles.module.scss"; -import markdown from "~/styles/common/markdown.module.scss"; -import { Group } from "~/components/containers/Group"; -import { Button } from "~/components/input/Button"; -import { InputText } from "~/components/input/InputText"; +import React, { FC, useState } from 'react'; +import { Card } from '~/components/containers/Card'; +import styles from './styles.module.scss'; +import markdown from '~/styles/common/markdown.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Button } from '~/components/input/Button'; +import { InputText } from '~/components/input/InputText'; interface IProps {} diff --git a/src/components/boris/Superpower/index.tsx b/src/components/boris/Superpower/index.tsx index 7d3f311f..66827d45 100644 --- a/src/components/boris/Superpower/index.tsx +++ b/src/components/boris/Superpower/index.tsx @@ -1,14 +1,12 @@ -import React, { FC } from "react"; -import { useShallowSelect } from "~/hooks/data/useShallowSelect"; -import { selectAuthIsTester, selectUser } from "~/redux/auth/selectors"; +import React, { FC } from 'react'; +import { useAuth } from '~/hooks/auth/useAuth'; interface IProps {} const Superpower: FC = ({ children }) => { - const user = useShallowSelect(selectUser); - const is_tester = useShallowSelect(selectAuthIsTester); + const { isTester } = useAuth(); - if (!user.is_user || !is_tester) return null; + if (!isTester) return null; return <>{children}; }; diff --git a/src/components/comment/Comment/index.tsx b/src/components/comment/Comment/index.tsx index d8c4a8c1..2b845ddd 100644 --- a/src/components/comment/Comment/index.tsx +++ b/src/components/comment/Comment/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, HTMLAttributes, memo } from "react"; -import { CommentWrapper } from "~/components/containers/CommentWrapper"; -import { IComment, ICommentGroup, IFile } from "~/redux/types"; -import { CommentContent } from "~/components/comment/CommentContent"; -import styles from "./styles.module.scss"; -import { CommendDeleted } from "../../node/CommendDeleted"; -import classNames from "classnames"; -import { NEW_COMMENT_CLASSNAME } from "~/constants/comment"; +import React, { FC, HTMLAttributes, memo } from 'react'; +import { CommentWrapper } from '~/components/containers/CommentWrapper'; +import { IComment, ICommentGroup, IFile } from '~/types'; +import { CommentContent } from '~/components/comment/CommentContent'; +import styles from './styles.module.scss'; +import { CommendDeleted } from '../../node/CommendDeleted'; +import classNames from 'classnames'; +import { NEW_COMMENT_CLASSNAME } from '~/constants/comment'; type IProps = HTMLAttributes & { nodeId: number; diff --git a/src/components/comment/CommentAvatar/index.tsx b/src/components/comment/CommentAvatar/index.tsx index 9b476c49..8eb0be0f 100644 --- a/src/components/comment/CommentAvatar/index.tsx +++ b/src/components/comment/CommentAvatar/index.tsx @@ -1,10 +1,10 @@ -import React, { FC, useCallback, useState } from "react"; -import { IUser } from "~/redux/auth/types"; -import { Avatar } from "~/components/common/Avatar"; -import { path } from "ramda"; -import { Manager, Popper, Reference } from "react-popper"; -import styles from "./styles.module.scss"; -import { useRandomPhrase } from "~/constants/phrases"; +import React, { FC, useCallback, useState } from 'react'; +import { IUser } from '~/types/auth'; +import { Avatar } from '~/components/common/Avatar'; +import { path } from 'ramda'; +import { Manager, Popper, Reference } from 'react-popper'; +import styles from './styles.module.scss'; +import { useRandomPhrase } from '~/constants/phrases'; interface Props { user: IUser; diff --git a/src/components/comment/CommentContent/index.tsx b/src/components/comment/CommentContent/index.tsx index 7012717a..b1f86ad9 100644 --- a/src/components/comment/CommentContent/index.tsx +++ b/src/components/comment/CommentContent/index.tsx @@ -1,18 +1,18 @@ -import React, { createElement, FC, Fragment, memo, useCallback, useMemo, useState } from "react"; -import { IComment, IFile } from "~/redux/types"; -import { append, assocPath, path } from "ramda"; -import { formatCommentText, getPrettyDate, getURL } from "~/utils/dom"; -import { Group } from "~/components/containers/Group"; -import styles from "./styles.module.scss"; -import { UploadType } from "~/constants/uploads"; -import reduce from "ramda/es/reduce"; -import { AudioPlayer } from "~/components/media/AudioPlayer"; -import classnames from "classnames"; -import classNames from "classnames"; -import { PRESETS } from "~/constants/urls"; -import { COMMENT_BLOCK_RENDERERS } from "~/constants/comment"; -import { CommentMenu } from "../CommentMenu"; -import { CommentForm } from "~/components/comment/CommentForm"; +import React, { createElement, FC, Fragment, memo, useCallback, useMemo, useState } from 'react'; +import { IComment, IFile } from '~/types'; +import { append, assocPath, path } from 'ramda'; +import { formatCommentText, getPrettyDate, getURL } from '~/utils/dom'; +import { Group } from '~/components/containers/Group'; +import styles from './styles.module.scss'; +import { UploadType } from '~/constants/uploads'; +import reduce from 'ramda/es/reduce'; +import { AudioPlayer } from '~/components/media/AudioPlayer'; +import classnames from 'classnames'; +import classNames from 'classnames'; +import { PRESETS } from '~/constants/urls'; +import { COMMENT_BLOCK_RENDERERS } from '~/constants/comment'; +import { CommentMenu } from '../CommentMenu'; +import { CommentForm } from '~/components/comment/CommentForm'; interface IProps { nodeId: number; diff --git a/src/components/comment/CommentEmbedBlock/index.tsx b/src/components/comment/CommentEmbedBlock/index.tsx index 23d17c62..5ff71877 100644 --- a/src/components/comment/CommentEmbedBlock/index.tsx +++ b/src/components/comment/CommentEmbedBlock/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, memo, useMemo } from "react"; -import { ICommentBlockProps } from "~/constants/comment"; -import styles from "./styles.module.scss"; -import { getYoutubeThumb } from "~/utils/dom"; -import { Icon } from "~/components/input/Icon"; -import { useYoutubeMetadata } from "~/hooks/metadata/useYoutubeMetadata"; +import React, { FC, memo, useMemo } from 'react'; +import { ICommentBlockProps } from '~/constants/comment'; +import styles from './styles.module.scss'; +import { getYoutubeThumb } from '~/utils/dom'; +import { Icon } from '~/components/input/Icon'; +import { useYoutubeMetadata } from '~/hooks/metadata/useYoutubeMetadata'; type Props = ICommentBlockProps & {}; diff --git a/src/components/comment/CommentForm/index.tsx b/src/components/comment/CommentForm/index.tsx index 84b13d84..b9038863 100644 --- a/src/components/comment/CommentForm/index.tsx +++ b/src/components/comment/CommentForm/index.tsx @@ -1,23 +1,23 @@ -import React, { FC, useCallback, useState } from "react"; -import { useCommentFormFormik } from "~/hooks/comments/useCommentFormFormik"; -import { FormikProvider } from "formik"; -import { LocalCommentFormTextarea } from "~/components/comment/LocalCommentFormTextarea"; -import { Button } from "~/components/input/Button"; -import { UploadSubject, UploadTarget } from "~/constants/uploads"; -import { CommentFormAttachButtons } from "~/components/comment/CommentFormAttachButtons"; -import { CommentFormFormatButtons } from "~/components/comment/CommentFormFormatButtons"; -import { CommentFormAttaches } from "~/components/comment/CommentFormAttaches"; -import { LoaderCircle } from "~/components/input/LoaderCircle"; -import { IComment, INode } from "~/redux/types"; -import { EMPTY_COMMENT } from "~/constants/node"; -import { UploadDropzone } from "~/components/upload/UploadDropzone"; -import styles from "./styles.module.scss"; -import { ERROR_LITERAL } from "~/constants/errors"; -import { useInputPasteUpload } from "~/hooks/dom/useInputPasteUpload"; -import { Filler } from "~/components/containers/Filler"; -import { useUploader } from "~/hooks/data/useUploader"; -import { UploaderContextProvider } from "~/utils/context/UploaderContextProvider"; -import { observer } from "mobx-react-lite"; +import React, { FC, useCallback, useState } from 'react'; +import { useCommentFormFormik } from '~/hooks/comments/useCommentFormFormik'; +import { FormikProvider } from 'formik'; +import { LocalCommentFormTextarea } from '~/components/comment/LocalCommentFormTextarea'; +import { Button } from '~/components/input/Button'; +import { UploadSubject, UploadTarget } from '~/constants/uploads'; +import { CommentFormAttachButtons } from '~/components/comment/CommentFormAttachButtons'; +import { CommentFormFormatButtons } from '~/components/comment/CommentFormFormatButtons'; +import { CommentFormAttaches } from '~/components/comment/CommentFormAttaches'; +import { LoaderCircle } from '~/components/input/LoaderCircle'; +import { IComment, INode } from '~/types'; +import { EMPTY_COMMENT } from '~/constants/node'; +import { UploadDropzone } from '~/components/upload/UploadDropzone'; +import styles from './styles.module.scss'; +import { ERROR_LITERAL } from '~/constants/errors'; +import { useInputPasteUpload } from '~/hooks/dom/useInputPasteUpload'; +import { Filler } from '~/components/containers/Filler'; +import { useUploader } from '~/hooks/data/useUploader'; +import { UploaderContextProvider } from '~/utils/context/UploaderContextProvider'; +import { observer } from 'mobx-react-lite'; interface IProps { comment?: IComment; diff --git a/src/components/comment/CommentFormAttachButtons/index.tsx b/src/components/comment/CommentFormAttachButtons/index.tsx index d4479f5d..59534254 100644 --- a/src/components/comment/CommentFormAttachButtons/index.tsx +++ b/src/components/comment/CommentFormAttachButtons/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import { ButtonGroup } from "~/components/input/ButtonGroup"; -import { Button } from "~/components/input/Button"; -import { COMMENT_FILE_TYPES } from "~/constants/uploads"; +import React, { FC, useCallback } from 'react'; +import { ButtonGroup } from '~/components/input/ButtonGroup'; +import { Button } from '~/components/input/Button'; +import { COMMENT_FILE_TYPES } from '~/constants/uploads'; interface IProps { onUpload: (files: File[]) => void; diff --git a/src/components/comment/CommentFormAttaches/index.tsx b/src/components/comment/CommentFormAttaches/index.tsx index af05d4f7..769e3eff 100644 --- a/src/components/comment/CommentFormAttaches/index.tsx +++ b/src/components/comment/CommentFormAttaches/index.tsx @@ -2,7 +2,7 @@ import React, { FC, useCallback } from 'react'; import styles from './styles.module.scss'; import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; import { SortableAudioGrid } from '~/components/editors/SortableAudioGrid'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; import { SortEnd } from 'react-sortable-hoc'; import { moveArrItem } from '~/utils/fn'; import { useFileDropZone } from '~/hooks'; diff --git a/src/components/comment/CommentFormFormatButtons/index.tsx b/src/components/comment/CommentFormFormatButtons/index.tsx index b26e10e2..8507e21f 100644 --- a/src/components/comment/CommentFormFormatButtons/index.tsx +++ b/src/components/comment/CommentFormFormatButtons/index.tsx @@ -1,8 +1,8 @@ -import React, { FC, useCallback, useEffect } from "react"; -import { ButtonGroup } from "~/components/input/ButtonGroup"; -import { Button } from "~/components/input/Button"; -import { useFormatWrapper, wrapTextInsideInput } from "~/hooks/dom/useFormatWrapper"; -import styles from "./styles.module.scss"; +import React, { FC, useCallback, useEffect } from 'react'; +import { ButtonGroup } from '~/components/input/ButtonGroup'; +import { Button } from '~/components/input/Button'; +import { useFormatWrapper, wrapTextInsideInput } from '~/hooks/dom/useFormatWrapper'; +import styles from './styles.module.scss'; interface IProps { element: HTMLTextAreaElement; diff --git a/src/components/comment/CommentMenu/index.tsx b/src/components/comment/CommentMenu/index.tsx index ec0604dd..bd632373 100644 --- a/src/components/comment/CommentMenu/index.tsx +++ b/src/components/comment/CommentMenu/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, useCallback, useState } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, useCallback, useState } from 'react'; +import styles from './styles.module.scss'; interface IProps { onEdit: () => void; diff --git a/src/components/comment/CommentTextBlock/index.tsx b/src/components/comment/CommentTextBlock/index.tsx index 84bef36e..674c7269 100644 --- a/src/components/comment/CommentTextBlock/index.tsx +++ b/src/components/comment/CommentTextBlock/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useMemo } from "react"; -import { ICommentBlockProps } from "~/constants/comment"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import markdown from "~/styles/common/markdown.module.scss"; -import { formatText } from "~/utils/dom"; +import React, { FC, useMemo } from 'react'; +import { ICommentBlockProps } from '~/constants/comment'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import markdown from '~/styles/common/markdown.module.scss'; +import { formatText } from '~/utils/dom'; interface IProps extends ICommentBlockProps {} diff --git a/src/components/comment/LocalCommentFormTextarea/index.tsx b/src/components/comment/LocalCommentFormTextarea/index.tsx index 96dd1235..7ec9feb1 100644 --- a/src/components/comment/LocalCommentFormTextarea/index.tsx +++ b/src/components/comment/LocalCommentFormTextarea/index.tsx @@ -1,7 +1,7 @@ -import React, { forwardRef, KeyboardEventHandler, TextareaHTMLAttributes, useCallback } from "react"; -import { Textarea } from "~/components/input/Textarea"; -import { useCommentFormContext } from "~/hooks/comments/useCommentFormFormik"; -import { useRandomPhrase } from "~/constants/phrases"; +import React, { forwardRef, KeyboardEventHandler, TextareaHTMLAttributes, useCallback } from 'react'; +import { Textarea } from '~/components/input/Textarea'; +import { useCommentFormContext } from '~/hooks/comments/useCommentFormFormik'; +import { useRandomPhrase } from '~/constants/phrases'; interface IProps extends TextareaHTMLAttributes { isLoading?: boolean; diff --git a/src/components/common/Avatar/index.tsx b/src/components/common/Avatar/index.tsx index 591c6398..e6955762 100644 --- a/src/components/common/Avatar/index.tsx +++ b/src/components/common/Avatar/index.tsx @@ -1,10 +1,10 @@ -import React, { FC, useCallback } from "react"; -import { getURLFromString } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { openUserProfile } from "~/utils/user"; -import { DivProps } from "~/utils/types"; +import React, { FC, useCallback } from 'react'; +import { getURLFromString } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { openUserProfile } from '~/utils/user'; +import { DivProps } from '~/utils/types'; interface Props extends DivProps { url?: string; diff --git a/src/components/common/MenuDots/index.tsx b/src/components/common/MenuDots/index.tsx index 6adb1327..09671742 100644 --- a/src/components/common/MenuDots/index.tsx +++ b/src/components/common/MenuDots/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import styles from "~/components/flow/FlowCell/styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { ButtonProps } from "~/utils/types"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import styles from '~/components/flow/FlowCell/styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { ButtonProps } from '~/utils/types'; +import classNames from 'classnames'; interface Props extends ButtonProps {} diff --git a/src/components/common/SubTitle/index.tsx b/src/components/common/SubTitle/index.tsx index f788e8f6..49da1ddf 100644 --- a/src/components/common/SubTitle/index.tsx +++ b/src/components/common/SubTitle/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import { DivProps } from "~/utils/types"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import { DivProps } from '~/utils/types'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; interface Props extends DivProps { isLoading?: boolean; diff --git a/src/components/containers/Authorized/index.tsx b/src/components/containers/Authorized/index.tsx index 6c1219cf..7eed18e2 100644 --- a/src/components/containers/Authorized/index.tsx +++ b/src/components/containers/Authorized/index.tsx @@ -1,13 +1,12 @@ -import React, { FC } from "react"; -import { useShallowSelect } from "~/hooks/data/useShallowSelect"; -import { selectUser } from "~/redux/auth/selectors"; +import React, { FC } from 'react'; +import { useAuth } from '~/hooks/auth/useAuth'; interface IProps {} const Authorized: FC = ({ children }) => { - const user = useShallowSelect(selectUser); + const { isUser } = useAuth(); - if (!user.is_user) return null; + if (!isUser) return null; return <>{children}; }; diff --git a/src/components/containers/BlurWrapper/index.tsx b/src/components/containers/BlurWrapper/index.tsx index 4bf63dc9..f62cdf09 100644 --- a/src/components/containers/BlurWrapper/index.tsx +++ b/src/components/containers/BlurWrapper/index.tsx @@ -1,6 +1,6 @@ -import React, { AllHTMLAttributes, FC } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { AllHTMLAttributes, FC } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; type IProps = AllHTMLAttributes & { is_blurred: boolean }; diff --git a/src/components/containers/Card/index.tsx b/src/components/containers/Card/index.tsx index 1981488d..94b48f8d 100644 --- a/src/components/containers/Card/index.tsx +++ b/src/components/containers/Card/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; -import classNames from "classnames"; +import classNames from 'classnames'; type IProps = React.HTMLAttributes & { seamless?: boolean; diff --git a/src/components/containers/CellGrid/index.tsx b/src/components/containers/CellGrid/index.tsx index f0cf2ad0..a8924be7 100644 --- a/src/components/containers/CellGrid/index.tsx +++ b/src/components/containers/CellGrid/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, HTMLAttributes } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, HTMLAttributes } from 'react'; +import styles from './styles.module.scss'; -import classNames from "classnames"; +import classNames from 'classnames'; type IProps = HTMLAttributes & { children: any; diff --git a/src/components/containers/CommentWrapper/index.tsx b/src/components/containers/CommentWrapper/index.tsx index 75f0fcd3..92f6d1d0 100644 --- a/src/components/containers/CommentWrapper/index.tsx +++ b/src/components/containers/CommentWrapper/index.tsx @@ -1,11 +1,11 @@ -import React, { FC } from "react"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import classNames from 'classnames'; -import styles from "./styles.module.scss"; -import { IUser } from "~/redux/auth/types"; -import { path } from "ramda"; -import { CommentAvatar } from "~/components/comment/CommentAvatar"; -import { DivProps } from "~/utils/types"; +import styles from './styles.module.scss'; +import { IUser } from '~/types/auth'; +import { path } from 'ramda'; +import { CommentAvatar } from '~/components/comment/CommentAvatar'; +import { DivProps } from '~/utils/types'; type IProps = DivProps & { user: IUser; diff --git a/src/components/containers/CoverBackdrop/index.tsx b/src/components/containers/CoverBackdrop/index.tsx index 108c77b7..d5824b58 100644 --- a/src/components/containers/CoverBackdrop/index.tsx +++ b/src/components/containers/CoverBackdrop/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback, useEffect, useRef, useState } from "react"; -import { IUser } from "~/redux/auth/types"; -import styles from "./styles.module.scss"; -import { getURL } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import classNames from "classnames"; +import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; +import { IUser } from '~/types/auth'; +import styles from './styles.module.scss'; +import { getURL } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import classNames from 'classnames'; interface IProps { cover: IUser['cover']; diff --git a/src/components/containers/Filler/index.tsx b/src/components/containers/Filler/index.tsx index 486234b9..4eb3fe88 100644 --- a/src/components/containers/Filler/index.tsx +++ b/src/components/containers/Filler/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; type IProps = React.HTMLAttributes; diff --git a/src/components/containers/Grid/index.tsx b/src/components/containers/Grid/index.tsx index 8fa5ac70..5f6a3e7d 100644 --- a/src/components/containers/Grid/index.tsx +++ b/src/components/containers/Grid/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; type IProps = React.HTMLAttributes & { horizontal?: boolean; diff --git a/src/components/containers/Group/index.tsx b/src/components/containers/Group/index.tsx index 3af6f217..08099e28 100644 --- a/src/components/containers/Group/index.tsx +++ b/src/components/containers/Group/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; type IProps = React.HTMLAttributes & { horizontal?: boolean; diff --git a/src/components/containers/InfiniteScroll/index.tsx b/src/components/containers/InfiniteScroll/index.tsx index 2e7fffad..18011736 100644 --- a/src/components/containers/InfiniteScroll/index.tsx +++ b/src/components/containers/InfiniteScroll/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, HTMLAttributes, useCallback, useEffect, useRef } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, HTMLAttributes, useCallback, useEffect, useRef } from 'react'; +import styles from './styles.module.scss'; interface IProps extends HTMLAttributes { hasMore: boolean; diff --git a/src/components/containers/Markdown/index.tsx b/src/components/containers/Markdown/index.tsx index a8991b13..61f2a678 100644 --- a/src/components/containers/Markdown/index.tsx +++ b/src/components/containers/Markdown/index.tsx @@ -1,6 +1,6 @@ -import React, { DetailedHTMLProps, FC, HTMLAttributes } from "react"; -import styles from "~/styles/common/markdown.module.scss"; -import classNames from "classnames"; +import React, { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; +import styles from '~/styles/common/markdown.module.scss'; +import classNames from 'classnames'; interface IProps extends DetailedHTMLProps, HTMLDivElement> {} diff --git a/src/components/containers/Padder/index.tsx b/src/components/containers/Padder/index.tsx index 096032f7..32b2eab0 100644 --- a/src/components/containers/Padder/index.tsx +++ b/src/components/containers/Padder/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; -import classNames from "classnames"; +import classNames from 'classnames'; type IProps = React.HTMLAttributes & { padding?: number; diff --git a/src/components/containers/PageCoverProvider/index.tsx b/src/components/containers/PageCoverProvider/index.tsx index be466988..fc9422de 100644 --- a/src/components/containers/PageCoverProvider/index.tsx +++ b/src/components/containers/PageCoverProvider/index.tsx @@ -1,9 +1,9 @@ -import React, { createContext, FC, useContext, useState } from "react"; -import styles from "./styles.module.scss"; -import { createPortal } from "react-dom"; -import { getURL } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import { IFile } from "~/redux/types"; +import React, { createContext, FC, useContext, useState } from 'react'; +import styles from './styles.module.scss'; +import { createPortal } from 'react-dom'; +import { getURL } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import { IFile } from '~/types'; interface CoverContextValue { cover: IFile | null; diff --git a/src/components/containers/PageCoverProvider/usePageCover.ts b/src/components/containers/PageCoverProvider/usePageCover.ts index b595728a..6b80dcc3 100644 --- a/src/components/containers/PageCoverProvider/usePageCover.ts +++ b/src/components/containers/PageCoverProvider/usePageCover.ts @@ -1,5 +1,5 @@ import { useEffect } from 'react'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; import { usePageCoverContext } from '~/components/containers/PageCoverProvider/index'; export const usePageCover = (cover?: IFile) => { diff --git a/src/components/containers/Panel/index.tsx b/src/components/containers/Panel/index.tsx index 16b8bcb5..c6d369d2 100644 --- a/src/components/containers/Panel/index.tsx +++ b/src/components/containers/Panel/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, HTMLAttributes } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, HTMLAttributes } from 'react'; +import styles from './styles.module.scss'; -import classNames from "classnames"; +import classNames from 'classnames'; type IProps = HTMLAttributes & { seamless?: boolean; diff --git a/src/components/containers/Square/index.tsx b/src/components/containers/Square/index.tsx index 42b0ceec..885aeabf 100644 --- a/src/components/containers/Square/index.tsx +++ b/src/components/containers/Square/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { DivProps } from "~/utils/types"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { DivProps } from '~/utils/types'; +import classNames from 'classnames'; interface IProps extends DivProps {} diff --git a/src/components/containers/Sticky/index.tsx b/src/components/containers/Sticky/index.tsx index fb68b4d2..a1a44bb0 100644 --- a/src/components/containers/Sticky/index.tsx +++ b/src/components/containers/Sticky/index.tsx @@ -1,5 +1,5 @@ -import React, { DetailsHTMLAttributes, FC } from "react"; -import StickyBox from "react-sticky-box"; +import React, { DetailsHTMLAttributes, FC } from 'react'; +import StickyBox from 'react-sticky-box'; interface IProps extends DetailsHTMLAttributes { offsetTop?: number; diff --git a/src/components/containers/TagField/index.tsx b/src/components/containers/TagField/index.tsx index 1f781d55..18987f03 100644 --- a/src/components/containers/TagField/index.tsx +++ b/src/components/containers/TagField/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, HTMLAttributes } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, HTMLAttributes } from 'react'; +import styles from './styles.module.scss'; type IProps = HTMLAttributes & {}; diff --git a/src/containers/dialogs/BetterScrollDialog/index.tsx b/src/components/dialogs/BetterScrollDialog/index.tsx similarity index 86% rename from src/containers/dialogs/BetterScrollDialog/index.tsx rename to src/components/dialogs/BetterScrollDialog/index.tsx index 181fcd1c..4d25dbf2 100644 --- a/src/containers/dialogs/BetterScrollDialog/index.tsx +++ b/src/components/dialogs/BetterScrollDialog/index.tsx @@ -1,8 +1,8 @@ -import React, { FC, MouseEventHandler, useEffect, useRef } from "react"; -import styles from "./styles.module.scss"; -import { clearAllBodyScrollLocks, disableBodyScroll } from "body-scroll-lock"; -import { Icon } from "~/components/input/Icon"; -import { LoaderCircle } from "~/components/input/LoaderCircle"; +import React, { FC, MouseEventHandler, useEffect, useRef } from 'react'; +import styles from './styles.module.scss'; +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock'; +import { Icon } from '~/components/input/Icon'; +import { LoaderCircle } from '~/components/input/LoaderCircle'; interface IProps { children: React.ReactChild; diff --git a/src/containers/dialogs/BetterScrollDialog/styles.module.scss b/src/components/dialogs/BetterScrollDialog/styles.module.scss similarity index 100% rename from src/containers/dialogs/BetterScrollDialog/styles.module.scss rename to src/components/dialogs/BetterScrollDialog/styles.module.scss diff --git a/src/components/dialogs/DialogTitle/index.tsx b/src/components/dialogs/DialogTitle/index.tsx index ab563522..d74c5912 100644 --- a/src/components/dialogs/DialogTitle/index.tsx +++ b/src/components/dialogs/DialogTitle/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, ReactNode } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, ReactNode } from 'react'; +import styles from './styles.module.scss'; interface IProps { children: ReactNode; diff --git a/src/components/dialogs/ModalWrapper/index.tsx b/src/components/dialogs/ModalWrapper/index.tsx index d94f0c2c..a765f69d 100644 --- a/src/components/dialogs/ModalWrapper/index.tsx +++ b/src/components/dialogs/ModalWrapper/index.tsx @@ -1,6 +1,6 @@ -import React, { FC, MouseEventHandler } from "react"; -import ReactDOM from "react-dom"; -import styles from "./styles.module.scss"; +import React, { FC, MouseEventHandler } from 'react'; +import ReactDOM from 'react-dom'; +import styles from './styles.module.scss'; type IProps = { onOverlayClick: MouseEventHandler; diff --git a/src/components/dialogs/Tabs/index.tsx b/src/components/dialogs/Tabs/index.tsx index bdf09d0c..17fc9255 100644 --- a/src/components/dialogs/Tabs/index.tsx +++ b/src/components/dialogs/Tabs/index.tsx @@ -1,6 +1,6 @@ -import React, { createContext, FC, useContext, useMemo, useState, VFC } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { createContext, FC, useContext, useMemo, useState, VFC } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; interface TabProps { items: string[]; diff --git a/src/components/editors/AudioEditor/index.tsx b/src/components/editors/AudioEditor/index.tsx index 06fecdac..2b61cc6e 100644 --- a/src/components/editors/AudioEditor/index.tsx +++ b/src/components/editors/AudioEditor/index.tsx @@ -1,15 +1,15 @@ -import React, { FC, useCallback, useMemo } from "react"; -import { UploadType } from "~/constants/uploads"; -import { ImageGrid } from "../ImageGrid"; -import { AudioGrid } from "../AudioGrid"; -import styles from "./styles.module.scss"; -import { NodeEditorProps } from "~/types/node"; -import { useNodeImages } from "~/hooks/node/useNodeImages"; -import { useNodeAudios } from "~/hooks/node/useNodeAudios"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; -import { UploadDropzone } from "~/components/upload/UploadDropzone"; -import { useUploaderContext } from "~/utils/context/UploaderContextProvider"; -import { values } from "ramda"; +import React, { FC, useCallback, useMemo } from 'react'; +import { UploadType } from '~/constants/uploads'; +import { ImageGrid } from '../ImageGrid'; +import { AudioGrid } from '../AudioGrid'; +import styles from './styles.module.scss'; +import { NodeEditorProps } from '~/types/node'; +import { useNodeImages } from '~/hooks/node/useNodeImages'; +import { useNodeAudios } from '~/hooks/node/useNodeAudios'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; +import { UploadDropzone } from '~/components/upload/UploadDropzone'; +import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; +import { values } from 'ramda'; type IProps = NodeEditorProps; diff --git a/src/components/editors/AudioGrid/index.tsx b/src/components/editors/AudioGrid/index.tsx index 61e0a631..5627a38b 100644 --- a/src/components/editors/AudioGrid/index.tsx +++ b/src/components/editors/AudioGrid/index.tsx @@ -1,12 +1,12 @@ -import React, { FC, useCallback } from "react"; -import { SortEnd } from "react-sortable-hoc"; -import { IFile } from "~/redux/types"; -import { moveArrItem } from "~/utils/fn"; -import { SortableAudioGrid } from "~/components/editors/SortableAudioGrid"; +import React, { FC, useCallback } from 'react'; +import { SortEnd } from 'react-sortable-hoc'; +import { IFile } from '~/types'; +import { moveArrItem } from '~/utils/fn'; +import { SortableAudioGrid } from '~/components/editors/SortableAudioGrid'; -import styles from "./styles.module.scss"; -import { UploadStatus } from "~/store/uploader/UploaderStore"; -import { useWindowSize } from "~/hooks/dom/useWindowSize"; +import styles from './styles.module.scss'; +import { UploadStatus } from '~/store/uploader/UploaderStore'; +import { useWindowSize } from '~/hooks/dom/useWindowSize'; interface IProps { files: IFile[]; diff --git a/src/components/editors/EditorAudioUploadButton/index.tsx b/src/components/editors/EditorAudioUploadButton/index.tsx index ac4173f7..786a7576 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 { UploadType } from "~/constants/uploads"; -import { IEditorComponentProps } from "~/types/node"; +import React, { FC } from 'react'; +import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; +import { UploadType } from '~/constants/uploads'; +import { IEditorComponentProps } from '~/types/node'; type IProps = IEditorComponentProps & {}; diff --git a/src/components/editors/EditorConfirmClose/index.tsx b/src/components/editors/EditorConfirmClose/index.tsx index 36f8eb86..8324b5d3 100644 --- a/src/components/editors/EditorConfirmClose/index.tsx +++ b/src/components/editors/EditorConfirmClose/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { Button } from "~/components/input/Button"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Button } from '~/components/input/Button'; interface IProps { onApprove: () => void; diff --git a/src/components/editors/EditorFiller/index.tsx b/src/components/editors/EditorFiller/index.tsx index 3a43fc3c..64887a0e 100644 --- a/src/components/editors/EditorFiller/index.tsx +++ b/src/components/editors/EditorFiller/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import { Filler } from "~/components/containers/Filler"; -import { IEditorComponentProps } from "~/types/node"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import { Filler } from '~/components/containers/Filler'; +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 2fe712b5..67f07d2d 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 { UploadType } from "~/constants/uploads"; -import { IEditorComponentProps } from "~/types/node"; +import React, { FC } from 'react'; +import { EditorUploadButton } from '~/components/editors/EditorUploadButton'; +import { UploadType } from '~/constants/uploads'; +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 30c75c28..b6a59b52 100644 --- a/src/components/editors/EditorPublicSwitch/index.tsx +++ b/src/components/editors/EditorPublicSwitch/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback } from "react"; -import { IEditorComponentProps } from "~/types/node"; -import { Button } from "~/components/input/Button"; -import { Icon } from "~/components/input/Icon"; -import styles from "./styles.module.scss"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; +import React, { FC, useCallback } from 'react'; +import { IEditorComponentProps } from '~/types/node'; +import { Button } from '~/components/input/Button'; +import { Icon } from '~/components/input/Icon'; +import styles from './styles.module.scss'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; interface IProps extends IEditorComponentProps {} diff --git a/src/components/editors/EditorUploadButton/index.tsx b/src/components/editors/EditorUploadButton/index.tsx index 4a320ffe..e0f1f5c4 100644 --- a/src/components/editors/EditorUploadButton/index.tsx +++ b/src/components/editors/EditorUploadButton/index.tsx @@ -1,12 +1,12 @@ -import React, { ChangeEvent, FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { UploadType } from "~/constants/uploads"; -import { IEditorComponentProps } from "~/types/node"; -import { getFileType } from "~/utils/uploader"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; -import { Button } from "~/components/input/Button"; -import { useUploaderContext } from "~/utils/context/UploaderContextProvider"; +import React, { ChangeEvent, FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { UploadType } from '~/constants/uploads'; +import { IEditorComponentProps } from '~/types/node'; +import { getFileType } from '~/utils/uploader'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; +import { Button } from '~/components/input/Button'; +import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; type IProps = IEditorComponentProps & { accept?: string; diff --git a/src/components/editors/EditorUploadCoverButton/index.tsx b/src/components/editors/EditorUploadCoverButton/index.tsx index 4868e4ac..8f9f509d 100644 --- a/src/components/editors/EditorUploadCoverButton/index.tsx +++ b/src/components/editors/EditorUploadCoverButton/index.tsx @@ -1,13 +1,13 @@ -import React, { ChangeEvent, FC, useCallback, useEffect } from "react"; -import styles from "./styles.module.scss"; -import { UploadSubject, UploadTarget, UploadType } from "~/constants/uploads"; -import { getURL } from "~/utils/dom"; -import { Icon } from "~/components/input/Icon"; -import { PRESETS } from "~/constants/urls"; -import { IEditorComponentProps } from "~/types/node"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; -import { getFileType } from "~/utils/uploader"; -import { useUploader } from "~/hooks/data/useUploader"; +import React, { ChangeEvent, FC, useCallback, useEffect } from 'react'; +import styles from './styles.module.scss'; +import { UploadSubject, UploadTarget, UploadType } from '~/constants/uploads'; +import { getURL } from '~/utils/dom'; +import { Icon } from '~/components/input/Icon'; +import { PRESETS } from '~/constants/urls'; +import { IEditorComponentProps } from '~/types/node'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; +import { getFileType } from '~/utils/uploader'; +import { useUploader } from '~/hooks/data/useUploader'; type IProps = IEditorComponentProps & {}; diff --git a/src/components/editors/ImageEditor/index.tsx b/src/components/editors/ImageEditor/index.tsx index 192d8af5..2d3eb0be 100644 --- a/src/components/editors/ImageEditor/index.tsx +++ b/src/components/editors/ImageEditor/index.tsx @@ -1,10 +1,10 @@ -import React, { FC } from "react"; -import { ImageGrid } from "~/components/editors/ImageGrid"; -import styles from "./styles.module.scss"; -import { NodeEditorProps } from "~/types/node"; -import { UploadDropzone } from "~/components/upload/UploadDropzone"; -import { useUploaderContext } from "~/utils/context/UploaderContextProvider"; -import { values } from "ramda"; +import React, { FC } from 'react'; +import { ImageGrid } from '~/components/editors/ImageGrid'; +import styles from './styles.module.scss'; +import { NodeEditorProps } from '~/types/node'; +import { UploadDropzone } from '~/components/upload/UploadDropzone'; +import { useUploaderContext } from '~/utils/context/UploaderContextProvider'; +import { values } from 'ramda'; type IProps = NodeEditorProps; diff --git a/src/components/editors/ImageGrid/index.tsx b/src/components/editors/ImageGrid/index.tsx index f9696d4f..e35a0955 100644 --- a/src/components/editors/ImageGrid/index.tsx +++ b/src/components/editors/ImageGrid/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, useCallback } from "react"; -import { SortEnd } from "react-sortable-hoc"; -import styles from "./styles.module.scss"; -import { IFile } from "~/redux/types"; -import { moveArrItem } from "~/utils/fn"; -import { SortableImageGrid } from "~/components/editors/SortableImageGrid"; -import { UploadStatus } from "~/store/uploader/UploaderStore"; -import { useWindowSize } from "~/hooks/dom/useWindowSize"; +import React, { FC, useCallback } from 'react'; +import { SortEnd } from 'react-sortable-hoc'; +import styles from './styles.module.scss'; +import { IFile } from '~/types'; +import { moveArrItem } from '~/utils/fn'; +import { SortableImageGrid } from '~/components/editors/SortableImageGrid'; +import { UploadStatus } from '~/store/uploader/UploaderStore'; +import { useWindowSize } from '~/hooks/dom/useWindowSize'; interface IProps { files: IFile[]; diff --git a/src/components/editors/SortableAudioGrid/index.tsx b/src/components/editors/SortableAudioGrid/index.tsx index 9af0cc0b..40eb3ddd 100644 --- a/src/components/editors/SortableAudioGrid/index.tsx +++ b/src/components/editors/SortableAudioGrid/index.tsx @@ -3,7 +3,7 @@ import { SortableContainer } from 'react-sortable-hoc'; import { AudioUpload } from '~/components/upload/AudioUpload'; import styles from './styles.module.scss'; import { SortableAudioGridItem } from '~/components/editors/SortableAudioGridItem'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; import { AudioPlayer } from '~/components/media/AudioPlayer'; import { UploadStatus } from '~/store/uploader/UploaderStore'; diff --git a/src/components/editors/SortableImageGrid/index.tsx b/src/components/editors/SortableImageGrid/index.tsx index 52bcec4e..7dbe9a62 100644 --- a/src/components/editors/SortableImageGrid/index.tsx +++ b/src/components/editors/SortableImageGrid/index.tsx @@ -3,7 +3,7 @@ import { SortableContainer } from 'react-sortable-hoc'; import { ImageUpload } from '~/components/upload/ImageUpload'; import styles from './styles.module.scss'; import { SortableImageGridItem } from '~/components/editors/SortableImageGridItem'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import classNames from 'classnames'; diff --git a/src/components/editors/TextEditor/index.tsx b/src/components/editors/TextEditor/index.tsx index 44e9f5ce..b11afe05 100644 --- a/src/components/editors/TextEditor/index.tsx +++ b/src/components/editors/TextEditor/index.tsx @@ -1,10 +1,10 @@ -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 "~/types/node"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; -import { useRandomPhrase } from "~/constants/phrases"; +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 '~/types/node'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; +import { useRandomPhrase } from '~/constants/phrases'; type IProps = NodeEditorProps & {}; diff --git a/src/components/editors/VideoEditor/index.tsx b/src/components/editors/VideoEditor/index.tsx index dd67a4db..a3621f6f 100644 --- a/src/components/editors/VideoEditor/index.tsx +++ b/src/components/editors/VideoEditor/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, useCallback, useMemo } from "react"; -import styles from "./styles.module.scss"; -import { path } from "ramda"; -import { InputText } from "~/components/input/InputText"; -import classnames from "classnames"; -import { getYoutubeThumb } from "~/utils/dom"; -import { NodeEditorProps } from "~/types/node"; -import { useNodeFormContext } from "~/hooks/node/useNodeFormFormik"; +import React, { FC, useCallback, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { path } from 'ramda'; +import { InputText } from '~/components/input/InputText'; +import classnames from 'classnames'; +import { getYoutubeThumb } from '~/utils/dom'; +import { NodeEditorProps } from '~/types/node'; +import { useNodeFormContext } from '~/hooks/node/useNodeFormFormik'; type IProps = NodeEditorProps & {}; diff --git a/src/components/flow/CellShade/index.tsx b/src/components/flow/CellShade/index.tsx index 0ad17a1e..64874497 100644 --- a/src/components/flow/CellShade/index.tsx +++ b/src/components/flow/CellShade/index.tsx @@ -1,10 +1,10 @@ -import React, { FC, useMemo } from "react"; -import styles from "./styles.module.scss"; -import { DEFAULT_DOMINANT_COLOR } from "~/constants/node"; -import { DivProps } from "~/utils/types"; -import classNames from "classnames"; -import { transparentize } from "color2k"; -import { normalizeBrightColor } from "~/utils/color"; +import React, { FC, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; +import { DivProps } from '~/utils/types'; +import classNames from 'classnames'; +import { transparentize } from 'color2k'; +import { normalizeBrightColor } from '~/utils/color'; interface Props extends DivProps { color?: string; diff --git a/src/components/flow/FlowCell/index.tsx b/src/components/flow/FlowCell/index.tsx index d3a72026..0d9e83a7 100644 --- a/src/components/flow/FlowCell/index.tsx +++ b/src/components/flow/FlowCell/index.tsx @@ -1,15 +1,15 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { NavLink } from "react-router-dom"; -import { CellShade } from "~/components/flow/CellShade"; -import { FlowDisplay, INode } from "~/redux/types"; -import { FlowCellText } from "~/components/flow/FlowCellText"; -import classNames from "classnames"; -import { FlowCellMenu } from "~/components/flow/FlowCellMenu"; -import { useFlowCellControls } from "~/hooks/flow/useFlowCellControls"; -import { useClickOutsideFocus } from "~/hooks/dom/useClickOutsideFocus"; -import { MenuDots } from "~/components/common/MenuDots"; -import { FlowCellImage } from "~/components/flow/FlowCellImage"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { NavLink } from 'react-router-dom'; +import { CellShade } from '~/components/flow/CellShade'; +import { FlowDisplay, INode } from '~/types'; +import { FlowCellText } from '~/components/flow/FlowCellText'; +import classNames from 'classnames'; +import { FlowCellMenu } from '~/components/flow/FlowCellMenu'; +import { useFlowCellControls } from '~/hooks/flow/useFlowCellControls'; +import { useClickOutsideFocus } from '~/hooks/dom/useClickOutsideFocus'; +import { MenuDots } from '~/components/common/MenuDots'; +import { FlowCellImage } from '~/components/flow/FlowCellImage'; interface Props { id: INode['id']; diff --git a/src/components/flow/FlowCellImage/index.tsx b/src/components/flow/FlowCellImage/index.tsx index 8c795ddd..3ac34dfc 100644 --- a/src/components/flow/FlowCellImage/index.tsx +++ b/src/components/flow/FlowCellImage/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import { IMGProps } from "~/utils/types"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import { IMGProps } from '~/utils/types'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; interface Props extends IMGProps { height?: number; diff --git a/src/components/flow/FlowCellImageLazyLoad/index.tsx b/src/components/flow/FlowCellImageLazyLoad/index.tsx index 857987d5..bb43419b 100644 --- a/src/components/flow/FlowCellImageLazyLoad/index.tsx +++ b/src/components/flow/FlowCellImageLazyLoad/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import LazyLoad from "react-lazyload"; -import { IMGProps } from "~/utils/types"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import LazyLoad from 'react-lazyload'; +import { IMGProps } from '~/utils/types'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; interface Props extends IMGProps { height?: number; diff --git a/src/components/flow/FlowCellMenu/index.tsx b/src/components/flow/FlowCellMenu/index.tsx index 040cdd58..23886369 100644 --- a/src/components/flow/FlowCellMenu/index.tsx +++ b/src/components/flow/FlowCellMenu/index.tsx @@ -1,10 +1,10 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import classNames from "classnames"; -import { Toggle } from "~/components/input/Toggle"; -import { Group } from "~/components/containers/Group"; -import { FlowDisplayVariant } from "~/redux/types"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import classNames from 'classnames'; +import { Toggle } from '~/components/input/Toggle'; +import { Group } from '~/components/containers/Group'; +import { FlowDisplayVariant } from '~/types'; interface Props { onClose: () => void; diff --git a/src/components/flow/FlowCellText/index.tsx b/src/components/flow/FlowCellText/index.tsx index d25ca911..26b6ffd1 100644 --- a/src/components/flow/FlowCellText/index.tsx +++ b/src/components/flow/FlowCellText/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, ReactElement } from "react"; -import { Markdown } from "~/components/containers/Markdown"; -import { DivProps } from "~/utils/types"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { formatText } from "~/utils/dom"; +import React, { FC, ReactElement } from 'react'; +import { Markdown } from '~/components/containers/Markdown'; +import { DivProps } from '~/utils/types'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { formatText } from '~/utils/dom'; interface Props extends DivProps { children: string; diff --git a/src/components/flow/FlowGrid/index.tsx b/src/components/flow/FlowGrid/index.tsx index 68408d25..e0c16bdc 100644 --- a/src/components/flow/FlowGrid/index.tsx +++ b/src/components/flow/FlowGrid/index.tsx @@ -1,12 +1,12 @@ -import React, { FC, Fragment } from "react"; -import { FlowDisplay, IFlowNode, INode } from "~/redux/types"; -import { IUser } from "~/redux/auth/types"; -import { PRESETS, URLS } from "~/constants/urls"; -import { FlowCell } from "~/components/flow/FlowCell"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { getURLFromString } from "~/utils/dom"; -import { canEditNode } from "~/utils/node"; +import React, { FC, Fragment } from 'react'; +import { FlowDisplay, IFlowNode, INode } from '~/types'; +import { IUser } from '~/types/auth'; +import { PRESETS, URLS } from '~/constants/urls'; +import { FlowCell } from '~/components/flow/FlowCell'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { getURLFromString } from '~/utils/dom'; +import { canEditNode } from '~/utils/node'; interface Props { nodes: IFlowNode[]; diff --git a/src/components/flow/FlowRecent/index.tsx b/src/components/flow/FlowRecent/index.tsx index a3f4c1e5..cabc8f3f 100644 --- a/src/components/flow/FlowRecent/index.tsx +++ b/src/components/flow/FlowRecent/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import { FlowRecentItem } from "../FlowRecentItem"; -import styles from "./styles.module.scss"; -import { IFlowNode } from "~/redux/types"; +import React, { FC } from 'react'; +import { FlowRecentItem } from '../FlowRecentItem'; +import styles from './styles.module.scss'; +import { IFlowNode } from '~/types'; interface IProps { recent: IFlowNode[]; diff --git a/src/components/flow/FlowRecentItem/index.tsx b/src/components/flow/FlowRecentItem/index.tsx index bcc0048c..381ac07b 100644 --- a/src/components/flow/FlowRecentItem/index.tsx +++ b/src/components/flow/FlowRecentItem/index.tsx @@ -1,12 +1,12 @@ -import React, { FC } from "react"; -import { INode } from "~/redux/types"; -import styles from "./styles.module.scss"; -import { URLS } from "~/constants/urls"; -import { NodeRelatedItem } from "~/components/node/NodeRelatedItem"; -import { getPrettyDate } from "~/utils/dom"; -import { Link } from "react-router-dom"; -import classNames from "classnames"; -import { Icon } from "~/components/input/Icon"; +import React, { FC } from 'react'; +import { INode } from '~/types'; +import styles from './styles.module.scss'; +import { URLS } from '~/constants/urls'; +import { NodeRelatedItem } from '~/components/node/NodeRelatedItem'; +import { getPrettyDate } from '~/utils/dom'; +import { Link } from 'react-router-dom'; +import classNames from 'classnames'; +import { Icon } from '~/components/input/Icon'; interface IProps { node: Partial; diff --git a/src/components/flow/FlowSearchResults/index.tsx b/src/components/flow/FlowSearchResults/index.tsx index c47ba230..507376f7 100644 --- a/src/components/flow/FlowSearchResults/index.tsx +++ b/src/components/flow/FlowSearchResults/index.tsx @@ -1,9 +1,9 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { FlowRecentItem } from "../FlowRecentItem"; -import { Icon } from "~/components/input/Icon"; -import { INode } from "~/redux/types"; -import { InfiniteScroll } from "~/components/containers/InfiniteScroll"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { FlowRecentItem } from '../FlowRecentItem'; +import { Icon } from '~/components/input/Icon'; +import { INode } from '~/types'; +import { InfiniteScroll } from '~/components/containers/InfiniteScroll'; interface IProps { isLoading: boolean; diff --git a/src/components/flow/FlowSwiperHero/index.tsx b/src/components/flow/FlowSwiperHero/index.tsx index c6cde0b5..93e6ecd7 100644 --- a/src/components/flow/FlowSwiperHero/index.tsx +++ b/src/components/flow/FlowSwiperHero/index.tsx @@ -10,7 +10,7 @@ import SwiperClass from 'swiper/types/swiper-class'; import { LoaderCircle } from '~/components/input/LoaderCircle'; import { useHistory } from 'react-router'; import classNames from 'classnames'; -import { IFlowNode } from '~/redux/types'; +import { IFlowNode } from '~/types'; import { useWindowSize } from '~/hooks/dom/useWindowSize'; SwiperCore.use([EffectFade, Lazy, Autoplay, Navigation]); diff --git a/src/components/input/ArcProgress/index.tsx b/src/components/input/ArcProgress/index.tsx index e15f5cc2..12309968 100644 --- a/src/components/input/ArcProgress/index.tsx +++ b/src/components/input/ArcProgress/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { describeArc } from "~/utils/dom"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { describeArc } from '~/utils/dom'; interface IProps { size: number; diff --git a/src/components/input/Button/index.tsx b/src/components/input/Button/index.tsx index fb6e6987..fa87e5f5 100644 --- a/src/components/input/Button/index.tsx +++ b/src/components/input/Button/index.tsx @@ -1,10 +1,10 @@ -import classnames from "classnames"; -import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, memo, useMemo } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { IIcon } from "~/redux/types"; -import Tippy from "@tippy.js/react"; -import "tippy.js/dist/tippy.css"; +import classnames from 'classnames'; +import React, { ButtonHTMLAttributes, DetailedHTMLProps, FC, memo, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { IIcon } from '~/types'; +import Tippy from '@tippy.js/react'; +import 'tippy.js/dist/tippy.css'; type IButtonProps = DetailedHTMLProps< ButtonHTMLAttributes, diff --git a/src/components/input/ButtonGroup/index.tsx b/src/components/input/ButtonGroup/index.tsx index 325e1f35..6fd1b73c 100644 --- a/src/components/input/ButtonGroup/index.tsx +++ b/src/components/input/ButtonGroup/index.tsx @@ -1,6 +1,6 @@ -import React, { HTMLAttributes } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { HTMLAttributes } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; type IProps = HTMLAttributes & {}; diff --git a/src/components/input/DropHereIcon/index.tsx b/src/components/input/DropHereIcon/index.tsx index ccb81445..8711d3ca 100644 --- a/src/components/input/DropHereIcon/index.tsx +++ b/src/components/input/DropHereIcon/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { SVGProps } from "~/utils/types"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { SVGProps } from '~/utils/types'; interface Props extends SVGProps {} diff --git a/src/components/input/Icon/index.tsx b/src/components/input/Icon/index.tsx index 56a1e387..67abc50d 100644 --- a/src/components/input/Icon/index.tsx +++ b/src/components/input/Icon/index.tsx @@ -1,5 +1,5 @@ -import React, { FC } from "react"; -import { IIcon } from "~/redux/types"; +import React, { FC } from 'react'; +import { IIcon } from '~/types'; type IProps = React.SVGAttributes & { size?: number; diff --git a/src/components/input/InputText/index.tsx b/src/components/input/InputText/index.tsx index 35f489f2..62cc7a39 100644 --- a/src/components/input/InputText/index.tsx +++ b/src/components/input/InputText/index.tsx @@ -1,6 +1,6 @@ import React, { ChangeEvent, FC, useCallback, useState } from 'react'; import classNames from 'classnames'; -import { IInputTextProps } from '~/redux/types'; +import { IInputTextProps } from '~/types'; import { useTranslatedError } from '~/hooks/data/useTranslatedError'; import { InputWrapper } from '~/components/input/InputWrapper'; import styles from './styles.module.scss'; diff --git a/src/components/input/InputWrapper/index.tsx b/src/components/input/InputWrapper/index.tsx index 6534b6f6..472480a5 100644 --- a/src/components/input/InputWrapper/index.tsx +++ b/src/components/input/InputWrapper/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; interface InputWrapperProps { title?: string; diff --git a/src/components/input/LoaderCircle/index.tsx b/src/components/input/LoaderCircle/index.tsx index fd4d17de..83f23a9a 100644 --- a/src/components/input/LoaderCircle/index.tsx +++ b/src/components/input/LoaderCircle/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { LoaderCircleInner } from "~/components/input/LoaderCircleInner"; -import { SVGProps } from "~/utils/types"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { LoaderCircleInner } from '~/components/input/LoaderCircleInner'; +import { SVGProps } from '~/utils/types'; interface IProps extends SVGProps { size?: number; diff --git a/src/components/input/LoaderCircleInner/index.tsx b/src/components/input/LoaderCircleInner/index.tsx index 07e482c3..f1bec199 100644 --- a/src/components/input/LoaderCircleInner/index.tsx +++ b/src/components/input/LoaderCircleInner/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, SVGAttributes } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, SVGAttributes } from 'react'; +import styles from './styles.module.scss'; interface IProps extends SVGAttributes { size: number; diff --git a/src/components/input/Textarea/index.tsx b/src/components/input/Textarea/index.tsx index 1d867b82..3cefba8a 100644 --- a/src/components/input/Textarea/index.tsx +++ b/src/components/input/Textarea/index.tsx @@ -5,14 +5,14 @@ import React, { TextareaHTMLAttributes, useCallback, useEffect, - useState -} from "react"; -import classNames from "classnames"; -import autosize from "autosize"; -import styles from "./styles.module.scss"; + useState, +} from 'react'; +import classNames from 'classnames'; +import autosize from 'autosize'; +import styles from './styles.module.scss'; -import { InputWrapper } from "~/components/input/InputWrapper"; -import { useForwardRef } from "~/hooks/dom/useForwardRef"; +import { InputWrapper } from '~/components/input/InputWrapper'; +import { useForwardRef } from '~/hooks/dom/useForwardRef'; type IProps = DetailedHTMLProps< TextareaHTMLAttributes, diff --git a/src/components/input/Toggle/index.tsx b/src/components/input/Toggle/index.tsx index cd4cbad4..485e0339 100644 --- a/src/components/input/Toggle/index.tsx +++ b/src/components/input/Toggle/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { ButtonProps } from "~/utils/types"; +import React, { FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { ButtonProps } from '~/utils/types'; type ToggleColor = 'primary' | 'secondary' | 'lab' | 'danger' | 'white'; diff --git a/src/components/lab/LabBanner/index.tsx b/src/components/lab/LabBanner/index.tsx index d0cf5106..14aafec8 100644 --- a/src/components/lab/LabBanner/index.tsx +++ b/src/components/lab/LabBanner/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { Square } from "~/components/containers/Square"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Square } from '~/components/containers/Square'; interface IProps {} diff --git a/src/components/lab/LabBottomPanel/index.tsx b/src/components/lab/LabBottomPanel/index.tsx index c5dec9c9..c8fb98b7 100644 --- a/src/components/lab/LabBottomPanel/index.tsx +++ b/src/components/lab/LabBottomPanel/index.tsx @@ -1,15 +1,15 @@ -import React, { FC, useCallback } from "react"; -import { Group } from "~/components/containers/Group"; -import { Filler } from "~/components/containers/Filler"; -import styles from "./styles.module.scss"; -import { getPrettyDate } from "~/utils/dom"; -import { INode } from "~/redux/types"; -import { Icon } from "~/components/input/Icon"; -import classNames from "classnames"; -import { Grid } from "~/components/containers/Grid"; -import { useHistory } from "react-router"; -import { URLS } from "~/constants/urls"; -import { Placeholder } from "~/components/placeholders/Placeholder"; +import React, { FC, useCallback } from 'react'; +import { Group } from '~/components/containers/Group'; +import { Filler } from '~/components/containers/Filler'; +import styles from './styles.module.scss'; +import { getPrettyDate } from '~/utils/dom'; +import { INode } from '~/types'; +import { Icon } from '~/components/input/Icon'; +import classNames from 'classnames'; +import { Grid } from '~/components/containers/Grid'; +import { useHistory } from 'react-router'; +import { URLS } from '~/constants/urls'; +import { Placeholder } from '~/components/placeholders/Placeholder'; type Props = { node: INode; diff --git a/src/components/lab/LabHead/index.tsx b/src/components/lab/LabHead/index.tsx index ed391ec2..68262270 100644 --- a/src/components/lab/LabHead/index.tsx +++ b/src/components/lab/LabHead/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { LabHeadItem } from "~/components/lab/LabHeadItem"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { LabHeadItem } from '~/components/lab/LabHeadItem'; interface IProps { isLoading?: boolean; diff --git a/src/components/lab/LabHeadItem/index.tsx b/src/components/lab/LabHeadItem/index.tsx index 209bd938..b4f51583 100644 --- a/src/components/lab/LabHeadItem/index.tsx +++ b/src/components/lab/LabHeadItem/index.tsx @@ -1,9 +1,9 @@ -import React, { FC } from "react"; -import { Group } from "~/components/containers/Group"; -import { Icon } from "~/components/input/Icon"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; +import React, { FC } from 'react'; +import { Group } from '~/components/containers/Group'; +import { Icon } from '~/components/input/Icon'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; interface IProps { icon: string; diff --git a/src/components/lab/LabHero/index.tsx b/src/components/lab/LabHero/index.tsx index d09e45bf..761f4997 100644 --- a/src/components/lab/LabHero/index.tsx +++ b/src/components/lab/LabHero/index.tsx @@ -1,12 +1,12 @@ -import React, { FC, useCallback } from "react"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import { Group } from "~/components/containers/Group"; -import { Icon } from "~/components/input/Icon"; -import styles from "./styles.module.scss"; -import { INode } from "~/redux/types"; -import { getPrettyDate } from "~/utils/dom"; -import { URLS } from "~/constants/urls"; -import { useHistory } from "react-router-dom"; +import React, { FC, useCallback } from 'react'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import { Group } from '~/components/containers/Group'; +import { Icon } from '~/components/input/Icon'; +import styles from './styles.module.scss'; +import { INode } from '~/types'; +import { getPrettyDate } from '~/utils/dom'; +import { URLS } from '~/constants/urls'; +import { useHistory } from 'react-router-dom'; interface IProps { node?: Partial; diff --git a/src/components/lab/LabHeroes/index.tsx b/src/components/lab/LabHeroes/index.tsx index 418fadf9..b7d20d04 100644 --- a/src/components/lab/LabHeroes/index.tsx +++ b/src/components/lab/LabHeroes/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import { INode } from "~/redux/types"; -import styles from "~/containers/lab/LabStats/styles.module.scss"; -import { LabHero } from "~/components/lab/LabHero"; -import { Group } from "~/components/containers/Group"; +import React, { FC } from 'react'; +import { INode } from '~/types'; +import styles from '~/containers/lab/LabStats/styles.module.scss'; +import { LabHero } from '~/components/lab/LabHero'; +import { Group } from '~/components/containers/Group'; interface IProps { nodes: Partial[]; diff --git a/src/components/lab/LabLine/index.tsx b/src/components/lab/LabLine/index.tsx index 264e6159..92966e98 100644 --- a/src/components/lab/LabLine/index.tsx +++ b/src/components/lab/LabLine/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { INodeComponentProps } from "~/constants/node"; -import { useColorGradientFromString } from "~/hooks/color/useColorGradientFromString"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { INodeComponentProps } from '~/constants/node'; +import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; interface Props extends INodeComponentProps {} diff --git a/src/components/lab/LabNode/index.tsx b/src/components/lab/LabNode/index.tsx index 0e4ac303..8ef757ae 100644 --- a/src/components/lab/LabNode/index.tsx +++ b/src/components/lab/LabNode/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, useMemo } from "react"; -import { INode } from "~/redux/types"; -import { useNodeBlocks } from "~/hooks/node/useNodeBlocks"; -import styles from "./styles.module.scss"; -import { LabBottomPanel } from "~/components/lab/LabBottomPanel"; -import { isAfter, parseISO } from "date-fns"; -import classNames from "classnames"; -import { useColorGradientFromString } from "~/hooks/color/useColorGradientFromString"; +import React, { FC, useMemo } from 'react'; +import { INode } from '~/types'; +import { useNodeBlocks } from '~/hooks/node/useNodeBlocks'; +import styles from './styles.module.scss'; +import { LabBottomPanel } from '~/components/lab/LabBottomPanel'; +import { isAfter, parseISO } from 'date-fns'; +import classNames from 'classnames'; +import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; interface IProps { node: INode; diff --git a/src/components/lab/LabTags/index.tsx b/src/components/lab/LabTags/index.tsx index 9f51c026..f3653f23 100644 --- a/src/components/lab/LabTags/index.tsx +++ b/src/components/lab/LabTags/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import styles from ".//styles.module.scss"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import { ITag } from "~/redux/types"; -import { Tag } from "~/components/tags/Tag"; +import React, { FC } from 'react'; +import styles from './/styles.module.scss'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import { ITag } from '~/types'; +import { Tag } from '~/components/tags/Tag'; interface IProps { tags: ITag[]; diff --git a/src/components/main/Footer/index.tsx b/src/components/main/Footer/index.tsx index 945bf6b3..5f494000 100644 --- a/src/components/main/Footer/index.tsx +++ b/src/components/main/Footer/index.tsx @@ -1,5 +1,5 @@ -import React, { FC, memo } from "react"; -import styles from "./styles.module.scss"; +import React, { FC, memo } from 'react'; +import styles from './styles.module.scss'; interface IProps {} diff --git a/src/components/main/GodRays/index.tsx b/src/components/main/GodRays/index.tsx index 86a52eb6..299fc562 100644 --- a/src/components/main/GodRays/index.tsx +++ b/src/components/main/GodRays/index.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import * as React from 'react'; interface IGodRaysProps { raised?: boolean; diff --git a/src/components/main/Header/index.tsx b/src/components/main/Header/index.tsx deleted file mode 100644 index 00e77f62..00000000 --- a/src/components/main/Header/index.tsx +++ /dev/null @@ -1,152 +0,0 @@ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { connect } from 'react-redux'; -import { push as historyPush } from 'connected-react-router'; -import { Link } from 'react-router-dom'; -import { Logo } from '~/components/main/Logo'; - -import { Filler } from '~/components/containers/Filler'; -import { selectAuthUpdates, selectUser } from '~/redux/auth/selectors'; -import { path, pick } from 'ramda'; -import { UserButton } from '../UserButton'; -import { Notifications } from '../Notifications'; -import { URLS } from '~/constants/urls'; -import classNames from 'classnames'; - -import styles from './styles.module.scss'; -import * as AUTH_ACTIONS from '~/redux/auth/actions'; -import { IState } from '~/redux/store'; -import isBefore from 'date-fns/isBefore'; -import { Authorized } from '~/components/containers/Authorized'; -import { Button } from '~/components/input/Button'; -import { useFlowStore } from '~/store/flow/useFlowStore'; -import { observer } from 'mobx-react'; -import { useShowModal } from '~/hooks/modal/useShowModal'; -import { Dialog } from '~/constants/modal'; -import { useGetLabStats } from '~/hooks/lab/useGetLabStats'; - -const mapStateToProps = (state: IState) => ({ - user: pick(['username', 'is_user', 'photo', 'last_seen_boris'])(selectUser(state)), - updates: pick(['boris_commented_at'])(selectAuthUpdates(state)), - pathname: path(['router', 'location', 'pathname'], state), -}); - -const mapDispatchToProps = { - push: historyPush, - authLogout: AUTH_ACTIONS.authLogout, - authOpenProfile: AUTH_ACTIONS.authOpenProfile, -}; - -type IProps = ReturnType & typeof mapDispatchToProps & {}; - -const HeaderUnconnected: FC = observer( - ({ - user, - user: { is_user, last_seen_boris }, - pathname, - updates: { boris_commented_at }, - authLogout, - authOpenProfile, - }) => { - const [is_scrolled, setIsScrolled] = useState(false); - const { updated: flowUpdates } = useFlowStore(); - const onLogin = useShowModal(Dialog.Login); - const labStats = useGetLabStats(); - - const onScroll = useCallback(() => { - const active = window.scrollY > 32; - - if (active !== is_scrolled) setIsScrolled(active); - }, [is_scrolled, setIsScrolled]); - - useEffect(() => { - onScroll(); - }, [onScroll]); - - useEffect(() => { - window.addEventListener('scroll', onScroll); - return () => window.removeEventListener('scroll', onScroll); - }, [onScroll]); - - const hasBorisUpdates = useMemo( - () => - is_user && - boris_commented_at && - (!last_seen_boris || isBefore(new Date(last_seen_boris), new Date(boris_commented_at))), - [boris_commented_at, is_user, last_seen_boris] - ); - - const hasLabUpdates = useMemo(() => labStats.updates.length > 0, [labStats.updates]); - const hasFlowUpdates = useMemo(() => flowUpdates.length > 0, [flowUpdates]); - - return ( -
-
-
- -
- - - -
- - - ФЛОУ - - - - ЛАБ - - - - БОРИС - - - - {is_user && ( -
- -
- )} -
- - {is_user && ( - - )} - - {!is_user && ( - - )} -
-
- ); - } -); - -const Header = connect(mapStateToProps, mapDispatchToProps)(HeaderUnconnected); - -export { Header }; diff --git a/src/components/main/Notifications/index.tsx b/src/components/main/Notifications/index.tsx deleted file mode 100644 index 6f65f41b..00000000 --- a/src/components/main/Notifications/index.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import { Icon } from '~/components/input/Icon'; -import styles from './styles.module.scss'; -import { connect } from 'react-redux'; -import { selectAuthUpdates, selectAuthUser } from '~/redux/auth/selectors'; -import { pick } from 'ramda'; -import classNames from 'classnames'; -import * as AUTH_ACTIONS from '~/redux/auth/actions'; -import { NotificationBubble } from '../../notifications/NotificationBubble'; -import { IMessageNotification, INotification } from '~/redux/types'; - -const mapStateToProps = state => ({ - user: pick(['last_seen_messages'], selectAuthUser(state)), - updates: selectAuthUpdates(state), -}); - -const mapDispatchToProps = { - authSetLastSeenMessages: AUTH_ACTIONS.authSetLastSeenMessages, - authOpenProfile: AUTH_ACTIONS.authOpenProfile, -}; - -type IProps = ReturnType & typeof mapDispatchToProps & {}; - -const NotificationsUnconnected: FC = ({ - updates: { last, notifications }, - user: { last_seen_messages }, - authSetLastSeenMessages, - authOpenProfile, -}) => { - const [visible, setVisible] = useState(false); - const has_new = useMemo( - () => - notifications.length && - last && - Date.parse(last) && - (!last_seen_messages || - (Date.parse(last_seen_messages) && Date.parse(last) > Date.parse(last_seen_messages))), - [last, last_seen_messages, notifications] - ); - - const onNotificationClick = useCallback( - (notification: INotification) => { - switch (notification.type) { - case 'message': - if (!(notification as IMessageNotification)?.content?.from?.username) { - return; - } - - return authOpenProfile((notification as IMessageNotification).content.from!.username); - default: - return; - } - }, - [authOpenProfile] - ); - const showList = useCallback(() => setVisible(true), [setVisible]); - const hideList = useCallback(() => setVisible(false), [setVisible]); - - useEffect(() => { - if (!visible || !has_new || !last) return; - authSetLastSeenMessages(last); - }, [visible, last, has_new, authSetLastSeenMessages]); - - return ( -
0, - })} - > -
- {has_new ? : } -
- - {visible && ( - - )} -
- ); -}; - -const Notifications = connect(mapStateToProps, mapDispatchToProps)(NotificationsUnconnected); - -export { Notifications }; diff --git a/src/components/main/Notifications/styles.module.scss b/src/components/main/Notifications/styles.module.scss deleted file mode 100644 index cf110f0a..00000000 --- a/src/components/main/Notifications/styles.module.scss +++ /dev/null @@ -1,51 +0,0 @@ -@import "src/styles/variables"; - -@keyframes ring { - 0% { - transform: rotate(-10deg); - } - - 20% { - transform: rotate(10deg); - } - - 40% { - transform: rotate(-10deg); - } - - 100% { - transform: rotate(0); - } -} - -.wrap { - fill: white; - position: relative; - outline: none; - color: white; - word-wrap: initial; - white-space: initial; - - &.active { - .icon { - opacity: 1; - } - } - - &.is_new { - .icon { - animation: ring 1s infinite alternate; - opacity: 1; - - svg { - fill: $red; - } - } - } -} - -.icon { - outline: none; - cursor: pointer; - opacity: 0.5; -} diff --git a/src/components/main/SidePane/index.tsx b/src/components/main/SidePane/index.tsx index 2db2bfb7..e952bc87 100644 --- a/src/components/main/SidePane/index.tsx +++ b/src/components/main/SidePane/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback, useEffect, useState } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; +import React, { FC, useCallback, useEffect, useState } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; interface IProps {} diff --git a/src/components/main/UserButton/index.tsx b/src/components/main/UserButton/index.tsx index b4e31d51..df563163 100644 --- a/src/components/main/UserButton/index.tsx +++ b/src/components/main/UserButton/index.tsx @@ -1,28 +1,25 @@ -import React, { FC, useCallback } from "react"; -import { Group } from "~/components/containers/Group"; -import styles from "./styles.module.scss"; -import { getURL } from "~/utils/dom"; -import { Icon } from "~/components/input/Icon"; -import { IUser } from "~/redux/auth/types"; -import { PRESETS } from "~/constants/urls"; -import { authOpenProfile } from "~/redux/auth/actions"; +import React, { FC, useCallback } from 'react'; +import { Group } from '~/components/containers/Group'; +import styles from './styles.module.scss'; +import { getURL } from '~/utils/dom'; +import { Icon } from '~/components/input/Icon'; +import { IUser } from '~/types/auth'; +import { PRESETS } from '~/constants/urls'; interface IProps { user: Partial; onLogout: () => void; - authOpenProfile: typeof authOpenProfile; + authOpenProfile: () => void; } const UserButton: FC = ({ user: { username, photo }, authOpenProfile, onLogout }) => { const onProfileOpen = useCallback(() => { - if (!username) return; - authOpenProfile(username); - }, [authOpenProfile, username]); + authOpenProfile(); + }, [authOpenProfile]); const onSettingsOpen = useCallback(() => { - if (!username) return; - authOpenProfile(username); - }, [authOpenProfile, username]); + authOpenProfile(); + }, [authOpenProfile]); return (
diff --git a/src/components/media/AudioPlayer/index.tsx b/src/components/media/AudioPlayer/index.tsx index a68e8b65..635c3c68 100644 --- a/src/components/media/AudioPlayer/index.tsx +++ b/src/components/media/AudioPlayer/index.tsx @@ -1,11 +1,11 @@ -import React, { memo, useCallback, useMemo } from "react"; -import { IFile } from "~/redux/types"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { InputText } from "~/components/input/InputText"; -import { PlayerState } from "~/constants/player"; -import { useAudioPlayer } from "~/utils/providers/AudioPlayerProvider"; +import React, { memo, useCallback, useMemo } from 'react'; +import { IFile } from '~/types'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { InputText } from '~/components/input/InputText'; +import { PlayerState } from '~/constants/player'; +import { useAudioPlayer } from '~/utils/providers/AudioPlayerProvider'; type Props = { file: IFile; diff --git a/src/components/media/ImagePreloader/index.tsx b/src/components/media/ImagePreloader/index.tsx index 597d63dd..654f9989 100644 --- a/src/components/media/ImagePreloader/index.tsx +++ b/src/components/media/ImagePreloader/index.tsx @@ -1,13 +1,13 @@ -import React, { FC, MouseEventHandler, useCallback, useMemo, useState } from "react"; -import classNames from "classnames"; -import { getURL } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import styles from "./styles.module.scss"; -import { IFile } from "~/redux/types"; -import { LoaderCircle } from "~/components/input/LoaderCircle"; -import { Icon } from "~/components/input/Icon"; -import { useResizeHandler } from "~/hooks/dom/useResizeHandler"; -import { DEFAULT_DOMINANT_COLOR } from "~/constants/node"; +import React, { FC, MouseEventHandler, useCallback, useMemo, useState } from 'react'; +import classNames from 'classnames'; +import { getURL } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import styles from './styles.module.scss'; +import { IFile } from '~/types'; +import { LoaderCircle } from '~/components/input/LoaderCircle'; +import { Icon } from '~/components/input/Icon'; +import { useResizeHandler } from '~/hooks/dom/useResizeHandler'; +import { DEFAULT_DOMINANT_COLOR } from '~/constants/node'; interface IProps { file: IFile; diff --git a/src/components/node/CommendDeleted/index.tsx b/src/components/node/CommendDeleted/index.tsx index 70b4f561..d4d8274e 100644 --- a/src/components/node/CommendDeleted/index.tsx +++ b/src/components/node/CommendDeleted/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import { Button } from "~/components/input/Button"; -import { IComment } from "~/redux/types"; +import React, { FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import { Button } from '~/components/input/Button'; +import { IComment } from '~/types'; interface IProps { id: IComment['id']; diff --git a/src/components/node/MenuButton/index.tsx b/src/components/node/MenuButton/index.tsx index c4a24b8b..509a918d 100644 --- a/src/components/node/MenuButton/index.tsx +++ b/src/components/node/MenuButton/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { Filler } from "~/components/containers/Filler"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Filler } from '~/components/containers/Filler'; interface IProps { title: string; diff --git a/src/components/node/NodeAudioBlock/index.tsx b/src/components/node/NodeAudioBlock/index.tsx index 4766a24b..1da925ed 100644 --- a/src/components/node/NodeAudioBlock/index.tsx +++ b/src/components/node/NodeAudioBlock/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import { AudioPlayer } from "~/components/media/AudioPlayer"; -import styles from "./styles.module.scss"; -import { INodeComponentProps } from "~/constants/node"; -import { useNodeAudios } from "~/hooks/node/useNodeAudios"; +import React, { FC } from 'react'; +import { AudioPlayer } from '~/components/media/AudioPlayer'; +import styles from './styles.module.scss'; +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 4e355c5e..ae430806 100644 --- a/src/components/node/NodeAudioImageBlock/index.tsx +++ b/src/components/node/NodeAudioImageBlock/index.tsx @@ -1,10 +1,10 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { path } from "ramda"; -import { getURL } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import { INodeComponentProps } from "~/constants/node"; -import { useNodeImages } from "~/hooks/node/useNodeImages"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { path } from 'ramda'; +import { getURL } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import { INodeComponentProps } from '~/constants/node'; +import { useNodeImages } from '~/hooks/node/useNodeImages'; interface IProps extends INodeComponentProps {} diff --git a/src/components/node/NodeAuthorBlock/index.tsx b/src/components/node/NodeAuthorBlock/index.tsx index ca74ce3f..045b2659 100644 --- a/src/components/node/NodeAuthorBlock/index.tsx +++ b/src/components/node/NodeAuthorBlock/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import { Avatar } from "~/components/common/Avatar"; -import { openUserProfile } from "~/utils/user"; -import { useUserDescription } from "~/hooks/user/useUserDescription"; -import { INodeUser } from "~/redux/types"; +import React, { FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import { Avatar } from '~/components/common/Avatar'; +import { openUserProfile } from '~/utils/user'; +import { useUserDescription } from '~/hooks/auth/useUserDescription'; +import { INodeUser } from '~/types'; interface Props { user?: INodeUser; diff --git a/src/components/node/NodeCommentForm/index.tsx b/src/components/node/NodeCommentForm/index.tsx index b07a08f4..a4e72b52 100644 --- a/src/components/node/NodeCommentForm/index.tsx +++ b/src/components/node/NodeCommentForm/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import { CommentWrapper } from "~/components/containers/CommentWrapper"; -import { CommentForm } from "~/components/comment/CommentForm"; -import { IComment } from "~/redux/types"; -import { IUser } from "~/redux/auth/types"; +import React, { FC } from 'react'; +import { CommentWrapper } from '~/components/containers/CommentWrapper'; +import { CommentForm } from '~/components/comment/CommentForm'; +import { IComment } from '~/types'; +import { IUser } from '~/types/auth'; interface NodeCommentFormProps { user: IUser; diff --git a/src/components/node/NodeDeletedBadge/index.tsx b/src/components/node/NodeDeletedBadge/index.tsx index 401d58e5..2c87f773 100644 --- a/src/components/node/NodeDeletedBadge/index.tsx +++ b/src/components/node/NodeDeletedBadge/index.tsx @@ -1,5 +1,5 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; interface IProps {} diff --git a/src/components/node/NodeNoComments/index.tsx b/src/components/node/NodeNoComments/index.tsx index 54f6a15e..149a01f6 100644 --- a/src/components/node/NodeNoComments/index.tsx +++ b/src/components/node/NodeNoComments/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useMemo } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import classNames from "classnames"; -import { ERRORS } from "~/constants/errors"; -import { t } from "~/utils/trans"; +import React, { FC, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import classNames from 'classnames'; +import { ERRORS } from '~/constants/errors'; +import { t } from '~/utils/trans'; interface IProps { is_loading?: boolean; diff --git a/src/components/node/NodeRelated/index.tsx b/src/components/node/NodeRelated/index.tsx index fde745c7..13d4f8b2 100644 --- a/src/components/node/NodeRelated/index.tsx +++ b/src/components/node/NodeRelated/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, ReactElement } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { INode } from "~/redux/types"; -import { NodeRelatedItem } from "~/components/node/NodeRelatedItem"; -import { SubTitle } from "~/components/common/SubTitle"; +import React, { FC, ReactElement } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { INode } from '~/types'; +import { NodeRelatedItem } from '~/components/node/NodeRelatedItem'; +import { SubTitle } from '~/components/common/SubTitle'; interface IProps { title: ReactElement | string; diff --git a/src/components/node/NodeRelated/placeholder.tsx b/src/components/node/NodeRelated/placeholder.tsx index 8e4b020c..4019e92c 100644 --- a/src/components/node/NodeRelated/placeholder.tsx +++ b/src/components/node/NodeRelated/placeholder.tsx @@ -1,10 +1,10 @@ -import React, { FC, memo } from "react"; -import styles from "./styles.module.scss"; -import cell_style from "~/components/node/NodeRelatedItem/styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import range from "ramda/es/range"; -import classNames from "classnames"; +import React, { FC, memo } from 'react'; +import styles from './styles.module.scss'; +import cell_style from '~/components/node/NodeRelatedItem/styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import range from 'ramda/es/range'; +import classNames from 'classnames'; interface IProps {} diff --git a/src/components/node/NodeRelatedBlock/index.tsx b/src/components/node/NodeRelatedBlock/index.tsx index 8a0d6ccd..c377e975 100644 --- a/src/components/node/NodeRelatedBlock/index.tsx +++ b/src/components/node/NodeRelatedBlock/index.tsx @@ -1,10 +1,10 @@ -import React, { FC } from "react"; -import { NodeRelatedPlaceholder } from "~/components/node/NodeRelated/placeholder"; -import { NodeRelated } from "~/components/node/NodeRelated"; -import { URLS } from "~/constants/urls"; -import { INode } from "~/redux/types"; -import { INodeRelated } from "~/types/node"; -import { Link } from "react-router-dom"; +import React, { FC } from 'react'; +import { NodeRelatedPlaceholder } from '~/components/node/NodeRelated/placeholder'; +import { NodeRelated } from '~/components/node/NodeRelated'; +import { URLS } from '~/constants/urls'; +import { INode } from '~/types'; +import { INodeRelated } from '~/types/node'; +import { Link } from 'react-router-dom'; interface IProps { isLoading: boolean; diff --git a/src/components/node/NodeRelatedItem/index.tsx b/src/components/node/NodeRelatedItem/index.tsx index 619da4eb..ddea53c3 100644 --- a/src/components/node/NodeRelatedItem/index.tsx +++ b/src/components/node/NodeRelatedItem/index.tsx @@ -1,12 +1,12 @@ -import React, { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { INode } from "~/redux/types"; -import { PRESETS, URLS } from "~/constants/urls"; -import { RouteComponentProps, withRouter } from "react-router"; -import { getURL } from "~/utils/dom"; -import { Avatar } from "~/components/common/Avatar"; -import { useColorGradientFromString } from "~/hooks/color/useColorGradientFromString"; +import React, { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { INode } from '~/types'; +import { PRESETS, URLS } from '~/constants/urls'; +import { RouteComponentProps, withRouter } from 'react-router'; +import { getURL } from '~/utils/dom'; +import { Avatar } from '~/components/common/Avatar'; +import { useColorGradientFromString } from '~/hooks/color/useColorGradientFromString'; type IProps = RouteComponentProps & { item: Partial; diff --git a/src/components/node/NodeTags/index.tsx b/src/components/node/NodeTags/index.tsx index 58fdff36..f499d7aa 100644 --- a/src/components/node/NodeTags/index.tsx +++ b/src/components/node/NodeTags/index.tsx @@ -1,6 +1,6 @@ -import React, { FC, memo } from "react"; -import { ITag } from "~/redux/types"; -import { Tags } from "~/containers/tags/Tags"; +import React, { FC, memo } from 'react'; +import { ITag } from '~/types'; +import { Tags } from '~/containers/tags/Tags'; interface IProps { is_deletable?: boolean; diff --git a/src/components/node/NodeTagsBlock/index.tsx b/src/components/node/NodeTagsBlock/index.tsx index 88f5138f..3cd17fec 100644 --- a/src/components/node/NodeTagsBlock/index.tsx +++ b/src/components/node/NodeTagsBlock/index.tsx @@ -1,6 +1,6 @@ -import React, { FC } from "react"; -import { NodeTags } from "~/components/node/NodeTags"; -import { useTagContext } from "~/utils/context/TagsContextProvider"; +import React, { FC } from 'react'; +import { NodeTags } from '~/components/node/NodeTags'; +import { useTagContext } from '~/utils/context/TagsContextProvider'; interface IProps {} diff --git a/src/components/node/NodeTagsPlaceholder/index.tsx b/src/components/node/NodeTagsPlaceholder/index.tsx index 8332ac8b..bdcc2fa3 100644 --- a/src/components/node/NodeTagsPlaceholder/index.tsx +++ b/src/components/node/NodeTagsPlaceholder/index.tsx @@ -1,6 +1,6 @@ -import React, { FC, memo } from "react"; -import { ITag } from "~/redux/types"; -import { Tags } from "~/containers/tags/Tags"; +import React, { FC, memo } from 'react'; +import { ITag } from '~/types'; +import { Tags } from '~/containers/tags/Tags'; interface IProps { is_editable?: boolean; diff --git a/src/components/node/NodeTextBlock/index.tsx b/src/components/node/NodeTextBlock/index.tsx index 3ab865c6..16ecb9c0 100644 --- a/src/components/node/NodeTextBlock/index.tsx +++ b/src/components/node/NodeTextBlock/index.tsx @@ -1,10 +1,10 @@ -import React, { FC, useMemo } from "react"; -import { path } from "ramda"; -import { formatTextParagraphs } from "~/utils/dom"; -import { INodeComponentProps } from "~/constants/node"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import markdown from "~/styles/common/markdown.module.scss"; +import React, { FC, useMemo } from 'react'; +import { path } from 'ramda'; +import { formatTextParagraphs } from '~/utils/dom'; +import { INodeComponentProps } from '~/constants/node'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import markdown from '~/styles/common/markdown.module.scss'; interface IProps extends INodeComponentProps {} diff --git a/src/components/node/NodeTitle/index.tsx b/src/components/node/NodeTitle/index.tsx index 0df4597e..128f7586 100644 --- a/src/components/node/NodeTitle/index.tsx +++ b/src/components/node/NodeTitle/index.tsx @@ -1,11 +1,11 @@ -import React, { memo, VFC } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import classNames from "classnames"; -import { Placeholder } from "~/components/placeholders/Placeholder"; -import { getPrettyDate } from "~/utils/dom"; -import { URLS } from "~/constants/urls"; -import { Link } from "react-router-dom"; +import React, { memo, VFC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import classNames from 'classnames'; +import { Placeholder } from '~/components/placeholders/Placeholder'; +import { getPrettyDate } from '~/utils/dom'; +import { URLS } from '~/constants/urls'; +import { Link } from 'react-router-dom'; interface IProps { id?: number; diff --git a/src/components/node/NodeVideoBlock/index.tsx b/src/components/node/NodeVideoBlock/index.tsx index 7625f489..7bcda3eb 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 "~/constants/node"; +import React, { FC, useMemo } from 'react'; +import styles from './styles.module.scss'; +import { path } from 'ramda'; +import { INodeComponentProps } from '~/constants/node'; interface IProps extends INodeComponentProps {} diff --git a/src/components/notifications/NotificationBubble/index.tsx b/src/components/notifications/NotificationBubble/index.tsx index 58324f85..091641e0 100644 --- a/src/components/notifications/NotificationBubble/index.tsx +++ b/src/components/notifications/NotificationBubble/index.tsx @@ -1,9 +1,9 @@ -import React, { createElement, FC } from "react"; -import { INotification, NOTIFICATION_TYPES } from "~/redux/types"; -import styles from "./styles.module.scss"; -import { NotificationMessage } from "../NotificationMessage"; -import { Icon } from "~/components/input/Icon"; -import { useRandomPhrase } from "~/constants/phrases"; +import React, { createElement, FC } from 'react'; +import { INotification, NOTIFICATION_TYPES } from '~/types'; +import styles from './styles.module.scss'; +import { NotificationMessage } from '../NotificationMessage'; +import { Icon } from '~/components/input/Icon'; +import { useRandomPhrase } from '~/constants/phrases'; interface IProps { notifications: INotification[]; diff --git a/src/components/notifications/NotificationMessage/index.tsx b/src/components/notifications/NotificationMessage/index.tsx index 8819ae64..fa6523c1 100644 --- a/src/components/notifications/NotificationMessage/index.tsx +++ b/src/components/notifications/NotificationMessage/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import styles from "~/components/notifications/NotificationBubble/styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { IMessageNotification, INotification } from "~/redux/types"; +import React, { FC, useCallback } from 'react'; +import styles from '~/components/notifications/NotificationBubble/styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { IMessageNotification, INotification } from '~/types'; interface IProps { notification: IMessageNotification; diff --git a/src/components/placeholders/Paragraph/index.tsx b/src/components/placeholders/Paragraph/index.tsx index fcf6c665..7d9b411a 100644 --- a/src/components/placeholders/Paragraph/index.tsx +++ b/src/components/placeholders/Paragraph/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useMemo } from "react"; -import { Placeholder, PlaceholderProps } from "~/components/placeholders/Placeholder"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; +import React, { FC, useMemo } from 'react'; +import { Placeholder, PlaceholderProps } from '~/components/placeholders/Placeholder'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; type Props = PlaceholderProps & { lines?: number; diff --git a/src/components/profile/Message/index.tsx b/src/components/profile/Message/index.tsx index 618bcfa9..0c5bdcce 100644 --- a/src/components/profile/Message/index.tsx +++ b/src/components/profile/Message/index.tsx @@ -1,11 +1,11 @@ -import React, { FC } from "react"; -import { IMessage } from "~/redux/types"; -import styles from "./styles.module.scss"; -import { formatText, getPrettyDate, getURL } from "~/utils/dom"; -import { PRESETS } from "~/constants/urls"; -import classNames from "classnames"; -import { Group } from "~/components/containers/Group"; -import markdown from "~/styles/common/markdown.module.scss"; +import React, { FC } from 'react'; +import { IMessage } from '~/types'; +import styles from './styles.module.scss'; +import { formatText, getPrettyDate, getURL } from '~/utils/dom'; +import { PRESETS } from '~/constants/urls'; +import classNames from 'classnames'; +import { Group } from '~/components/containers/Group'; +import markdown from '~/styles/common/markdown.module.scss'; interface IProps { message: IMessage; diff --git a/src/components/profile/ProfileAccounts/index.tsx b/src/components/profile/ProfileAccounts/index.tsx deleted file mode 100644 index 01c820f5..00000000 --- a/src/components/profile/ProfileAccounts/index.tsx +++ /dev/null @@ -1,151 +0,0 @@ -import React, { FC, Fragment, useCallback, useEffect } from 'react'; -import { ISocialProvider } from '~/redux/auth/types'; -import styles from './styles.module.scss'; -import { Placeholder } from '~/components/placeholders/Placeholder'; -import { Icon } from '~/components/input/Icon'; -import { Button } from '~/components/input/Button'; -import { Group } from '~/components/containers/Group'; -import * as AUTH_ACTIONS from '~/redux/auth/actions'; -import { selectAuthProfile } from '~/redux/auth/selectors'; -import { IState } from '~/redux/store'; -import { connect } from 'react-redux'; -import { API } from '~/constants/api'; -import { ProfileAccountsError } from '~/components/profile/ProfileAccountsError'; - -const mapStateToProps = (state: IState) => selectAuthProfile(state).socials; -const mapDispatchToProps = { - authGetSocials: AUTH_ACTIONS.authGetSocials, - authDropSocial: AUTH_ACTIONS.authDropSocial, - authAttachSocial: AUTH_ACTIONS.authAttachSocial, - authSetSocials: AUTH_ACTIONS.authSetSocials, -}; - -type IProps = ReturnType & typeof mapDispatchToProps & {}; - -const SOCIAL_ICONS: Record = { - vkontakte: 'vk', - google: 'google', -}; - -const ProfileAccountsUnconnected: FC = ({ - authGetSocials, - authDropSocial, - authAttachSocial, - authSetSocials, - accounts, - is_loading, - error, -}) => { - const onMessage = useCallback( - (event: MessageEvent) => { - if (!event?.data?.type) return; - - switch (event?.data?.type) { - case 'oauth_processed': - return authAttachSocial(event?.data?.payload?.token); - case 'oauth_error': - return authSetSocials({ error: event?.data?.payload?.error || '' }); - default: - return; - } - }, - [authAttachSocial, authSetSocials] - ); - - const openOauthWindow = useCallback( - (provider: ISocialProvider) => () => { - window.open(API.USER.OAUTH_WINDOW(provider), '', 'width=600,height=400'); - }, - [] - ); - - const resetErrors = useCallback(() => authSetSocials({ error: '' }), [authSetSocials]); - - useEffect(() => { - authGetSocials(); - }, [authGetSocials]); - - useEffect(() => { - window.addEventListener('message', onMessage); - return () => window.removeEventListener('message', onMessage); - }, [onMessage]); - - return ( - - {error && } - - -

- Ты можешь входить в Убежище, используя аккаунты на других сайтах вместо ввода логина и - пароля. -

- -

- Мы честно украдём и будем хранить твои имя, фото и адрес на этом сайте, но никому о них не - расскажем. -

-
- - {is_loading && ( -
- {[...new Array(accounts.length || 1)].map((_, i) => ( - - - - - ))} -
- )} - - {!is_loading && accounts.length > 0 && ( -
- {!is_loading && - accounts.map(it => ( -
-
-
- -
-
- -
{it.name || it.id}
- -
- authDropSocial(it.provider, it.id)} /> -
-
- ))} -
- )} - - - - - - -
- ); -}; - -const ProfileAccounts = connect(mapStateToProps, mapDispatchToProps)(ProfileAccountsUnconnected); - -export { ProfileAccounts }; diff --git a/src/components/profile/ProfileAccountsError/index.tsx b/src/components/profile/ProfileAccountsError/index.tsx index 3dbe5bde..ad65fe5b 100644 --- a/src/components/profile/ProfileAccountsError/index.tsx +++ b/src/components/profile/ProfileAccountsError/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { ERROR_LITERAL } from "~/constants/errors"; -import { Button } from "~/components/input/Button"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { ERROR_LITERAL } from '~/constants/errors'; +import { Button } from '~/components/input/Button'; interface IProps { onClose: () => void; diff --git a/src/components/profile/ProfileAvatar/index.tsx b/src/components/profile/ProfileAvatar/index.tsx index b5a3ed79..e1723efe 100644 --- a/src/components/profile/ProfileAvatar/index.tsx +++ b/src/components/profile/ProfileAvatar/index.tsx @@ -3,7 +3,7 @@ import styles from './styles.module.scss'; import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import { Icon } from '~/components/input/Icon'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; export interface ProfileAvatarProps { canEdit: boolean; diff --git a/src/components/profile/ProfileDescription/index.tsx b/src/components/profile/ProfileDescription/index.tsx index 683ccadb..fbf2ec28 100644 --- a/src/components/profile/ProfileDescription/index.tsx +++ b/src/components/profile/ProfileDescription/index.tsx @@ -6,24 +6,29 @@ import { Group } from '~/components/containers/Group'; import markdown from '~/styles/common/markdown.module.scss'; import classNames from 'classnames'; import { useProfileContext } from '~/utils/providers/ProfileProvider'; +import { useUser } from '~/hooks/auth/useUser'; const ProfileDescription: FC = () => { const { profile, isLoading } = useProfileContext(); + const { user } = useUser(); + + const isOwn = user?.id === profile?.id; + const description = isOwn ? user.description : profile.description; + const fullName = isOwn ? user.fullname : profile.fullname; + const username = isOwn ? user.username : profile.username; if (isLoading) return ; return (
- {!!profile?.description && ( + {!!description ? ( - )} - - {!profile?.description && ( + ) : (
- {profile?.fullname || profile?.username} пока ничего не рассказал о себе + {fullName || username} пока ничего не рассказал о себе
)}
diff --git a/src/components/profile/ProfileDescription/styles.module.scss b/src/components/profile/ProfileDescription/styles.module.scss index 3c1a63d0..0095bad7 100644 --- a/src/components/profile/ProfileDescription/styles.module.scss +++ b/src/components/profile/ProfileDescription/styles.module.scss @@ -6,6 +6,8 @@ display: flex; box-sizing: border-box; flex-direction: column; + align-items: center; + justify-content: center; } .placeholder { diff --git a/src/components/profile/ProfileSettings/index.tsx b/src/components/profile/ProfileSettings/index.tsx index 8ca11c68..74ff3227 100644 --- a/src/components/profile/ProfileSettings/index.tsx +++ b/src/components/profile/ProfileSettings/index.tsx @@ -6,22 +6,22 @@ import { Group } from '~/components/containers/Group'; import { Filler } from '~/components/containers/Filler'; import { InputText } from '~/components/input/InputText'; import { ERROR_LITERAL } from '~/constants/errors'; -import { ProfileAccounts } from '~/components/profile/ProfileAccounts'; +import { ProfileAccounts } from '~/containers/profile/ProfileAccounts'; import classNames from 'classnames'; -import { useUser } from '~/hooks/user/userUser'; -import { useProfileContext } from '~/utils/providers/ProfileProvider'; +import { useUser } from '~/hooks/auth/useUser'; import { useProfileForm } from '~/hooks/profile/useProfileForm'; import { has } from 'ramda'; +import { usePatchUser } from '~/hooks/auth/usePatchUser'; const getError = (error?: string) => (error && has(error, ERROR_LITERAL) ? error : undefined); const ProfileSettings: FC = () => { - const user = useUser(); - const { updateProfile } = useProfileContext(); + const { user } = useUser(); + const { save } = usePatchUser(); const { handleSubmit, values, errors, handleChange } = useProfileForm( { ...user, password: '', newPassword: '' }, - updateProfile + save ); return ( diff --git a/src/components/profile/ProfileSidebarMenu/index.tsx b/src/components/profile/ProfileSidebarMenu/index.tsx index 344a8d83..dafbae33 100644 --- a/src/components/profile/ProfileSidebarMenu/index.tsx +++ b/src/components/profile/ProfileSidebarMenu/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; -import { Link } from "react-router-dom"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; +import { Link } from 'react-router-dom'; interface IProps { path: string; diff --git a/src/components/profile/ProfileSidebarSettings/index.tsx b/src/components/profile/ProfileSidebarSettings/index.tsx index beb1f4f3..8e30fc7d 100644 --- a/src/components/profile/ProfileSidebarSettings/index.tsx +++ b/src/components/profile/ProfileSidebarSettings/index.tsx @@ -1,8 +1,8 @@ -import React, { FC } from "react"; -import { ProfileSettings } from "~/components/profile/ProfileSettings"; -import styles from "./styles.module.scss"; -import { Filler } from "~/components/containers/Filler"; -import { Button } from "~/components/input/Button"; +import React, { FC } from 'react'; +import { ProfileSettings } from '~/components/profile/ProfileSettings'; +import styles from './styles.module.scss'; +import { Filler } from '~/components/containers/Filler'; +import { Button } from '~/components/input/Button'; interface IProps {} diff --git a/src/components/sidebar/TagSidebarList/index.tsx b/src/components/sidebar/TagSidebarList/index.tsx index 7b1ef1ed..1f083981 100644 --- a/src/components/sidebar/TagSidebarList/index.tsx +++ b/src/components/sidebar/TagSidebarList/index.tsx @@ -1,7 +1,7 @@ -import React, { FC } from "react"; -import { INode } from "~/redux/types"; -import styles from "./styles.module.scss"; -import { FlowRecentItem } from "~/components/flow/FlowRecentItem"; +import React, { FC } from 'react'; +import { INode } from '~/types'; +import styles from './styles.module.scss'; +import { FlowRecentItem } from '~/components/flow/FlowRecentItem'; interface IProps { nodes: INode[]; diff --git a/src/components/tags/Tag/index.tsx b/src/components/tags/Tag/index.tsx index 14074d6c..509a786e 100644 --- a/src/components/tags/Tag/index.tsx +++ b/src/components/tags/Tag/index.tsx @@ -1,5 +1,5 @@ import React, { FC, FocusEventHandler, useCallback } from 'react'; -import { ITag } from '~/redux/types'; +import { ITag } from '~/types'; import { TagWrapper } from '~/components/tags/TagWrapper'; const getTagFeature = (tag: Partial) => { diff --git a/src/components/tags/TagAutocomplete/index.tsx b/src/components/tags/TagAutocomplete/index.tsx index dd43f885..af8941bb 100644 --- a/src/components/tags/TagAutocomplete/index.tsx +++ b/src/components/tags/TagAutocomplete/index.tsx @@ -1,9 +1,9 @@ -import React, { useCallback, useEffect, useMemo, useRef, useState, VFC } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { separateTagOptions } from "~/utils/tag"; -import { TagAutocompleteRow } from "~/components/tags/TagAutocompleteRow"; -import { usePopper } from "react-popper"; +import React, { useCallback, useEffect, useMemo, useRef, useState, VFC } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { separateTagOptions } from '~/utils/tag'; +import { TagAutocompleteRow } from '~/components/tags/TagAutocompleteRow'; +import { usePopper } from 'react-popper'; interface TagAutocompleteProps { exclude: string[]; diff --git a/src/components/tags/TagAutocompleteRow/index.tsx b/src/components/tags/TagAutocompleteRow/index.tsx index bc413c79..27e8b282 100644 --- a/src/components/tags/TagAutocompleteRow/index.tsx +++ b/src/components/tags/TagAutocompleteRow/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import styles from "./styles.module.scss"; -import classNames from "classnames"; -import { Icon } from "~/components/input/Icon"; +import React, { FC, useCallback } from 'react'; +import styles from './styles.module.scss'; +import classNames from 'classnames'; +import { Icon } from '~/components/input/Icon'; interface IProps { selected: boolean; diff --git a/src/components/tags/TagWrapper/index.tsx b/src/components/tags/TagWrapper/index.tsx index 320e3b40..0b95527d 100644 --- a/src/components/tags/TagWrapper/index.tsx +++ b/src/components/tags/TagWrapper/index.tsx @@ -1,7 +1,7 @@ -import React, { FC, useCallback } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { Icon } from "~/components/input/Icon"; +import React, { FC, useCallback } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { Icon } from '~/components/input/Icon'; interface IProps { feature?: string; diff --git a/src/components/upload/AudioUpload/index.tsx b/src/components/upload/AudioUpload/index.tsx index 80930b3d..3454e218 100644 --- a/src/components/upload/AudioUpload/index.tsx +++ b/src/components/upload/AudioUpload/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { ArcProgress } from "~/components/input/ArcProgress"; -import { IFile } from "~/redux/types"; -import { Icon } from "~/components/input/Icon"; +import React, { FC, useCallback } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { ArcProgress } from '~/components/input/ArcProgress'; +import { IFile } from '~/types'; +import { Icon } from '~/components/input/Icon'; interface IProps { id?: IFile['id']; diff --git a/src/components/upload/ImageUpload/index.tsx b/src/components/upload/ImageUpload/index.tsx index dedfb367..02d19f3c 100644 --- a/src/components/upload/ImageUpload/index.tsx +++ b/src/components/upload/ImageUpload/index.tsx @@ -1,9 +1,9 @@ -import React, { FC, useCallback } from "react"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { ArcProgress } from "~/components/input/ArcProgress"; -import { IFile } from "~/redux/types"; -import { Icon } from "~/components/input/Icon"; +import React, { FC, useCallback } from 'react'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { ArcProgress } from '~/components/input/ArcProgress'; +import { IFile } from '~/types'; +import { Icon } from '~/components/input/Icon'; interface IProps { id?: IFile['id']; diff --git a/src/components/upload/UploadDropzone/index.tsx b/src/components/upload/UploadDropzone/index.tsx index 3abd5ec3..c72f71a9 100644 --- a/src/components/upload/UploadDropzone/index.tsx +++ b/src/components/upload/UploadDropzone/index.tsx @@ -1,11 +1,11 @@ -import React, { FC, useCallback } from "react"; -import Dropzone from "react-dropzone"; -import classnames from "classnames"; -import classNames from "classnames"; -import styles from "./styles.module.scss"; -import { DivProps } from "~/utils/types"; -import { DropHereIcon } from "~/components/input/DropHereIcon"; -import { useDragDetector } from "~/hooks/dom/useDragDetector"; +import React, { FC, useCallback } from 'react'; +import Dropzone from 'react-dropzone'; +import classnames from 'classnames'; +import classNames from 'classnames'; +import styles from './styles.module.scss'; +import { DivProps } from '~/utils/types'; +import { DropHereIcon } from '~/components/input/DropHereIcon'; +import { useDragDetector } from '~/hooks/dom/useDragDetector'; interface IProps extends DivProps { onUpload: (files: File[]) => void; diff --git a/src/constants/api.ts b/src/constants/api.ts index d03fdce4..a1d24d65 100644 --- a/src/constants/api.ts +++ b/src/constants/api.ts @@ -1,11 +1,11 @@ -import { IComment, INode, ITag } from '~/redux/types'; -import { ISocialProvider } from '~/redux/auth/types'; +import { IComment, INode, ITag } from '~/types'; +import { OAuthProvider } from '~/types/auth'; export const API = { BASE: process.env.REACT_APP_API_HOST, USER: { LOGIN: '/user/login', - OAUTH_WINDOW: (provider: ISocialProvider) => + OAUTH_WINDOW: (provider: OAuthProvider) => `${process.env.REACT_APP_API_HOST}oauth/${provider}/redirect`, ME: '/user/', PROFILE: (username: string) => `/user/user/${username}/profile`, diff --git a/src/constants/auth/index.ts b/src/constants/auth/index.ts new file mode 100644 index 00000000..5ea16500 --- /dev/null +++ b/src/constants/auth/index.ts @@ -0,0 +1,25 @@ +import { IUser } from '~/types/auth'; + +export enum Role { + Guest = 'guest', + User = 'user', + Admin = 'admin', +} + +export const EMPTY_USER: IUser = { + id: 0, + role: Role.Guest, + email: '', + name: '', + username: '', + photo: undefined, + cover: undefined, + is_activated: false, + is_user: false, + fullname: '', + description: '', + + last_seen: '', + last_seen_messages: '', + last_seen_boris: '', +}; diff --git a/src/constants/auth/socials.ts b/src/constants/auth/socials.ts new file mode 100644 index 00000000..3d0532f5 --- /dev/null +++ b/src/constants/auth/socials.ts @@ -0,0 +1,6 @@ +import { OAuthProvider } from '~/types/auth'; + +export const SOCIAL_ICONS: Record = { + vkontakte: 'vk', + google: 'google', +}; diff --git a/src/constants/events.ts b/src/constants/events.ts new file mode 100644 index 00000000..34cccdc6 --- /dev/null +++ b/src/constants/events.ts @@ -0,0 +1,6 @@ +export enum EventMessageType { + OpenProfile = 'open_profile', + OAuthLogin = 'oauth_login', + OAuthProcessed = 'oauth_processed', + OAuthError = 'oauth_error', +} diff --git a/src/constants/node/index.ts b/src/constants/node/index.ts index cc672ea9..b6075bdf 100644 --- a/src/constants/node/index.ts +++ b/src/constants/node/index.ts @@ -1,5 +1,5 @@ import { FC } from 'react'; -import { IComment, INode, ValueOf } from 'src/redux/types'; +import { IComment, INode, ValueOf } from '~/types'; import { NodeTextBlock } from '~/components/node/NodeTextBlock'; import { NodeAudioBlock } from '~/components/node/NodeAudioBlock'; import { NodeVideoBlock } from '~/components/node/NodeVideoBlock'; diff --git a/src/constants/phrases.ts b/src/constants/phrases.ts index 97a7e596..2fb4be4d 100644 --- a/src/constants/phrases.ts +++ b/src/constants/phrases.ts @@ -64,6 +64,11 @@ export const PHRASES = { 'Звук из преисподней', 'Симулятор счастливого человека', ], + REGISTER: [ + 'Сушёный кабачок особенно хорош в это время года, знаете ли.', + 'Бывало, стреляешь по кабачку, или он стреляет в тебя.', + 'Он всегда рядом, кабачок -- первый сорт! Надежда империи.', + ], }; export const getRandomPhrase = (key: keyof typeof PHRASES) => diff --git a/src/constants/uploads/index.ts b/src/constants/uploads/index.ts index 0d683b89..480256ab 100644 --- a/src/constants/uploads/index.ts +++ b/src/constants/uploads/index.ts @@ -1,4 +1,4 @@ -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; export const EMPTY_FILE: IFile = { id: undefined, diff --git a/src/constants/urls.ts b/src/constants/urls.ts index 588cf64f..e656b340 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -1,4 +1,4 @@ -import { INode } from '~/redux/types'; +import { INode } from '~/types'; export const URLS = { BASE: '/', diff --git a/src/containers/App.tsx b/src/containers/App.tsx index b4bf8ba8..517f7b54 100644 --- a/src/containers/App.tsx +++ b/src/containers/App.tsx @@ -1,6 +1,4 @@ import React, { VFC } from 'react'; -import { ConnectedRouter } from 'connected-react-router'; -import { history } from '~/redux/store'; import { MainLayout } from '~/containers/main/MainLayout'; import { Sprites } from '~/sprites/Sprites'; import { Modal } from '~/containers/dialogs/Modal'; @@ -16,12 +14,14 @@ import { SearchProvider } from '~/utils/providers/SearchProvider'; import { ToastProvider } from '~/utils/providers/ToastProvider'; import { AudioPlayerProvider } from '~/utils/providers/AudioPlayerProvider'; import { MetadataProvider } from '~/utils/providers/MetadataProvider'; +import { AuthProvider } from '~/utils/providers/AuthProvider'; +import { BrowserRouter } from 'react-router-dom'; const App: VFC = observer(() => { useGlobalLoader(); return ( - + @@ -29,14 +29,16 @@ const App: VFC = observer(() => { - - - - + + + + + - - - + + + + @@ -44,7 +46,7 @@ const App: VFC = observer(() => { - + ); }); diff --git a/src/containers/boris/BorisComments/index.tsx b/src/containers/boris/BorisComments/index.tsx index 14e7c0c4..378909f6 100644 --- a/src/containers/boris/BorisComments/index.tsx +++ b/src/containers/boris/BorisComments/index.tsx @@ -1,18 +1,21 @@ -import React, { FC } from "react"; -import styles from "./styles.module.scss"; -import { Group } from "~/components/containers/Group"; -import { NodeCommentForm } from "~/components/node/NodeCommentForm"; -import { NodeNoComments } from "~/components/node/NodeNoComments"; -import { NodeComments } from "~/containers/node/NodeComments"; -import { Footer } from "~/components/main/Footer"; -import { CommentContextProvider, useCommentContext } from "~/utils/context/CommentContextProvider"; -import { useUserContext } from "~/utils/context/UserContextProvider"; -import { useNodeContext } from "~/utils/context/NodeContextProvider"; +import React, { FC } from 'react'; +import styles from './styles.module.scss'; +import { Group } from '~/components/containers/Group'; +import { NodeCommentForm } from '~/components/node/NodeCommentForm'; +import { NodeNoComments } from '~/components/node/NodeNoComments'; +import { NodeComments } from '~/containers/node/NodeComments'; +import { Footer } from '~/components/main/Footer'; +import { CommentContextProvider, useCommentContext } from '~/utils/context/CommentContextProvider'; +import { useUserContext } from '~/utils/context/UserContextProvider'; +import { useNodeContext } from '~/utils/context/NodeContextProvider'; +import { useAuth } from '~/hooks/auth/useAuth'; interface IProps {} const BorisComments: FC = () => { const user = useUserContext(); + const { isUser } = useAuth(); + const { isLoading, comments, @@ -27,9 +30,7 @@ const BorisComments: FC = () => { return ( <> - {user.is_user && ( - - )} + {isUser && } {isLoading ? ( diff --git a/src/containers/dialogs/EditorCreateDialog/index.tsx b/src/containers/dialogs/EditorCreateDialog/index.tsx index c8b5d081..c7c4a512 100644 --- a/src/containers/dialogs/EditorCreateDialog/index.tsx +++ b/src/containers/dialogs/EditorCreateDialog/index.tsx @@ -3,7 +3,7 @@ import { EMPTY_NODE, NODE_TYPES } from '~/constants/node'; import { EditorDialog } from '~/containers/dialogs/EditorDialog'; import { useHistory, useRouteMatch } from 'react-router'; import { values } from 'ramda'; -import { INode } from '~/redux/types'; +import { INode } from '~/types'; import { useCreateNode } from '~/hooks/node/useCreateNode'; const EditorCreateDialog: FC = () => { diff --git a/src/containers/dialogs/EditorDialog/index.tsx b/src/containers/dialogs/EditorDialog/index.tsx index 7fccfac1..9d9a086f 100644 --- a/src/containers/dialogs/EditorDialog/index.tsx +++ b/src/containers/dialogs/EditorDialog/index.tsx @@ -1,22 +1,22 @@ -import React, { createElement, FC, useCallback, useMemo, useState } from "react"; -import styles from "./styles.module.scss"; -import { NODE_EDITORS } from "~/constants/node"; -import { BetterScrollDialog } from "../BetterScrollDialog"; -import { CoverBackdrop } from "~/components/containers/CoverBackdrop"; -import { prop } from "ramda"; -import { useNodeFormFormik } from "~/hooks/node/useNodeFormFormik"; -import { EditorButtons } from "~/components/editors/EditorButtons"; -import { UploadSubject, UploadTarget } from "~/constants/uploads"; -import { FormikProvider } from "formik"; -import { INode } from "~/redux/types"; -import { ModalWrapper } from "~/components/dialogs/ModalWrapper"; -import { useTranslatedError } from "~/hooks/data/useTranslatedError"; -import { useCloseOnEscape } from "~/hooks"; -import { EditorConfirmClose } from "~/components/editors/EditorConfirmClose"; -import { DialogComponentProps } from "~/types/modal"; -import { useUploader } from "~/hooks/data/useUploader"; -import { UploaderContextProvider } from "~/utils/context/UploaderContextProvider"; -import { observer } from "mobx-react-lite"; +import React, { createElement, FC, useCallback, useMemo, useState } from 'react'; +import styles from './styles.module.scss'; +import { NODE_EDITORS } from '~/constants/node'; +import { BetterScrollDialog } from '../../../components/dialogs/BetterScrollDialog'; +import { CoverBackdrop } from '~/components/containers/CoverBackdrop'; +import { prop } from 'ramda'; +import { useNodeFormFormik } from '~/hooks/node/useNodeFormFormik'; +import { EditorButtons } from '~/components/editors/EditorButtons'; +import { UploadSubject, UploadTarget } from '~/constants/uploads'; +import { FormikProvider } from 'formik'; +import { INode } from '~/types'; +import { ModalWrapper } from '~/components/dialogs/ModalWrapper'; +import { useTranslatedError } from '~/hooks/data/useTranslatedError'; +import { useCloseOnEscape } from '~/hooks'; +import { EditorConfirmClose } from '~/components/editors/EditorConfirmClose'; +import { DialogComponentProps } from '~/types/modal'; +import { useUploader } from '~/hooks/data/useUploader'; +import { UploaderContextProvider } from '~/utils/context/UploaderContextProvider'; +import { observer } from 'mobx-react-lite'; interface Props extends DialogComponentProps { node: INode; diff --git a/src/containers/dialogs/EditorEditDialog/index.tsx b/src/containers/dialogs/EditorEditDialog/index.tsx index 885a10e5..b026269a 100644 --- a/src/containers/dialogs/EditorEditDialog/index.tsx +++ b/src/containers/dialogs/EditorEditDialog/index.tsx @@ -6,7 +6,7 @@ import { LoaderCircle } from '~/components/input/LoaderCircle'; import styles from './styles.module.scss'; import { useLoadNode } from '~/hooks/node/useLoadNode'; import { useUpdateNode } from '~/hooks/node/useUpdateNode'; -import { INode } from '~/redux/types'; +import { INode } from '~/types'; import { observer } from 'mobx-react'; const EditorEditDialog: FC = observer(() => { diff --git a/src/containers/dialogs/LoginDialog/index.tsx b/src/containers/dialogs/LoginDialog/index.tsx index 4f9aa06e..5f54a9bb 100644 --- a/src/containers/dialogs/LoginDialog/index.tsx +++ b/src/containers/dialogs/LoginDialog/index.tsx @@ -1,62 +1,29 @@ -import React, { FC, FormEvent, useCallback, useEffect, useState } from 'react'; -import { connect } from 'react-redux'; +import React, { FC, useCallback } from 'react'; import { useCloseOnEscape } from '~/hooks'; import { Group } from '~/components/containers/Group'; import { InputText } from '~/components/input/InputText'; import { Button } from '~/components/input/Button'; import { Padder } from '~/components/containers/Padder'; -import { selectAuthLogin } from '~/redux/auth/selectors'; -import { API } from '~/constants/api'; -import { BetterScrollDialog } from '../BetterScrollDialog'; +import { BetterScrollDialog } from '~/components/dialogs/BetterScrollDialog'; import styles from './styles.module.scss'; -import * as ACTIONS from '~/redux/auth/actions'; -import { ISocialProvider } from '~/redux/auth/types'; -import { pick } from 'ramda'; -import { LoginDialogButtons } from '~/containers/dialogs/LoginDialogButtons'; -import { OAUTH_EVENT_TYPES } from '~/redux/types'; +import { LoginDialogButtons } from '~/components/auth/login/LoginDialogButtons'; import { DialogTitle } from '~/components/dialogs/DialogTitle'; -import { useTranslatedError } from '~/hooks/data/useTranslatedError'; import { DialogComponentProps } from '~/types/modal'; import { useShowModal } from '~/hooks/modal/useShowModal'; import { Dialog } from '~/constants/modal'; +import { useAuth } from '~/hooks/auth/useAuth'; +import { useLoginForm } from '~/hooks/auth/useLoginForm'; +import { useOAuth } from '~/hooks/auth/useOAuth'; -const mapStateToProps = state => ({ - ...pick(['error', 'is_registering'], selectAuthLogin(state)), -}); +type LoginDialogProps = DialogComponentProps & {}; -const mapDispatchToProps = { - userSendLoginRequest: ACTIONS.userSendLoginRequest, - userSetLoginError: ACTIONS.userSetLoginError, - authLoginWithSocial: ACTIONS.authLoginWithSocial, - authGotOauthLoginEvent: ACTIONS.authGotOauthLoginEvent, -}; - -type IProps = ReturnType & - typeof mapDispatchToProps & - DialogComponentProps & {}; - -const LoginDialogUnconnected: FC = ({ - error, - - onRequestClose, - userSendLoginRequest, - userSetLoginError, - authGotOauthLoginEvent, -}) => { - const [username, setUserName] = useState(''); - const [password, setPassword] = useState(''); +const LoginDialog: FC = ({ onRequestClose }) => { + useCloseOnEscape(onRequestClose); + const { login } = useAuth(); + const { openOauthWindow } = useOAuth(); const showRestoreDialog = useShowModal(Dialog.RestoreRequest); - - const onSubmit = useCallback( - (event: FormEvent) => { - event.preventDefault(); - userSendLoginRequest({ username, password }); - }, - [userSendLoginRequest, username, password] - ); - const onRestoreRequest = useCallback( event => { event.preventDefault(); @@ -65,44 +32,13 @@ const LoginDialogUnconnected: FC = ({ [showRestoreDialog] ); - const openOauthWindow = useCallback( - (provider: ISocialProvider) => () => { - window.open(API.USER.OAUTH_WINDOW(provider), '', 'width=600,height=400'); - }, - [] - ); - - const onMessage = useCallback( - (event: MessageEvent) => { - if (!event?.data?.type || !Object.values(OAUTH_EVENT_TYPES).includes(event.data.type)) { - return; - } - - authGotOauthLoginEvent(event.data); - }, - [authGotOauthLoginEvent] - ); - - useEffect(() => { - if (error) userSetLoginError(''); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [username, password]); - - useEffect(() => { - window.addEventListener('message', onMessage); - return () => window.removeEventListener('message', onMessage); - }, [onMessage]); - - useCloseOnEscape(onRequestClose); - - const translatedError = useTranslatedError(error); + const { values, errors, handleSubmit, handleChange } = useLoginForm(login, onRequestClose); return ( -
+
} backdrop={
} @@ -112,9 +48,21 @@ const LoginDialogUnconnected: FC = ({ Решительно войти - + - + - - - - - - - -); - -export { LoginDialogButtons }; diff --git a/src/containers/dialogs/LoginSocialRegisterButtons/index.tsx b/src/containers/dialogs/LoginSocialRegisterButtons/index.tsx deleted file mode 100644 index f0f856e9..00000000 --- a/src/containers/dialogs/LoginSocialRegisterButtons/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React, { FC } from "react"; -import { Button } from "~/components/input/Button"; -import styles from "./styles.module.scss"; - -interface IProps {} - -const LoginSocialRegisterButtons: FC = () => ( -
- -
-); - -export { LoginSocialRegisterButtons }; diff --git a/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx b/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx index 2f0f1819..8595502c 100644 --- a/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx +++ b/src/containers/dialogs/LoginSocialRegisterDialog/index.tsx @@ -1,76 +1,52 @@ -import React, { FC, FormEvent, useCallback, useEffect, useState } from 'react'; -import { connect } from 'react-redux'; -import { BetterScrollDialog } from '~/containers/dialogs/BetterScrollDialog'; +import React, { FC, useCallback, useState } from 'react'; +import { BetterScrollDialog } from '~/components/dialogs/BetterScrollDialog'; import { Padder } from '~/components/containers/Padder'; import { DialogTitle } from '~/components/dialogs/DialogTitle'; import { Group } from '~/components/containers/Group'; import { InputText } from '~/components/input/InputText'; import styles from './styles.module.scss'; -import { selectAuthRegisterSocial } from '~/redux/auth/selectors'; -import * as AUTH_ACTIONS from '~/redux/auth/actions'; import { useCloseOnEscape } from '~/hooks'; -import { LoginSocialRegisterButtons } from '~/containers/dialogs/LoginSocialRegisterButtons'; +import { LoginSocialRegisterButtons } from '~/components/auth/oauth/LoginSocialRegisterButtons'; import { Toggle } from '~/components/input/Toggle'; import { DialogComponentProps } from '~/types/modal'; +import { getRandomPhrase } from '~/constants/phrases'; +import { useSocialRegisterForm } from '~/hooks/auth/useSocialRegisterForm'; +import { apiLoginWithSocial } from '~/api/auth'; +import { useModal } from '~/hooks/modal/useModal'; +import { useAuthStore } from '~/store/auth/useAuthStore'; -const mapStateToProps = selectAuthRegisterSocial; -const mapDispatchToProps = { - authSetRegisterSocialErrors: AUTH_ACTIONS.authSetRegisterSocialErrors, - authSetRegisterSocial: AUTH_ACTIONS.authSetRegisterSocial, - authSendRegisterSocial: AUTH_ACTIONS.authSendRegisterSocial, -}; +type LoginSocialRegisterDialogProps = DialogComponentProps & { token: string }; -type Props = ReturnType & - typeof mapDispatchToProps & - DialogComponentProps & {}; +const phrase = getRandomPhrase('REGISTER'); -const phrase = [ - 'Сушёный кабачок особенно хорош в это время года, знаете ли.', - 'Бывало, стреляешь по кабачку, или он стреляет в тебя.', - 'Он всегда рядом, кабачок -- первый сорт! Надежда империи.', -]; - -const LoginSocialRegisterDialogUnconnected: FC = ({ +const LoginSocialRegisterDialog: FC = ({ onRequestClose, - errors, - error, - - authSetRegisterSocialErrors, - authSetRegisterSocial, - authSendRegisterSocial, + token, }) => { - const [username, setUsername] = useState(''); - const [password, setPassword] = useState(''); - const [isDryingPants, setIsDryingPants] = useState(false); + useCloseOnEscape(onRequestClose); + const { hideModal } = useModal(); + const auth = useAuthStore(); - const onSubmit = useCallback( - (event: FormEvent) => { - event.preventDefault(); - authSendRegisterSocial(username, password); + const [isDryingPants, setIsDryingPants] = useState(false); + const onSuccess = useCallback( + (loginToken: string) => { + auth.setToken(loginToken); + hideModal(); }, - [username, password, authSendRegisterSocial] + [auth, hideModal] ); - useEffect(() => { - if (errors.username) authSetRegisterSocialErrors({ username: '' }); - }, [authSetRegisterSocialErrors, errors.username, username]); - - useEffect(() => { - if (errors.password) authSetRegisterSocialErrors({ password: '' }); - }, [authSetRegisterSocialErrors, errors.password, password]); - - useEffect(() => { - if (error) authSetRegisterSocial({ error: '' }); - }, [username, password, error, authSetRegisterSocial]); - - useCloseOnEscape(onRequestClose); + const { values, errors, handleChange, handleSubmit } = useSocialRegisterForm( + token, + apiLoginWithSocial, + onSuccess + ); return ( - + } > @@ -79,16 +55,16 @@ const LoginSocialRegisterDialogUnconnected: FC = ({ Добро пожаловать в семью! = ({
setIsDryingPants(!isDryingPants)}> - {phrase[Math.floor(Math.random() * phrase.length)]} + {phrase}
@@ -112,9 +88,4 @@ const LoginSocialRegisterDialogUnconnected: FC = ({ ); }; -const LoginSocialRegisterDialog = connect( - mapStateToProps, - mapDispatchToProps -)(LoginSocialRegisterDialogUnconnected); - export { LoginSocialRegisterDialog }; diff --git a/src/containers/dialogs/Modal/index.tsx b/src/containers/dialogs/Modal/index.tsx index b1515cd5..ecbbc50a 100644 --- a/src/containers/dialogs/Modal/index.tsx +++ b/src/containers/dialogs/Modal/index.tsx @@ -1,9 +1,9 @@ -import React, { FC } from "react"; -import { ModalWrapper } from "~/components/dialogs/ModalWrapper"; -import { DIALOG_CONTENT } from "~/constants/modal"; -import { useModalStore } from "~/store/modal/useModalStore"; -import { has } from "ramda"; -import { observer } from "mobx-react-lite"; +import React, { FC } from 'react'; +import { ModalWrapper } from '~/components/dialogs/ModalWrapper'; +import { DIALOG_CONTENT } from '~/constants/modal'; +import { useModalStore } from '~/store/modal/useModalStore'; +import { has } from 'ramda'; +import { observer } from 'mobx-react-lite'; type IProps = {}; diff --git a/src/containers/dialogs/PhotoSwipe/index.tsx b/src/containers/dialogs/PhotoSwipe/index.tsx index 46f4c658..9521dade 100644 --- a/src/containers/dialogs/PhotoSwipe/index.tsx +++ b/src/containers/dialogs/PhotoSwipe/index.tsx @@ -6,10 +6,9 @@ import { getURL } from '~/utils/dom'; import { PRESETS } from '~/constants/urls'; import styles from './styles.module.scss'; import classNames from 'classnames'; -import { useBlockBackButton } from '~/hooks/navigation/useBlockBackButton'; import { useModal } from '~/hooks/modal/useModal'; import { observer } from 'mobx-react'; -import { IFile } from '~/redux/types'; +import { IFile } from '~/types'; import { DialogComponentProps } from '~/types/modal'; export interface PhotoSwipeProps extends DialogComponentProps { @@ -60,8 +59,6 @@ const PhotoSwipe: VFC = observer(({ index, items }) => { }); }, [hideModal, items, index]); - useBlockBackButton(hideModal); - return (