diff --git a/package-lock.json b/package-lock.json index 5a3d0b2..9500488 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1283,6 +1283,7 @@ "version": "5.101.0", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.0.tgz", "integrity": "sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==", + "license": "MIT", "dependencies": { "@tanstack/query-core": "5.101.0" }, @@ -1298,6 +1299,7 @@ "version": "5.101.0", "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.101.0.tgz", "integrity": "sha512-cpZA0+WqKXwrwMfiWZEGGF6QrIWVQFbhBtxqDF5sQsAfrFf47HIE6fiPbQU3wyAUEN2+7UNqLCQe7oG6m3f93w==", + "license": "MIT", "dependencies": { "@tanstack/query-devtools": "5.101.0" }, @@ -5011,6 +5013,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, diff --git a/src/app/(dashboard)/subscriptions/page.tsx b/src/app/(dashboard)/subscriptions/page.tsx new file mode 100644 index 0000000..112f1c0 --- /dev/null +++ b/src/app/(dashboard)/subscriptions/page.tsx @@ -0,0 +1,7 @@ +export default function SubscriptionsPage() { + return ( +
+

Subscriptions

+
+ ); +} diff --git a/src/components/navigation/BottomNav.tsx b/src/components/navigation/BottomNav.tsx new file mode 100644 index 0000000..e80e801 --- /dev/null +++ b/src/components/navigation/BottomNav.tsx @@ -0,0 +1,84 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { Compass, Home, Heart, User } from "lucide-react"; +import { cn } from "@/lib/utils"; + +const NAV_ITEMS = [ + { + label: "Discover", + href: "/discover", + Icon: Compass, + }, + { + label: "Dashboard", + href: "/dashboard", + Icon: Home, + }, + { + label: "Subscriptions", + href: "/subscriptions", + Icon: Heart, + }, + { + label: "Profile", + href: "/profile", + Icon: User, + }, +] as const; + +export function BottomNav() { + const pathname = usePathname(); + + return ( + + ); +} diff --git a/src/middleware.ts b/src/middleware.ts index 1e15c13..bf46c2d 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -3,7 +3,7 @@ import type { NextRequest } from "next/server"; import { isAuthenticatedFromRequest } from "@/lib/auth/session"; const AUTH_ROUTES = ["/login", "/signup"]; -const PROTECTED_PREFIXES = ["/dashboard", "/profile"]; +const PROTECTED_PREFIXES = ["/dashboard", "/profile", "/discover", "/subscriptions"]; function isProtectedPath(pathname: string): boolean { return PROTECTED_PREFIXES.some( @@ -34,5 +34,7 @@ export const config = { "/signup", "/dashboard/:path*", "/profile/:path*", + "/discover/:path*", + "/subscriptions/:path*", ], }; diff --git a/src/types/api.ts b/src/types/api.ts index 3bc3943..d064f36 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -29,3 +29,22 @@ export interface Post { authorId: string; createdAt: string; } + +export interface Subscription { + id: string; + creatorId: string; + status: "active" | "cancelled" | "expired"; + createdAt: string; + expiresAt?: string; +} + +export interface Creator { + id: string; + name: string; + handle: string; + avatarUrl?: string; + bio?: string; + subscriberCount: number; + isSubscribed?: boolean; + subscriptionPrice?: number; +}