Improve alias support

This commit is contained in:
Joshua Coles 2023-09-29 10:14:49 +01:00
parent 3e44846e22
commit 9f4dff0417

View File

@ -1,10 +1,20 @@
import {ChangeEventHandler, KeyboardEventHandler, ReactNode, useCallback, useEffect, useRef, useState} from "react"; import {
ChangeEventHandler, Dispatch,
KeyboardEventHandler,
MouseEventHandler,
ReactNode, SetStateAction,
useCallback,
useEffect,
useRef,
useState
} from "react";
import {FixedSizeList as List} from "react-window"; import {FixedSizeList as List} from "react-window";
import Select, {createFilter, MenuListProps} from "react-select"; import Select, {createFilter, MenuListProps} from "react-select";
import * as R from 'ramda'; import * as R from 'ramda';
import {useQuery} from "@tanstack/react-query"; import {useQuery} from "@tanstack/react-query";
// TODO: Fix this for wrapping items, esp on phones
const height = 35; const height = 35;
function MenuList(props: MenuListProps) { function MenuList(props: MenuListProps) {
@ -80,6 +90,10 @@ export function LargeSelect() {
/> />
{selected && <div className={"mt-2"}> {selected && <div className={"mt-2"}>
<div className="py-1">
<Alias original={selected.label}/>
</div>
{selected.data.aliases?.map(alias => ( {selected.data.aliases?.map(alias => (
<div className="py-1"> <div className="py-1">
<Alias original={selected.label} alias={alias}/> <Alias original={selected.label} alias={alias}/>
@ -87,33 +101,54 @@ export function LargeSelect() {
))} ))}
<div className="py-1"> <div className="py-1">
<span className={"rounded-md p-1 hover:bg-slate-100"}> <CustomAlias selected={selected}/>
<span className={"text-slate-300 p-0.5"}>[[</span>
<span>{selected.label}</span>
<span className={"text-slate-300 p-0.5"}>|</span>
<span>
<CustomAliasField selected={selected}/>
</span>
<span className={"text-slate-300 p-0.5"}>]]</span>
</span>
</div> </div>
</div>} </div>}
</div> </div>
) )
} }
function CustomAliasField({selected}: { function CustomAlias({selected}: {
selected: Option selected: Option
}) { }) {
const [content, setContent] = useState(''); const [alias, setAlias] = useState('');
const [width, setWidth] = useState<any>(0);
const span = useRef<HTMLSpanElement>(null);
// Reset when selection changes // Reset when selection changes
useEffect(() => { useEffect(() => {
setContent(''); setAlias('');
}, [selected.value]); }, [selected.value]);
const onClick: MouseEventHandler = useCallback((e) => {
if ((e.target as HTMLElement).tagName == 'SPAN' && alias.length > 0) {
navigator.clipboard.writeText(`[[${selected!.label}|${alias}]]`);
}
}, [selected.value, selected.label, alias]);
return (
<span onClick={onClick} className={"rounded-md p-1 hover:bg-slate-100"}>
<span className={"text-slate-300 p-0.5"}>[[</span>
<span>{selected.label}</span>
<span className={"text-slate-300 p-0.5"}>|</span>
<span>
<CustomAliasField content={alias} setContent={setAlias} selected={selected}/>
</span>
<span className={"text-slate-300 p-0.5"}>]]</span>
</span>
)
}
function CustomAliasField({
selected,
content,
setContent
}: {
selected: Option,
content: string,
setContent: Dispatch<SetStateAction<string>>,
}) {
const [width, setWidth] = useState<any>(0);
const span = useRef<HTMLSpanElement>(null);
// Resize on change of content // Resize on change of content
useEffect(() => { useEffect(() => {
setWidth(span.current!.offsetWidth); setWidth(span.current!.offsetWidth);
@ -141,7 +176,8 @@ function CustomAliasField({selected}: {
}} ref={span}>{content}</span> }} ref={span}>{content}</span>
<input <input
className={"border-none p-0 px-1"} className={"border-none p-0 px-1"}
type="text" style={{width: `calc(${width}px + 0.25rem)`}} autoFocus onChange={changeHandler} onKeyDown={onCustomElementKeyDown}/> type="text" style={{width: `calc(${width}px + 0.25rem)`}} autoFocus onChange={changeHandler}
onKeyDown={onCustomElementKeyDown}/>
</span> </span>
); );
} }
@ -154,15 +190,19 @@ function Alias({
alias: string alias: string
}) { }) {
const onClick = useCallback(() => { const onClick = useCallback(() => {
navigator.clipboard.writeText(`[[${original}|${alias}]]`) if (alias) {
navigator.clipboard.writeText(`[[${original}|${alias}]]`)
} else {
navigator.clipboard.writeText(`[[${original}]]`)
}
}, [original, alias]); }, [original, alias]);
return ( return (
<span className={"rounded-md p-1 hover:bg-slate-100"} onClick={onClick}> <span className={"rounded-md p-1 hover:bg-slate-100"} onClick={onClick}>
<span className={"text-slate-300 p-0.5"}>[[</span> <span className={"text-slate-300 p-0.5"}>[[</span>
<span>{original}</span> <span>{original}</span>
<span className={"text-slate-300 p-0.5"}>|</span> {alias && <><span className={"text-slate-300 p-0.5"}>|</span>
<span>{alias}</span> <span>{alias}</span></>}
<span className={"text-slate-300 p-0.5"}>]]</span> <span className={"text-slate-300 p-0.5"}>]]</span>
</span> </span>
); );