import React, { useState, useRef, useContext, useEffect } from "react"; import { Card } from "react-bootstrap"; import ContentEditable, { ContentEditableEvent } from "react-contenteditable"; import { Link } from "react-router-dom"; import { Spinner } from "react-bootstrap"; import { UserPrefContext, LabelInfo, LabelMap, } from "src/services/userPref/userPrefProvider"; import { timestampToTimeago, printableChars } from "src/utils/Utils"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faEdit, faTrashAlt } from "@fortawesome/free-regular-svg-icons"; import sanitizeHtml from "sanitize-html"; import "./LabelCard.css"; interface IProps { k: string; v: LabelInfo; } const LabelCard: React.FC = ({ k, v }) => { const userPrefContext = useContext(UserPrefContext); if (!userPrefContext) { return (
); } const { labelMap, setLabelMap } = userPrefContext; const text = useRef(v.name); const [isEditing, setEditing] = useState(false); const inner = React.createRef(); const handleDelete = () => { const temp: LabelMap = { ...labelMap }; delete temp[k]; setLabelMap(temp); }; const handleChange = (e: ContentEditableEvent) => { text.current = sanitizeHtml(e.target.value); }; const handleBlur = () => { setEditing(false); const temp: LabelMap = { ...labelMap }; temp[k].name = sanitizeHtml(text.current); setLabelMap(temp); }; const moveCaretToEnd = (el: HTMLElement) => { const target = document.createTextNode(""); el.appendChild(target); if (target !== null && target.nodeValue !== null) { const sel = window.getSelection(); if (sel === null) return; const range = document.createRange(); range.setStart(target, target.nodeValue.length); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); if (el instanceof HTMLElement) el.focus(); } }; useEffect(() => { if (!inner.current) return; inner.current.focus(); moveCaretToEnd(inner.current); }, [isEditing, inner]); return ( <>
{isEditing ? ( text.current.length >= 20 && printableChars(e.keyCode) ? e.preventDefault() : e.keyCode === 13 && (() => { inner.current?.blur(); })() } className="label-name-editable" innerRef={inner} html={text.current} onBlur={handleBlur} onChange={handleChange} /> ) : ( {v.name} )}
setEditing(true)} cursor="pointer" icon={faEdit} />
Type: {v.type}
Network: {v.networkName}
Added: {timestampToTimeago(v.timeAdded * 1000)}
); }; export default LabelCard;