File "TotalWatchGraph.js"
Full Path: /home/tekvhqgl/public_html/dev2024_old_skip/wp-content/plugins/presto-player/src/admin/analytics/components/TotalWatchGraph.js
File size: 2.87 KB
MIME-type: text/x-java
Charset: utf-8
const { __, sprintf } = wp.i18n;
const { Card, CardBody } = wp.components;
const { useState, useEffect, useRef } = wp.element;
import Loading from "@/admin/settings/components/Loading";
import apiFetch from "@/shared/services/fetch";
import Chart from "react-apexcharts";
import { convertDateTimeToAbsoluteDate, humanSeconds } from "../util";
export default (props) => {
const [loading, setLoading] = useState(true);
const [averageTime, setAverageTime] = useState(0);
const { startDate, endDate } = props;
const [series, setSeries] = useState([
{
name: "Views",
data: [],
},
]);
const chart = {
options: {
chart: {
toolbar: {
show: false,
},
},
yaxis: {
labels: {
formatter: function (num) {
return Math.abs(num) > 999
? Math.sign(num) * (Math.abs(num) / 1000).toFixed(1) + "k min"
: (Math.sign(num) * Math.abs(num)).toFixed(1) + "min";
},
},
},
colors: ["#7c3aed"],
xaxis: {
type: "datetime",
min: new Date(startDate).setHours(0, 0, 0, 0),
max: new Date(endDate).setHours(23, 59, 59, 999),
},
dataLabels: {
enabled: false,
},
stroke: { curve: "smooth" },
fill: {
type: "gradient",
gradient: {
shadeIntensity: 1,
opacityFrom: 0.7,
opacityTo: 0.9,
stops: [0, 90, 100],
},
},
},
};
// fetch only if we already mounted
useEffect(() => {
fetchMinutes();
}, [props]);
const fetchMinutes = () => {
setLoading(true);
apiFetch({
path:
"/presto-player/v1/analytics/watch-time?" +
jQuery.param({
start: convertDateTimeToAbsoluteDate(startDate),
end: convertDateTimeToAbsoluteDate(endDate),
}),
parse: false,
})
.then(async (res) => {
const { data, average } = await res.json();
setAverageTime(parseFloat(average));
let series = [];
if (data.length) {
data.forEach((item) => {
series.push({
x: item.date_time,
y: (item.total / 60).toFixed(2),
});
});
}
setSeries([
{
name: "Watch Time",
data: series,
},
]);
})
.catch((e) => {
console.error(e);
})
.finally(() => {
setLoading(false);
});
};
if (loading) {
return (
<CardBody>
<Loading />
</CardBody>
);
}
return (
<CardBody className="presto-flow">
<div className="presto-card__title">
{sprintf(
__("%s average watch time", "presto-player"),
humanSeconds(averageTime)
)}
</div>
<Chart options={chart.options} series={series} type="area" height={280} />
</CardBody>
);
};