// 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' ? (
) : 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')}
);
}
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;