Raid Group calendar working

This commit is contained in:
2025-03-07 21:54:17 -05:00
parent 61789d7ca2
commit 0dfb971bc2
8 changed files with 213 additions and 30 deletions

View File

@@ -1,9 +1,27 @@
import { CalendarEvent } from "@/interface/Calendar";
import { RaidGroup } from "@/interface/RaidGroup"; import { RaidGroup } from "@/interface/RaidGroup";
import { api } from "@/util/AxiosUtil"; import { api } from "@/util/AxiosUtil";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
export function useGetRaidGroup(raidGroupId: string, disabled: boolean){
return useQuery({
queryKey: ["raidGroups", raidGroupId],
queryFn: async () => {
const response = await api.get(`/raidGroup/${raidGroupId}`);
if(response.status !== 200){
throw new Error("Failed to get raid group");
}
else if(response.data.errors){
throw new Error(response.data.errors.join(", "));
}
return response.data?.raidGroupId ? response.data as RaidGroup : undefined;
},
enabled: !disabled
});
}
export function useGetRaidGroups(page: number, pageSize: number, searchTerm?: string){ export function useGetRaidGroups(page: number, pageSize: number, searchTerm?: string){
return useQuery({ return useQuery({
queryKey: ["raidGroups", { page, pageSize, searchTerm }], queryKey: ["raidGroups", { page, pageSize, searchTerm }],
@@ -152,24 +170,6 @@ export function useGetRaidGroupsCountByAccount(accountId: string, searchTerm?: s
} }
export function useGetRaidGroupCalendar(raidGroupId: string){
return useQuery({
queryKey: ["raidGroups", raidGroupId, "calendar"],
queryFn: async () => {
const response = await api.get(`/raidGroup/${raidGroupId}/calendar`);
if(response.status !== 200){
throw new Error("Failed to get raid group calendar");
}
else if(response.data.errors){
throw new Error(response.data.errors.join(", "));
}
return response.data as CalendarEvent[];
}
});
}
export function useCreateRaidGroup(){ export function useCreateRaidGroup(){
const queryClient = useQueryClient(); const queryClient = useQueryClient();

View File

@@ -45,7 +45,7 @@ export default function GamePage(){
<div>Error</div> <div>Error</div>
); );
} }
else if(gameQuery.status === "success" && (gameQuery.data === undefined || gameQuery.data === undefined)){ else if(gameQuery.status === "success" && gameQuery.data === undefined){
return ( return (
<Navigate to="/game"/> <Navigate to="/game"/>
); );

View File

@@ -1,10 +1,60 @@
import TabGroup, { Tab } from "@/components/tab/TabGroup";
import { useGetRaidGroup } from "@/hooks/RaidGroupHooks";
import { RaidGroup } from "@/interface/RaidGroup";
import RaidGroupCalendarDisplay from "@/ui/calendar/RaidGroupCalendarDisplay";
import RaidGroupHeader from "@/ui/calendar/RaidGroupHeader";
import { useEffect, useState } from "react";
import { Navigate, useParams } from "react-router";
export default function RaidGroupPage(){ export default function RaidGroupPage(){
//TODO: const { raidGroupId } = useParams();
return ( const [ raidGroup, setRaidGroup ] = useState<RaidGroup>();
<div> const raidGroupQuery = useGetRaidGroup(raidGroupId ?? "", false);
Raid Group Page useEffect(() => {
</div> if(raidGroupQuery.status === "success"){
); setRaidGroup(raidGroupQuery.data);
}
}, [ raidGroupQuery ]);
if(raidGroupQuery.status === "pending"){
return (
<div>Loading...</div>
);
}
else if(raidGroupQuery.status === "error"){
return (
<div>Error</div>
);
}
else if(raidGroupQuery.status === "success" && raidGroupQuery.data === undefined){
return (
<Navigate to="/raidGroup"/>
);
}
else if(raidGroup){
const tabs: Tab[] = [
{
tabHeader: "Calendar",
tabContent: <RaidGroupCalendarDisplay gameId={raidGroup?.gameId ?? ""} raidGroupId={raidGroupId!}/>
}
];
return (
<main
className="flex flex-col items-center justify-center"
>
<RaidGroupHeader
raidGroup={raidGroup}
/>
<TabGroup
tabs={tabs}
/>
</main>
);
}
} }

View File

@@ -21,6 +21,7 @@ export default function CalendarDisplay({
}){ }){
const [ displayCalendarEventModal, setDisplayCalendarEventModal ] = useState(false); const [ displayCalendarEventModal, setDisplayCalendarEventModal ] = useState(false);
const [ alterCalendarEvent, setAlterCalendarEvent ] = useState<CalendarEvent>(); const [ alterCalendarEvent, setAlterCalendarEvent ] = useState<CalendarEvent>();
const [ disableModal, setDisableModal ] = useState(false);
const createGameCalendarEventMutate = useCreateGameCalendarEvent(gameId ?? ""); const createGameCalendarEventMutate = useCreateGameCalendarEvent(gameId ?? "");
const updateGameCalendarEventMutate = useUpdateGameCalendarEvent(gameId ?? ""); const updateGameCalendarEventMutate = useUpdateGameCalendarEvent(gameId ?? "");
@@ -34,8 +35,6 @@ export default function CalendarDisplay({
const showAddCalendarEventModal = (dateClickArg: DateClickArg) => { const showAddCalendarEventModal = (dateClickArg: DateClickArg) => {
console.log("showAdd()");
console.log(dateClickArg.date);
setAlterCalendarEvent({ setAlterCalendarEvent({
eventStartDate: dateClickArg.date, eventStartDate: dateClickArg.date,
eventEndDate: moment(dateClickArg.date).add(1, "hours").toDate() eventEndDate: moment(dateClickArg.date).add(1, "hours").toDate()
@@ -44,13 +43,19 @@ export default function CalendarDisplay({
} }
const showEditCalendarEventModal = (eventClickArg: EventClickArg) => { const showEditCalendarEventModal = (eventClickArg: EventClickArg) => {
setAlterCalendarEvent(calendarEvents.find((calEvent) => calEvent.calendarEventId === eventClickArg.event.id)); const calendarEvent = calendarEvents.find((calEvent) => calEvent.calendarEventId === eventClickArg.event.id);
if(raidGroupId && calendarEvent?.gameId){
setDisableModal(true);
}
setAlterCalendarEvent(calendarEvent);
setDisplayCalendarEventModal(true); setDisplayCalendarEventModal(true);
} }
const hideCalendarEventModal = () => { const hideCalendarEventModal = () => {
setAlterCalendarEvent(undefined); setAlterCalendarEvent(undefined);
setDisplayCalendarEventModal(false); setDisplayCalendarEventModal(false);
setDisableModal(false);
} }
@@ -71,6 +76,7 @@ export default function CalendarDisplay({
display={displayCalendarEventModal} display={displayCalendarEventModal}
close={hideCalendarEventModal} close={hideCalendarEventModal}
calendarEvent={alterCalendarEvent} calendarEvent={alterCalendarEvent}
disabled={disableModal}
createCalendarEventMutate={gameId ? createGameCalendarEventMutate : createRaidGroupCalendarEventMutate} createCalendarEventMutate={gameId ? createGameCalendarEventMutate : createRaidGroupCalendarEventMutate}
updateCalendarEventMutate={gameId ? updateGameCalendarEventMutate : updateRaidGroupCalendarEventMutate} updateCalendarEventMutate={gameId ? updateGameCalendarEventMutate : updateRaidGroupCalendarEventMutate}
deleteCalendarEventMutate={gameId ? deleteGameCalendarEventMutate : deleteRaidGroupCalendarEventMutate} deleteCalendarEventMutate={gameId ? deleteGameCalendarEventMutate : deleteRaidGroupCalendarEventMutate}

View File

@@ -0,0 +1,21 @@
import RaidGroupCalendarLoader from "./RaidGroupCalendarLoader";
export default function RaidGroupCalendarDisplay({
gameId,
raidGroupId
}:{
gameId: string;
raidGroupId: string;
}){
return (
<div
className="flex flex-col items-center justify-center"
>
<RaidGroupCalendarLoader
gameId={gameId}
raidGroupId={raidGroupId}
/>
</div>
);
}

View File

@@ -0,0 +1,38 @@
import DangerMessage from "@/components/message/DangerMessage";
import { useGetGameCalendar, useGetRaidGroupCalendar } from "@/hooks/CalendarHooks";
import CalendarDisplay from "./CalendarDisplay";
export default function RaidGroupCalendarLoader({
gameId,
raidGroupId
}:{
gameId: string;
raidGroupId: string;
}){
const gameCalendarQuery = useGetGameCalendar(gameId);
const raidGroupCalendarQuery = useGetRaidGroupCalendar(raidGroupId);
if(raidGroupCalendarQuery.status === "error"){
return (<DangerMessage>Error {raidGroupCalendarQuery.error.message}</DangerMessage>);
}
else if(gameCalendarQuery.status === "error"){
return (<DangerMessage>Error {gameCalendarQuery.error.message}</DangerMessage>);
}
else if((raidGroupCalendarQuery.status === "pending") || (gameCalendarQuery.status === "pending")){
return (
<div>
Loading...
</div>
);
}
else{
return (
<CalendarDisplay
raidGroupId={raidGroupId}
calendarEvents={[...raidGroupCalendarQuery.data, ...gameCalendarQuery.data]}
/>
);
}
}

View File

@@ -0,0 +1,61 @@
import { ButtonProps } from "@/components/button/Button";
import { RaidGroup } from "@/interface/RaidGroup";
import { useState } from "react";
import RaidGroupAdminButtons from "../raidGroup/RaidGroupAdminButtons";
import DeleteRaidGroupModal from "../raidGroup/modals/DeleteRaidGroupModal";
import RaidGroupModal from "../raidGroup/modals/RaidGroupModal";
export default function RaidGroupHeader({
raidGroup
}:{
raidGroup: RaidGroup;
}){
const [ displayEditRaidGroupModal, setDisplayEditRaidGroupModal ] = useState(false);
const [ displayDeleteRaidGroupModal, setDisplayDeleteRaidGroupModal ] = useState(false);
const buttonProps: ButtonProps = {
variant: "ghost",
size: "md",
shape: "square"
};
return (
<h1
className="flex flex-col items-center justify-center"
>
<div
className="flex flex-row items-center justify-center text-4xl"
>
{
raidGroup.raidGroupIcon &&
<img
className="m-auto mr-4"
src={`${import.meta.env.VITE_ICON_URL}/raidGroupIcons/${raidGroup.raidGroupIcon}`}
height={72}
width={72}
/>
}
{raidGroup.raidGroupName}
</div>
<div>
<RaidGroupAdminButtons
buttonProps={buttonProps}
showEditRaidGroupModal={() => setDisplayEditRaidGroupModal(true)}
showDeleteRaidGroupModal={() => setDisplayDeleteRaidGroupModal(true)}
/>
</div>
<RaidGroupModal
display={displayEditRaidGroupModal}
close={() => setDisplayEditRaidGroupModal(false)}
raidGroup={raidGroup}
/>
<DeleteRaidGroupModal
display={displayDeleteRaidGroupModal}
close={() => setDisplayDeleteRaidGroupModal(false)}
raidGroup={raidGroup}
/>
</h1>
);
}

View File

@@ -17,6 +17,7 @@ export default function CalendarEventModal({
display, display,
close, close,
calendarEvent, calendarEvent,
disabled,
createCalendarEventMutate, createCalendarEventMutate,
updateCalendarEventMutate, updateCalendarEventMutate,
deleteCalendarEventMutate deleteCalendarEventMutate
@@ -24,6 +25,7 @@ export default function CalendarEventModal({
display: boolean; display: boolean;
close: () => void; close: () => void;
calendarEvent?: CalendarEvent; calendarEvent?: CalendarEvent;
disabled?: boolean;
createCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>; createCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>;
updateCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>; updateCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>;
deleteCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>; deleteCalendarEventMutate: UseMutationResult<void, Error, CalendarEvent, unknown>;
@@ -117,6 +119,7 @@ export default function CalendarEventModal({
placeholder="Event Name" placeholder="Event Name"
onChange={(e) => setEventName(e.target.value)} onChange={(e) => setEventName(e.target.value)}
value={eventName} value={eventName}
disabled={disabled}
/> />
</div> </div>
<TextArea <TextArea
@@ -124,6 +127,7 @@ export default function CalendarEventModal({
placeholder="Event Description" placeholder="Event Description"
onChange={(e) => setEventDescription(e.target.value)} onChange={(e) => setEventDescription(e.target.value)}
value={eventDescription} value={eventDescription}
disabled={disabled}
/> />
<div <div
className="w-full" className="w-full"
@@ -133,12 +137,14 @@ export default function CalendarEventModal({
placeholder="Start Date" placeholder="Start Date"
value={moment(eventStartDate).format("YYYY-MM-DDTHH:mm")} value={moment(eventStartDate).format("YYYY-MM-DDTHH:mm")}
onChange={(e) => setEventStartDate(moment(e.target.value).toDate())} onChange={(e) => setEventStartDate(moment(e.target.value).toDate())}
disabled={disabled}
/> />
<DateInput <DateInput
id={`calendarEventModalEndDateInput${modalId}`} id={`calendarEventModalEndDateInput${modalId}`}
placeholder="End Date" placeholder="End Date"
value={moment(eventEndDate).format("YYYY-MM-DDTHH:mm")} value={moment(eventEndDate).format("YYYY-MM-DDTHH:mm")}
onChange={(e) => setEventEndDate(moment(e.target.value).toDate())} onChange={(e) => setEventEndDate(moment(e.target.value).toDate())}
disabled={disabled}
/> />
</div> </div>
</div> </div>
@@ -157,6 +163,7 @@ export default function CalendarEventModal({
> >
<PrimaryButton <PrimaryButton
onClick={calendarEvent?.calendarEventId ? updateCalendarEvent : createCalendarEvent} onClick={calendarEvent?.calendarEventId ? updateCalendarEvent : createCalendarEvent}
disabled={disabled}
> >
{calendarEvent?.calendarEventId ? "Update" : "Create"} {calendarEvent?.calendarEventId ? "Update" : "Create"}
</PrimaryButton> </PrimaryButton>
@@ -170,7 +177,7 @@ export default function CalendarEventModal({
className="flex flex-row items-center justify-end w-full" className="flex flex-row items-center justify-end w-full"
> >
{ {
calendarEvent?.calendarEventId && calendarEvent?.calendarEventId && !disabled &&
<DangerButton <DangerButton
variant="ghost" variant="ghost"
shape="square" shape="square"