83 lines
2.1 KiB
TypeScript
83 lines
2.1 KiB
TypeScript
|
'use client';
|
||
|
|
||
|
import FullCalendar from "@fullcalendar/react";
|
||
|
import interactionPlugin, { DateClickArg } from '@fullcalendar/interaction';
|
||
|
import dayGridPlugin from '@fullcalendar/daygrid';
|
||
|
import multiMonthPlugin from '@fullcalendar/multimonth'
|
||
|
|
||
|
import { IStream } from "@/lib/streams";
|
||
|
import { useRouter } from 'next/navigation';
|
||
|
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
|
||
|
|
||
|
|
||
|
|
||
|
interface IStreamsCalendarProps {
|
||
|
missingStreams: IStream[];
|
||
|
issueStreams: IStream[];
|
||
|
goodStreams: IStream[];
|
||
|
}
|
||
|
|
||
|
interface IEvent {
|
||
|
cuid: string;
|
||
|
start: Date;
|
||
|
end?: Date;
|
||
|
title: string;
|
||
|
vtuber: string;
|
||
|
}
|
||
|
|
||
|
// function buildStreamPageUrlFromDate(date: Date) {
|
||
|
// // const cuid =
|
||
|
// return `/s/${safeDate}`;
|
||
|
// }
|
||
|
|
||
|
function handleEventClick(info: any, router: AppRouterInstance) {
|
||
|
var eventObj = info.event;
|
||
|
const { cuid } = eventObj._def.extendedProps;
|
||
|
router.push(`/streams/${cuid}`);
|
||
|
|
||
|
}
|
||
|
|
||
|
function convertStreamToEvent(stream: IStream): IEvent {
|
||
|
console.log(stream)
|
||
|
const displayName = stream.attributes.vtuber.data.attributes.displayName;
|
||
|
return {
|
||
|
cuid: stream.attributes.cuid,
|
||
|
start: new Date(stream.attributes.date),
|
||
|
title: `${displayName}`,
|
||
|
vtuber: displayName
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default function StreamsCalendar({ missingStreams, issueStreams, goodStreams }: IStreamsCalendarProps) {
|
||
|
const router = useRouter();
|
||
|
const eventSources = [
|
||
|
{
|
||
|
events: missingStreams.map(convertStreamToEvent),
|
||
|
color: 'red'
|
||
|
},
|
||
|
{
|
||
|
events: issueStreams.map(convertStreamToEvent),
|
||
|
color: 'yellow',
|
||
|
},
|
||
|
{
|
||
|
events: goodStreams.map(convertStreamToEvent),
|
||
|
color: 'green'
|
||
|
}
|
||
|
]
|
||
|
|
||
|
return (
|
||
|
<>
|
||
|
<FullCalendar
|
||
|
plugins={[
|
||
|
dayGridPlugin,
|
||
|
interactionPlugin
|
||
|
]}
|
||
|
editable={false}
|
||
|
eventSources={eventSources}
|
||
|
eventClick={(args) => {
|
||
|
handleEventClick(args, router);
|
||
|
}}
|
||
|
/>
|
||
|
</>
|
||
|
)
|
||
|
}
|