-
-
-
+ {/* Basic Info */}
+
+
-
-
{cafeData.Name}
-
-
-
-
- {cafeData.address || "آدرس موجود نیست"}
-
-
-
-
-
-
{cafeData.rating || 0}
+
+
+ {cafeData.address || "آدرس موجود نیست"}
-
درباره کافه
-
- {cafeData.description || "توضیحاتی برای این کافه وجود ندارد."}
-
-
-
-
- ویژگی ها
-
-
-
-
-

-
- منو کافه:
-
-
-
-
-

-
ساعت کاری:
-
23 - 8
-
-
-
-

-
رزرو :
-
رزرو آنلاین
-
-
-
-

-
موسیقی :
-
موسیقی زنده آخر هفته
-
-
-
-

-
پارکینگ :
-
عمومی
-
-
-
-

-
دسترسی آسان :
-
مناسب افراد ناتوان
-
-
-
-

-
+
+
+ {cafeData.rating || 0}
-
-
-
-
-
-

setIsEditMode(!isEditMode)}
- title={isEditMode ? "خروج از حالت ویرایش" : "ویرایش عنوانها"}
- />
-
عنوان
-
-
- {!isEditMode ? (
- <>
- {categories.map((category, index) => (
-
{category}
- ))}
- >
- ) : (
- <>
- {categories.map((category, index) => (
-
- {editingIndex === index ? (
- <>
-
-
-
-
-
setEditValue(e.target.value)}
- className="border-2 border-[#bb8f70] rounded-lg px-2 py-1 text-sm focus:outline-none focus:border-[#7f4629] w-[100px] text-center"
- autoFocus
- />
- >
- ) : (
- <>
-
- handleStartEdit(index)}
- title="ویرایش"
- />
- {category}
- handleDeleteCategory(index)}
- title="حذف"
- />
-
- >
- )}
-
- ))}
- >
- )}
-
-
-
- {isEditMode && (
-
- {!isAdding ? (
-
- ) : (
-
-
-
- {
- setIsAdding(false);
- setNewCategory("");
- }}
- title="لغو"
- />
-
-
setNewCategory(e.target.value)}
- placeholder="عنوان جدید"
- className="border-2 border-[#bb8f70] rounded-lg px-2 py-1 text-sm focus:outline-none focus:border-[#7f4629] w-[100px] text-center"
- autoFocus
- />
-
- )}
-
- )}
-
-
-
-
-
-

-
افزودن زیر عنوان
-
-
-
-

-

-
قهوه ها
-
-
-
-
-

-
آیتم
-
-
-
-
-
اسپرسو100%
-

-
- قیمت
- 118.000
-
-
- 45 میلی لیتر، قهوه، 100% عربیکا، دم شده با دستگاه اسپرسو ساز،
- به همراه یک عدد آب معدنی مینی
-
-
-
-
-
-
- کارامل ماکیاتو
-
-

-
- قیمت
- 149.000
-
-
- 220 میلی لیتر، 2 شات اسپرسو 30% روبوستا، 70% عربیکا، یک لکه
- فوم شیر، سیروپ کارامل
-
-
-
-
-
-
- اسپرسو آفوگاتو
-
-

-
- قیمت
- 118.000
-
-
- اسپرسو، یک اسکوپ بستنی وانیلی
-
-
-
-
+
درباره کافه
+
+ {cafeData.description || "توضیحاتی برای این کافه وجود ندارد."}
+
-
- >
- );
- }
+
+
+ {/* Features Section */}
+
+
ویژگی ها
+
+ {CAFE_FEATURES.map((feature, idx) => (
+
+

+
+ {feature.label}
+
+ {feature.value && (
+
{feature.value}
+ )}
+
+ ))}
+
+
+
+
+ {/* Categories Section */}
+
+
+
دستهبندیها
+
+
+
+
+ {categories.map((category, idx) => (
+
+ {isEditMode && editingIndex === idx ? (
+
+
+
+
+
+
setEditValue(e.target.value)}
+ className="border-2 border-[#bb8f70] rounded-lg px-2 py-1 text-xs md:text-sm focus:outline-none focus:border-[#7f4629] min-w-[100px]"
+ autoFocus
+ />
+
+ ) : (
+
+ {category}
+ {isEditMode && (
+ <>
+ handleEditCategory(idx)}
+ className="text-[#7f4629] cursor-pointer hover:text-[#5f494f] w-4 h-4 ml-1"
+ title="ویرایش"
+ />
+ handleDeleteCategory(idx)}
+ className="text-white bg-[#a79fa1] rounded cursor-pointer hover:bg-[#9a8f91] w-4 h-4"
+ title="حذف"
+ />
+ >
+ )}
+
+ )}
+
+ ))}
+
+ {isEditMode && !isAddingCategory && (
+
+ )}
+
+ {isEditMode && isAddingCategory && (
+
+
+
+ {
+ setIsAddingCategory(false);
+ setNewCategory("");
+ }}
+ className="text-red-600 cursor-pointer hover:text-red-800 w-5 h-5"
+ title="لغو"
+ />
+
+
setNewCategory(e.target.value)}
+ placeholder="دسته جدید"
+ className="border-2 border-[#bb8f70] rounded-lg px-2 py-1 text-xs md:text-sm focus:outline-none focus:border-[#7f4629] min-w-[100px]"
+ autoFocus
+ />
+
+ )}
+
+
+
+ {/* Products Section */}
+
+
محصولات
+
+ {CAFE_PRODUCTS.map((product, idx) => (
+
+
{product.name}
+

+
+ قیمت:
+ {product.price}
+
+
+ {product.description}
+
+
+ ))}
+
+
+
+
+ );
+}
diff --git a/src/pages/Dashboard/Dashboard.jsx b/src/pages/Dashboard/Dashboard.jsx
index 5be2154..96f017e 100644
--- a/src/pages/Dashboard/Dashboard.jsx
+++ b/src/pages/Dashboard/Dashboard.jsx
@@ -1,14 +1,15 @@
-import {useProfile} from "../../hooks/useProfile";
+import React from "react";
+import { useProfile } from "../../hooks/useProfile";
-const Dashboard = () => {
+export default function Dashboard() {
useProfile();
-
return (
-
- صفحه داشبورد
-
+
+ صفحه داشبورد
+
+
محتوای داشبورد بهزودی اضافه خواهد شد
+
+
);
-};
-
-export default Dashboard;
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/pages/Login/Login.jsx b/src/pages/Login/Login.jsx
index cba36af..903bbb3 100644
--- a/src/pages/Login/Login.jsx
+++ b/src/pages/Login/Login.jsx
@@ -1,202 +1,179 @@
-import React, { useState } from 'react';
-import Loginpic from '../../assets/image/loginpic.jpg';
-import { FiLock } from 'react-icons/fi';
+import React, { useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { useDispatch } from "react-redux";
+import { FiLock } from "react-icons/fi";
import { FaRegUser } from "react-icons/fa6";
+
+// Assets
+import Loginpic from "../../assets/image/loginpic.jpg";
import LogoDM from "../../assets/icons/LogoDM.svg";
-import { useNavigate, Navigate } from 'react-router-dom';
-import authService from '../../services/auth';
-import { useDispatch } from 'react-redux';
-import { setToken } from '../../redux/slices/authSlice';
-import { setProfile } from '../../redux/slices/profileSlice';
+// Redux
+import { setToken } from "../../redux/slices/authSlice";
+import { setProfile } from "../../redux/slices/profileSlice";
-const Login = () => {
- const [userName, setUserName] = useState('');
- const [password, setPassword] = useState('');
- const [loading, setLoading] = useState(false);
- const [error, setError] = useState('');
+// Services
+import authService from "../../services/auth";
+
+export default function Login() {
const navigate = useNavigate();
const dispatch = useDispatch();
+ // State Management
+ const [userName, setUserName] = useState("");
+ const [password, setPassword] = useState("");
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState("");
+ // Handle Login
const handleLogin = async (e) => {
e.preventDefault();
- setError('');
+ setError("");
setLoading(true);
- const loginData = {
- userName: userName,
- password: password
- };
-
try {
- const res = await authService.login(loginData);
- if (res.data.success && res.data.data && res.data.data.tokens.accessToken) {
+ const res = await authService.login({ userName, password });
+ if (res.data.success && res.data.data?.tokens?.accessToken) {
dispatch(setToken(res.data.data.tokens.accessToken));
- navigate('/dashboard');
dispatch(setProfile(res.data.data.admin));
- console.log('login:', res.data.data.admin);
+ console.log("✅ Login successful:", res.data.data.admin);
+ navigate("/dashboard");
+ } else {
+ setError("اطلاعات دریافتی معتبر نیست");
}
-
- console.log('Response:', res);
} catch (error) {
- setLoading(false);
- console.error('❌ Login error:', error);
- // if (error.response) {
- // setError(error.response.data.message || error.response.data.en_message || 'نام کاربری یا رمز عبور اشتباه است');
- // } else if (error.request) {
- // setError('خطا در برقراری ارتباط با سرور');
- // } else {
- // console.error('Error setting up request');
- // setError('خطای نامشخص رخ داده است');
- // }
+ console.error("❌ Login error:", error);
+ const errorMessage =
+ error.response?.data?.message ||
+ (error.request ? "خطا در برقراری ارتباط با سرور" : "خطای نامشخص رخ داده است");
+ setError(errorMessage);
} finally {
setLoading(false);
}
-
};
return (
-
-
-
+
+
-
-
-
-
+ {/* Main Content */}
+
+ {/* Left Side - Login Form */}
+
+
+ {/* Breadcrumb */}
+
ورود
- >
+ >
خانه
+ {/* Header */}
-
- ورود ادمین
-
-
- دسترسی ویژه برای مدیریت و گزارشها
-
+
ورود ادمین
+
دسترسی ویژه برای مدیریت و گزارشها
+ {/* Login Form */}
-
-

+ {/* Right Side - Image (Hidden on Mobile) */}
+
+
);
-};
-
-
-
-export default Login;
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/pages/Stats/Stats.jsx b/src/pages/Stats/Stats.jsx
index 4d3980d..c118e08 100644
--- a/src/pages/Stats/Stats.jsx
+++ b/src/pages/Stats/Stats.jsx
@@ -1,9 +1,12 @@
-const Stats = () => {
- return (
-
- صفحه آمار و تحلیل
-
- );
-};
+import React from "react";
-export default Stats;
\ No newline at end of file
+export default function Stats() {
+ return (
+
+ آمار و تحلیل
+
+
محتوای آمار و تحلیل بهزودی اضافه خواهد شد
+
+
+ );
+}
\ No newline at end of file