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 && (
)}
);
};
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 && (
<>
>
)}
{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 && (
)}
)}
{!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)}
/>
{["action", "tool"].includes(swType) && (
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 === "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 (
);
};
const CustomizeInput = ({ value, setValue }) => {
return (
);
};
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")}
);
};
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 && (
)}
{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 (
);
};
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")}
/>
)}
);
};