import React, { useEffect, useState } from "react"; import Lottie from "lottie-react"; import { nanoid } from "nanoid"; import PagePlaceholder from "@/Components/PagePlaceholder"; import UploadFile from "@/Components/UploadFile"; import { bytesTohex, getEmptyuserMetadata, getParsedSW, timeAgo, } from "@/Helpers/Encryptions"; import LoadingDots from "@/Components/LoadingDots"; import Select from "@/Components/Select"; import OptionsDropdown from "@/Components/OptionsDropdown"; import UserSearchBar from "@/Components/UserSearchBar"; import NProfilePreviewer from "@/Components/NProfilePreviewer"; import { useDispatch, useSelector } from "react-redux"; import { setToast, setToPublish } from "@/Store/Slides/Publishers"; import { useTranslation } from "react-i18next"; import { t } from "i18next"; import { generateSecretKey, nip19 } from "nostr-tools"; import NDK, { NDKEvent, NDKPrivateKeySigner } from "@nostr-dev-kit/ndk"; import { Widget } from "smart-widget-previewer"; import { getUser, InitEvent } from "@/Helpers/Controlers"; import { ndkInstance } from "@/Helpers/NDKInstance"; import PostNoteWithWidget from "@/Components/PostNoteWithWidget"; import { customHistory } from "@/Helpers/History"; import axios from "axios"; import UserProfilePic from "@/Components/UserProfilePic"; import { saveUsers } from "@/Helpers/DB"; import { addWidgetPathToUrl } from "@/Helpers/Helpers"; import widget from "@/JSONs/widgets.json"; import { useRouter } from "next/router"; import { getPostToEdit } from "@/Helpers/ClientHelpers"; import { DraggableComp } from "@/Components/DraggableComp"; import Icon from "@/Components/Icon"; const SWT_YAKIHONNE = "https://swt.yakihonne.com"; const getLocalSWv2Drafts = () => { try { let previousDrafts = localStorage?.getItem("swv2-drafts") || false; previousDrafts = previousDrafts ? JSON.parse(previousDrafts) : []; return previousDrafts; } catch (err) { console.log(err); return []; } }; const getLocalSWv2CDraft = () => { try { let current = localStorage?.getItem("swv2-cdraft") || false; current = current ? JSON.parse(current) : false; return current; } catch (err) { console.log(err); return false; } }; export default function SmartWidgetEditor() { let { query } = useRouter(); let { edit, clone } = query || {}; let toEdit = edit ? getPostToEdit(edit) : false; let toClone = clone ? getPostToEdit(clone) : clone; const userKeys = useSelector((state) => state.userKeys); const [buildOption, setBuildOption] = useState("normal"); const [buildOptions, setBuildOptions] = useState(query ? false : true); const [template, setTemplate] = useState( toEdit || toClone ? toEdit || toClone : getLocalSWv2CDraft(), ); const [identifier, setIdentifier] = useState(edit ? true : false); const [templates, setTemplates] = useState([]); useEffect(() => { const getTemplates = async () => { try { let t = await axios.post(SWT_YAKIHONNE, undefined, { withCredentials: true, }); setTemplates(t.data); } catch (err) { console.log(err); } }; getTemplates(); }, []); const handleSelectTemplate = (t) => { setTemplate(t); setBuildOption("normal"); setBuildOptions(false); setIdentifier(false); }; const handleSelectDraft = (draft, publish) => { setTemplate(draft); setBuildOptions(false); setIdentifier(false); }; return (
{userKeys && ( <> {(userKeys.sec || userKeys.ext || userKeys.bunker) && ( <> {buildOptions && ( <> {buildOption === "normal" && ( { setBuildOptions(false); setTemplate(data); }} template={template} setBuildOption={(option) => setBuildOption(option)} back={() => setBuildOptions(false)} /> )} {buildOption === "template" && ( setBuildOption("normal")} setTemplate={handleSelectTemplate} templates={templates} /> )} {buildOption === "drafts" && ( )} )} {!buildOptions && ( { setBuildOptions(true); setTemplate(data); }} template={template} identifier={identifier} /> )} )} {!userKeys.sec && !userKeys.ext && !userKeys.bunker && ( )} )} {!userKeys && }
); } const BuildOptions = ({ setTemplate, template, back, setBuildOption }) => { const { t } = useTranslation(); return (

{t("AgnT2y8")}

{t("AG1WdKb")}

setTemplate(false, true)} >

{t("AbvONJd")}

setBuildOption("drafts")} >

{t("AaXbNvT")}

setBuildOption("template")} >

{t("A60QDNZ")}

{template && (

{t("ARVqa3s")}

)}
); }; const SmartWidgetBuilder = ({ back, template, identifier }) => { const dispatch = useDispatch(); const { t } = useTranslation(); const userKeys = useSelector((state) => state.userKeys); const [isSaving, setIsSaving] = useState(false); const [swType, setSwType] = useState(template?.type || "basic"); const [swMetadataUrl, setSwMetadataUrl] = useState(""); const [swMetadataIsLoading, setSwMetadataIsLoading] = useState(false); const [swMetadata, setSwMetadata] = useState(false); const [swIcon, setSwIcon] = useState(template?.icon || ""); const [swTitle, setSwTitle] = useState(template?.title || ""); const [mbHide, setMbHide] = useState(true); const [selectedComp, setSelectedComp] = useState(""); const [showSaveDraft, setShowSaveDraft] = useState(false); const [preview, setPreview] = useState(false); const [swImage, setSwImage] = useState(template ? template.image : ""); const [swInput, setSwInput] = useState( template ? template.input : t("AEyQqPE"), ); const [swButtons, setSwButtons] = useState( template ? template.buttons : [{ type: "redirect", label: "Button", url: "" }], ); const [swComponents, setSwComponents] = useState( template ? template.components : [ { value: swImage, type: "image" }, { value: swInput, type: "input" }, { value: swButtons, type: "button" }, ], ); const [widgetToPostInNote, setWidgetToPostInNote] = useState(false); const swTypes = [ { display_name: "Basic", value: "basic", }, { display_name: "Action", value: "action", }, { display_name: "Tool", value: "tool", }, ]; useEffect(() => { if (template && template.type !== "basic") { setSwMetadataUrl(template.buttons[0].url); getApp(template.buttons[0].url); } }, []); useEffect(() => { if (swComponents.length < 3) { setSwComponents([ { value: swImage, type: "image" }, { value: swButtons, type: "button" }, ]); return; } setSwComponents([ { value: swImage, type: "image" }, { value: swInput, type: "input" }, { value: swButtons, type: "button" }, ]); setIsSaving(true); let current = { title: "", image: swImage, input: swInput, buttons: swButtons, components: swComponents, }; if (swImage || swButtons.length > 1 || swComponents.length <= 2) { localStorage?.setItem("swv2-cdraft", JSON.stringify(current)); } else { localStorage?.removeItem("swv2-cdraft"); } let timer = setTimeout(() => { setIsSaving(false); clearTimeout(timer); }, [500]); return () => { clearTimeout(timer); }; }, [swImage, swInput, swButtons]); const handleInputInCompSet = () => { if (swComponents.length > 2) { setSwComponents(swComponents.filter((_) => _.type !== "input")); return; } setSwComponents([ { value: swImage, type: "image" }, { value: swInput, type: "input" }, { value: swButtons, type: "button" }, ]); }; const handleAddButton = () => { let btn = { type: "redirect", label: "Button", url: "" }; setSwButtons((prev) => [...prev, btn]); }; const handleRemoveButton = (index) => { let selectedCompIndex = selectedComp && selectedComp.includes("button") ? parseInt(selectedComp.split(":")[1]) : 0; if ( selectedComp.includes("button:") && selectedCompIndex > swButtons.length - 2 ) setSelectedComp(""); setSwButtons(swButtons.filter((_, _index) => _index !== index)); }; const handlePReview = async () => { if (preview) { setPreview(false); return; } setSelectedComp(""); let tags = getTagsArray(); if (!tags) return; const sk = bytesTohex(generateSecretKey()); let ndkInstance_ = new NDK(); ndkInstance_.signer = new NDKPrivateKeySigner(sk); let identifier = `unpublished_smart_widget_${Date.now()}`; let tags_ = [["d", identifier], ["l", swType], ["icon", swIcon], ...tags]; const ndkEvent = new NDKEvent(ndkInstance_); ndkEvent.kind = 30033; ndkEvent.content = swTitle; ndkEvent.tags = tags_; await ndkEvent.sign(); setPreview(ndkEvent.rawEvent()); }; const handlePublish = async () => { if (!swTitle) { dispatch( setToast({ type: 2, desc: t("AbfIPKv"), }), ); return; } setSelectedComp(""); if (swType === "basic") await publishBasicSW(); if (swType !== "basic") await publishNoneBasicSW(); }; const publishBasicSW = async () => { let tags = getTagsArray(); let d = identifier ? template.d : nanoid(); if (!tags) return; let eventInitEx = await InitEvent(30033, swTitle, [ [ "client", "Yakihonne", "31990:20986fb83e775d96d188ca5c9df10ce6d613e0eb7e5768a0f0b12b37cdac21b3:1700732875747", ], ["published_at", `${Math.floor(Date.now() / 1000)}`], ["d", d], ["l", swType], ["icon", swIcon], ...tags, ]); if (!eventInitEx) return; dispatch( setToPublish({ eventInitEx, allRelays: [], }), ); let sub = ndkInstance.subscribe( [{ kinds: [30033], ids: [eventInitEx.id] }], { closeOnEose: true, cacheUsage: "CACHE_FIRST", }, ); sub.on("event", (event) => { let naddr = nip19.naddrEncode({ pubkey: event.pubkey, kind: event.kind, identifier: d, }); setWidgetToPostInNote( `https://yakihonne.com/smart-widget-checker?naddr=${naddr}`, ); sub.stop(); }); }; const publishNoneBasicSW = async () => { if (!swMetadata) { dispatch( setToast({ type: 2, desc: t("AbfIPKv"), }), ); return; } let d = identifier ? template.d : nanoid(); let eventInitEx = await InitEvent(30033, swTitle, [ [ "client", "Yakihonne", "31990:20986fb83e775d96d188ca5c9df10ce6d613e0eb7e5768a0f0b12b37cdac21b3:1700732875747", ], ["published_at", `${Math.floor(Date.now() / 1000)}`], ["d", d], ["l", swType], ["icon", swIcon], ["image", swMetadata.widget.imageUrl], [ "button", swMetadata.widget.buttonTitle, "app", // "http://localhost:5173/", swMetadata.widget.appUrl, ], ]); if (!eventInitEx) return; dispatch( setToPublish({ eventInitEx, allRelays: [], }), ); let sub = ndkInstance.subscribe( [{ kinds: [30033], ids: [eventInitEx.id] }], { closeOnEose: true, cacheUsage: "CACHE_FIRST", }, ); sub.on("event", (event) => { let naddr = nip19.naddrEncode({ pubkey: event.pubkey, kind: event.kind, identifier: d, }); setWidgetToPostInNote( `https://yakihonne.com/smart-widget-checker?naddr=${naddr}`, ); sub.stop(); }); }; const getTagsArray = () => { let imageTag = swImage ? ["image", swImage] : false; let inputTag = swInput ? ["input", swInput] : swComponents.length > 2 ? false : true; let buttonsTag = swButtons.filter((_) => _.label && _.url); buttonsTag = buttonsTag.length > 0 ? buttonsTag.map((_) => ["button", _.label, _.type, _.url]) : false; let tags = []; if (!imageTag) { dispatch( setToast({ type: 2, desc: t("Ar85kI3"), }), ); return; } if (!inputTag) { dispatch( setToast({ type: 2, desc: t("AKIvtnO"), }), ); return; } if (!buttonsTag) { dispatch( setToast({ type: 2, desc: t("ASEZMzR"), }), ); return; } tags = [imageTag, ...buttonsTag]; if (inputTag && swComponents.length > 2) tags.push(inputTag); return tags; }; const handleDragEnd = (res) => { if (!res.destination || res.destination.index === res.source.index) return; let tempArr = structuredClone(swButtons); let selectedCompIndex = selectedComp && selectedComp.includes("button") ? parseInt(selectedComp.split(":")[1]) : false; let [reorderedArr] = tempArr.splice(res.source.index, 1); tempArr.splice(res.destination.index, 0, reorderedArr); setSwButtons(tempArr); if (selectedCompIndex !== false) { if (selectedComp === `button:${res.source.index}`) setSelectedComp(`button:${res.destination.index}`); if (selectedComp !== `button:${res.source.index}`) { if (res.destination.index > selectedCompIndex) setSelectedComp(`button:${Math.max(0, selectedCompIndex - 1)}`); else if (res.destination.index < selectedCompIndex) setSelectedComp( `button:${Math.min(swButtons.length - 1, selectedCompIndex + 1)}`, ); else if (res.destination.index === selectedCompIndex) { if (res.source.index < selectedCompIndex) setSelectedComp(`button:${Math.max(0, selectedCompIndex - 1)}`); else setSelectedComp( `button:${Math.min(swButtons.length - 1, selectedCompIndex + 1)}`, ); } } } }; const handleBack = () => { let current = { title: swTitle, image: swImage, input: swInput, buttons: swButtons, components: swComponents, }; back(current); }; const getApp = async (url_) => { try { let url = addWidgetPathToUrl(url_ || swMetadataUrl); if (!url) { dispatch( setToast({ type: 2, desc: t("AOF2uGu"), }), ); return; } setSwMetadataIsLoading(true); let data = await axios.get(url); let { pubkey, widget } = data.data || {}; let { appUrl, iconUrl, buttonTitle, imageUrl, title, tags } = widget || {}; if ( !( pubkey && widget && appUrl && iconUrl && buttonTitle && imageUrl && title && tags ) ) { dispatch( setToast({ type: 2, desc: t("AOF2uGu"), }), ); return; } // setSwInput(""); saveUsers([pubkey]); setSwMetadata(data.data); // setSwImage(imageUrl); if (!url_) setSwTitle(title); setSwIcon(iconUrl); // if (swInput) handleInputInCompSet(); // setSwButtons([ // { // label: buttonTitle, // type: "app", // url: appUrl, // }, // ]); setSwMetadataIsLoading(false); } catch (err) { console.log(err); setSwMetadataIsLoading(false); dispatch( setToast({ type: 2, desc: t("AOF2uGu"), }), ); } }; const handleSwitchSWTypes = (data) => { setPreview(false); setSwType(data); }; return ( <> {showSaveDraft && ( setShowSaveDraft(false)} swButtons={swButtons} swComponents={swComponents} swImage={swImage} swInput={swInput} /> )} {widgetToPostInNote && ( customHistory.push("/smart-widgets")} /> )}
{preview && ( )} {!preview && ( )}
setMbHide(false)} >
{!preview && swType === "basic" && (
setSelectedComp(selectedComp === `image` ? "" : `image`) } >
{swImage && } {!swImage && (
)}
{swComponents.length > 2 && (
setSelectedComp(selectedComp === `input` ? "" : `input`) } > {/*
*/}
)} {swComponents.length < 3 && ( <>
{" "}

{t("AqrGbmn")}

)}
{swButtons.map((_, index) => { if (index < 3) return (
setSelectedComp( selectedComp === `button:${index}` ? "" : `button:${index}`, ) } key={index} >
); })}
{swButtons.length > 3 && (
{swButtons.map((_, index) => { if (index > 2) return (
setSelectedComp( selectedComp === `button:${index}` ? "" : `button:${index}`, ) } key={index} >
); })}
)} {swButtons.length < 6 && (
{" "}

{t("Amg4EKo")}

)}
)} {!preview && swType !== "basic" && (
{swMetadata && ( <>
{swMetadata.widget.imageUrl && ( )} {!swMetadata.widget.imageUrl && (
)}
{swMetadata.widget.buttonTitle && (

{swMetadata.widget.buttonTitle}

)} )} {!swMetadata && ( <>
)}
)} {preview && ( alert(t("AXNd5xs"))} onNostrButton={() => alert(t("AbzzoX6"))} widgetBorderColor="var(--pale-gray)" /> )}
setMbHide(true)} data-tooltip={t("ATB2h6T")} >

{t("AzZ1GXv")}

{t("Akxf8vJ")}

{/*
*/}

{t("AE9UQ58")}

setSwTitle(e.target.value)} /> setSwMetadataUrl(e.target.value)} /> {!swMetadata && ( )} {swMetadata && ( )}
)} {swMetadata && swType !== "basic" && ( )} {swType === "basic" && ( <> {selectedComp === "image" && ( )} {selectedComp === "input" && ( )} {selectedComp.includes("button") && ( )} )}
{swType === "basic" && ( <>

{t("AYmIvXo")}

{swComponents.map((comp, index) => { return (
{ e.stopPropagation(); comp.type === "button" ? setSelectedComp( selectedComp === `button:0` ? "" : `button:0`, ) : setSelectedComp( selectedComp === comp.type ? "" : comp.type, ); }} >

{comp.type}

{comp.type === "input" && ( )}
{Array.isArray(comp.value) && (
{ let id = nanoid(); return { ..._, id, }; })} setNewOrderedList={(data) => { setSwButtons(data); }} component={ButtonItem} props={{ handleRemoveButton, setSelectedComp, outterComp: comp, selectedComp, setSelectedComp, }} background={false} />
)}
); })}
)}
); }; const ButtonItem = ({ item, index, handleRemoveButton, outterComp, setSelectedComp, selectedComp, }) => { return (
{ e.stopPropagation(); setSelectedComp( selectedComp === `button:${index}` ? "" : `button:${index}`, ); }} >
{outterComp.value.length > 1 && (
)}

button → {item.type}

{outterComp.value.length > 1 && (
{ e.stopPropagation(); handleRemoveButton(index); }} >
)}
); }; const AppPreview = ({ metadata }) => { const nostrAuthors = useSelector((state) => state.nostrAuthors); const [author, setAuthor] = useState(getEmptyuserMetadata(metadata.pubkey)); useEffect(() => { const data = getUser(metadata.pubkey); if (data) setAuthor(data); }, [nostrAuthors]); return (

{metadata.widget.title}

{t("AsXpL4b", { name: author.display_name || author.name })}

); }; const CustomizeImage = ({ value, setValue }) => { return (

{t("ArKQgmW")}

setValue(e.target.value)} /> setValue(data)} />
); }; const CustomizeInput = ({ value, setValue }) => { return (

{t("AAmUHSp")}

setValue(e.target.value)} />
); }; const CustomizeButton = ({ index, value, setValue, swComps }) => { const buttonTypes = [ { display_name: "Redirect", value: "redirect", }, { display_name: "Zap", value: "zap", }, { display_name: "Nostr", value: "nostr", }, // { // display_name: "App", // value: "app", // }, { display_name: "Post", value: "post", }, ]; const postFunctions = [ { display_name: t("A9rc7Ni"), value: "https://", }, { display_name: t("AowMF91"), value: "https://swt.yakihonne.com/user-search", }, { display_name: t("Ar6CqVi"), value: "https://swt.yakihonne.com/quote", }, { display_name: t("ARx9Q6e"), value: "https://swt.yakihonne.com/trending-notes/next", }, { display_name: t("AIus9gb"), value: "https://swt.yakihonne.com/trending-users/next", }, { display_name: t("A8MH8NR"), value: "https://swt.yakihonne.com/event-countdown/countdown", }, { display_name: t("AiGC7RP"), value: "https://swt.yakihonne.com/memes/shuffle", }, { display_name: t("AehzAoy"), value: "https://swt.yakihonne.com/generate-memes/list/0", }, { display_name: t("AWh5g66"), value: "https://swt.yakihonne.com/quiz-game", }, { display_name: t("AEi6SJh"), value: "https://swt.yakihonne.com/user-stats-search", }, { display_name: t("AR0Bz6H"), value: "https://swt.yakihonne.com/user-zaps/zap", }, { display_name: t("AGAO1Kr"), value: "https://swt.yakihonne.com/jokes/joke", }, { display_name: t("AIXpEsf"), value: "https://swt.yakihonne.com/user-profile-zapping/profiles", }, { display_name: t("AbyPbsN"), value: "https://swt.yakihonne.com/user-profile-visiting/profiles", }, ]; const handleButtonData = (type, data) => { let buttons = structuredClone(value); if (type === "label") { let label = data; let button = buttons[index]; button.label = label; buttons[index] = button; setValue(buttons); } if (type === "url") { let url = data; let button = buttons[index]; button.url = url; buttons[index] = button; setValue(buttons); } if (type === "type") { let type = data; let button = buttons[index]; button.type = type; buttons[index] = button; setValue(buttons); } }; return (

{t("A5IuG4M")}

{t("A38I7Hm")}

handleButtonData("label", e.target.value)} /> {!( value[index].type === "post" && value[index].url.includes("swt.yakihonne.com") ) && ( <>

{t("AGaizjj")}

handleButtonData("url", e.target.value)} /> )}

{t("Ayd7Ojf")}

handleButtonData("url", value)} value={value[index].url.split("?")[0]} defaultLabel={`-- ${t("AKKhOC2")} --`} /> handleButtonData("url", value)} /> {[ "/user-search", "/user-stats-search", "/user-zaps/zap", "/user-profile-zapping", ].includes(value[index].url.split("swt.yakihonne.com")[1]) && swComps.length < 3 && (

{t("A4eRArd")}

)} )}
); }; const CustomFunctionRequiredData = ({ url, setUrl }) => { if ( [ "/quote", "/trending-notes/next", "/trending-users/next", "/memes/shuffle", "/generate-memes/list/0", "/quiz-game", "/jokes/joke", ].includes(url.split("swt.yakihonne.com")[1]) ) return; if (url.includes("/event-countdown/countdown")) return ; if (url.includes("/user-zaps/zap")) return ; if ( url.includes("/user-profile-zapping/profiles") || url.includes("/user-profile-visiting/profiles") ) return ; }; const CountdownFunction = ({ url, setUrl }) => { let { time } = Object.fromEntries(new URL(url).searchParams.entries()); const [date, setDate] = useState( time ? new Date(time * 1000).toISOString().slice(0, 16) : "", ); return ( <>

{t("AE6wLmo")}

{ setDate(e.target.value); setUrl( url.split("?")[0] + `?time=${Math.floor(new Date(e.target.value).getTime() / 1000)}`, ); }} min={new Date().toISOString().slice(0, 16)} /> ); }; const HighestZapperFunction = ({ url, setUrl }) => { let { lud16, ends_at } = Object.fromEntries( new URL(url).searchParams.entries(), ); const [date, setDate] = useState( ends_at ? new Date(ends_at * 1000).toISOString().slice(0, 16) : "", ); const [addr, setAddr] = useState(lud16 || ""); return ( <>

{t("A40BuYB")}

{ setAddr(e.target.value); setUrl( url.split("?")[0] + `?lud16=${e.target.value}&starts_at=${Math.floor( new Date().getTime() / 1000, )}${ date ? `&ends_at=${Math.floor(new Date(date).getTime() / 1000)}` : "" }`, ); }} min={new Date().toISOString().slice(0, 16)} />

{t("AoNggMQ")}

{ setDate(e.target.value); setUrl( url.split("?")[0] + `?lud16=${addr}&starts_at=${Math.floor( new Date().getTime() / 1000, )}&ends_at=${Math.floor( new Date(e.target.value).getTime() / 1000, )}`, ); }} min={new Date().toISOString().slice(0, 16)} /> ); }; const UserProfiles = ({ url, setUrl }) => { let profiles = new URL(url).searchParams.getAll("pubkey"); let [pubkeys, setPubkeys] = useState( profiles && Array.isArray(profiles) ? profiles.map((_) => nip19.decode(_).data) : profiles.map((_) => nip19.decode(_).data) ? [nip19.decode(profiles).data] : [], ); const handleAddProfiles = (data) => { let pubkeys_ = Array.from(pubkeys); pubkeys_ = [...new Set([...pubkeys_, data])]; setPubkeys(pubkeys_); let finalUrl = url.split("?")[0] + "?"; for (let pub of pubkeys_) { let pub_ = nip19.npubEncode(pub); finalUrl = finalUrl + `pubkey=${pub_}&`; } finalUrl = finalUrl.slice(0, -1); setUrl(finalUrl); }; const handleRemoveProfiles = (pub) => { let pubkeys_ = Array.from(pubkeys); pubkeys_ = pubkeys_.filter((_) => _ !== pub); setPubkeys(pubkeys_); let finalUrl = url.split("?")[0] + "?"; for (let pub of pubkeys_) { let pub_ = nip19.npubEncode(pub); finalUrl = finalUrl + `pubkey=${pub_}&`; } finalUrl.slice(0, -1); setUrl(finalUrl); }; return ( <>

{t("ABn8zyu")}

{pubkeys.length < 6 && ( )} {pubkeys.map((pub) => { return ( handleRemoveProfiles(pub)} /> ); })} {pubkeys.length === 0 && (

{t("AuyfKBY")}

)} ); }; const SWTemplates = ({ templates, setTemplate, setBuildOption }) => { const [isLoading, setIsLoading] = useState(false); const getTemplate = async (templatePath) => { try { setIsLoading(true); const t = await axios.post(SWT_YAKIHONNE + templatePath, undefined, { withCredentials: true, }); setTemplate(getParsedSW(t.data)); setIsLoading(false); } catch (err) { console.log(err); setIsLoading(false); } }; return ( <> {isLoading && (
)}

{t("A60QDNZ")}

{templates.map((sample, index) => { return (
getTemplate(sample.path)} style={{ flex: "1 1 250px" }} >

{sample.title}

); })}
); }; const SaveDraft = ({ exit, swButtons, swImage, swInput, swComponents }) => { const dispatch = useDispatch(); const [title, setTile] = useState(""); const saveDraft = () => { try { let current = { created_at: Date.now(), title: title, image: swImage, input: swInput, buttons: swButtons, components: swComponents, }; let previousDrafts = getLocalSWv2Drafts(); previousDrafts = [current, ...previousDrafts]; localStorage?.setItem("swv2-drafts", JSON.stringify(previousDrafts)); dispatch( setToast({ type: 1, desc: t("AawZhvj"), }), ); exit(); } catch (err) { console.log(err); dispatch( setToast({ type: 2, desc: t("Acr4Slu"), }), ); } }; return (

{t("AjbW7pt")}

{t("AAMzwZn")}

setTile(e.target.value)} />
); }; const SWDrafts = ({ back, setTemplate }) => { const { t } = useTranslation(); const userKeys = useSelector((state) => state.userKeys); const [drafts, setDrafts] = useState(getLocalSWv2Drafts()); const deleteDraft = (index) => { let tempArray = Array.from(drafts); tempArray.splice(index, 1); setDrafts(tempArray); localStorage?.setItem("swv2-drafts", JSON.stringify(tempArray)); }; return (
{drafts.length > 0 && (
back("normal")} >

{t("Ayh5F4w")}

)} {drafts.length > 0 && (
{drafts?.map((draft, index) => { return (
setTemplate(draft)} > {draft.image && ( )} {!draft.image && (
)}

{t("AcKscQl", { date: timeAgo( new Date(draft?.created_at || Date.now()), ), })}

{draft.title}

setTemplate(draft, true)}> // {t("As7IjvV")} //
,
setTemplate(draft)}> {t("AsXohpb")}
,
deleteDraft(index)}> {t("Almq94P")}
, ]} />
); })}
)} {drafts.length === 0 && ( back("normal")} /> )} ); };