Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4d25fed

Browse files
committed
feat: Add theme toggle component and integrate into home and dashboard pages
- Introduced a new ThemeToggle component for switching between light and dark themes. - Integrated ThemeToggle into the Home and Dashboard pages for improved user experience. - Adjusted layout styles for better responsiveness and visual consistency.
1 parent 460e031 commit 4d25fed

File tree

3 files changed

+55
-7
lines changed

3 files changed

+55
-7
lines changed

app/dashboard/page.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { redirect } from "next/navigation"
33
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
44
import { Button } from "@/components/ui/button"
55
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"
6+
import { ThemeToggle } from "@/components/theme-toggle"
67
import Link from "next/link"
78

89
export default async function Dashboard() {
@@ -18,16 +19,19 @@ export default async function Dashboard() {
1819
try {
1920
session = JSON.parse(sessionCookie.value)
2021
} catch (error) {
21-
console.error("解析会话 Cookie 失败:", error)
22+
console.error("解析会话 Cookie 失败", error)
2223
redirect("/")
2324
}
2425

2526
const user = session.user
2627

2728
return (
28-
<div className="container py-10">
29-
<div className="flex flex-col items-center justify-center space-y-6">
30-
<Card className="w-full max-w-md">
29+
<div className="flex min-h-[calc(100vh-4rem)] items-center justify-center py-10">
30+
<div className="absolute right-4 top-4 md:right-8 md:top-8">
31+
<ThemeToggle />
32+
</div>
33+
<div className="container max-w-screen-xl mx-auto flex flex-col items-center justify-center">
34+
<Card className="w-full max-w-lg">
3135
<CardHeader className="text-center">
3236
<CardTitle className="text-2xl">欢迎回来,{user.name || user.login}</CardTitle>
3337
<CardDescription>您已成功使用 Gitee 账号登录</CardDescription>

app/page.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { UserAuthForm } from "@/components/user-auth-form"
2+
import { ThemeToggle } from "@/components/theme-toggle"
23
import Link from "next/link"
34

45
export default function Home() {
56
return (
67
<div className="container relative flex h-screen flex-col items-center justify-center md:grid lg:max-w-none lg:grid-cols-2 lg:px-0">
7-
<div className="relative hidden h-full flex-col bg-muted p-10 text-white lg:flex dark:border-r">
8-
<div className="absolute inset-0 bg-zinc-900" />
8+
<div className="absolute right-4 top-4 md:right-8 md:top-8">
9+
<ThemeToggle />
10+
</div>
11+
<div className="relative hidden h-full flex-col bg-muted p-10 text-white dark:border-r lg:flex">
12+
<div className="absolute inset-0 bg-zinc-900 dark:bg-zinc-800" />
913
<div className="relative z-20 flex items-center text-lg font-medium">
1014
Next.js Gitee OAuth 示例
1115
</div>
@@ -19,7 +23,7 @@ export default function Home() {
1923
</div>
2024
</div>
2125
<div className="lg:p-8">
22-
<div className="mx-auto flex w-full flex-col justify-center space-y-6 sm:w-[350px]">
26+
<div className="mx-auto flex w-full flex-col justify-center space-y-6 sm:w-[450px]">
2327
<div className="flex flex-col space-y-2 text-center">
2428
<h1 className="text-2xl font-semibold tracking-tight">账号登录</h1>
2529
<p className="text-sm text-muted-foreground">使用 Gitee 账号登录应用</p>

components/theme-toggle.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"use client"
2+
3+
import * as React from "react"
4+
import { Moon, Sun } from "lucide-react"
5+
import { useTheme } from "next-themes"
6+
7+
import { Button } from "@/components/ui/button"
8+
import {
9+
DropdownMenu,
10+
DropdownMenuContent,
11+
DropdownMenuItem,
12+
DropdownMenuTrigger,
13+
} from "@/components/ui/dropdown-menu"
14+
15+
export function ThemeToggle() {
16+
const { setTheme } = useTheme()
17+
18+
return (
19+
<DropdownMenu>
20+
<DropdownMenuTrigger asChild>
21+
<Button variant="outline" size="icon">
22+
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
23+
<Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
24+
<span className="sr-only">切换主题</span>
25+
</Button>
26+
</DropdownMenuTrigger>
27+
<DropdownMenuContent align="end">
28+
<DropdownMenuItem onClick={() => setTheme("light")}>
29+
浅色
30+
</DropdownMenuItem>
31+
<DropdownMenuItem onClick={() => setTheme("dark")}>
32+
深色
33+
</DropdownMenuItem>
34+
<DropdownMenuItem onClick={() => setTheme("system")}>
35+
跟随系统
36+
</DropdownMenuItem>
37+
</DropdownMenuContent>
38+
</DropdownMenu>
39+
)
40+
}

0 commit comments

Comments
 (0)