import { observer } from "mobx-react"; import * as React from "react"; import { Trans } from "react-i18next"; import { useLocation } from "react-router-dom"; import styled from "styled-components"; import Document from "~/models/Document"; import Fade from "~/components/Fade"; import Tab from "~/components/Tab"; import Tabs from "~/components/Tabs"; import useStores from "~/hooks/useStores"; import ReferenceListItem from "./ReferenceListItem"; type Props = { document: Document; }; function References({ document }: Props) { const { collections, documents } = useStores(); const location = useLocation(); React.useEffect(() => { documents.fetchBacklinks(document.id); }, [documents, document.id]); const backlinks = documents.getBacklinkedDocuments(document.id); const collection = collections.get(document.collectionId); const children = collection ? collection.getDocumentChildren(document.id) : []; const showBacklinks = !!backlinks.length; const showChildDocuments = !!children.length; const isBacklinksTab = location.hash === "#backlinks" || !showChildDocuments; const height = Math.max(backlinks.length, children.length) * 40; return showBacklinks || showChildDocuments ? ( {showChildDocuments && ( !isBacklinksTab}> Nested documents )} {showBacklinks && ( isBacklinksTab}> Backlinks )} {showBacklinks && ( {backlinks.map((backlinkedDocument) => ( ))} )} {showChildDocuments && ( {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 ( ); })} )} ) : null; } const Content = styled.div` position: relative; `; const List = styled.div<{ $active: boolean }>` visibility: ${({ $active }) => ($active ? "visible" : "hidden")}; position: absolute; top: 0; left: 0; right: 0; `; export default observer(References);