From 577c1af79bace353accf71fd8833883818aabbe0 Mon Sep 17 00:00:00 2001 From: karishmas6 Date: Thu, 11 Apr 2024 14:13:55 +0530 Subject: [PATCH] refactor: remove typescript --- ui/src/components/VisualSelector/index.jsx | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 ui/src/components/VisualSelector/index.jsx diff --git a/ui/src/components/VisualSelector/index.jsx b/ui/src/components/VisualSelector/index.jsx new file mode 100644 index 00000000..29b6a417 --- /dev/null +++ b/ui/src/components/VisualSelector/index.jsx @@ -0,0 +1,59 @@ +import React, { useState, useRef, useEffect } from 'react'; +import parse from 'html-react-parser'; + + +const VisualSelector = () => { + const [selectedElements, setSelectedElements] = useState([]); + const contentRef = useRef(null); + + useEffect(() => { + const handleClick = (e) => { + const target = e.target as HTMLElement; + if (selectedElements.includes(target)) { + setSelectedElements(selectedElements.filter((el) => el !== target)); + } else { + setSelectedElements([...selectedElements, target]); + } + }; + + if (contentRef.current) { + contentRef.current.addEventListener('click', handleClick); + } + + return () => { + if (contentRef.current) { + contentRef.current.removeEventListener('click', handleClick); + } + }; + }, [selectedElements]); + + useEffect(() => { + onElementSelection(selectedElements); + }, [selectedElements, onElementSelection]); + + const getElementSelector = (element): string => { + const path = Array.from(element.parentNode.childNodes) + .indexOf(element) + .toString(); + const selector = `${element.tagName.toLowerCase()}:nth-child(${path})`; + return element.parentNode.tagName.toLowerCase() !== 'HTML' + ? `${getElementSelector(element.parentNode)} > ${selector}` + : selector; + }; + + const handleClearSelection = () => { + setSelectedElements([]); + onElementSelection([]); + }; + + return ( +
+
{parse(htmlContent)}
+ +

Selected Elements:

+
{JSON.stringify(selectedElements.map(getElementSelector), null, 2)}
+
+ ); +}; + +export default VisualSelector; \ No newline at end of file