Files
hotel-demo-front/src/App.jsx
Romain Mallard 5b305bee01
Some checks failed
Deploy React / build-and-deploy (push) Failing after 11s
test workflow file
2026-02-23 17:21:44 +01:00

266 lines
6.4 KiB
JavaScript

import { useState, useEffect } from 'react'
import { createContext } from 'react'
import reactLogo from './assets/react.svg'
import viteLogo from '/vite.svg'
import './App.css'
import { API_BASE } from './config.js'
import Login from './components/login.jsx'
import MainApp from './components/MainApp.jsx'
import AdminWidget from './components/widget/adminWidget.jsx'
export const ClientContext = createContext(null);
export function userContext() {}
export default function App() {
const [loading, setLoading] = useState(true); // true while checking auth
const [loggedIn, setLoggedIn] = useState(false);
const [clientId, setClientId] = useState([]);
const [updateUsername, setUpdateUsername] = useState("");
const [updateCurrentPassword, setUpdateCurrentPassword] = useState("");
const [updateNewPassword, setUpdateNewPassword] = useState("");
const [logMenuOpen, setLogMenuOpen] = useState(false)
useEffect(() => {
checkAuth();
}, []);
async function checkAuth() {
setLoading(true);
try {
const res = await fetch(`${API_BASE}/auth/login_refresh_token`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": "react-app",
},
credentials: "include", // send cookies automatically
body: JSON.stringify({
device_id : "147ac10b-58cc-4372-a567-0e02b2c3d479", // or persistent device ID
}),
});
if (!res.ok) {
setLoggedIn(false);
return;
}
const data = await res.json();
localStorage.setItem("access_tokens", JSON.stringify(data.tokens));
setClientId(data.user_id);
setLoggedIn(true);
} finally {
setLoading(false);
}
}
async function logoutUser() {
try {
const res = await fetch(`${API_BASE}/auth/logout_single_device`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": "react-app",
},
credentials: "include", // send cookies automatically
body: JSON.stringify({
device_id : "147ac10b-58cc-4372-a567-0e02b2c3d479", // or persistent device ID
}),
});
const data = await res.json();
localStorage.setItem("access_tokens", JSON.stringify(data.tokens));
setClientId(data.user_id);
setLoggedIn(false);
} finally {
checkAuth();
}
}
async function logoutAllSessions() {
if (!accessTokenSingle) return;
try {
const res = await fetch(`${API_BASE}/auth/logout_all_devices`, {
method: "POST",
headers: {
"Content-Type": "application/json",
"User-Agent": "react-app",
Authorization: `Bearer ${accessTokenSingle}`
},
credentials: "include", // send cookies automatically
body: JSON.stringify({
//device_id : "147ac10b-58cc-4372-a567-0e02b2c3d479", // or persistent device ID
}),
});
const data = await res.json();
localStorage.setItem("access_tokens", JSON.stringify(data.tokens));
setClientId(data.user_id);
setLoggedIn(false);
} finally {
checkAuth();
}
}
function RegisterUser() {
let [username, setUserName] = useState("");
let [password, setPassword] = useState("");
let [displayName, setDisplayName] = useState("");
let hotel_ids = [1];
function registerUser(username, password, hotel_ids, displayname) {
const payload = {
username,
password,
hotel_ids,
displayname
}
console.log("Reg")
const res = fetch(`${API_BASE}/auth/register`, {
method: "PUT",
headers: {"Content-Type": "application/json"},
body: JSON.stringify(payload),
}
)
}
return(
<div className="CreateUserDiv">
<input
value={username}
onChange={e => setUserName(e.target.value)}
placeholder="NomDeCompte"
type="text" />
<input
value={password}
onChange={e => setPassword(e.target.value)}
placeholder="Mot de Passe"
type="text" />
<input
value={displayName}
onChange={e => setDisplayName(e.target.value)}
placeholder="Nome afficher"
type="text" />
<button
onClick={() =>
registerUser(username, password, hotel_ids, displayName)
}
>
Créer l'utilisateur
</button>
</div>
);
}
async function updatePassword(e) {
e.preventDefault();
//try
const payload = {
username : updateUsername,
current_password : updateCurrentPassword,
newpassword : updateNewPassword
}
const res = await fetch(`${API_BASE}/auth/update_password`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
"User-Agent": "react-app",
},
credentials: "include", // send cookies automatically
body: JSON.stringify(payload),
});
if (!res.ok) {
console.log("update password failed"+ updateCurrentPassword, updateNewPassword, updateUsername)
}
}
if (loading) return <p>Loading...</p>; // can show a spinner
return (
<>
<button className="user-btn" onClick={() => setLogMenuOpen(o => !o)}>
⚙️
</button>
{logMenuOpen && (
<div className='log-menu'>
<button onClick={logoutUser}>disconnect</button>
<button onClick={logoutAllSessions}>disconnect all session</button>
<form onSubmit={updatePassword}>
<h1>Update Password</h1>
<input
type="text"
placeholder="Username"
value={updateUsername}
onChange={(e) => setUpdateUsername(e.target.value)}
/>
<input
type="text"
placeholder="MDP actuel"
value={updateCurrentPassword}
onChange={(e) => setUpdateCurrentPassword(e.target.value)}
/>
<input
type="text"
placeholder="Nouveau MDP"
value={updateNewPassword}
onChange={(e) => setUpdateNewPassword(e.target.value)}
/>
<button type="submit">Uppdate</button>
</form>
<RegisterUser/>
</div>
)}
{loggedIn ? (
<MainApp resClientId={clientId} />
) : (
<Login className='logLanding' onLogin={checkAuth} />
)}
</>
);
}
//export default App