/* 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 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 { NodeByCite, NodeById } from '../../pages' export interface LinkProps { href: any children: any previewNode?: any setPreviewNode: any setSidebarHighlightedNode: any nodeByCite: NodeByCite nodeById: NodeById openContextMenu: any } export interface NormalLinkProps { setPreviewNode: any nodeById: NodeById nodeByCite: NodeByCite href: any children: any setSidebarHighlightedNode: any openContextMenu: any } import { hexToRGBA, getThemeColor } from '../../pages/index' import noteStyle from './noteStyle' import { OrgImage } from './OrgImage' import { Scrollbars } from 'react-custom-scrollbars-2' export const NormalLink = (props: NormalLinkProps) => { const { setSidebarHighlightedNode, setPreviewNode, nodeById, openContextMenu, href, children } = props const { highlightColor } = useContext(ThemeContext) const theme = useTheme() const coolHighlightColor = getThemeColor(highlightColor, theme) const [whatever, type, uri] = [...href.matchAll(/(.*?)\:(.*)/g)][0] return ( setSidebarHighlightedNode(nodeById[uri])} onMouseLeave={() => setSidebarHighlightedNode({})} tabIndex={0} display="inline" overflow="hidden" fontWeight={500} color={highlightColor} textDecoration="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 }} > {children} ) } export const PreviewLink = (props: LinkProps) => { const { href, children, nodeById, setSidebarHighlightedNode, previewNode, setPreviewNode, nodeByCite, openContextMenu, } = props // TODO figure out how to properly type this // see https://github.com/rehypejs/rehype-react/issues/25 const [orgText, setOrgText] = useState(null) const [whatever, type, uri] = [...href.matchAll(/(.*?)\:(.*)/g)][0] const [hover, setHover] = useState(false) 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)) const processor = unified() .use(uniorgParse) .use(uniorg2rehype) .use(katex) .use(rehype2react, { createElement: React.createElement, components: { // eslint-disable-next-line react/display-name a: ({ children, href }) => ( {children} ), img: ({ src }) => { return }, }, }) const getText = () => { fetch(`http://localhost:35901/file/${file}`) .then((res) => { return res.text() }) .then((res) => { if (res !== 'error') { const text = processor.processSync(res).result setOrgText(text) 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 (!!orgText) { return } if (!hover) { return } getText() }, [hover, orgText]) if (id) { return ( <> setHover(true)} onMouseLeave={() => setHover(false)} > { setSidebarHighlightedNode(nodeById[id] ?? {}) }} onMouseLeave={() => { setSidebarHighlightedNode({}) }} > ( )} > {orgText} ) } return ( {children} ) }