File "VideoTimeline.js"

Full Path: /home/tekvhqgl/public_html/dev2024_old_skip/wp-content/plugins/presto-player/src/admin/analytics/components/VideoTimeline.js
File size: 2.59 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, timestamp } from "../util";

export default (props) => {
  const { video_id, startDate, endDate } = props;
  const [loading, setLoading] = useState(true);

  const [series, setSeries] = useState([
    {
      name: "Views",
      data: [],
    },
  ]);

  const fetchTimeline = () => {
    setLoading(true);
    apiFetch({
      path: wp.url.addQueryArgs(
        `/presto-player/v1/analytics/video/${video_id}/timeline`,
        {
          start: convertDateTimeToAbsoluteDate(startDate),
          end: convertDateTimeToAbsoluteDate(endDate),
        }
      ),
    })
      .then((data) => {
        let series = [];
        if (data.length) {
          data.forEach((item) => {
            // add another to them
            series.push({
              x: item.watch_time,
              y: item.total,
            });
          });
        }
        setSeries([
          {
            name: "Viewers",
            data: series,
          },
        ]);
      })
      .catch((e) => {
        console.error(e);
      })
      .finally(() => {
        setLoading(false);
      });
  };

  useEffect(() => {
    fetchTimeline();
  }, [startDate, endDate]);

  const chart = {
    options: {
      chart: {
        toolbar: {
          show: false,
        },
      },
      tickAmount: 1,
      yaxis: {
        labels: {
          formatter: function (num) {
            return parseInt(num);
          },
        },
      },
      xaxis: {
        labels: {
          formatter: function (num) {
            return timestamp(num);
          },
        },
      },
      colors: ["#7c3aed"],
      dataLabels: {
        enabled: false,
      },
      stroke: { curve: "smooth" },
      fill: {
        type: "gradient",
        gradient: {
          shadeIntensity: 1,
          opacityFrom: 0.7,
          opacityTo: 0.9,
          stops: [0, 90, 100],
        },
      },
    },
  };

  if (loading) {
    return (
      <Card>
        <CardBody>
          <Loading />
        </CardBody>
      </Card>
    );
  }

  return (
    <Card>
      <CardBody>
        <div className="presto-card__title">
          {__("Audience Retention", "presto-player")}
        </div>
        <Chart
          options={chart.options}
          series={series}
          type="area"
          height={280}
        />
      </CardBody>
    </Card>
  );
};