Fix admin check on monitoring UI
Build and Push Docker Images / detect-changes (push) Successful in 12s
Build and Push Docker Images / build-auth-api (push) Has been skipped
Build and Push Docker Images / build-employee-api (push) Has been skipped
Build and Push Docker Images / build-transit-api (push) Has been skipped
Build and Push Docker Images / build-error-log-api (push) Has been skipped
Build and Push Docker Images / build-admin-ui (push) Has been skipped
Build and Push Docker Images / build-monitoring-ui (push) Successful in 1m15s
Build and Push Docker Images / deploy-test-node (push) Successful in 3s
Build and Push Docker Images / detect-changes (push) Successful in 12s
Build and Push Docker Images / build-auth-api (push) Has been skipped
Build and Push Docker Images / build-employee-api (push) Has been skipped
Build and Push Docker Images / build-transit-api (push) Has been skipped
Build and Push Docker Images / build-error-log-api (push) Has been skipped
Build and Push Docker Images / build-admin-ui (push) Has been skipped
Build and Push Docker Images / build-monitoring-ui (push) Successful in 1m15s
Build and Push Docker Images / deploy-test-node (push) Successful in 3s
This commit is contained in:
+58
-36
@@ -57,7 +57,12 @@ const healthPaths = {
|
||||
errors: "/health",
|
||||
};
|
||||
const testerRoutes = [
|
||||
{ service: "auth", method: "POST", path: "/login", label: "Login (userCode + password)" },
|
||||
{
|
||||
service: "auth",
|
||||
method: "POST",
|
||||
path: "/login",
|
||||
label: "Login (userCode + password)",
|
||||
},
|
||||
{ service: "auth", method: "GET", path: "/me", label: "Current session" },
|
||||
{
|
||||
service: "employee",
|
||||
@@ -108,8 +113,8 @@ function App() {
|
||||
const [token, setToken] = useState(
|
||||
() => localStorage.getItem("transit-monitor-token") || "",
|
||||
);
|
||||
const [user, setUser] = useState(
|
||||
() => JSON.parse(localStorage.getItem("transit-monitor-user") || "null"),
|
||||
const [user, setUser] = useState(() =>
|
||||
JSON.parse(localStorage.getItem("transit-monitor-user") || "null"),
|
||||
);
|
||||
const [health, setHealth] = useState({});
|
||||
const [history, setHistory] = useState({});
|
||||
@@ -129,35 +134,38 @@ function App() {
|
||||
const [loginLoading, setLoginLoading] = useState(false);
|
||||
const [loginError, setLoginError] = useState("");
|
||||
|
||||
const login = useCallback(async (userCode, password) => {
|
||||
const url = urls.auth;
|
||||
if (!url) {
|
||||
setLoginError("Auth API URL not configured");
|
||||
return;
|
||||
}
|
||||
setLoginLoading(true);
|
||||
setLoginError("");
|
||||
try {
|
||||
const response = await fetch(`${url}/login`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ userCode, password }),
|
||||
});
|
||||
const data = await response.json();
|
||||
if (!response.ok) {
|
||||
throw new Error(data.error || `HTTP ${response.status}`);
|
||||
const login = useCallback(
|
||||
async (userCode, password) => {
|
||||
const url = urls.auth;
|
||||
if (!url) {
|
||||
setLoginError("Auth API URL not configured");
|
||||
return;
|
||||
}
|
||||
setToken(data.token);
|
||||
setUser(data.user);
|
||||
localStorage.setItem("transit-monitor-token", data.token);
|
||||
localStorage.setItem("transit-monitor-user", JSON.stringify(data.user));
|
||||
setLoginLoading(true);
|
||||
setLoginError("");
|
||||
} catch (error) {
|
||||
setLoginError(error.message);
|
||||
} finally {
|
||||
setLoginLoading(false);
|
||||
}
|
||||
}, [urls.auth]);
|
||||
try {
|
||||
const response = await fetch(`${url}/login`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ userCode, password }),
|
||||
});
|
||||
const data = await response.json();
|
||||
if (!response.ok) {
|
||||
throw new Error(data.error || `HTTP ${response.status}`);
|
||||
}
|
||||
setToken(data.token);
|
||||
setUser(data.user);
|
||||
localStorage.setItem("transit-monitor-token", data.token);
|
||||
localStorage.setItem("transit-monitor-user", JSON.stringify(data.user));
|
||||
setLoginError("");
|
||||
} catch (error) {
|
||||
setLoginError(error.message);
|
||||
} finally {
|
||||
setLoginLoading(false);
|
||||
}
|
||||
},
|
||||
[urls.auth],
|
||||
);
|
||||
|
||||
const logout = useCallback(() => {
|
||||
setToken("");
|
||||
@@ -590,7 +598,9 @@ function Docs() {
|
||||
<summary>API Routes</summary>
|
||||
<ul>
|
||||
{meta.routes.map((route) => (
|
||||
<li key={route}><code>{route}</code></li>
|
||||
<li key={route}>
|
||||
<code>{route}</code>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</details>
|
||||
@@ -855,7 +865,11 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
|
||||
/>
|
||||
</label>
|
||||
{loginError && <div className="login-error">{loginError}</div>}
|
||||
<button type="submit" className="run-button save-button" disabled={loginLoading}>
|
||||
<button
|
||||
type="submit"
|
||||
className="run-button save-button"
|
||||
disabled={loginLoading}
|
||||
>
|
||||
{loginLoading ? "Logging in..." : "Login"}
|
||||
</button>
|
||||
</form>
|
||||
@@ -898,10 +912,18 @@ function Connections({ urls, token, user, login, logout, save, loginLoading }) {
|
||||
</div>
|
||||
<div className="user-info">
|
||||
<h3>Logged in as</h3>
|
||||
<p><strong>User Code:</strong> {user?.userCode}</p>
|
||||
<p><strong>Role:</strong> {user?.job}</p>
|
||||
<p><strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}</p>
|
||||
<button className="ghost-button" onClick={logout}>Logout</button>
|
||||
<p>
|
||||
<strong>User Code:</strong> {user?.userCode}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Role:</strong> {user?.job}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Admin:</strong> {user?.isAdmin ? "Yes" : "No"}
|
||||
</p>
|
||||
<button className="ghost-button" onClick={logout}>
|
||||
Logout
|
||||
</button>
|
||||
</div>
|
||||
<button
|
||||
className="run-button save-button"
|
||||
|
||||
Reference in New Issue
Block a user