/* eslint-disable react/display-name */ import { Box, Button, Link, Popover, PopoverArrow, PopoverBody, PopoverCloseButton, PopoverContent, PopoverHeader, PopoverTrigger, Portal, Text, useTheme, } from '@chakra-ui/react' import React, { ReactElement, useContext, useEffect, useMemo, useState } from 'react' import { ProcessedOrg } from '../../util/processOrg' import unified from 'unified' //import createStream from 'unified-stream' import uniorgParse from 'uniorg-parse' import uniorg2rehype from 'uniorg-rehype' //import highlight from 'rehype-highlight' import katex from 'rehype-katex' import 'katex/dist/katex.css' import rehype2react from 'rehype-react' import { ThemeContext } from '../../util/themecontext' import { LinksByNodeId, NodeByCite, NodeById } from '../../pages' export interface LinkProps { href: any children: any previewNode?: any setPreviewNode: any setSidebarHighlightedNode: any nodeByCite: NodeByCite nodeById: NodeById openContextMenu: any outline: boolean linksByNodeId: LinksByNodeId isWiki?: boolean noUnderline?: boolean attachDir: string macros: { [key: string]: string } } export interface NodeLinkProps { setPreviewNode: any nodeById: NodeById nodeByCite: NodeByCite href: any children: any setSidebarHighlightedNode: any openContextMenu: any isWiki?: boolean noUnderline?: boolean id?: string } export interface NormalLinkProps { href: string children: string } import { hexToRGBA, getThemeColor } from '../../pages/index' import { defaultNoteStyle, viewerNoteStyle, outlineNoteStyle } from './noteStyle' import { OrgImage } from './OrgImage' import { Scrollbars } from 'react-custom-scrollbars-2' import { ExternalLinkIcon } from '@chakra-ui/icons' import { Section } from './Section' import { OrgRoamLink } from '../../api' export const NodeLink = (props: NodeLinkProps) => { const { noUnderline, id, setSidebarHighlightedNode, setPreviewNode, nodeById, openContextMenu, href, children, isWiki, } = props const { highlightColor } = useContext(ThemeContext) const theme = useTheme() const coolHighlightColor = getThemeColor(highlightColor, theme) const type = href.replaceAll(/(.*?)\:?.*/g, '$1') const uri = href.replaceAll(/.*?\:(.*)/g, '$1') const ID = id ?? uri const linkText = isWiki ? `[[${children}]]` : children return ( setSidebarHighlightedNode(nodeById[ID])} onMouseLeave={() => setSidebarHighlightedNode({})} tabIndex={0} display="inline" overflow="hidden" fontWeight={500} color={highlightColor} textDecoration={noUnderline ? undefined : 'underline'} onContextMenu={(e) => { e.preventDefault() openContextMenu(nodeById[uri], e) }} onClick={() => setPreviewNode(nodeById[uri])} // TODO don't hardcode the opacitycolor _hover={{ textDecoration: 'none', cursor: 'pointer', bgColor: coolHighlightColor + '22' }} _focus={{ outlineColor: highlightColor }} > {linkText} ) } export const NormalLink = (props: NormalLinkProps) => { const { href, children } = props const { highlightColor } = useContext(ThemeContext) return ( {children} ) } export const PreviewLink = (props: LinkProps) => { const { href, children, nodeById, setSidebarHighlightedNode, previewNode, setPreviewNode, nodeByCite, openContextMenu, outline, noUnderline, linksByNodeId, isWiki, macros, attachDir, } = props // TODO figure out how to properly type this // see https://github.com/rehypejs/rehype-react/issues/25 const [orgText, setOrgText] = useState(null) const [hover, setHover] = useState(false) const type = href.replaceAll(/(.*?)\:.*/g, '$1') const extraNoteStyle = outline ? outlineNoteStyle : viewerNoteStyle console.log(previewNode) const getText = () => { fetch(`http://localhost:35901/node/${id}`) .then((res) => { return res.text() }) .then((res) => { if (res !== 'error') { setOrgText(res) return } }) .catch((e) => { console.log(e) return 'Could not fetch the text for some reason, sorry!\n\n This can happen because you have an id with forward slashes (/) in it.' }) } useEffect(() => { if (type.replaceAll(/(http)?.*/g, '$1')) { return } if (!!orgText) { return } if (!hover) { return } getText() }, [hover, orgText]) if (!type) { return {children} } if (type.replaceAll(/(http)?.*/g, '$1')) { return {children} } const uri = href.replaceAll(/.*?\:(.*)/g, '$1') const getId = (type: string, uri: string) => { if (type === 'id') { return uri } if (type.includes('cite')) { const node = nodeByCite[uri] ?? false if (!node) { return '' } if (node?.properties.FILELESS) { return '' } return node?.id } return '' } const id = getId(type, uri) const file = encodeURIComponent(encodeURIComponent(nodeById[id]?.file as string)) if (id) { return ( <> setHover(true)} onMouseLeave={() => setHover(false)} > { setSidebarHighlightedNode(nodeById[id] ?? {}) }} onMouseLeave={() => { setSidebarHighlightedNode({}) }} > ( )} > ) } return ( {children} ) }