"use client" import { Nav } from "@/components/core/nav" import { SiForgejo, SiJellyfin, SiOllama, SiVaultwarden } from "react-icons/si" import { TbMail, TbServer, TbTool, TbKey, TbLogin, TbSend, TbExternalLink, TbInfoCircle } from "react-icons/tb" import Link from "next/link" import { useEffect, useState } from "react" import { authClient } from "@/util/auth-client" interface Service { id: string; name: string; description: string; priceStatus: string; joinLink?: string; enabled: boolean; } interface UserService { serviceId: string; serviceName: string; serviceDescription: string; priceStatus: string; joinLink?: string; grantedAt: string | null; isOpen: boolean; } const getServiceIcon = (serviceName: string) => { switch (serviceName.toLowerCase()) { case 'git': return SiForgejo; case 'tv': return SiJellyfin; case 'ai': return SiOllama; case 'mail': case 'email': return TbMail; case 'hosting': return TbServer; case 'keybox': return TbKey; case 'pass': return SiVaultwarden; default: return TbTool; } }; export default function Services() { const { data: session, isPending } = authClient.useSession(); const [services, setServices] = useState([]); const [userServices, setUserServices] = useState([]); const [loading, setLoading] = useState(true); const [mounted, setMounted] = useState(false); useEffect(() => { setMounted(true); }, []); useEffect(() => { fetchServices(); if (session) { fetchUserServices(); } }, [session]); const fetchServices = async () => { try { const response = await fetch("/api/services"); if (response.ok) { const data = await response.json(); setServices(data.services); } } catch (error) { console.error("Error fetching services:", error); } finally { setLoading(false); } }; const fetchUserServices = async () => { try { const response = await fetch("/api/user-services"); if (response.ok) { const data = await response.json(); setUserServices(data.services); } } catch (error) { console.error("Error fetching user services:", error); } }; const hasAccess = (serviceName: string) => { return userServices.some(userService => userService.serviceName === serviceName); }; const getUserJoinLink = (serviceName: string) => { const userService = userServices.find(us => us.serviceName === serviceName); return userService?.joinLink; }; const getServiceButtonContent = (service: Service) => { const isLoggedIn = !!session; const userHasAccess = hasAccess(service.name); const userJoinLink = getUserJoinLink(service.name); const joinLink = userJoinLink || service.joinLink; if (isLoggedIn && userHasAccess && joinLink) { return ( ); } if (isLoggedIn && !userHasAccess && (service.priceStatus === 'by-request' || service.priceStatus === 'invite-only')) { return ( ); } if (isLoggedIn && service.priceStatus === 'open' && joinLink) { return ( ); } if (!isLoggedIn && service.priceStatus === 'open' && joinLink) { return ( ); } if (!isLoggedIn && (service.priceStatus === 'invite-only' || service.priceStatus === 'by-request')) { return ( ); } return null; }; const getServiceCardColor = (service: Service) => { const isLoggedIn = !!session; const userHasAccess = hasAccess(service.name); if (isLoggedIn && userHasAccess) { return "bg-green-400 text-white"; } switch (service.priceStatus) { case 'open': return "bg-blue-400 text-white"; case 'invite-only': return "bg-orange-400 text-white"; case 'by-request': return "bg-purple-400 text-white"; default: return "bg-gray-400 text-white"; } }; if (!mounted || isPending) { return (
); } return (
) }