From c56586f5baa89200889119c9627c02035b1621ad Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Wed, 1 Oct 2025 15:47:02 +0200 Subject: [PATCH] feat(web): integrate PocketBase authentication with LoginPopup in header --- web/src/components/header.tsx | 83 ++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/web/src/components/header.tsx b/web/src/components/header.tsx index 4c13be85..a2cc21a5 100644 --- a/web/src/components/header.tsx +++ b/web/src/components/header.tsx @@ -7,16 +7,26 @@ import { IconSubmissionForm } from "@/components/icon-submission-form" import { ThemeSwitcher } from "@/components/theme-switcher" import { REPO_PATH } from "@/constants" import { getIconsArray } from "@/lib/api" +import { pb } from "@/lib/pb" import type { IconWithName } from "@/types/icons" import { CommandMenu } from "./command-menu" import { HeaderNav } from "./header-nav" import { Button } from "./ui/button" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip" +import { LoginPopup } from "./user-button" + +interface UserData { + username: string + email: string + avatar?: string +} export function Header() { const [iconsData, setIconsData] = useState([]) const [isLoaded, setIsLoaded] = useState(false) const [commandMenuOpen, setCommandMenuOpen] = useState(false) + const [isLoggedIn, setIsLoggedIn] = useState(false) + const [userData, setUserData] = useState(undefined) useEffect(() => { async function loadIcons() { @@ -33,17 +43,59 @@ export function Header() { loadIcons() }, []) + useEffect(() => { + // Initialize auth state from PocketBase authStore + const updateAuthState = () => { + if (pb.authStore.isValid && pb.authStore.record) { + setIsLoggedIn(true) + setUserData({ + username: pb.authStore.record.username || pb.authStore.record.email, + email: pb.authStore.record.email, + avatar: pb.authStore.record.avatar + ? `${pb.baseURL}/api/files/_pb_users_auth_/${pb.authStore.record.id}/${pb.authStore.record.avatar}` + : undefined, + }) + } else { + setIsLoggedIn(false) + setUserData(undefined) + } + } + + // Set initial state + updateAuthState() + + // Listen for auth changes + const unsubscribe = pb.authStore.onChange(() => { + updateAuthState() + }) + + // Cleanup listener on unmount + return () => { + unsubscribe() + } + }, []) + // Function to open the command menu const openCommandMenu = () => { setCommandMenuOpen(true) } + // Handle sign out using PocketBase + const handleSignOut = () => { + pb.authStore.clear() + } + return (
- - Dashboard Icons + + + Dashboard Icons +
@@ -52,7 +104,11 @@ export function Header() {
{/* Desktop search button */}
- @@ -111,11 +171,22 @@ export function Header() {
+
{/* Single instance of CommandMenu */} - {isLoaded && } + {isLoaded && ( + + )}
- ) + ); }