Skip to content

Commit 5798555

Browse files
authored
Merge pull request #11 from WebmasterCamp/dev
v1.1.0
2 parents ef590a0 + 01de41e commit 5798555

File tree

15 files changed

+717
-106
lines changed

15 files changed

+717
-106
lines changed

src/app/login/page.tsx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use client';
2+
import { useState } from 'react';
3+
import { useRouter } from 'next/navigation';
4+
5+
export default function LoginPage() {
6+
const router = useRouter();
7+
8+
const [email, setEmail] = useState('');
9+
const [password, setPassword] = useState('');
10+
const [error, setError] = useState('');
11+
const [success, setSuccess] = useState(false);
12+
13+
const isValidEmail = (email: string) =>
14+
/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/u.test(email);
15+
16+
const handleSubmit = (e: React.FormEvent) => {
17+
e.preventDefault();
18+
if (!isValidEmail(email)) return setError('อีเมลไม่ถูกต้อง');
19+
if (!password) return setError('กรุณากรอกรหัสผ่าน');
20+
setError('');
21+
setSuccess(true);
22+
23+
// หลังจาก login สำเร็จ redirect ไปหน้า /home
24+
router.push('/');
25+
};
26+
27+
return (
28+
<div className="min-h-screen flex items-center justify-center bg-gradient-to-r from-black to-red-900 p-4">
29+
<form onSubmit={handleSubmit} className="bg-black/80 p-10 rounded-2xl w-full max-w-md text-white">
30+
<h1 className="flex text-[20px] font-semibold mb-2 items-center justify-center">
31+
<img src="/logo.png" alt="" className='w-[37px] h-[37px]'/>
32+
หาผีใกล้ฉัน</h1>
33+
<div className='text-center'>เข้าสู่ระบบ </div>
34+
35+
<label className="block mb-4">
36+
<span>อีเมล</span>
37+
<input
38+
type="text"
39+
className="w-full mt-1 p-2 rounded-full text-white"
40+
value={email}
41+
onChange={(e) => setEmail(e.target.value)}
42+
/>
43+
</label>
44+
<label className="block mb-4">
45+
<span>รหัสผ่าน</span>
46+
<input
47+
type="password"
48+
className="w-full mt-1 p-2 rounded-full text-white"
49+
value={password}
50+
onChange={(e) => setPassword(e.target.value)}
51+
/>
52+
</label>
53+
{error && <div className="text-red-400 mb-2">{error}</div>}
54+
{success && <div className="text-green-400 mb-2 ">เข้าสู่ระบบสำเร็จ!</div>}
55+
<button type="submit" className="mt-2 bg-red-800 w-full py-2 rounded hover:bg-red-700">
56+
เข้าสู่ระบบ
57+
</button>
58+
</form>
59+
</div>
60+
);
61+
}

src/app/login/success/page.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
'use client';
2+
3+
import { useRouter } from 'next/navigation';
4+
5+
export default function LoginSuccess() {
6+
const router = useRouter();
7+
8+
const handleLogout = () => {
9+
// ในอนาคตจะใส่ logic logout ที่นี่
10+
router.push('/'); // กลับไปหน้า login
11+
};
12+
13+
return (
14+
<div className="min-h-screen flex flex-col items-center justify-center bg-gradient-to-r from-black to-red-900 p-4 text-white">
15+
<h1 className="text-4xl font-bold mb-6">ยินดีต้อนรับสู่หน้า Home 👻</h1>
16+
<p className="mb-10 text-center max-w-md">
17+
คุณเข้าสู่ระบบสำเร็จแล้ว! ตอนนี้คุณสามารถใช้งานเว็บไซต์หาผีใกล้ฉันได้ตามต้องการ
18+
</p>
19+
<button
20+
onClick={handleLogout}
21+
className="bg-red-800 px-6 py-3 rounded hover:bg-red-700 transition"
22+
>
23+
ออกจากระบบ
24+
</button>
25+
</div>
26+
);
27+
}

src/app/my/page.css

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
.main-container {
2+
min-height: calc(100vh - 100px);
3+
background-image: url('/bg.jpg');
4+
background-size: cover;
5+
background-position: center;
6+
background-repeat: no-repeat;
7+
position: relative;
8+
padding-bottom: 100px;
9+
}
10+
11+
.main-container::before {
12+
content: '';
13+
position: absolute;
14+
top: 0;
15+
left: 0;
16+
right: 0;
17+
bottom: 0;
18+
background: rgba(0, 0, 0, 0.5);
19+
z-index: 1;
20+
}
21+
22+
.main-content {
23+
position: relative;
24+
z-index: 2;
25+
}

src/app/my/page.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import GhostNearMeSearchCard from "@/components/GhostNearMeSearchCard/GhostNearMeSearchCard";
2+
import NavigationBar from "@/components/NavigationBar";
3+
import React from "react";
4+
import './page.css';
5+
import GradientCard from "@/components/GradientCard/GradientCard";
6+
import CreateGhostStory from "@/components/CreateGhostStory/CreateGhostStory";
7+
const My = () => {
8+
return (
9+
<div className="main-container">
10+
<div className="main-content">
11+
<NavigationBar />
12+
<div className="text-center mt-[100px]">
13+
<div className="text-[40px] text-white">
14+
แชร์เรื่องเล่า
15+
</div>
16+
</div>
17+
<div className="w-[80%] mx-auto">
18+
<div className="mt-[20px] mb-[80px]">
19+
<CreateGhostStory />
20+
</div>
21+
<div>
22+
<div className="flex justify-between items-end mb-[40px]">
23+
<div className="text-[32px] font-bold text-white">
24+
เรื่องเล่าจากทางบ้าน
25+
</div>
26+
<div className="text-[20px] text-white">ดูทั้งหมด</div>
27+
</div>
28+
29+
<div className="grid grid-cols-2 gap-[32px]">
30+
<GradientCard
31+
title="เรื่องเล่าจากทางบ้าน"
32+
description="เรื่องเล่าจากทางบ้าน"
33+
/>
34+
<GradientCard
35+
title="เรื่องเล่าจากทางบ้าน"
36+
description="เรื่องเล่าจากทางบ้าน"
37+
/>
38+
<GradientCard
39+
title="เรื่องเล่าจากทางบ้าน"
40+
description="เรื่องเล่าจากทางบ้าน"
41+
/>
42+
<GradientCard
43+
title="เรื่องเล่าจากทางบ้าน"
44+
description="เรื่องเล่าจากทางบ้าน"
45+
/>
46+
</div>
47+
</div>
48+
</div>
49+
</div>
50+
</div>
51+
);
52+
};
53+
54+
export default My;

src/app/page.tsx

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,42 @@
1+
'use client'
12
import NavigationBar from "@/components/NavigationBar";
23
import Image from "next/image";
34
import GhostNearMeSearchCard from "@/components/GhostNearMeSearchCard/GhostNearMeSearchCard";
45
import GradientCard from "@/components/GradientCard/GradientCard";
56
import './page.css'
7+
import { useState } from "react";
68

79
export default function Home() {
10+
const [searchQuery, setSearchQuery] = useState("")
11+
12+
const handleSearch = (query: string) => {
13+
setTimeout(() => {
14+
setSearchQuery(query)
15+
}, 1000);
16+
}
17+
18+
const mockData = [
19+
{
20+
title: "เสียงลึกลับในบ้านร้าง",
21+
description: "แค่เล่นหยอกกับเพื่อนว่าจะไปล่าท้าผีทว่ากลับเจอเรื่องสุดสยองในบ้านร้าง..."
22+
},
23+
{
24+
title: "เงาปริศนาใต้สะพาน",
25+
description: "ทุกคืนวันพระจะมีเสียงร้องไห้ดังมาจากใต้สะพานเก่า ไม่มีใครกล้าเข้าใกล้จนกระทั่งวันหนึ่งมีเด็กกลุ่มหนึ่งหายตัวไป..."
26+
},
27+
{
28+
title: "เสียงกระซิบในห้องเรียนร้าง",
29+
description: "นักเรียนที่อยู่เวรดึกมักได้ยินเสียงกระซิบชื่อของตัวเองจากห้องเรียนที่ปิดตายมานานหลายปี..."
30+
},
31+
{
32+
title: "ตุ๊กตาผีในบ้านเช่า",
33+
description: "หลังจากย้ายเข้าบ้านเช่าใหม่ เด็กหญิงคนหนึ่งเริ่มพูดคุยกับตุ๊กตาตัวเก่าที่พบในห้องเก็บของ ก่อนจะเกิดเหตุการณ์ประหลาดขึ้นทุกคืน..."
34+
},
35+
{
36+
title: "เงาลึกลับริมถนนพหลโยธิน",
37+
description: "คืนหนึ่งขณะขับรถกลับบ้านบนถนนพหลโยธิน ฉันเห็นเงาดำสูงใหญ่ยืนอยู่ข้างทาง แม้จะขับผ่านไปแล้วแต่กระจกหลังก็ยังสะท้อนภาพเงานั้นที่เหมือนจะขยับเข้ามาใกล้ขึ้นเรื่อย ๆ... จนต้องเร่งเครื่องหนีโดยไม่กล้าหันกลับไปมองอีกเลย"
38+
},
39+
]
840
return (
941
<div className="main-container">
1042
<div className="main-content">
@@ -15,19 +47,26 @@ export default function Home() {
1547
</div>
1648
<div className="w-[80%] mx-auto">
1749
<div className="my-[80px]">
18-
<GhostNearMeSearchCard />
50+
<GhostNearMeSearchCard onSearch={handleSearch} />
1951
</div>
2052
<div>
2153
<div className="flex justify-between items-end mb-[40px]">
22-
<div className="text-[32px] font-bold text-white">เรื่องเล่าจากทางบ้าน</div>
54+
<div className={`text-[32px] font-bold ${searchQuery ? "text-red-500" : "text-white"}`}>
55+
56+
{searchQuery ? `${searchQuery}` : "เรื่องเล่าจากทางบ้าน"}
57+
{searchQuery && (<span className="text-white">ใกล้ฉัน</span>)}</div>
2358
<div className="text-[20px] text-white">ดูทั้งหมด</div>
2459
</div>
2560

2661
<div className="grid grid-cols-2 gap-[32px]">
27-
<GradientCard title="เรื่องเล่าจากทางบ้าน" description="เรื่องเล่าจากทางบ้าน" />
28-
<GradientCard title="เรื่องเล่าจากทางบ้าน" description="เรื่องเล่าจากทางบ้าน" />
29-
<GradientCard title="เรื่องเล่าจากทางบ้าน" description="เรื่องเล่าจากทางบ้าน" />
30-
<GradientCard title="เรื่องเล่าจากทางบ้าน" description="เรื่องเล่าจากทางบ้าน" />
62+
{mockData.filter((item) => {
63+
if (searchQuery === "บางเขน") {
64+
return item.title.toLowerCase().includes("พหลโยธิน")
65+
}
66+
return item.title.toLowerCase().includes(searchQuery.toLowerCase())
67+
}).map((item) => (
68+
<GradientCard title={item.title} description={item.description} key={item.title} />
69+
))}
3170
</div>
3271
</div>
3372
</div>

0 commit comments

Comments
 (0)