From dcdd2383c6851b3e0c785040539c865fdf608b6a Mon Sep 17 00:00:00 2001 From: gosangam Date: Sat, 30 May 2026 23:44:08 +0530 Subject: [PATCH] feat: add user centric features --- app/(auth)/login/page.tsx | 72 +- app/(auth)/signup/page.tsx | 78 +- app/books/chapter-viewer.tsx | 6 +- app/c/[id]/page.tsx | 96 + app/globals.css | 55 + app/layout.tsx | 39 +- app/page.tsx | 325 +- app/profile/page.tsx | 47 - app/profile/profile-form.tsx | 197 - app/search/search-content.tsx | 55 +- app/u/[handle]/page.tsx | 131 + app/u/[handle]/posts/page.tsx | 70 + app/u/me/bookmarks/page.tsx | 117 + app/u/me/collections/[id]/page.tsx | 91 + app/u/me/collections/page.tsx | 150 + app/u/me/layout.tsx | 93 + app/u/me/mentions/page.tsx | 21 + app/u/me/page.tsx | 124 + app/u/me/posts/page.tsx | 108 + components/auth/auth-gate.tsx | 109 + components/auth/auth-modal.tsx | 158 + components/auth/login-form.tsx | 93 + components/auth/signup-form.tsx | 81 + components/auth/user-menu.tsx | 120 +- components/knowledgebase-index.tsx | 213 + components/page-header.tsx | 10 +- components/profile/profile-edit-form.tsx | 225 + components/profile/profile-header.tsx | 88 + components/profile/profile-sidebar.tsx | 189 + components/profile/profile-tabs.tsx | 71 + components/profile/profile-view-header.tsx | 71 + components/reading-settings.tsx | 150 +- .../selection-toolbar/collections-drawer.tsx | 320 +- components/selection-toolbar/compose-post.tsx | 258 + components/selection-toolbar/more-popover.tsx | 142 +- components/selection-toolbar/share-modal.tsx | 5 +- components/site-bottom-nav.tsx | 105 + components/site-footer.tsx | 99 +- components/site-header.tsx | 126 +- components/site-sidebar.tsx | 299 + components/social/collection-grid-card.tsx | 86 + components/social/collection-scroll-card.tsx | 325 + components/social/collection-views.tsx | 38 + components/social/edit-collection-drawer.tsx | 504 + components/social/page-bookmarks.tsx | 241 + components/social/post-actions-footer.tsx | 109 + components/social/post-card-shared.tsx | 145 + components/social/post-card.tsx | 101 + components/social/post-grid-card.tsx | 158 + components/social/post-scroll-card.tsx | 329 + components/social/post-views.tsx | 52 + components/social/update-background-modal.tsx | 240 + components/text-selection-toolbar.tsx | 359 +- components/ui/checkbox.tsx | 71 + components/ui/confirm-modal.tsx | 188 + components/ui/toaster.tsx | 37 + lib/auth.ts | 9 +- lib/social.ts | 288 + lib/source-reference.ts | 122 + lib/text-highlight.ts | 512 +- package-lock.json | 9103 +++++++++++++++++ package.json | 1 + yarn.lock | 693 +- 63 files changed, 16783 insertions(+), 1735 deletions(-) create mode 100644 app/c/[id]/page.tsx delete mode 100644 app/profile/page.tsx delete mode 100644 app/profile/profile-form.tsx create mode 100644 app/u/[handle]/page.tsx create mode 100644 app/u/[handle]/posts/page.tsx create mode 100644 app/u/me/bookmarks/page.tsx create mode 100644 app/u/me/collections/[id]/page.tsx create mode 100644 app/u/me/collections/page.tsx create mode 100644 app/u/me/layout.tsx create mode 100644 app/u/me/mentions/page.tsx create mode 100644 app/u/me/page.tsx create mode 100644 app/u/me/posts/page.tsx create mode 100644 components/auth/auth-gate.tsx create mode 100644 components/auth/auth-modal.tsx create mode 100644 components/auth/login-form.tsx create mode 100644 components/auth/signup-form.tsx create mode 100644 components/knowledgebase-index.tsx create mode 100644 components/profile/profile-edit-form.tsx create mode 100644 components/profile/profile-header.tsx create mode 100644 components/profile/profile-sidebar.tsx create mode 100644 components/profile/profile-tabs.tsx create mode 100644 components/profile/profile-view-header.tsx create mode 100644 components/selection-toolbar/compose-post.tsx create mode 100644 components/site-bottom-nav.tsx create mode 100644 components/site-sidebar.tsx create mode 100644 components/social/collection-grid-card.tsx create mode 100644 components/social/collection-scroll-card.tsx create mode 100644 components/social/collection-views.tsx create mode 100644 components/social/edit-collection-drawer.tsx create mode 100644 components/social/page-bookmarks.tsx create mode 100644 components/social/post-actions-footer.tsx create mode 100644 components/social/post-card-shared.tsx create mode 100644 components/social/post-card.tsx create mode 100644 components/social/post-grid-card.tsx create mode 100644 components/social/post-scroll-card.tsx create mode 100644 components/social/post-views.tsx create mode 100644 components/social/update-background-modal.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/confirm-modal.tsx create mode 100644 components/ui/toaster.tsx create mode 100644 lib/social.ts create mode 100644 package-lock.json diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx index 44837c56..5383544e 100644 --- a/app/(auth)/login/page.tsx +++ b/app/(auth)/login/page.tsx @@ -1,86 +1,36 @@ "use client"; -import { Suspense, useState } from "react"; +import { Suspense } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { AuthCard, AuthFooterLink } from "@/components/auth/auth-card"; -import { useAuth } from "@/components/auth/auth-provider"; -import { AuthError } from "@/lib/auth"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; +import { LoginForm } from "@/components/auth/login-form"; -function LoginForm() { +function LoginContent() { const router = useRouter(); const params = useSearchParams(); - const { logIn } = useAuth(); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState(null); - const [submitting, setSubmitting] = useState(false); - - async function onSubmit(e: React.SyntheticEvent) { - e.preventDefault(); - setError(null); - setSubmitting(true); - try { - await logIn(email, password); - router.push(params.get("next") ?? "/profile"); - router.refresh(); - } catch (err) { - setError(err instanceof AuthError ? err.message : "Login failed."); - setSubmitting(false); - } - } return ( - - - + } > -
-
- - setEmail(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
-
- {error ?

{error}

: null} - -
+ { + router.push(params.get("next") ?? "/u/me"); + router.refresh(); + }} + />
); } export default function LoginPage() { - // useSearchParams must be inside Suspense for Next.js streaming. return ( - + ); } diff --git a/app/(auth)/signup/page.tsx b/app/(auth)/signup/page.tsx index 57c57a63..012ecec2 100644 --- a/app/(auth)/signup/page.tsx +++ b/app/(auth)/signup/page.tsx @@ -1,37 +1,11 @@ "use client"; -import { useState } from "react"; import { useRouter } from "next/navigation"; import { AuthCard, AuthFooterLink } from "@/components/auth/auth-card"; -import { useAuth } from "@/components/auth/auth-provider"; -import { AuthError } from "@/lib/auth"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Label } from "@/components/ui/label"; +import { SignUpForm } from "@/components/auth/signup-form"; export default function SignUpPage() { const router = useRouter(); - const { signUp } = useAuth(); - const [name, setName] = useState(""); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState(null); - const [submitting, setSubmitting] = useState(false); - - async function onSubmit(e: React.SyntheticEvent) { - e.preventDefault(); - setError(null); - setSubmitting(true); - try { - await signUp(email, password, name); - router.push("/profile"); - router.refresh(); - } catch (err) { - setError(err instanceof AuthError ? err.message : "Sign-up failed."); - setSubmitting(false); - } - } - return ( } > -
-
- - setName(e.target.value)} - /> -
- -
- - setEmail(e.target.value)} - /> -
- -
- - setPassword(e.target.value)} - /> -

At least 8 characters.

-
-
- {error ?

{error}

: null} - -
+ { + router.push("/u/me"); + router.refresh(); + }} + />
); } diff --git a/app/books/chapter-viewer.tsx b/app/books/chapter-viewer.tsx index 131e3055..9c840b13 100644 --- a/app/books/chapter-viewer.tsx +++ b/app/books/chapter-viewer.tsx @@ -390,7 +390,11 @@ export function ChapterViewer({ return ( <> {/* ---- Sidebar: Verse Index ---- */} -