import {mountLogo} from './ds/logo.js'; import {startNavScroll} from './ds/header.js'; import {link,mountAppChrome} from './ds/frame.js'; import {npubFrom,prod} from './ds/env.js'; const app=document.querySelector('#app'); const npub=npubFrom(); const esc=value=>String(value??'').replace(/[&<>"']/g,char=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[char])); function fail(message){app.innerHTML=`
∩

Business profile

${esc(message)}

Back to Business
`} function field(label,id,value,type='text',extra=''){return ``} function render(data){const profile=data.profile||{},image=profile.banner||data.images[0]||'';document.title=`${data.merchant.name} · Business profile`;app.innerHTML=`
Just WorksBusiness profileBack to modules ↙

Nostr merchant identity

${esc(data.merchant.name)}

${esc(npub)}

Public profile

What customers see.

Saving republishes the signed Nostr profile and nsite.

Identity

${field('Display name','displayName',profile.display_name||data.merchant.name)}${field('Nostr name','nostrName',profile.name||'','text','readonly')}${field('Public website','website',profile.website||data.links.justworks,'url','readonly')}

Images

${field('Profile picture URL','picture',profile.picture||'','url')}${field('Banner image URL','banner',profile.banner||'','url')}

Use public HTTPS image URLs. These images appear in the signed Nostr profile.

Payments

${field('Lightning address','lud16',profile.lud16||'','email','placeholder="merchant@example.com" required')}

Pay Bill and Just Pay remain locked while this uses the default @npub.cash address.

Owner authorization

${field('Owner login','ownerIdentifier',prod?'':'demo','text','autocomplete="username"')}${field('Owner password','ownerPassword',prod?'':'demo','password','autocomplete="current-password"')}
or
${field('Owner key','ownerKey','','password','placeholder="nsec1… or ncryptsec1…" autocomplete="off"')}

Credentials are used only for this save and publish request. Just Works Business does not store them.

Ready to update the signed merchant profile.

`;document.querySelector('#profileForm').onsubmit=save;document.querySelectorAll('[data-logo]').forEach(host=>mountLogo(host,{icon:true}))} async function save(event){event.preventDefault();const button=document.querySelector('#save'),status=document.querySelector('#status');button.disabled=true;status.textContent='Signing and publishing the Nostr profile…';const profile={display_name:document.querySelector('#displayName').value,about:document.querySelector('#about').value,picture:document.querySelector('#picture').value,banner:document.querySelector('#banner').value,lud16:document.querySelector('#lud16').value};const body={npub,profile,ownerIdentifier:document.querySelector('#ownerIdentifier').value,ownerPassword:document.querySelector('#ownerPassword').value,ownerKey:document.querySelector('#ownerKey').value};try{const response=await fetch('/api/business-profile',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify(body)}),data=await response.json();if(!response.ok)throw new Error(data.error||'Could not publish');document.querySelector('#ownerPassword').value='';document.querySelector('#ownerKey').value='';status.textContent='Published. Pay Bill and Just Pay are now available.';button.innerHTML='Published ✓';setTimeout(()=>location.href=link('business'),1200)}catch(error){status.textContent=error.message;status.classList.add('error');button.disabled=false;button.innerHTML='Try again ↻'}finally{document.querySelector('#ownerPassword').value='';document.querySelector('#ownerKey').value=''}} if(!npub)fail('Add the merchant npub.');else fetch(`/api/business?npub=${encodeURIComponent(npub)}`,{cache:'no-store'}).then(async response=>{const data=await response.json();if(!response.ok)throw new Error(data.error||'Profile unavailable');render(data);app.querySelector(':scope > header')?.remove();mountAppChrome(app,{label:'Business profile',endHtml:`Back to modules ↙`})}).catch(error=>fail(error.message));