/* 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 }) => (
*
* ),
* p: ({ children }) => {
* return {children}
* },
* },
* })
*/
if (id) {
return (
<>
setHover(true)}
onMouseLeave={() => setHover(false)}
>
{
setSidebarHighlightedNode(nodeById[id] ?? {})
}}
onMouseLeave={() => {
setSidebarHighlightedNode({})
}}
>
(
)}
>
>
)
}
return (
{children}
)
}