/* 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 { 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 noUnderline?: boolean } export interface NodeLinkProps { setPreviewNode: any nodeById: NodeById nodeByCite: NodeByCite href: any children: any setSidebarHighlightedNode: any openContextMenu: any 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' export const NodeLink = (props: NodeLinkProps) => { const { noUnderline, id, setSidebarHighlightedNode, setPreviewNode, nodeById, openContextMenu, href, children, } = 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 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 }} > {children} ) } 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, } = 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 const getText = () => { fetch(`http://localhost:35901/file/${file}`) .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)) /* 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 * }, * section: ({ children, className }) => ( *
{children}
* ), * p: ({ children }) => { * return

{children}

* }, * }, * }) */ if (id) { return ( <> setHover(true)} onMouseLeave={() => setHover(false)} > { setSidebarHighlightedNode(nodeById[id] ?? {}) }} onMouseLeave={() => { setSidebarHighlightedNode({}) }} > ( )} > ) } return ( {children} ) }