From 1f43da9d02b0b248e14ac65c9d9c66960fcbc4dd Mon Sep 17 00:00:00 2001 From: Invictus108 Date: Fri, 10 Apr 2026 16:13:04 -0400 Subject: [PATCH 1/3] hide decline button when people select --- src/components/GroupView/GroupViewPage.tsx | 13 ++- .../SideBySideView/SharedSidebar.tsx | 17 +++- .../SideBySideView/SideBySideView.tsx | 3 + src/components/TimeSelect/TimeSelectPage.tsx | 13 ++- .../UnifiedAvailabilityPage.tsx | 1 + .../utils/components/EventOptionsMenu.tsx | 83 ++++++++++++++----- 6 files changed, 102 insertions(+), 28 deletions(-) diff --git a/src/components/GroupView/GroupViewPage.tsx b/src/components/GroupView/GroupViewPage.tsx index dbc307d..eecf8df 100644 --- a/src/components/GroupView/GroupViewPage.tsx +++ b/src/components/GroupView/GroupViewPage.tsx @@ -15,6 +15,7 @@ import { } from '../../types'; import Calendar from '../selectCalendarComponents/CalendarApp'; import { useCallback } from 'react'; +import { useNavigate } from 'react-router-dom'; import { getEventObjectForGCal, getParticipantIndex, @@ -24,6 +25,7 @@ import { getChosenLocation, getEmailAdmin, setEmailAdmin, + wrappedSaveDeclinedParticipantDetails, } from '../../backend/events'; import LocationChart from './LocationChart'; import UserChart from './UserChart'; @@ -115,6 +117,7 @@ export default function GroupViewPage({ userHasFilled: boolean; setUserHasFilled: Dispatch>; }) { + const navigate = useNavigate(); const [showUserChart, setShowUserChart] = useState(false); const [showParticipantFilter, setShowParticipantFilter] = useState(false); const [participantToggleClicked, setParticipantToggleClicked] = @@ -317,7 +320,15 @@ export default function GroupViewPage({ > {eventName} - {isAdmin && } + { + await wrappedSaveDeclinedParticipantDetails(); + navigate('/'); + }} + /> {eventDescription && (
void; + userHasFilled: boolean; onDecline: () => void; } @@ -106,6 +107,7 @@ export default function SharedSidebar({ setSelectedLocations, userHasSignedIn, onUserSignIn, + userHasFilled, onDecline, }: SharedSidebarProps) { const navigate = useNavigate(); @@ -218,7 +220,16 @@ export default function SharedSidebar({ > {eventName}
- {isAdmin && } + { + await wrappedSaveDeclinedParticipantDetails(); + onDecline(); + navigate('/'); + }} + /> {eventDescription && (
)} - {/* Decline Button */} - {!chartedUsers?.hovering && !isAdmin && userHasSignedIn && getAccountId() !== '' && ( + {/* Decline Button - only shown when user hasnt filled availability yet. once filled it moves to the dropdown */} + {!chartedUsers?.hovering && !isAdmin && userHasSignedIn && getAccountId() !== '' && !userHasFilled && (
Decline Invitation{' '} diff --git a/src/components/SideBySideView/SideBySideView.tsx b/src/components/SideBySideView/SideBySideView.tsx index d1dc9e7..daeb8cf 100644 --- a/src/components/SideBySideView/SideBySideView.tsx +++ b/src/components/SideBySideView/SideBySideView.tsx @@ -87,6 +87,7 @@ interface SideBySideViewProps { onSave: () => Promise; onDecline: () => void; isSaving: boolean; + userHasFilled: boolean; // Unsaved changes tracking hasUnsavedChanges: boolean; @@ -128,6 +129,7 @@ export default function SideBySideView({ onSave, onDecline, isSaving, + userHasFilled, hasUnsavedChanges, setHasUnsavedChanges, }: SideBySideViewProps) { @@ -436,6 +438,7 @@ export default function SideBySideView({ setSelectedLocations={wrappedSetSelectedLocations} userHasSignedIn={userHasSignedIn} onUserSignIn={() => setUserHasSignedIn(true)} + userHasFilled={userHasFilled} onDecline={onDecline} />
diff --git a/src/components/TimeSelect/TimeSelectPage.tsx b/src/components/TimeSelect/TimeSelectPage.tsx index b494d1b..0fe9296 100644 --- a/src/components/TimeSelect/TimeSelectPage.tsx +++ b/src/components/TimeSelect/TimeSelectPage.tsx @@ -1,6 +1,7 @@ import LocationSelectionComponent from './LocationSelectionComponent'; import { calendar_v3, google } from 'googleapis'; import { useState, useEffect, Dispatch, SetStateAction } from 'react'; +import { useNavigate } from 'react-router-dom'; import { DateTime } from 'luxon'; import { calanderState, @@ -28,6 +29,7 @@ import { setUserSelectedCalendarIDs, workingEvent, checkIfAdmin, + wrappedSaveDeclinedParticipantDetails, } from '../../backend/events'; import { notifyAdminOfNewResponse } from '../../emails/sendEmailHelpers'; import Calendar from '../selectCalendarComponents/CalendarApp'; @@ -105,6 +107,7 @@ function TimeSelectPage({ hasAvailability: boolean; setHasAvailability: Dispatch>; }) { + const navigate = useNavigate(); const [isGcalPopupOpen, setGcalPopupOpen] = useState(false); const [isSaving, setIsSaving] = useState(false); @@ -591,7 +594,15 @@ function TimeSelectPage({ > {eventName}
- {checkIfAdmin() && } + { + await wrappedSaveDeclinedParticipantDetails(); + navigate('/'); + }} + />
{eventDescription && (
fetchData(false)} isSaving={isSaving} + userHasFilled={userHasFilled} hasUnsavedChanges={hasUnsavedChanges} setHasUnsavedChanges={setHasUnsavedChanges} /> diff --git a/src/components/utils/components/EventOptionsMenu.tsx b/src/components/utils/components/EventOptionsMenu.tsx index 9a6478f..26c3bc6 100644 --- a/src/components/utils/components/EventOptionsMenu.tsx +++ b/src/components/utils/components/EventOptionsMenu.tsx @@ -1,18 +1,24 @@ import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; -import { IconDotsVertical, IconPencil, IconTrash } from '@tabler/icons-react'; +import { IconDotsVertical, IconPencil, IconTrash, IconX } from '@tabler/icons-react'; import { deleteEvent } from '../../../backend/events'; import DeletePopup from './DeletePopup'; interface EventOptionsMenuProps { eventCode: string | undefined; + isAdmin: boolean; + userHasFilled?: boolean; + onCancel?: () => Promise; } -export default function EventOptionsMenu({ eventCode }: EventOptionsMenuProps) { +export default function EventOptionsMenu({ eventCode, isAdmin, userHasFilled, onCancel }: EventOptionsMenuProps) { const [isMenuOpen, setIsMenuOpen] = useState(false); const [showDeletePopup, setShowDeletePopup] = useState(false); + const [showCancelPopup, setShowCancelPopup] = useState(false); const nav = useNavigate(); + const showMenu = isAdmin || (!!userHasFilled && !!onCancel); + // Close menu when clicking outside useEffect(() => { if (isMenuOpen) { @@ -39,6 +45,8 @@ export default function EventOptionsMenu({ eventCode }: EventOptionsMenuProps) { } }; + if (!showMenu) return null; + return ( <>
@@ -53,28 +61,44 @@ export default function EventOptionsMenu({ eventCode }: EventOptionsMenuProps) { {isMenuOpen && (
- - + {isAdmin && ( + <> + + + + )} + {!isAdmin && userHasFilled && onCancel && ( + + )}
)}
@@ -86,6 +110,19 @@ export default function EventOptionsMenu({ eventCode }: EventOptionsMenuProps) { onConfirm={handleDeleteEvent} onCancel={() => setShowDeletePopup(false)} /> + + { + setShowCancelPopup(false); + if (onCancel) await onCancel(); + }} + onCancel={() => setShowCancelPopup(false)} + confirmText="Cancel" + cancelText="Go Back" + /> ); } From 9c838d2c3a40ad529e78654ab976d4d9c117ef4c Mon Sep 17 00:00:00 2001 From: Invictus108 Date: Mon, 13 Apr 2026 23:09:01 -0400 Subject: [PATCH 2/3] name changes --- src/components/utils/components/EventOptionsMenu.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/utils/components/EventOptionsMenu.tsx b/src/components/utils/components/EventOptionsMenu.tsx index 26c3bc6..7d68bef 100644 --- a/src/components/utils/components/EventOptionsMenu.tsx +++ b/src/components/utils/components/EventOptionsMenu.tsx @@ -96,7 +96,7 @@ export default function EventOptionsMenu({ eventCode, isAdmin, userHasFilled, on className="w-full px-4 py-2.5 text-left text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 flex items-center gap-2 transition-colors" > - Cancel + Remove Response )}
@@ -112,15 +112,15 @@ export default function EventOptionsMenu({ eventCode, isAdmin, userHasFilled, on /> { setShowCancelPopup(false); if (onCancel) await onCancel(); }} onCancel={() => setShowCancelPopup(false)} - confirmText="Cancel" + confirmText="Remove" cancelText="Go Back" /> From 415115e1ded18fab392cb07199ed2a1ac4b5d21d Mon Sep 17 00:00:00 2001 From: Jeet Parikh Date: Tue, 14 Apr 2026 14:19:57 -0400 Subject: [PATCH 3/3] wording changes --- src/components/utils/components/EventOptionsMenu.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/utils/components/EventOptionsMenu.tsx b/src/components/utils/components/EventOptionsMenu.tsx index 7d68bef..7683e06 100644 --- a/src/components/utils/components/EventOptionsMenu.tsx +++ b/src/components/utils/components/EventOptionsMenu.tsx @@ -96,7 +96,7 @@ export default function EventOptionsMenu({ eventCode, isAdmin, userHasFilled, on className="w-full px-4 py-2.5 text-left text-sm text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 flex items-center gap-2 transition-colors" > - Remove Response + Decline Event )} @@ -112,16 +112,16 @@ export default function EventOptionsMenu({ eventCode, isAdmin, userHasFilled, on /> { setShowCancelPopup(false); if (onCancel) await onCancel(); }} onCancel={() => setShowCancelPopup(false)} - confirmText="Remove" - cancelText="Go Back" + confirmText="Yes, decline event" + cancelText="No" /> );