// Kasse: e-post først (skiller ny/eksisterende kunde), så betalingsmåte, // så fullfør. Oppsummering alltid synlig. I produksjon kaller dette // storeapi → whmcs-api (AddClient/AddOrder/CreateSsoToken). import React, { useState } from 'react'; const NS = window.STWORDER; const inputCls = 'w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-sm text-navy outline-none focus:border-brand'; function Field({ label, span2, children }) { return ( ); } function AccountStep({ account, setAccount }) { const { useI18n, Btn, Spinner, CheckIcon } = NS.ui; const { t } = useI18n(); const [stage, setStage] = useState('email'); // email | login | register const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [busy, setBusy] = useState(false); const [reg, setReg] = useState({ firstName: '', lastName: '', company: '', address: '', zip: '', city: '', country: 'Norge', phone: '', }); async function lookup() { if (!/^\S+@\S+\.\S+$/.test(email)) return; setBusy(true); const r = await NS.api.customerLookup(email); setBusy(false); setStage(r.exists ? 'login' : 'register'); } async function doLogin() { setBusy(true); const r = await NS.api.login(email, password); setBusy(false); if (r.ok) setAccount({ kind: 'existing', email: r.email, name: r.name }); } const regOk = reg.firstName && reg.lastName && reg.address && reg.zip && reg.city && reg.phone; function doRegister() { setAccount({ kind: 'new', email: email.trim().toLowerCase(), details: reg }); } if (account) { return (
{account.kind === 'existing' ? t('checkout.loggedInAs') + ' ' : ''}{account.email}
); } return (

{t('checkout.emailFirst')}

setEmail(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') lookup(); }} placeholder={t('checkout.email')} disabled={stage !== 'email'} autoComplete="email" className={inputCls + ' disabled:bg-gray-50 disabled:text-gray-500'} /> {stage === 'email' ? ( {busy ? : null} {t('common.continue')} ) : ( { setStage('email'); setPassword(''); }}> {t('checkout.change')} )}
{stage === 'login' ? (

{t('checkout.welcomeBack')}

setPassword(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') doLogin(); }} placeholder={t('checkout.password')} autoFocus className={inputCls} /> {busy ? : null} {t('checkout.login')}

{t('checkout.demoPassword')}

) : null} {stage === 'register' ? (

{t('checkout.newCustomer')}

setReg({ ...reg, firstName: e.target.value })} autoComplete="given-name" className={inputCls} /> setReg({ ...reg, lastName: e.target.value })} autoComplete="family-name" className={inputCls} /> setReg({ ...reg, company: e.target.value })} autoComplete="organization" className={inputCls} /> setReg({ ...reg, address: e.target.value })} autoComplete="street-address" className={inputCls} /> setReg({ ...reg, zip: e.target.value })} autoComplete="postal-code" className={inputCls} /> setReg({ ...reg, city: e.target.value })} autoComplete="address-level2" className={inputCls} /> setReg({ ...reg, phone: e.target.value })} autoComplete="tel" className={inputCls} />
{t('common.continue')}
) : null}
); } function PaymentStep({ method, setMethod }) { const { useI18n, localName } = NS.ui; const { t, lang } = useI18n(); return (
{NS.data.paymentMethods.map((m) => ( ))}
); } function CheckoutPage() { const { useI18n, useCart, nok, Btn, Spinner, StepHeading, PageHero, CartItems } = NS.ui; const { t } = useI18n(); const cart = useCart(); const [account, setAccount] = useState(null); const [method, setMethod] = useState(null); const [placing, setPlacing] = useState(false); async function place() { setPlacing(true); const result = await NS.api.checkout({ customer: account, items: cart.items, paymentMethod: method, }); sessionStorage.setItem('stworder.receipt', JSON.stringify(result)); NS.store.clear(); location.hash = '#/kvittering'; } if (cart.items.length === 0) { return (

{t('cart.empty')}

{ location.hash = '#/domener'; }}> {t('cart.emptyCta')}
); } const canPlace = account && method && !placing; return (
{t('checkout.stepAccount')}
{t('checkout.stepPayment')}

{t('checkout.secure')}

); } function ReceiptPage() { const { useI18n, Btn, CheckIcon } = NS.ui; const { t } = useI18n(); let receipt = null; try { receipt = JSON.parse(sessionStorage.getItem('stworder.receipt') || 'null'); } catch (e) {} return (

{t('receipt.title')}

{receipt ? (

{t('receipt.order')}: {receipt.orderId}

) : null}

{t('receipt.note')}

{ location.hash = '#/'; }}> {t('receipt.back')}
); } NS.pages = NS.pages || {}; NS.pages.Checkout = CheckoutPage; NS.pages.Receipt = ReceiptPage;