/* eslint-disable @typescript-eslint/no-misused-promises */ import { useState } from "react"; import { toast } from "react-toastify"; import "../../index.css"; import "../../tailwind.css"; import "./register.css"; import { register, verifyEmail, resendCode, getBotByApiKey, saveConfig, type RegisterData, } from "./services/wordpress-api/shopinzen-integrator.service"; import { useIntl } from "react-intl"; import { window_SHOPINZEN_INTEGRATOR_object } from "@src/dev-env"; // Fonctions helper pour le loader const showLoader = () => { const loader = document.getElementById("shopinzen-loader"); if (loader) loader.classList.add("active"); }; const hideLoader = () => { const loader = document.getElementById("shopinzen-loader"); if (loader) loader.classList.remove("active"); }; function App() { const [activeTab, setActiveTab] = useState<"register" | "api-key">( "register", ); const [showEmailVerification, setShowEmailVerification] = useState(false); const [userEmail, setUserEmail] = useState(""); return (
{/* Hero Section */} {/* Formulaire */}
{/* Onglets */} {/* Contenu onglet inscription */} {activeTab === "register" && ( )} {/* Contenu onglet clé API */} {activeTab === "api-key" && }
{/* Loader */}
); } // Hero Section const HeroSection = () => { const intl = useIntl(); return (

{intl.formatMessage({ defaultMessage: "100 % FREEMIUM – COMMENCEZ SANS PAYER", id: "hiPs8R", })}

{intl.formatMessage({ defaultMessage: "Créez votre chatbot IA personnalisé pour votre site en quelques clics", id: "KEHqE0", })}

{intl.formatMessage({ defaultMessage: "ShopinZen rend votre site vivant : un chatbot intelligent qui guide vos visiteurs, booste vos conversions et révolutionne leur expérience, sans aucune ligne de code.", id: "aSMbeE", })}

{intl.formatMessage({ defaultMessage: "Démarrer l'essai gratuit", id: "YDSE04", })} {intl.formatMessage({ defaultMessage: "Essayer la démo", id: "q2E2cb", })}
); }; // Composant Onglets const Tabs = ({ activeTab, onTabChange, }: { activeTab: string; onTabChange: (tab: "register" | "api-key") => void; }) => { const intl = useIntl(); return (
); }; // Onglet Inscription const RegisterTab = ({ showEmailVerification, setShowEmailVerification, userEmail, setUserEmail, setActiveTab, }: any) => { const intl = useIntl(); if (showEmailVerification) { return ; } return (

{intl.formatMessage({ defaultMessage: "Créer un compte ShopinZen", id: "/vl53g", })}

{ setUserEmail(email); setShowEmailVerification(true); }} />
); }; // Formulaire d'inscription COMPLET avec API const RegisterForm = ({ onSuccess, }: { onSuccess: (email: string) => void; }) => { const intl = useIntl(); // ← AJOUTER const [formData, setFormData] = useState({ company: "", legal_form: "", first_name: "", last_name: "", url: typeof window !== "undefined" ? window.location.origin : "", activity_sector: "", email: "", phone: "", password: "", password_confirm: "", }); const [passwordVisible, setPasswordVisible] = useState(false); const [confirmPasswordVisible, setConfirmPasswordVisible] = useState(false); const [isLoading, setIsLoading] = useState(false); const [passwordValidation, setPasswordValidation] = useState({ length: false, uppercase: false, lowercase: false, number: false, special: false, }); // Validation mot de passe en temps réel const validatePassword = (password: string) => { setPasswordValidation({ length: password.length >= 8, uppercase: /[A-Z]/.test(password), lowercase: /[a-z]/.test(password), number: /[0-9]/.test(password), special: /[!@#$%^&*(),.?":{}|<>]/.test(password), }); }; const handleChange = ( e: React.ChangeEvent, ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); if (name === "password") { validatePassword(value); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); // Vérifier que les mots de passe correspondent if (formData.password !== formData.password_confirm) { toast.error( intl.formatMessage({ defaultMessage: "Les mots de passe ne correspondent pas", id: "AaK2rE", }), ); return; } setIsLoading(true); showLoader(); try { const registerData: RegisterData = { firstName: formData.first_name, lastName: formData.last_name, email: formData.email, company: formData.company, product: formData.legal_form, url: formData.url, country: "FR", password: formData.password, phone: formData.phone, phoneCode: "+33", lang: intl.locale, // ← Utilise la langue active }; await register(registerData); hideLoader(); setIsLoading(false); toast.success( intl.formatMessage({ defaultMessage: "Compte créé avec succès ! Vérifiez votre email.", id: "z2Y6cQ", }), ); onSuccess(formData.email); } catch (error: any) { hideLoader(); setIsLoading(false); const errorMessage = error.response?.data?.message || intl.formatMessage({ defaultMessage: "Erreur lors de l'inscription", id: "yR5YrD", }); toast.error(errorMessage); } }; return (
{/* Nom de l'entreprise */}
{/* Forme juridique */}
{/* Prénom */}
{/* Nom */}
{/* URL */}
{/* Secteur d'activité */}
{/* Email */}
{/* Téléphone */}
{/* Mot de passe avec viewer */}
  • {intl.formatMessage({ defaultMessage: "Au moins 8 caractères", id: "ztCLpL", })}
  • {intl.formatMessage({ defaultMessage: "Au moins une lettre majuscule", id: "rDDCz/", })}
  • {intl.formatMessage({ defaultMessage: "Au moins une lettre minuscule", id: "w5HjDs", })}
  • {intl.formatMessage({ defaultMessage: "Au moins un chiffre", id: "cwswVY", })}
  • {intl.formatMessage({ defaultMessage: "Au moins un caractère spécial", id: "FjmNcD", })}
{/* Confirmer mot de passe avec viewer */}
); }; // Verification email complet const EmailVerification = ({ email, setActiveTab, }: { email: string; setActiveTab: (tab: "register" | "api-key") => void; }) => { const intl = useIntl(); // ← AJOUTER const [code, setCode] = useState(""); const [isLoading, setIsLoading] = useState(false); const [isResending, setIsResending] = useState(false); const handleVerify = async (e: React.FormEvent) => { e.preventDefault(); if (!code) { toast.error( intl.formatMessage({ defaultMessage: "Veuillez saisir le code de vérification", id: "Ah/zDq", }), ); return; } setIsLoading(true); showLoader(); try { await verifyEmail({ email, code }); hideLoader(); setIsLoading(false); toast.success( intl.formatMessage({ defaultMessage: "Email vérifié avec succès ! Connectez-vous au dashboard pour récupérer votre clé API.", id: "9L0aAl", }), ); // Basculer sur l'onglet "J'ai déjà un compte" setActiveTab("api-key"); // Ouvrir le dashboard après 2 secondes setTimeout(() => { window.open( `${window_SHOPINZEN_INTEGRATOR_object.getKey("dashboard_url")}/auth/login`, "_blank", ); }, 2000); } catch (error: any) { hideLoader(); setIsLoading(false); const errorMessage = error.response?.data?.message || intl.formatMessage({ defaultMessage: "Code de vérification invalide", id: "YMKjHR", }); toast.error(errorMessage); } }; const handleResend = async () => { setIsResending(true); showLoader(); try { await resendCode(email); hideLoader(); setIsResending(false); toast.success( intl.formatMessage({ defaultMessage: "Code renvoyé avec succès !", id: "HEkjO7", }), ); } catch (error: any) { hideLoader(); setIsResending(false); const errorMessage = error.response?.data?.message || intl.formatMessage({ defaultMessage: "Erreur lors de l'envoi du code", id: "FnnMhS", }); toast.error(errorMessage); } }; return (

{intl.formatMessage({ defaultMessage: "Vérification de votre email", id: "948Lr/", })}

{intl.formatMessage({ defaultMessage: "Un code de vérification a été envoyé à", id: "ILvLhS", })}{" "} {email}

setCode(e.target.value)} disabled={isLoading} required />
); }; // Onglet clé API (à compléter à l'étape suivante) const ApiKeyTab = () => { const intl = useIntl(); // ← AJOUTER const [apiKey, setApiKey] = useState(""); const [isLoading, setIsLoading] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!apiKey.trim()) { toast.error( intl.formatMessage({ defaultMessage: "Veuillez saisir une clé API", id: "/Y7UOU", }), ); return; } setIsLoading(true); showLoader(); try { // 1. Récupérer les données du bot const botData = await getBotByApiKey(apiKey); // 2. Enregistrer la config dans WordPress await saveConfig({ public_key: apiKey, user: {}, chatbot: botData.data, }); hideLoader(); setIsLoading(false); toast.success( intl.formatMessage({ defaultMessage: "Configuration enregistrée ! Rechargement...", id: "/GhWqK", }), ); setTimeout(() => { // Chemin relatif - fonctionne partout const currentPath = window.location.pathname.split("/wp-admin/")[0]; window.location.href = currentPath + "/wp-admin/admin.php?page=shopinzen-integrator-home"; }, 1000); } catch (error: any) { hideLoader(); setIsLoading(false); const errorMessage = error.response?.status === 401 ? intl.formatMessage({ defaultMessage: "Clé API invalide ou expirée", id: "IzFpBU", }) : error.response?.data?.message || intl.formatMessage({ defaultMessage: "Erreur lors de l'enregistrement", id: "VlzhWF", }); toast.error(errorMessage); } }; return (

{intl.formatMessage({ defaultMessage: "Connecter avec une clé API", id: "LcA/8q", })}

{intl.formatMessage({ defaultMessage: "Si vous avez déjà un compte ShopinZen, collez votre clé API ci-dessous.", id: "T/eP2s", })}

setApiKey(e.target.value)} disabled={isLoading} required />
); }; // Loader const Loader = () => { return (
); }; export default App;