function LoginScreen({ mode, user, sites, activeSiteId, onLogin, onRegister, onDiscoverShops, onLinkShopify, onConnectWebsite, onGoogleLogin, onSelect, onLogout, loading, error, }) { const landingIntent = React.useMemo(() => { const empty = { signup: false, platform: "" }; try { const p = new URLSearchParams(window.location.search); const signup = p.get("signup") === "1"; const platform = (p.get("platform") || "").toLowerCase(); if (signup || platform) { sessionStorage.setItem("guy_landing_intent", JSON.stringify({ signup, platform })); } const stored = JSON.parse(sessionStorage.getItem("guy_landing_intent") || "null"); return { signup: signup || !!stored?.signup, platform: platform || stored?.platform || "", }; } catch { return empty; } }, []); const [authView, setAuthView] = React.useState(landingIntent.signup ? "signup" : "login"); const [signupType, setSignupType] = React.useState( landingIntent.signup && landingIntent.platform === "wordpress" ? "web" : null, ); const [email, setEmail] = React.useState(""); const [password, setPassword] = React.useState(""); const [passwordConfirm, setPasswordConfirm] = React.useState(""); const [firstName, setFirstName] = React.useState(""); const [lastName, setLastName] = React.useState(""); const [companyName, setCompanyName] = React.useState(""); const [siret, setSiret] = React.useState(""); const [vatNumber, setVatNumber] = React.useState(""); const [merchantEmail, setMerchantEmail] = React.useState(""); const [discoveredShops, setDiscoveredShops] = React.useState(null); const [localError, setLocalError] = React.useState(""); const [linkMode, setLinkMode] = React.useState(null); React.useEffect(() => { if (mode !== "pick-site") return; if (landingIntent.platform !== "wordpress") return; if (sites.length) return; if (linkMode) return; setLinkMode("website"); }, [mode, landingIntent.platform, sites.length, linkMode]); const [siteUrl, setSiteUrl] = React.useState(""); const [siteName, setSiteName] = React.useState(""); const displayError = error || localError; function resetSignup() { setSignupType(null); setDiscoveredShops(null); setLocalError(""); } async function handleLoginSubmit(e) { e.preventDefault(); setLocalError(""); onLogin({ email: email.trim(), password }); } async function handleDiscover(e) { e.preventDefault(); setLocalError(""); try { const shops = await onDiscoverShops(merchantEmail.trim()); setDiscoveredShops(shops); if (!shops.length) { setLocalError( "Aucune boutique trouvée pour cet email. Installez d'abord l'app SEO GUY sur Shopify.", ); } } catch (err) { setLocalError(err.message || "Recherche impossible."); } } async function handleShopifyRegister(e) { e.preventDefault(); setLocalError(""); onRegister({ type: "shopify", email: merchantEmail.trim(), password, passwordConfirm, firstName: firstName.trim() || undefined, lastName: lastName.trim() || undefined, }); } async function handleWebRegister(e) { e.preventDefault(); setLocalError(""); onRegister({ type: "web", email: email.trim(), password, passwordConfirm, firstName: firstName.trim(), lastName: lastName.trim(), companyName: companyName.trim(), siret: siret.trim() || undefined, vatNumber: vatNumber.trim() || undefined, }); } async function handleLinkWebsite(e) { e.preventDefault(); setLocalError(""); try { await onConnectWebsite({ siteUrl: siteUrl.trim(), siteName: siteName.trim() || undefined, }); } catch (err) { setLocalError(err.message || "Rattachement impossible."); } } async function handleLinkShopify(e) { e.preventDefault(); setLocalError(""); try { await onLinkShopify(merchantEmail.trim()); } catch (err) { setLocalError(err.message || "Rattachement impossible."); } } function siteLabel(site) { if (site.platform === "WEBSITE") { return site.shopName || "Site web"; } return site.shopName || site.shop; } function siteSubtitle(site) { if (site.platform === "WEBSITE") { return site.shopDomain || site.shop.replace(/^website:/, ""); } return site.shop; } if (mode === "auth") { if (authView === "signup" && !signupType) { return (
SEO GUY

Créer un compte

Choisissez votre profil pour démarrer.

{displayError &&

{displayError}

}
); } if (authView === "signup" && signupType === "shopify") { return (

Compte marchand Shopify

Saisissez l'email utilisé sur Shopify. Nous retrouverons vos boutiques où l'app SEO GUY est installée.

{displayError &&

{displayError}

}
{discoveredShops && discoveredShops.length > 0 && ( <>

{discoveredShops.length} boutique(s) trouvée(s) :

    {discoveredShops.map((s) => (
  • {s.shopName || s.shop}
  • ))}
)}
); } if (authView === "signup" && signupType === "web") { return (

Compte web SEO GUY

{landingIntent.platform === "wordpress" ? "Parcours WordPress : après inscription, rattachez l’URL de votre site puis le plugin Assistant Guy." : "Sans boutique Shopify pour l'instant — vous pourrez synchroniser plus tard."}

{displayError &&

{displayError}

}
); } return (
SEO GUY

SEO GUY — Back-office web

Connectez-vous pour accéder à vos boutiques.

{displayError &&

{displayError}

}
ou par email

Pas encore de compte ?{" "}

); } const pickerTitle = linkMode === "shopify" ? "Rattacher Shopify" : linkMode === "website" ? "Rattacher un site web" : "Choisissez un site"; return (
SEO GUY

{pickerTitle}

Connecté en tant que {user?.email || "—"}

{displayError &&

{displayError}

} {linkMode === "shopify" ? (

Email utilisé sur Shopify — nous synchroniserons les boutiques installées.

) : linkMode === "website" ? (

WordPress, site vitrine ou blog — sans boutique Shopify. Ensuite, Guy vous demandera d’installer le plugin et de coller le mot de passe d’application.

) : ( <>
{sites.map((s) => ( ))}
{!sites.length && !loading && (

Aucun site rattaché. Connectez votre site web (WordPress) ou une boutique Shopify.

)} )} {loading &&

Chargement…

}
); } window.LoginScreen = LoginScreen;