+
: {props.label}
}
diff --git a/src/index.css b/src/index.css
index 25c8051..9c8543c 100644
--- a/src/index.css
+++ b/src/index.css
@@ -519,3 +519,8 @@ strong {
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(7416%)
hue-rotate(296deg) brightness(109%) contrast(97%);
}
+
+.filterBlue {
+ filter: brightness(0) saturate(100%) invert(9%) sepia(100%) saturate(7246%)
+ hue-rotate(236deg) brightness(111%) contrast(112%);
+}
diff --git a/src/pages/guide/ReportBug.tsx b/src/pages/guide/ReportBug.tsx
new file mode 100644
index 0000000..ebfa583
--- /dev/null
+++ b/src/pages/guide/ReportBug.tsx
@@ -0,0 +1,128 @@
+import React, { useMemo, useState } from 'react'
+import DefaulModal from '@/components/DefaulModal'
+import Textarea from '@/components/Textarea'
+import Button from '@/components/Button'
+import { useSharedStore } from '@/shared/store/sharedStore'
+import { useSendFeedback } from './hooks/useFeedbackData'
+import { toast } from '@/components/Toast'
+import { ErrorType } from '@/helpers/types'
+import { useTheme } from '@/contexts/ThemeContext'
+
+
+// Import images
+import sad1 from '@/assets/images/sad1.png'
+import sad2 from '@/assets/images/sad2.png'
+import sad3 from '@/assets/images/sad3.png'
+import smile from '@/assets/images/smile.png'
+import smile2 from '@/assets/images/smile2.png'
+import smile3 from '@/assets/images/smile3.png'
+import { useGetProfile } from '../profile/hooks/useProfileData'
+
+const ReportBug: React.FC = () => {
+ const { openReportBug, setOpenReportBug } = useSharedStore()
+ const [description, setDescription] = useState('')
+ const [feeling, setFeeling] = useState
(null)
+ const { data } = useGetProfile()
+ const { mutate: sendReportBug, isPending } = useSendFeedback()
+ const { theme } = useTheme()
+
+ const isValid = useMemo(() => description.trim().length > 0, [description])
+
+ const getRatingFromFeeling = (feeling: string | null): number => {
+ if (!feeling) return 0
+
+ const feelingMap: Record = {
+ 'angry': 1, // sad1
+ 'crying': 2, // sad2
+ 'sad': 3, // sad3
+ 'neutral': 4, // smile
+ 'smile': 5, // smile2
+ 'love': 6, // smile3
+ }
+
+ return feelingMap[feeling] || 0
+ }
+
+ const handleSubmit = async () => {
+ if (!isValid) return
+
+ sendReportBug({
+ content: description,
+ rating: getRatingFromFeeling(feeling),
+ serviceId: import.meta.env.VITE_SERVICE_ID,
+ email: data?.data?.user?.emailAddress,
+ }, {
+ onSuccess: () => {
+ toast('گزارش با موفقیت ارسال شد', 'success')
+ setDescription('')
+ setFeeling(null)
+ setOpenReportBug(false)
+ },
+ onError: (error: ErrorType) => {
+ toast(error.response?.data?.error?.message[0], 'error')
+ }
+ })
+ }
+
+ const feelings = [
+ { id: 'angry', image: sad1, alt: 'ناراضی' },
+ { id: 'crying', image: sad2, alt: 'ناراضی' },
+ { id: 'sad', image: sad3, alt: 'ناراضی' },
+ { id: 'neutral', image: smile, alt: 'خنثی' },
+ { id: 'smile', image: smile2, alt: 'راضی' },
+ { id: 'love', image: smile3, alt: 'راضی' },
+ ]
+
+ return (
+ setOpenReportBug(false)} isHeader title_header='گزارش اشکالات' width={500}>
+
+
+ لطفاً در صورت مشاهده هرگونه اشکال یا باگ در سایت، از طریق این فرم گزارش دهید. همچنین میتوانید بازخورد، نظر یا پیشنهادات خود را درباره سایت با ما به اشتراک بگذارید. اطلاعات دقیق شما به ما کمک میکند مشکلات را سریعتر برطرف کنیم و کیفیت سایت را بهبود بخشیم.
+
+
+
+
+ )
+}
+
+export default ReportBug
\ No newline at end of file
diff --git a/src/pages/guide/hooks/useFeedbackData.ts b/src/pages/guide/hooks/useFeedbackData.ts
new file mode 100644
index 0000000..ed71634
--- /dev/null
+++ b/src/pages/guide/hooks/useFeedbackData.ts
@@ -0,0 +1,9 @@
+import { useMutation } from "@tanstack/react-query";
+import { sendFeedback } from "../service/Service";
+import { FeedbackType } from "../types/Types";
+
+export const useSendFeedback = () => {
+ return useMutation({
+ mutationFn: (params: FeedbackType) => sendFeedback(params),
+ });
+};
diff --git a/src/pages/guide/service/Service.ts b/src/pages/guide/service/Service.ts
new file mode 100644
index 0000000..7be15cf
--- /dev/null
+++ b/src/pages/guide/service/Service.ts
@@ -0,0 +1,7 @@
+import axios from "@/config/axiosDanak";
+import { FeedbackType } from "../types/Types";
+
+export const sendFeedback = async (params: FeedbackType) => {
+ const { data } = await axios.post("/danak-services/feedback", params);
+ return data;
+};
diff --git a/src/pages/guide/types/Types.ts b/src/pages/guide/types/Types.ts
new file mode 100644
index 0000000..b25f79b
--- /dev/null
+++ b/src/pages/guide/types/Types.ts
@@ -0,0 +1,7 @@
+export type FeedbackType = {
+ content: string;
+ rating: number;
+ serviceId: string;
+ phone?: string;
+ email?: string;
+};
diff --git a/src/shared/Header.tsx b/src/shared/Header.tsx
index 16a58b8..4b46077 100644
--- a/src/shared/Header.tsx
+++ b/src/shared/Header.tsx
@@ -1,6 +1,6 @@
import { FC, useEffect, useState } from 'react'
import Input from '../components/Input'
-import { ArrowDown2, CloseCircle, HambergerMenu, Logout, ProfileCircle, SearchNormal, Setting2 } from 'iconsax-react'
+import { ArrowDown2, CloseCircle, HambergerMenu, Logout, MessageQuestion, ProfileCircle, SearchNormal, Setting2 } from 'iconsax-react'
import { useTranslation } from 'react-i18next'
import Notifications from '../pages/notification/Notification'
import { useSharedStore } from './store/sharedStore'
@@ -13,6 +13,7 @@ import { useGetProfile } from '@/pages/profile/hooks/useProfileData'
import { useGetInbox } from '@/pages/received/hooks/useEmailData'
import ThemeToggle from '@/components/ThemeToggle'
import { getIconColor } from '@/utils/colorUtils'
+import RowActionsDropdown from '@/components/RowActionsDropdown'
const Header: FC = () => {
@@ -30,7 +31,7 @@ const Header: FC = () => {
})
const { t } = useTranslation('global')
- const { setOpenSidebar, openSidebar } = useSharedStore()
+ const { setOpenSidebar, openSidebar, setOpenReportBug } = useSharedStore()
const handleSearchChange = (value: string) => {
setSearch(value)
@@ -269,9 +270,23 @@ const Header: FC = () => {
)}
-