diff --git a/src/app/api/auth/login/route.ts b/src/app/api/auth/login/route.ts index b736913..7479f63 100644 --- a/src/app/api/auth/login/route.ts +++ b/src/app/api/auth/login/route.ts @@ -8,7 +8,7 @@ export async function POST(request: Request) { const supabase = await createClient() const domain = process.env.DOMAIN; - console.log(domain) + if (!domain) { return NextResponse.json({ error: "Server is misconfigured, please check env variables and try again." diff --git a/src/app/api/auth/register/route.ts b/src/app/api/auth/register/route.ts index ee59366..4c554ab 100644 --- a/src/app/api/auth/register/route.ts +++ b/src/app/api/auth/register/route.ts @@ -6,9 +6,20 @@ export async function POST(request: Request) { const supabase = await createClient() try { + const domain = process.env.DOMAIN; + + if (!domain) { + return NextResponse.json({ + error: "Server is misconfigured, please check env variables and try again." + }, + { + status: 500 + }) + } + // First create the auth user const {data: {user}, error: authError} = await supabase.auth.signUp({ - email: `${username}@${process.env.DOMAIN}`, // Using username as email + email: `${username}@${domain}`, // Using username as email password: password, }) diff --git a/src/app/api/user/actions/realtime/requests/route.ts b/src/app/api/user/actions/realtime/requests/route.ts deleted file mode 100644 index c22ca0d..0000000 --- a/src/app/api/user/actions/realtime/requests/route.ts +++ /dev/null @@ -1,74 +0,0 @@ -// app/api/realtime/route.ts -import {createClient} from '@/lib/supabase/server' - -export async function GET(request: Request) { - const supabase = await createClient() - console.log("Updated") - // Get the current authenticated user - const {data: {user}, error: userError} = await supabase.auth.getUser() - - // If any of these, return a default error. - if (userError || !user) { - return new Response('Unauthorized', {status: 401}) - } - - // Start the stream of data - const stream = new TransformStream() - const writer = stream.writable.getWriter() - const encoder = new TextEncoder() - - // Create the channel - let channel: ReturnType | null = null - - try { - // RealTime supabase! - channel = supabase - .channel('user-requests') - .on( - 'postgres_changes', - { - event: 'UPDATE', - schema: 'public', - table: 'users', - filter: `uuid=eq.${user.id}`, - }, - async (payload) => { - if (payload.new.requests !== payload.old.requests) { - try { - const data = encoder.encode(`data: ${JSON.stringify({ - type: 'requests_update', - data: payload.new.requests - })}\n\n`) - await writer.write(data) - } catch (error) { - console.error('Error writing to stream:', error) - } - } - } - ) - .subscribe() - - const initialData = encoder.encode(`data: ${JSON.stringify({ - type: 'connected', - message: 'SSE connection established' - })}\n\n`) - await writer.write(initialData) - - request.signal.addEventListener('abort', () => { - channel?.unsubscribe() - writer.close() - }) - - } catch (error) { - console.error('Error in SSE setup:', error) - return new Response('Error setting up SSE', {status: 500}) - } - - return new Response(stream.readable, { - headers: { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - 'Connection': 'keep-alive', - }, - }) -} \ No newline at end of file diff --git a/src/app/api/user/send/request/route.ts b/src/app/api/user/send/request/route.ts index 0247a51..b4a4e37 100644 --- a/src/app/api/user/send/request/route.ts +++ b/src/app/api/user/send/request/route.ts @@ -45,7 +45,12 @@ export async function POST(request: Request) { return NextResponse.json({user: null}, {status: 401}); } - const userSuuid = (await getUserByUUID(supabase, user.id)).suuid; + const getUser = await getUserByUUID(supabase, user.id) + const userSuuid = getUser.suuid; + + if (userSuuid === searchTerm) { + return NextResponse.json({success: false, hint: "Used self SUUID"}, {status: 409}); + } const result = await updateUserRequests(searchTerm, userSuuid, supabase); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index af87918..82072f7 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -58,7 +58,6 @@ export default async function RootLayout(
- {children}
diff --git a/src/components/main/realtime/request.tsx b/src/components/main/realtime/request.tsx index 099989d..d91b339 100644 --- a/src/components/main/realtime/request.tsx +++ b/src/components/main/realtime/request.tsx @@ -1,12 +1,20 @@ // components/RealtimeRequests.tsx 'use client' -import {useEffect} from 'react' +import {Dispatch, SetStateAction, useEffect} from 'react' import {useToast} from "@/hooks/use-toast" import {useUser} from "@/contexts/user" import {createBrowserClient} from "@/lib/supabase/browser"; -export function RealtimeRequests() { +interface RealtimeRequests { + setRequests: Dispatch> +} + +export function RealtimeRequests( + { + setRequests, + }: RealtimeRequests +) { const {toast} = useToast() const {user, updateUser} = useUser() @@ -19,7 +27,13 @@ export function RealtimeRequests() { table: 'users', filter: `uuid=eq.${user.uuid}`, }, async (payload) => { - console.log(payload) + if (payload.new.requests !== payload.old.requests) { + try { + setRequests(payload.new.requests) + } catch (error) { + console.error('Error writing to stream:', error) + } + } }).subscribe() }, []) diff --git a/src/components/main/sidebar/sidebar.tsx b/src/components/main/sidebar/sidebar.tsx index 8ecc87b..36fac85 100644 --- a/src/components/main/sidebar/sidebar.tsx +++ b/src/components/main/sidebar/sidebar.tsx @@ -3,7 +3,7 @@ import React, {useCallback, useEffect, useState} from "react" import {usePathname} from "next/navigation" import Link from "next/link" import {AnimatePresence, motion} from "framer-motion" -import {LogOut, Mail, MailPlus, X} from "lucide-react" +import {Check, LogOut, Mail, MailPlus, X} from "lucide-react" import {Button} from "@/components/ui/button" import {Avatar, AvatarFallback} from "@/components/ui/avatar" import {Separator} from "@/components/ui/separator" @@ -17,6 +17,7 @@ import {useToast} from "@/hooks/use-toast"; import {useTheme} from "next-themes"; import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip"; import {DropdownMenu, DropdownMenuContent, DropdownMenuTrigger} from "@/components/ui/dropdown-menu"; +import {RealtimeRequests} from "@/components/main/realtime/request"; type SidebarProps = { children?: React.ReactNode @@ -33,24 +34,30 @@ function Sidebar( const [threads, setThreads] = useState([]); const [threadMenu, setThreadMenu] = useState([]); const [copied, setCopied] = useState(false); - const {theme, systemTheme} = useTheme() + const {theme, systemTheme} = useTheme(); const {toast} = useToast(); - const {isDrawerOpen, setIsDrawerOpen} = useUIState() + const {isDrawerOpen, setIsDrawerOpen} = useUIState(); const {drawerRef} = useRefs(); + const [requests, setRequests] = useState([]); const [pendingRequest, setPendingRequest] = useState(0); - const {user, getUser} = useUser() + const {user, getUser} = useUser(); const { username, suuid - } = user + } = user; useEffect(() => { - setPendingRequest(user.requests?.length || 0); - }, [user]) + setPendingRequest(requests.length || 0); + }, [requests, setPendingRequest]); + + useEffect(() => { + setPendingRequest(user.requests.length); + setRequests(user.requests); + }, []); useEffect(() => { const getThreads = async () => { @@ -149,10 +156,27 @@ function Sidebar(
+
+

User

+

Decline | Accept

+
{ - pendingRequest > 0 && user.requests.map((request, item) => { + pendingRequest > 0 && requests.map((request, item) => { return ( -

{request}

+
+ +
+

{request}

+
+ + +
+
+
) }) || (

Nothing new here

@@ -210,6 +234,7 @@ function Sidebar( return ( <> +