import React, { useState } from 'react'; import { encodeTemplate, generateTemplateId, validateTemplate, getCommunityTemplates } from '../utils/templates'; import RelayList from './RelayList'; import NostrConnect from './NostrConnect'; // Configure your blast relays here (hidden from UI) // These will be used to publish the events, but won't appear in the template const BLAST_RELAYS = [ 'wss://relay.primal.net', 'wss://relay.damus.io', 'wss://nos.lol' // Add your preferred blast relays here ]; const TemplateCreator = ({ setConnectedPubkey }) => { const [templateName, setTemplateName] = useState(''); const [description, setDescription] = useState(''); const [relays, setRelays] = useState([ { url: 'wss://relay.damus.io', read: true, write: true }, { url: 'wss://nos.lol', read: true, write: true } ]); // Blossom servers (kind 10063) const [blossomServers, setBlossomServers] = useState([ { url: 'https://cdn.satellite.earth' } ]); const [showBlossom, setShowBlossom] = useState(true); // DM relays (kind 10050) const [dmRelays, setDmRelays] = useState([ { url: 'wss://relay.private-msgs.com' } ]); const [showDmRelays, setShowDmRelays] = useState(true); const [error, setError] = useState(''); const [shareUrl, setShareUrl] = useState(''); const [selectedTemplate, setSelectedTemplate] = useState(''); const communityTemplates = getCommunityTemplates(); const handleCreateTemplate = () => { try { const template = { id: generateTemplateId(), name: templateName, description: description, relays: relays, blossomServers: showBlossom ? blossomServers : [], dmRelays: showDmRelays ? dmRelays : [], created_at: Math.floor(Date.now() / 1000) }; validateTemplate(template); const encoded = encodeTemplate(template); const url = `${window.location.origin}${window.location.pathname}#/apply/${encoded}`; setShareUrl(url); navigator.clipboard?.writeText(url).catch(() => {}); setError(''); } catch (err) { setError(err.message); } }; const loadCommunityTemplate = (templateKey) => { const template = communityTemplates[templateKey]; if (template) { setRelays(template.relays); setTemplateName(template.name); setDescription(template.description); if (template.blossomServers && template.blossomServers.length > 0) { setBlossomServers(template.blossomServers); setShowBlossom(true); } else { setBlossomServers([{ url: '' }]); setShowBlossom(false); } if (template.dmRelays && template.dmRelays.length > 0) { setDmRelays(template.dmRelays); setShowDmRelays(true); } else { setDmRelays([{ url: '' }]); setShowDmRelays(false); } setSelectedTemplate(templateKey); setError(''); } }; // Relay functions const addRelay = () => { setRelays([...relays, { url: '', read: true, write: true }]); }; const removeRelay = (index) => { setRelays(relays.filter((_, i) => i !== index)); }; const updateRelay = (index, field, value) => { const updated = [...relays]; updated[index][field] = value; setRelays(updated); }; // Blossom server functions const addBlossomServer = () => { setBlossomServers([...blossomServers, { url: '' }]); }; const removeBlossomServer = (index) => { setBlossomServers(blossomServers.filter((_, i) => i !== index)); }; const updateBlossomServer = (index, value) => { const updated = [...blossomServers]; updated[index].url = value; setBlossomServers(updated); }; // DM relay functions const addDmRelay = () => { setDmRelays([...dmRelays, { url: '' }]); }; const removeDmRelay = (index) => { setDmRelays(dmRelays.filter((_, i) => i !== index)); }; const updateDmRelay = (index, value) => { const updated = [...dmRelays]; updated[index].url = value; setDmRelays(updated); }; const addCommonRelay = (url) => { if (!relays.some(r => r.url === url)) { setRelays([...relays, { url, read: true, write: true }]); } }; return (
Load a pre-configured template from popular communities
Servers used to host your blobs/images. Order determines trust/reliability.
{blossomServers.map((server, index) => (Relays used for private messages.
{dmRelays.map((relay, index) => (Share this link with your community:
🔒 Template will be published to blast relays (configured in code)