180 lines
4.3 KiB
TypeScript
180 lines
4.3 KiB
TypeScript
"use client";
|
|
import React, { Component, useEffect, useState } from "react";
|
|
import ReactApexChart from "react-apexcharts";
|
|
import dummyData from "../../../../const/dummy.json";
|
|
import {
|
|
getStatisticMonthly,
|
|
getStatisticMonthlyFeedback,
|
|
} from "@/services/article";
|
|
|
|
type WeekData = {
|
|
week: number;
|
|
days: number[];
|
|
total: number;
|
|
};
|
|
|
|
type RemainingDays = {
|
|
days: number[];
|
|
total: number;
|
|
};
|
|
|
|
function processMonthlyData(count: number[]): {
|
|
weeks: WeekData[];
|
|
remaining_days: RemainingDays;
|
|
} {
|
|
const weeks: WeekData[] = [];
|
|
let weekIndex = 1;
|
|
|
|
for (let i = 0; i < count.length; i += 7) {
|
|
const weekData = count.slice(i, i + 7);
|
|
weeks.push({
|
|
week: weekIndex,
|
|
days: weekData,
|
|
total: weekData.reduce((sum, day) => sum + day, 0),
|
|
});
|
|
weekIndex++;
|
|
}
|
|
|
|
const remainingDays: RemainingDays = {
|
|
days: count.length % 7 === 0 ? [] : count.slice(-count.length % 7),
|
|
total: count.slice(-count.length % 7).reduce((sum, day) => sum + day, 0),
|
|
};
|
|
|
|
return {
|
|
weeks,
|
|
remaining_days: remainingDays,
|
|
};
|
|
}
|
|
|
|
const SuggestionsChart = (props: {
|
|
type: string;
|
|
date: string;
|
|
totals: (data: number) => void;
|
|
}) => {
|
|
const { date, type, totals } = props;
|
|
const [categories, setCategories] = useState<string[]>([]);
|
|
const [seriesSuggestions, setSeriesSuggestions] = useState<number[]>([]);
|
|
|
|
useEffect(() => {
|
|
initFetch();
|
|
}, [date, type]);
|
|
|
|
function processYearlyData(data: any) {
|
|
const months = [
|
|
"Januari",
|
|
"Februari",
|
|
"Maret",
|
|
"April",
|
|
"Mei",
|
|
"Juni",
|
|
"Juli",
|
|
"Agustus",
|
|
"September",
|
|
"Oktober",
|
|
"November",
|
|
"Desember",
|
|
];
|
|
const category = [];
|
|
const temp = [];
|
|
let totalData = 0;
|
|
for (let i = 0; i < data.length; i++) {
|
|
const total = data[i].suggestions.reduce(
|
|
(sum: number, list: number) => sum + list,
|
|
0
|
|
);
|
|
temp.push(total);
|
|
totalData += total;
|
|
category.push(months[data[i].month - 1]);
|
|
}
|
|
return { categories: category, series: temp, total: totalData };
|
|
}
|
|
|
|
const initFetch = async () => {
|
|
const splitDate = date.split(" ");
|
|
const res = await getStatisticMonthlyFeedback(splitDate[1]);
|
|
const data = res?.data?.data;
|
|
// const data = dummyData.data;
|
|
if (type === "monthly") {
|
|
const getDatas = data?.filter(
|
|
(a: any) => a.year === Number(splitDate[1])
|
|
);
|
|
console.log("teemp,tota", getDatas);
|
|
|
|
if (getDatas) {
|
|
const temp = processYearlyData(getDatas);
|
|
setSeriesSuggestions(temp.series);
|
|
setCategories(temp.categories);
|
|
totals(temp.total);
|
|
} else {
|
|
setSeriesSuggestions([]);
|
|
totals(0);
|
|
}
|
|
} else {
|
|
const getDatas = data?.find(
|
|
(a: any) =>
|
|
a.month == Number(splitDate[0]) && a.year === Number(splitDate[1])
|
|
);
|
|
if (getDatas) {
|
|
const temp = processMonthlyData(getDatas?.suggestions);
|
|
const sum = getDatas.suggestions.reduce(
|
|
(acc: any, curr: any) => acc + curr,
|
|
0
|
|
);
|
|
totals(sum);
|
|
if (type == "weekly") {
|
|
setSeriesSuggestions(
|
|
temp.weeks.map((list) => {
|
|
return list.total;
|
|
})
|
|
);
|
|
const category = [];
|
|
for (let i = 1; i <= temp.weeks.length; i++) {
|
|
category.push(`Minggu ke-${i}`);
|
|
}
|
|
setCategories(category);
|
|
} else {
|
|
setSeriesSuggestions(getDatas.suggestions);
|
|
}
|
|
} else {
|
|
setSeriesSuggestions([]);
|
|
totals(0);
|
|
}
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div className="h-full">
|
|
<div id="chart" className="h-full">
|
|
<ReactApexChart
|
|
options={{
|
|
chart: {
|
|
height: "100%",
|
|
type: "area",
|
|
},
|
|
stroke: {
|
|
curve: "smooth",
|
|
},
|
|
dataLabels: {
|
|
enabled: false,
|
|
},
|
|
xaxis: {
|
|
categories: type == "daily" ? [] : categories,
|
|
},
|
|
}}
|
|
series={[
|
|
{
|
|
name: "Kritik & Saran",
|
|
data: seriesSuggestions,
|
|
},
|
|
]}
|
|
type="area"
|
|
height="100%"
|
|
/>
|
|
</div>
|
|
<div id="html-dist"></div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default SuggestionsChart;
|