diff --git a/app/components/ScrollToTop.js b/app/components/ScrollToTop.js index 1129a341..44e654b8 100644 --- a/app/components/ScrollToTop.js +++ b/app/components/ScrollToTop.js @@ -1,31 +1,29 @@ // @flow // based on: https://reacttraining.com/react-router/web/guides/scroll-restoration import * as React from "react"; -import { withRouter } from "react-router-dom"; -import type { Location } from "react-router-dom"; +import { useLocation } from "react-router-dom"; +import usePrevious from "hooks/usePrevious"; -type Props = { - location: Location, +type Props = {| children: React.Node, -}; +|}; -class ScrollToTop extends React.Component { - componentDidUpdate(prevProps) { - if (this.props.location.pathname === prevProps.location.pathname) return; +export default function ScrollToTop({ children }: Props) { + const location = useLocation(); + const previousLocationPathname = usePrevious(location.pathname); + + React.useEffect(() => { + if (location.pathname === previousLocationPathname) return; // exception for when entering or exiting document edit, scroll position should not reset if ( - this.props.location.pathname.match(/\/edit\/?$/) || - prevProps.location.pathname.match(/\/edit\/?$/) + location.pathname.match(/\/edit\/?$/) || + previousLocationPathname?.match(/\/edit\/?$/) ) return; window.scrollTo(0, 0); - } + }, [location.pathname, previousLocationPathname]); - render() { - return this.props.children; - } + return children; } - -export default withRouter(ScrollToTop); diff --git a/app/scenes/Document/components/References.js b/app/scenes/Document/components/References.js index 470cdce6..796fe10b 100644 --- a/app/scenes/Document/components/References.js +++ b/app/scenes/Document/components/References.js @@ -1,8 +1,8 @@ // @flow -import { observer, inject } from "mobx-react"; +import { observer } from "mobx-react"; import * as React from "react"; import { Trans } from "react-i18next"; -import { withRouter, type Location } from "react-router-dom"; +import { useLocation } from "react-router-dom"; import CollectionsStore from "stores/CollectionsStore"; import DocumentsStore from "stores/DocumentsStore"; import Document from "models/Document"; @@ -10,75 +10,73 @@ import Fade from "components/Fade"; import Tab from "components/Tab"; import Tabs from "components/Tabs"; import ReferenceListItem from "./ReferenceListItem"; +import useStores from "hooks/useStores"; type Props = { document: Document, documents: DocumentsStore, collections: CollectionsStore, - location: Location, }; -@observer -class References extends React.Component { - componentDidMount() { - this.props.documents.fetchBacklinks(this.props.document.id); - } +function References({ document }: Props) { + const { collections, documents } = useStores(); + const location = useLocation(); - render() { - const { documents, collections, document } = this.props; - const backlinks = documents.getBacklinedDocuments(document.id); - const collection = collections.get(document.collectionId); - const children = collection - ? collection.getDocumentChildren(document.id) - : []; + React.useEffect(() => { + documents.fetchBacklinks(document.id); + }, [documents, document.id]); - const showBacklinks = !!backlinks.length; - const showNestedDocuments = !!children.length; - const isBacklinksTab = - this.props.location.hash === "#backlinks" || !showNestedDocuments; + const backlinks = documents.getBacklinedDocuments(document.id); + const collection = collections.get(document.collectionId); + const children = collection + ? collection.getDocumentChildren(document.id) + : []; - return ( - (showBacklinks || showNestedDocuments) && ( - - - {showNestedDocuments && ( - !isBacklinksTab}> - Nested documents - - )} - {showBacklinks && ( - isBacklinksTab}> - Referenced by - - )} - - {isBacklinksTab - ? backlinks.map((backlinkedDocument) => ( + const showBacklinks = !!backlinks.length; + const showNestedDocuments = !!children.length; + const isBacklinksTab = location.hash === "#backlinks" || !showNestedDocuments; + + return ( + (showBacklinks || showNestedDocuments) && ( + + + {showNestedDocuments && ( + !isBacklinksTab}> + Nested documents + + )} + {showBacklinks && ( + isBacklinksTab}> + Referenced by + + )} + + {isBacklinksTab + ? backlinks.map((backlinkedDocument) => ( + + )) + : children.map((node) => { + // If we have the document in the store already then use it to get the extra + // contextual info, otherwise the collection node will do (only has title and id) + const document = documents.get(node.id); + return ( - )) - : children.map((node) => { - // If we have the document in the store already then use it to get the extra - // contextual info, otherwise the collection node will do (only has title and id) - const document = documents.get(node.id); - return ( - - ); - })} - - ) - ); - } + ); + })} + + ) + ); } -export default withRouter(inject("documents", "collections")(References)); +export default observer(References);