From 7a52261b1ef220f02ad0d3184d38ce265ed59dff Mon Sep 17 00:00:00 2001 From: ysandler Date: Sat, 3 May 2025 15:26:08 -0500 Subject: [PATCH] feat: login redirect and logout --- .../(frontend)/books/[bookId]/page.client.tsx | 30 +++++++++++++------ src/app/(frontend)/logout/page.client.tsx | 24 +++++++++++++++ src/app/(frontend)/logout/page.tsx | 12 ++++++++ src/components/login-form.tsx | 7 +++-- 4 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/app/(frontend)/logout/page.client.tsx create mode 100644 src/app/(frontend)/logout/page.tsx diff --git a/src/app/(frontend)/books/[bookId]/page.client.tsx b/src/app/(frontend)/books/[bookId]/page.client.tsx index ee143d9..4d0520b 100644 --- a/src/app/(frontend)/books/[bookId]/page.client.tsx +++ b/src/app/(frontend)/books/[bookId]/page.client.tsx @@ -13,6 +13,7 @@ import { RichText } from '@/components/RichText' import { useMemo, useState } from 'react' import requestHold from '../../serverCalls/requestHold' import { useGlobal } from '@/providers/GlobalProvider' +import Link from 'next/link' type DropDownProps = { currentRepository: Repository @@ -85,6 +86,8 @@ export default function BookByIdPageClient(props: Props) { const { user } = useGlobal() + console.log(user) + const [isRequestingCopy, setIsRequestingCopy] = useState(false) const [selectedRepository, setSelectedRepository] = useState( repos.length ? repos[0] : null, @@ -147,15 +150,24 @@ export default function BookByIdPageClient(props: Props) {

{book.summary}

- setSelectedRepository(repo)} - /> + {!user ? ( + + Sign in to request a hold + + ) : ( + setSelectedRepository(repo)} + /> + )}

Genres

diff --git a/src/app/(frontend)/logout/page.client.tsx b/src/app/(frontend)/logout/page.client.tsx new file mode 100644 index 0000000..e2561f5 --- /dev/null +++ b/src/app/(frontend)/logout/page.client.tsx @@ -0,0 +1,24 @@ +'use client' + +import { useSearchParams } from 'next/navigation' + +const LogoutClientPage = () => { + const searchParams = useSearchParams() + + fetch('/api/users/logout', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }).finally(() => { + window.location.href = searchParams.get('redirectUrl') || '/' + }) + + return ( +
+

Logging you out . . .

+
+ ) +} + +export default LogoutClientPage diff --git a/src/app/(frontend)/logout/page.tsx b/src/app/(frontend)/logout/page.tsx new file mode 100644 index 0000000..0b69cfa --- /dev/null +++ b/src/app/(frontend)/logout/page.tsx @@ -0,0 +1,12 @@ +import { Suspense } from 'react' +import LogoutClientPage from './page.client' + +const LogoutPage = () => { + return ( + + + + ) +} + +export default LogoutPage diff --git a/src/components/login-form.tsx b/src/components/login-form.tsx index a51ea61..dbf1471 100644 --- a/src/components/login-form.tsx +++ b/src/components/login-form.tsx @@ -5,7 +5,7 @@ import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { useRouter } from 'next/navigation' +import { useRouter, useSearchParams } from 'next/navigation' import { useState } from 'react' import { useGlobal } from '@/providers/GlobalProvider' @@ -13,6 +13,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) const router = useRouter() const { setUser } = useGlobal() const [isLoading, setIsLoading] = useState(false) + const searchParams = useSearchParams() const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() @@ -42,7 +43,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) setUser(user.user) - if (user.token) router.push('/') + if (user.token) router.push(searchParams.get('redirectUrl') || '/') } catch (error) { console.error('Login failed:', error) } finally { @@ -68,7 +69,7 @@ export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) id="email" name="email" type="email" - placeholder="m@example.com" + placeholder="me@example.com" required />