feat: real login and logout
This commit is contained in:
@@ -4,8 +4,22 @@ import { FunctionComponent, h } from "preact";
|
||||
import { useLocation } from "preact-iso";
|
||||
import { tv } from "tailwind-variants";
|
||||
import classes from "./menu.module.scss";
|
||||
import { calculatePoints, getCurrentStatus } from "@/utils/status-system";
|
||||
import { useEffect, useState } from "preact/hooks";
|
||||
import apiClient from "@/services/api";
|
||||
import { useAppContext } from "@/providers/AuthProvider";
|
||||
|
||||
interface UserProfile {
|
||||
username: string;
|
||||
email: string;
|
||||
status: string;
|
||||
avatar_url: string | null;
|
||||
telegram_notifications: boolean;
|
||||
telegram_chat_id: string;
|
||||
}
|
||||
|
||||
interface UserSettings {
|
||||
profile: UserProfile;
|
||||
}
|
||||
|
||||
interface MenuItemProps {
|
||||
title: string;
|
||||
@@ -36,32 +50,27 @@ const MenuItem: FunctionComponent<MenuItemProps> = ({ title, link, icon }: MenuI
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
const Avatar: FunctionComponent = () => {
|
||||
const [status, setStatus] = useState("");
|
||||
const [username, setUsername] = useState("");
|
||||
const { route, path } = useLocation();
|
||||
const { isLoggedIn } = useAppContext();
|
||||
|
||||
useEffect(() => {
|
||||
const updateStatus = () => {
|
||||
const tasks = JSON.parse(localStorage.getItem("tasks") || "[]");
|
||||
const completedTasks = tasks.filter((task: { checked: boolean }) => task.checked).length;
|
||||
const points = calculatePoints(completedTasks);
|
||||
setStatus(getCurrentStatus(points));
|
||||
};
|
||||
|
||||
// Initial update
|
||||
updateStatus();
|
||||
|
||||
// Update when tasks change
|
||||
const handleStorage = (e: StorageEvent) => {
|
||||
if (e.key === "tasks") {
|
||||
updateStatus();
|
||||
const fetchUserData = async () => {
|
||||
try {
|
||||
const response = await apiClient<UserSettings>("/api/settings/view_settings/", { method: "GET" }, isLoggedIn);
|
||||
setUsername(response.profile.username);
|
||||
setStatus(response.profile.status);
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch user data:", error);
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener('storage', handleStorage);
|
||||
return () => window.removeEventListener('storage', handleStorage);
|
||||
}, []);
|
||||
|
||||
if (isLoggedIn.value) {
|
||||
fetchUserData();
|
||||
}
|
||||
}, [isLoggedIn.value]);
|
||||
|
||||
return (
|
||||
<button
|
||||
@@ -77,7 +86,7 @@ const Avatar: FunctionComponent = () => {
|
||||
>
|
||||
<div class="my-5 aspect-square h-full rounded-full bg-white"></div>
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<p class="text-3xl font-semibold">никнейм</p>
|
||||
<p class="text-3xl font-semibold">{username}</p>
|
||||
<div class="rounded-[1rem] bg-white px-5 leading-5 font-light italic">{status}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user