public/components/BatchTagControls/BatchTagArbitraryUrls.js (60 lines of code) (raw):

import React, {useState} from "react"; export const BatchTagArbitraryUrls = ({addPathsToSelection}) => { const [isModalDisplayed, setIsModalDisplayed] = useState(false); const [input, setInput] = useState("") // string const [cleaned, setCleaned] = useState(); // string[] const close = () => { setInput(""); setCleaned(null); setIsModalDisplayed(false); } const clean = () => setCleaned([...new Set( input.split("\n").map(url => { if(url.startsWith("http")){ return url.trim().split("/").slice(3).join("/"); } return url.trim(); // already just the path }).filter(_ => !!_) // remove empty )]); const complete = () => { addPathsToSelection(cleaned); close(); } return ( <React.Fragment> {isModalDisplayed && ( <div className="batch-tag__arbitrary_modal_background"> <div className="batch-tag__arbitrary_modal_content"> <div><strong>{cleaned ? "Please check the paths extracted from the web URLs you entered" : "Enter web URLs (one per line)" }</strong></div> <textarea className="batch-tag__arbitrary_modal_input" value={cleaned ? cleaned.join("\n") : input} onChange={({target}) => setInput(target.value)} disabled={!!cleaned} /> <div className="batch-tag__arbitrary_modal_button_bar"> <button className="batch-tag__arbitrary_button" onClick={close}>Cancel</button> {cleaned ? ( <div> <button className="batch-tag__arbitrary_button--red" onClick={() => setCleaned(null)}> Back </button> {" "} <button className="batch-tag__arbitrary_button--green" disabled={!input} onClick={complete}> Add {cleaned.length} unique rows </button> </div> ) : ( <button className="batch-tag__arbitrary_button--green" disabled={!input} onClick={clean}> Next </button> )} </div> </div> </div> )} <button className="batch-tag__arbitrary_button" onClick={() => setIsModalDisplayed(true)}>Add arbitrary URLs</button> </React.Fragment> ); }