Preserve hosted website UX inside Archipelago, add isolated Business and owner-authorized native wallet setup, and include deployment handoff. Based on main with native signer import already accepted.
45 lines
2.9 KiB
JavaScript
45 lines
2.9 KiB
JavaScript
// Connector for the native OS guide. No Just Works UI is replaced.
|
|
const base = new URL('..', import.meta.url).pathname.replace(/\/?$/, '/');
|
|
let parentOrigin;
|
|
try { parentOrigin = new URL(document.referrer).origin; } catch { /* standalone */ }
|
|
if (parentOrigin && new URL(parentOrigin).hostname === location.hostname && new URL(parentOrigin).protocol === location.protocol && window.parent !== window) {
|
|
window.addEventListener('message', async event => {
|
|
if (event.source !== parent || event.origin !== parentOrigin || typeof event.data.requestId !== 'string') return;
|
|
const requestId = event.data.requestId;
|
|
try {
|
|
if (event.data.type === 'justworks:get-connection') {
|
|
const siteId = localStorage.getItem('archipelago-justworks-site-v1') || '';
|
|
let npub = '';
|
|
if (siteId) {
|
|
const response = await fetch(`${base}api/site?url=${encodeURIComponent(siteId)}`, {cache:'no-store', signal:AbortSignal.timeout(12000)});
|
|
const site = await response.json();
|
|
if (response.ok && site.id === siteId) npub = site.npub;
|
|
}
|
|
parent.postMessage({type:'justworks:connection', requestId, siteId, npub}, parentOrigin);
|
|
return;
|
|
}
|
|
if (event.data.type === 'justworks:business-login') {
|
|
const response = await fetch(`${base}business-demo/api/business-owner-login`, {method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(event.data.payload), signal:AbortSignal.timeout(60000)});
|
|
const result = await response.json();
|
|
parent.postMessage({type:'justworks:business-result', requestId, ok:response.ok && result.ok === true, npub:result.npub, error:result.error}, parentOrigin);
|
|
return;
|
|
}
|
|
if (event.data.type === 'justworks:connect-payment') {
|
|
const response = await fetch(`${base}api/payment-connect`, {method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(event.data.payload), signal:AbortSignal.timeout(170000)});
|
|
const result = await response.json();
|
|
parent.postMessage({type:'justworks:payment-result', requestId, ...result}, parentOrigin);
|
|
return;
|
|
}
|
|
if (event.data.type !== 'justworks:check-site' || typeof event.data.url !== 'string') return;
|
|
const response = await fetch(`${base}api/site?url=${encodeURIComponent(event.data.url)}`, {cache:'no-store', signal:AbortSignal.timeout(15000)});
|
|
const site = await response.json();
|
|
if (!response.ok || site.published !== true) throw new Error(site.error || 'Publish your website in Just Works, then try again.');
|
|
let remembered = true;
|
|
try { localStorage.setItem('archipelago-justworks-site-v1', site.id); } catch { remembered = false; }
|
|
parent.postMessage({type:'justworks:site-connected', requestId, site:{id:site.id,published:true}, remembered}, parentOrigin);
|
|
} catch (error) {
|
|
parent.postMessage({type:'justworks:site-error', requestId, error:error.message}, parentOrigin);
|
|
}
|
|
});
|
|
}
|