diff --git a/src/app/[locale]/dashboard/requests/page.tsx b/src/app/[locale]/dashboard/requests/page.tsx
new file mode 100644
index 0000000..cce916b
--- /dev/null
+++ b/src/app/[locale]/dashboard/requests/page.tsx
@@ -0,0 +1,161 @@
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
+import { ListOrdered, Check, X } from "lucide-react";
+import Link from "next/link";
+import { Button } from "@/components/ui/button";
+import Image from "next/image";
+import type { Toy } from "@/types";
+import { mockToys } from "@/lib/mockData";
+import { Badge } from "@/components/ui/badge";
+import { getI18n } from "@/locales/server";
+
+interface RentalRequest {
+ id: string;
+ toy: Toy;
+ requesterName: string;
+ requesterId: string;
+ requestedDates: string; // e.g., "Aug 5, 2024 - Aug 10, 2024"
+ status: 'pending' | 'approved' | 'declined';
+ message?: string;
+ dataAiHint?: string;
+}
+
+const rentalRequests: RentalRequest[] = [
+ {
+ id: 'req1',
+ toy: mockToys[0],
+ requesterName: 'Charlie Brown',
+ requesterId: 'user4',
+ requestedDates: 'August 10, 2024 - August 17, 2024',
+ status: 'pending',
+ message: 'My son would love to play with these for his birthday week!',
+ dataAiHint: mockToys[0]?.category.toLowerCase(),
+ },
+ {
+ id: 'req2',
+ toy: mockToys[3],
+ requesterName: 'Diana Prince',
+ requesterId: 'user5',
+ requestedDates: 'September 1, 2024 - September 5, 2024',
+ status: 'approved',
+ dataAiHint: mockToys[3]?.category.toLowerCase(),
+ },
+ {
+ id: 'req3',
+ toy: mockToys[0],
+ requesterName: 'Edward Nigma',
+ requesterId: 'user6',
+ requestedDates: 'July 20, 2024 - July 22, 2024',
+ status: 'declined',
+ message: 'Looking for a weekend rental.',
+ dataAiHint: mockToys[0]?.category.toLowerCase(),
+ },
+];
+
+const currentUserToyRequests = rentalRequests.filter(req => req.toy.ownerId === 'user1');
+
+
+export default async function RentalRequestsPage() {
+ const t = await getI18n();
+
+ return (
+
+
+
{t('dashboard.requests.title')}
+
{t('dashboard.requests.description')}
+
+
+ {currentUserToyRequests.length === 0 ? (
+
+
+
+ {t('dashboard.requests.no_requests_title')}
+ {t('dashboard.requests.no_requests_description')}
+
+
+ {t('dashboard.requests.no_requests_content')}
+
+
+ ) : (
+
+ {currentUserToyRequests.map(request => (
+
+ ))}
+
+ )}
+
+ );
+}
+
+interface RequestItemCardProps {
+ request: RentalRequest;
+ t: (key: string) => string;
+}
+
+function RequestItemCard({ request, t }: RequestItemCardProps) {
+ const placeholderHint = request.dataAiHint || request.toy.category.toLowerCase() || "toy";
+
+ const getStatusBadgeVariant = (status: RentalRequest['status']) => {
+ if (status === 'approved') return 'default';
+ if (status === 'declined') return 'destructive';
+ return 'secondary';
+ };
+
+ const getStatusText = (status: RentalRequest['status']) => {
+ if (status === 'approved') return t('dashboard.requests.status_approved');
+ if (status === 'declined') return t('dashboard.requests.status_declined');
+ return t('dashboard.requests.status_pending');
+ }
+
+ return (
+
+
+
+
+
+
+
+ {request.toy.name}
+ {getStatusText(request.status)}
+
+
+ {t('dashboard.requests.requested_by')}: {request.requesterName}
+
+
+ {t('dashboard.requests.dates')}: {request.requestedDates}
+
+ {request.message && (
+
+ {t('dashboard.requests.message')}: "{request.message}"
+
+ )}
+
+ {request.status === 'pending' && (
+
+
+
+
+
+ )}
+ {request.status !== 'pending' && (
+
+
+
+
+
+ )}
+
+
+
+ );
+}
diff --git a/src/locales/en.ts b/src/locales/en.ts
index 04e8f1a..ae45a1d 100644
--- a/src/locales/en.ts
+++ b/src/locales/en.ts
@@ -129,4 +129,19 @@ export default {
'dashboard.rentals.rental_ends': 'Rental ends: {date}',
'dashboard.rentals.view_toy_details_button': 'View Toy Details',
'dashboard.rentals.contact_owner_button': 'Contact Owner',
+ 'dashboard.requests.title': 'Rental Requests',
+ 'dashboard.requests.description': 'Manage incoming rental requests for your toys.',
+ 'dashboard.requests.no_requests_title': 'No Rental Requests',
+ 'dashboard.requests.no_requests_description': 'You currently have no pending rental requests for your toys.',
+ 'dashboard.requests.no_requests_content': 'When someone requests to rent one of your toys, it will appear here.',
+ 'dashboard.requests.requested_by': 'Requested by',
+ 'dashboard.requests.dates': 'Dates',
+ 'dashboard.requests.message': 'Message',
+ 'dashboard.requests.approve_button': 'Approve',
+ 'dashboard.requests.decline_button': 'Decline',
+ 'dashboard.requests.message_requester_button': 'Message Requester',
+ 'dashboard.requests.view_toy_listing_button': 'View Toy Listing',
+ 'dashboard.requests.status_pending': 'Pending',
+ 'dashboard.requests.status_approved': 'Approved',
+ 'dashboard.requests.status_declined': 'Declined',
} as const;
diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts
index f0d4930..ae9bb91 100644
--- a/src/locales/zh-TW.ts
+++ b/src/locales/zh-TW.ts
@@ -129,4 +129,19 @@ export default {
'dashboard.rentals.rental_ends': '租借結束於:{date}',
'dashboard.rentals.view_toy_details_button': '查看玩具詳情',
'dashboard.rentals.contact_owner_button': '聯絡擁有者',
+ 'dashboard.requests.title': '租借請求',
+ 'dashboard.requests.description': '管理您玩具的租借請求。',
+ 'dashboard.requests.no_requests_title': '沒有租借請求',
+ 'dashboard.requests.no_requests_description': '您目前沒有任何待處理的玩具租借請求。',
+ 'dashboard.requests.no_requests_content': '當有人請求租借您的玩具時,請求將會出現在這裡。',
+ 'dashboard.requests.requested_by': '請求者',
+ 'dashboard.requests.dates': '日期',
+ 'dashboard.requests.message': '訊息',
+ 'dashboard.requests.approve_button': '批准',
+ 'dashboard.requests.decline_button': '拒絕',
+ 'dashboard.requests.message_requester_button': '傳訊息給請求者',
+ 'dashboard.requests.view_toy_listing_button': '查看玩具列表',
+ 'dashboard.requests.status_pending': '待處理',
+ 'dashboard.requests.status_approved': '已批准',
+ 'dashboard.requests.status_declined': '已拒絕',
} as const;