update frontend

This commit is contained in:
Your Name 2025-12-10 21:16:21 -05:00
parent 34414ebaca
commit dc9498cc7a
2 changed files with 114 additions and 102 deletions

View File

@ -21,11 +21,11 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
const [showAuth, setShowAuth] = useState(false); const [showAuth, setShowAuth] = useState(false);
const [mode, setMode] = useState("login"); // "login" | "signup" const [mode, setMode] = useState("login"); // "login" | "signup"
// login // login form
const [loginUser, setLoginUser] = useState(""); const [loginUser, setLoginUser] = useState("");
const [loginPass, setLoginPass] = useState(""); const [loginPass, setLoginPass] = useState("");
// signup // signup form
const [firstName, setFirstName] = useState(""); const [firstName, setFirstName] = useState("");
const [lastName, setLastName] = useState(""); const [lastName, setLastName] = useState("");
const [regUser, setRegUser] = useState(""); const [regUser, setRegUser] = useState("");
@ -46,12 +46,11 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
const closeModal = () => { const closeModal = () => {
setShowAuth(false); setShowAuth(false);
// reset basique des champs
setLoginPass(""); setLoginPass("");
setSignupError(""); setSignupError("");
}; };
// 🔒 Quand on devient authentifié fermer automatiquement le popup // When auth becomes true, close the popup automatically
useEffect(() => { useEffect(() => {
if (authenticated) { if (authenticated) {
setShowAuth(false); setShowAuth(false);
@ -61,7 +60,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
const handleLoginSubmit = async (e) => { const handleLoginSubmit = async (e) => {
e.preventDefault(); e.preventDefault();
await login(loginUser, loginPass); await login(loginUser, loginPass);
// le useEffect ci-dessus va fermer le modal quand authenticated passe à true // popup closes via useEffect when authenticated becomes true
}; };
const handleSignupSubmit = async (e) => { const handleSignupSubmit = async (e) => {
@ -74,7 +73,9 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
!regEmail.trim() || !regEmail.trim() ||
!regPass !regPass
) { ) {
setSignupError("Nom, prénom, user, email et mot de passe sont requis."); setSignupError(
"First name, last name, username, email and password are required."
);
return; return;
} }
try { try {
@ -86,12 +87,12 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
firstName: firstName.trim(), firstName: firstName.trim(),
lastName: lastName.trim(), lastName: lastName.trim(),
}); });
// après création, on tente le login direct // auto-login after registration
await login(regUser.trim(), regPass); await login(regUser.trim(), regPass);
// la fermeture est gérée aussi par le useEffect(authenticated) // popup closes via useEffect
} catch (err) { } catch (err) {
console.error(err); console.error(err);
setSignupError(err.message || "Register error."); setSignupError(err.message || "Registration error.");
} finally { } finally {
setSignupLoading(false); setSignupLoading(false);
} }
@ -198,7 +199,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
{mode === "login" ? ( {mode === "login" ? (
<form className="auth-form" onSubmit={handleLoginSubmit}> <form className="auth-form" onSubmit={handleLoginSubmit}>
<label> <label>
Nom d&apos;utilisateur Username
<input <input
type="text" type="text"
value={loginUser} value={loginUser}
@ -207,7 +208,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
/> />
</label> </label>
<label> <label>
Mot de passe Password
<input <input
type="password" type="password"
value={loginPass} value={loginPass}
@ -220,14 +221,14 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
className="btn-primary btn-full" className="btn-primary btn-full"
disabled={loading} disabled={loading}
> >
{loading ? "..." : "Se connecter"} {loading ? "..." : "Sign in"}
</button> </button>
</form> </form>
) : ( ) : (
<form className="auth-form" onSubmit={handleSignupSubmit}> <form className="auth-form" onSubmit={handleSignupSubmit}>
<div className="auth-row"> <div className="auth-row">
<label> <label>
Prénom First name
<input <input
type="text" type="text"
value={firstName} value={firstName}
@ -235,7 +236,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
/> />
</label> </label>
<label> <label>
Nom Last name
<input <input
type="text" type="text"
value={lastName} value={lastName}
@ -244,7 +245,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
</label> </label>
</div> </div>
<label> <label>
Nom d&apos;utilisateur Username
<input <input
type="text" type="text"
value={regUser} value={regUser}
@ -252,7 +253,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
/> />
</label> </label>
<label> <label>
Courriel Email
<input <input
type="email" type="email"
value={regEmail} value={regEmail}
@ -260,7 +261,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
/> />
</label> </label>
<label> <label>
Mot de passe Password
<input <input
type="password" type="password"
value={regPass} value={regPass}
@ -277,7 +278,7 @@ export default function TopBar({ theme = "dark", onChangeTheme }) {
className="btn-primary btn-full" className="btn-primary btn-full"
disabled={signupLoading} disabled={signupLoading}
> >
{signupLoading ? "..." : "Créer le compte"} {signupLoading ? "..." : "Create account"}
</button> </button>
</form> </form>
)} )}

View File

@ -1,144 +1,155 @@
/* src/styles/auth-modal.css */ /* ==========================================
SocioWire auth modal (login / signup)
Follows body[data-theme]: dark | blue | light
========================================== */
/* BACKDROP sombre plein écran */
.auth-modal-backdrop { .auth-modal-backdrop {
position: fixed; position: fixed;
inset: 0; inset: 0;
z-index: 50; z-index: 60;
background: rgba(15, 23, 42, 0.88);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: rgba(2, 6, 23, 0.65);
backdrop-filter: blur(8px);
} }
/* BOÎTE MODAL */ /* Base modal box */
.auth-modal { .auth-modal {
width: 100%; width: min(640px, 95vw);
max-width: 420px; border-radius: 22px;
background: rgba(15, 23, 42, 0.98); padding: 1.1rem 1.25rem 1.35rem;
border-radius: 16px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.85);
border: 1px solid rgba(148, 163, 184, 0.9); border: 1px solid rgba(148, 163, 184, 0.7);
box-shadow:
0 18px 40px rgba(0, 0, 0, 0.9),
0 0 24px rgba(56, 189, 248, 0.55);
padding: 0.75rem 0.9rem 0.9rem 0.9rem;
color: #e5e7eb;
} }
/* HEADER TABS (Login / Sign up) */ /* Theme variants */
body[data-theme="dark"] .auth-modal {
background: radial-gradient(circle at top left, #0f172a, #020617 70%);
}
body[data-theme="blue"] .auth-modal {
background: radial-gradient(circle at top left, #0ea5e9, #020617 65%);
border-color: rgba(96, 165, 250, 0.9);
}
body[data-theme="light"] .auth-modal {
background: radial-gradient(circle at top left, #ffffff, #e5e7eb 70%);
color: #020617;
border-color: rgba(148, 163, 184, 0.7);
}
/* Header: tabs + close */
.auth-modal-header { .auth-modal-header {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.4rem; gap: 0.5rem;
margin-bottom: 0.6rem; margin-bottom: 0.9rem;
} }
.auth-tab { .auth-tab {
flex: 1; padding: 0.45rem 0.95rem;
border: 1px solid rgba(75, 85, 99, 0.9);
background: rgba(15, 23, 42, 0.95);
color: #e5e7eb;
border-radius: 999px; border-radius: 999px;
font-size: 0.8rem; border: 1px solid transparent;
padding: 0.35rem 0.4rem; background: transparent;
font-size: 0.85rem;
color: #e5e7eb;
cursor: pointer; cursor: pointer;
} }
.auth-tab-active { .auth-tab-active {
background: linear-gradient(135deg, #1d4ed8, #0ea5e9); background: linear-gradient(135deg, #1d4ed8, #38bdf8);
border-color: #93c5fd; border-color: rgba(191, 219, 254, 0.9);
color: #f9fafb;
}
/* light theme override for tab text */
body[data-theme="light"] .auth-tab {
color: #0f172a;
}
body[data-theme="light"] .auth-tab-active {
color: #f9fafb; color: #f9fafb;
box-shadow: 0 0 14px rgba(59, 130, 246, 0.7);
} }
/* Bouton X */
.auth-close { .auth-close {
border: none; margin-left: auto;
background: transparent; width: 32px;
color: #9ca3af; height: 32px;
font-size: 0.9rem; border-radius: 999px;
padding: 0.1rem 0.3rem; border: 1px solid rgba(148, 163, 184, 0.6);
background: rgba(15, 23, 42, 0.85);
color: #e5e7eb;
font-size: 0.8rem;
cursor: pointer; cursor: pointer;
} }
/* FORMULAIRE */ /* Close button for light theme */
body[data-theme="light"] .auth-close {
background: #e5e7eb;
color: #020617;
}
/* Form layout */
.auth-form { .auth-form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.7rem;
}
.auth-row {
display: flex;
gap: 0.6rem;
}
.auth-row label {
flex: 1;
} }
/* Chaque label = colonne verticale */
.auth-form label { .auth-form label {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 0.2rem; font-size: 0.8rem;
font-size: 0.78rem; gap: 0.25rem;
margin-bottom: 0.45rem;
} }
/* CHAMPS TEXTE */ /* Inputs */
.auth-form input { .auth-form input {
border-radius: 999px; border-radius: 999px;
border: 1px solid #4b5563; border: 1px solid rgba(51, 65, 85, 0.9);
padding: 0.38rem 0.7rem; background: rgba(15, 23, 42, 0.96);
background: #020617;
color: #e5e7eb; color: #e5e7eb;
font-size: 0.8rem; padding: 0.55rem 0.85rem;
outline: none; font-size: 0.85rem;
width: 100%;
} }
.auth-form input:focus { /* Light theme inputs */
border-color: #60a5fa; body[data-theme="light"] .auth-form input {
box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.7); background: #f9fafb;
color: #020617;
border-color: rgba(148, 163, 184, 0.9);
} }
/* LIGNE PRÉNOM / NOM */ /* Full-width primary button */
.auth-row {
display: flex;
gap: 0.5rem;
margin-bottom: 0.3rem;
}
/* Les deux labels prennent chacun 50% (moins le gap) */
.auth-row label {
flex: 1;
min-width: 0; /* évite de dépasser le modal */
}
/* MESSAGE DERREUR */
.auth-error {
margin-top: 0.25rem;
font-size: 0.74rem;
color: #fecaca;
background: rgba(127, 29, 29, 0.35);
border-radius: 0.5rem;
padding: 0.25rem 0.5rem;
}
/* BOUTON FULL WIDTH */
.btn-full { .btn-full {
width: 100%; width: 100%;
margin-top: 0.4rem; margin-top: 0.4rem;
} }
/* Petite variation visuelle pour Sign up si .btn-secondary non définie */ /* Error message */
.btn-secondary { .auth-error {
padding: 0.25rem 0.7rem; margin-top: 0.25rem;
font-size: 0.75rem; font-size: 0.8rem;
border-radius: 999px; color: #fecaca;
border: 1px solid #60a5fa; background: rgba(127, 29, 29, 0.55);
background: #0b1120; border-radius: 0.5rem;
color: #dbeafe; padding: 0.4rem 0.6rem;
cursor: pointer; border: 1px solid rgba(248, 113, 113, 0.7);
} }
/* Responsive: sur petits écrans, Prénom/Nom se mettent lun sous lautre */ /* Small screen tweaks */
@media (max-width: 480px) { @media (max-width: 480px) {
.auth-modal { .auth-modal {
margin: 0 0.7rem; padding: 0.95rem 0.9rem 1.1rem;
} }
.auth-row { .auth-row {
flex-direction: column; flex-direction: column;
} }