2024-12-10 13:51:14 +00:00
|
|
|
"use client";
|
|
|
|
|
|
2024-12-17 14:27:48 +00:00
|
|
|
import { Reveal } from "@/components/landing-page/Reveal";
|
2024-12-20 15:52:53 +00:00
|
|
|
import { error, loading, successCallback } from "@/config/swal";
|
2024-12-19 15:20:03 +00:00
|
|
|
import { getFeedback, postUserFeedback } from "@/service/landing/landing";
|
|
|
|
|
import React, { useEffect, useState } from "react";
|
2025-02-15 14:43:19 +00:00
|
|
|
import { useTranslations } from "next-intl";
|
2024-12-10 13:51:14 +00:00
|
|
|
|
|
|
|
|
interface RatingProps {
|
|
|
|
|
label: string;
|
|
|
|
|
onRate: (rating: number) => void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const Rating: React.FC<RatingProps> = ({ label, onRate }) => {
|
|
|
|
|
const [selected, setSelected] = useState<number>(0);
|
|
|
|
|
|
|
|
|
|
const handleClick = (rating: number) => {
|
|
|
|
|
setSelected(rating);
|
|
|
|
|
onRate(rating);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div className="flex justify-between items-center mb-4">
|
2025-02-18 06:02:40 +00:00
|
|
|
<span className="text-gray-800 dark:text-white">{label}</span>
|
2024-12-10 13:51:14 +00:00
|
|
|
<div className="flex space-x-1">
|
|
|
|
|
{[1, 2, 3, 4, 5].map((star) => (
|
|
|
|
|
<button key={star} onClick={() => handleClick(star)} className={`text-2xl ${star <= selected ? "text-yellow-500" : "text-gray-300"}`}>
|
|
|
|
|
★
|
|
|
|
|
</button>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const FeedbackForm: React.FC = () => {
|
2024-12-20 15:52:53 +00:00
|
|
|
const [ratings, setRatings] = useState({
|
|
|
|
|
accessibility: 0,
|
|
|
|
|
appearance: 0,
|
|
|
|
|
content: 0,
|
|
|
|
|
});
|
|
|
|
|
|
2024-12-19 15:20:03 +00:00
|
|
|
useEffect(() => {
|
|
|
|
|
async function initState() {
|
|
|
|
|
const response = await getFeedback();
|
|
|
|
|
console.log(response?.data?.data);
|
|
|
|
|
setRatings(response?.data?.data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
initState();
|
|
|
|
|
}, []);
|
2024-12-10 13:51:14 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
type Feedback = {
|
|
|
|
|
feedbackId: any;
|
|
|
|
|
score: any;
|
2024-12-10 13:51:14 +00:00
|
|
|
};
|
2025-01-31 12:51:04 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
const [userFeedbacks, setUserFeedbacks] = useState<Feedback[]>([]);
|
|
|
|
|
const [hasMounted, setHasMounted] = useState(false);
|
2025-02-15 14:43:19 +00:00
|
|
|
const t = useTranslations("LandingPage");
|
2024-12-10 13:51:14 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
const handleRatingChange = (id: any, score: any) => {
|
|
|
|
|
const listData = [...userFeedbacks];
|
|
|
|
|
const dataIdx = userFeedbacks.findIndex((o) => o.feedbackId === id);
|
|
|
|
|
|
|
|
|
|
console.log("idx :", dataIdx);
|
|
|
|
|
console.log("Before :", listData);
|
2025-01-31 12:51:04 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
if (dataIdx !== -1) {
|
|
|
|
|
console.log("update");
|
|
|
|
|
listData[dataIdx].score = score;
|
|
|
|
|
} else {
|
|
|
|
|
const data = {
|
|
|
|
|
feedbackId: id,
|
|
|
|
|
score,
|
|
|
|
|
};
|
2025-01-31 12:51:04 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
listData.push(data);
|
|
|
|
|
}
|
2025-01-31 12:51:04 +00:00
|
|
|
|
2024-12-20 15:52:53 +00:00
|
|
|
setUserFeedbacks(listData);
|
|
|
|
|
console.log("After :", userFeedbacks);
|
|
|
|
|
};
|
2024-12-19 15:20:03 +00:00
|
|
|
const handleSubmit = async () => {
|
2024-12-20 15:52:53 +00:00
|
|
|
loading();
|
|
|
|
|
console.log("Save Feedback :", userFeedbacks);
|
2024-12-19 15:20:03 +00:00
|
|
|
const response = await postUserFeedback();
|
2024-12-20 15:52:53 +00:00
|
|
|
close();
|
2025-01-01 17:48:57 +00:00
|
|
|
if (response?.error) {
|
|
|
|
|
error(response?.message);
|
2024-12-20 15:52:53 +00:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
successCallback("Terima kasih, feedback Anda telah terkirim");
|
2024-12-10 13:51:14 +00:00
|
|
|
};
|
2024-12-20 15:52:53 +00:00
|
|
|
async function onSubmit() {
|
|
|
|
|
// loading();
|
|
|
|
|
// let finalData = {
|
|
|
|
|
// name: data.name,
|
|
|
|
|
// email: data.email,
|
|
|
|
|
// title : data.title,
|
|
|
|
|
// message: data.title
|
|
|
|
|
// }
|
|
|
|
|
// console.log(finalData);
|
|
|
|
|
// const response = await sendMessage(finalData);
|
|
|
|
|
// close();
|
|
|
|
|
// successCallback();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Hooks
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
setHasMounted(true);
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
// Render
|
|
|
|
|
if (!hasMounted) return null;
|
2024-12-10 13:51:14 +00:00
|
|
|
|
|
|
|
|
return (
|
2024-12-17 14:27:48 +00:00
|
|
|
<Reveal>
|
2025-02-18 06:02:40 +00:00
|
|
|
<div className="max-w-6xl flex flex-col mx-auto p-4 lg:p-40 gap-5 ">
|
2024-12-17 14:27:48 +00:00
|
|
|
<div className="flex items-center justify-center mb-6">
|
|
|
|
|
<img src="/assets/icons-feedback.png" alt="Feedback" />
|
2025-02-18 06:02:40 +00:00
|
|
|
<h2 className="ml-4 text-[15px] lg:text-[32px] font-bold text-gray-800 dark:text-white">{t("userFeedback")}</h2>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="text-black dark:text-white">
|
|
|
|
|
<Rating label={t("ratings")} onRate={(rating) => handleRatingChange("accessibility", rating)} />
|
|
|
|
|
<Rating label={t("ratings2")} onRate={(rating) => handleRatingChange("appearance", rating)} />
|
|
|
|
|
<Rating label={t("ratings3")} onRate={(rating) => handleRatingChange("content", rating)} />
|
2024-12-17 14:27:48 +00:00
|
|
|
</div>
|
|
|
|
|
<div className="flex justify-center">
|
2025-01-31 12:51:04 +00:00
|
|
|
<button onClick={handleSubmit} className="w-fit lg:w-32 bg-[#2F80ED] text-white py-2 px-4 gap-4 rounded-md hover:bg-blue-600 transition text-sm lg:text-base">
|
2025-02-15 14:43:19 +00:00
|
|
|
{t("send")}
|
2024-12-17 14:27:48 +00:00
|
|
|
</button>
|
|
|
|
|
</div>
|
2024-12-10 13:51:14 +00:00
|
|
|
</div>
|
2024-12-17 14:27:48 +00:00
|
|
|
</Reveal>
|
2024-12-10 13:51:14 +00:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default FeedbackForm;
|