Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
0e356e6
add layout checks to the middleware
mirmirmirr Mar 28, 2026
7f00582
remove auth provider
mirmirmirr Mar 28, 2026
1630193
Merge branch 'account-settings' into serverside-auth
mirmirmirr Mar 30, 2026
eafabd4
fix merge conflicts
mirmirmirr Mar 30, 2026
97ecf2b
initial dialog separation
mirmirmirr Apr 13, 2026
da0bf8b
adjust confirmation spacing
mirmirmirr Apr 13, 2026
9f964e1
update all dialogs
mirmirmirr Apr 17, 2026
2cddbdb
hide close button
mirmirmirr Apr 17, 2026
a9393a3
Merge remote-tracking branch 'origin/v0.4.3' into serverside-auth
mirmirmirr Apr 18, 2026
9ad3e78
refactor header logic
mirmirmirr Apr 18, 2026
c070872
fix new event icon blip
mirmirmirr Apr 18, 2026
62c7680
expand dashboard loading
mirmirmirr Apr 18, 2026
5fb0150
create url toast listener
mirmirmirr Apr 19, 2026
aafef6b
move get-session to global lib
mirmirmirr Apr 19, 2026
7d16cd6
update painting page to use server auth
mirmirmirr Apr 19, 2026
b64d4a9
create dedicated session type
mirmirmirr Apr 19, 2026
8a9debf
adjust redirect url for settings page
mirmirmirr Apr 19, 2026
11f8e18
safe callback url
mirmirmirr Apr 19, 2026
da70441
remove console log and fix typo
mirmirmirr Apr 19, 2026
4bf7c07
return response at end
mirmirmirr Apr 19, 2026
aade4ee
import type
mirmirmirr Apr 19, 2026
113f450
revise comment string
mirmirmirr Apr 20, 2026
9af677b
add headers
mirmirmirr Apr 20, 2026
7451a36
move auth route checks to layout.tsx
mirmirmirr Apr 20, 2026
e8e0d40
create folder
mirmirmirr May 1, 2026
64433dd
Merge branch 'v0.4.3' into expand-dialog-family
mirmirmirr May 1, 2026
b7b406b
adjust listener
mirmirmirr May 1, 2026
37a9d6d
remove extra console log
mirmirmirr May 1, 2026
73400ef
remove icons
mirmirmirr May 1, 2026
80fa552
Create MobileFooterIsland component
jzgom067 May 4, 2026
9e6b1fa
Add hidePadding prop to SegmentedControl
jzgom067 May 4, 2026
c6c97c7
Add MobileFooterIsland to event editor
jzgom067 May 4, 2026
1043568
Update segmented control style
jzgom067 May 4, 2026
7408840
Remove redundant className
jzgom067 May 4, 2026
5dca0fb
Add built-in spacer for mobile footer island
jzgom067 May 4, 2026
159cc83
Add desktop hiding on footer island
jzgom067 May 4, 2026
751876a
Add footer island to painting page
jzgom067 May 4, 2026
035e50e
Remove MobileFooterTray
jzgom067 May 4, 2026
7e8b4d8
Simplify dashboard layout
jzgom067 May 4, 2026
4039926
Fix DisplayNameInput typing
jzgom067 May 4, 2026
7f2d5e5
Update segmented control fallback padding
jzgom067 May 4, 2026
553ab6f
Simplify fallback padding
jzgom067 May 4, 2026
7e49868
Create CookieGuard
jzgom067 May 4, 2026
0ca38a9
Update cookie check logic
jzgom067 May 4, 2026
1f3235e
Remove redundant text color class
jzgom067 May 4, 2026
05b5cda
Update comment in CookieGuard
jzgom067 May 4, 2026
08730f3
Update possible dates text for weekday events
jzgom067 May 6, 2026
48d2feb
Remove mobile event type switch
jzgom067 May 6, 2026
db009bb
Shorten gap between form text and field on editor
jzgom067 May 6, 2026
93d89ab
Simplify weekday row rounding logic
jzgom067 May 6, 2026
e2f53fb
Update selection style on weekday row
jzgom067 May 7, 2026
d4f8bda
Simplify hover highlight classes
jzgom067 May 7, 2026
6e61674
Add hover color back to unhighlighted state
jzgom067 May 7, 2026
9fc6564
Add cursor-pointer to weekday row items
jzgom067 May 7, 2026
96cf37b
Simplify specific date range component
jzgom067 May 7, 2026
98c4edd
Add downward arrows to all dropdowns
jzgom067 May 7, 2026
12f5b2f
Adjust text styling on event editor
jzgom067 May 7, 2026
42c7dfb
Update advanced options spacing
jzgom067 May 8, 2026
08a2e5a
Update advanced options dropdown appearance
jzgom067 May 8, 2026
a1db9c2
Increase mobile event name field width
jzgom067 May 8, 2026
3717acf
Change event code text color
jzgom067 May 8, 2026
93f2010
Add null typing to selectors
jzgom067 May 8, 2026
3b149c3
Adjust colors for null selectors
jzgom067 May 8, 2026
e2dda25
Add null value support to specific date display
jzgom067 May 8, 2026
df50ec0
Remove initial default date/time range
jzgom067 May 8, 2026
1a4d072
Update event data validation for null values
jzgom067 May 8, 2026
ad4cc74
Fix date picker on empty state
jzgom067 May 8, 2026
1f1effb
Remove dashed outline state from weekday row
jzgom067 May 8, 2026
8d2caed
Add message to grid preview for unselected range
jzgom067 May 9, 2026
79f424e
Update unselected range message appearance
jzgom067 May 9, 2026
41c9800
Hide grid preview dialog button on error
jzgom067 May 9, 2026
a7d37be
Fix mobile grid message centering
jzgom067 May 9, 2026
eacaa82
Remove panel background on mobile grid preview
jzgom067 May 9, 2026
1f4df55
Fix null typing for time slot generation
jzgom067 May 9, 2026
6512b2c
Update disabled dropdown text color
jzgom067 May 9, 2026
aac85e6
Add defensive checks to slot generation
jzgom067 May 9, 2026
dcbdcbb
Update invalid time range error message
jzgom067 May 9, 2026
a76db04
Update missing weekday error message
jzgom067 May 9, 2026
051151e
Update weekday range error handling
jzgom067 May 9, 2026
d104fb8
Update invalid times error message
jzgom067 May 9, 2026
d27072a
Fix invalid event range message
jzgom067 May 9, 2026
b0bf966
Fix null value check in dropdown
jzgom067 May 9, 2026
3d029f5
Merge branch 'v0.4.4' into more-mobile-islands
jzgom067 May 9, 2026
eff8b37
Merge branch 'v0.4.4' into cookie-check
jzgom067 May 9, 2026
2c9f6bc
Merge branch 'v0.4.4' into editor-adjustments
jzgom067 May 9, 2026
52dd49e
Increase segmented control text size
jzgom067 May 9, 2026
446d768
Create new share menu component
jzgom067 May 11, 2026
30cba66
Add share menu to mobile results drawer
jzgom067 May 11, 2026
45142d4
Adjust share menu URL style
jzgom067 May 18, 2026
bde2d61
Add proper event title to share menu
jzgom067 May 18, 2026
b2baaae
Change copy button from callback
jzgom067 May 18, 2026
f31ca71
Merge branch 'expand-dialog-family' into move-share-buttons
jzgom067 May 18, 2026
59df5ef
Add share dialog to desktop
jzgom067 May 18, 2026
712a2e7
Add copy on link click
jzgom067 May 18, 2026
f4d18d3
Add stylized QR code to share menu
jzgom067 May 18, 2026
4b741bb
Merge pull request #340 from plan-cake/editor-adjustments
mirmirmirr Jun 8, 2026
8a49c52
Merge pull request #337 from plan-cake/cookie-check
mirmirmirr Jun 8, 2026
079c11e
Merge pull request #336 from plan-cake/more-mobile-islands
mirmirmirr Jun 8, 2026
6380613
Add link usage message
jzgom067 Jun 9, 2026
863c372
Add close button option to dialogs
jzgom067 Jun 10, 2026
a88648f
Add close button to share menu dialog
jzgom067 Jun 10, 2026
378c23f
Remove bottom margin on grid
jzgom067 Jun 10, 2026
aa134c6
Merge branch 'v0.4.4' into move-share-buttons
jzgom067 Jun 10, 2026
5845800
Re-add timezone selector to mobile results
jzgom067 Jun 10, 2026
36a1b1b
Move timezone selector on mobile painting page
jzgom067 Jun 10, 2026
15bc7d7
Remove bold styling from display settings
jzgom067 Jun 10, 2026
d7b4321
Update clickable text link in share menu
jzgom067 Jun 10, 2026
fddddd4
Simplify share button variable logic
jzgom067 Jun 10, 2026
a0d351d
Add aria label to mobile share button
jzgom067 Jun 10, 2026
4c3ff5c
Add close button visibility to nested dialog
jzgom067 Jun 10, 2026
d1690f3
Update aria label in dialog close button
jzgom067 Jun 10, 2026
22261cb
Remove unnecessary comment
jzgom067 Jun 10, 2026
2110638
Add passthrough for close button prop
jzgom067 Jun 11, 2026
9e7e309
Revert button conversion for link text
jzgom067 Jun 11, 2026
b157343
Merge branch 'v0.4.4' into expand-dialog-family
mirmirmirr Jun 12, 2026
8f6b17b
consolidate duplicated user removal
mirmirmirr Jun 12, 2026
6a210a1
restructure results folder
mirmirmirr Jun 12, 2026
4fefccb
Merge remote-tracking branch 'origin/v0.4.4' into serverside-auth
mirmirmirr Jun 12, 2026
c029e34
update to new theme picker
mirmirmirr Jun 12, 2026
cabefd6
update nickname change ui
mirmirmirr Jun 12, 2026
a658fde
delete account refinements
mirmirmirr Jun 12, 2026
0713891
dialog cleanup
mirmirmirr Jun 12, 2026
27da6f4
strengthen equality
mirmirmirr Jun 12, 2026
ae71302
Merge pull request #325 from plan-cake/serverside-auth
jzgom067 Jun 12, 2026
646ab17
Merge branch 'v0.4.4' into expand-dialog-family
mirmirmirr Jun 12, 2026
c7f6057
Merge branch 'expand-dialog-family' into restructured-results
mirmirmirr Jun 12, 2026
b18daf1
Merge pull request #330 from plan-cake/expand-dialog-family
jzgom067 Jun 12, 2026
319ce3d
Remove unused props in display settings
jzgom067 Jun 12, 2026
2b0a671
Merge branch 'v0.4.4' into move-share-buttons
jzgom067 Jun 12, 2026
81e4ca2
Merge branch 'v0.4.4' into restructured-results
jzgom067 Jun 12, 2026
895194a
Merge pull request #343 from plan-cake/restructured-results
jzgom067 Jun 12, 2026
f783e19
Merge branch 'v0.4.4' into move-share-buttons
jzgom067 Jun 12, 2026
17870a3
Merge pull request #342 from plan-cake/move-share-buttons
mirmirmirr Jun 12, 2026
f0edbe7
Add version data
jzgom067 Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions frontend/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"next": "15.4.10",
"next-themes": "^0.4.6",
"patch-package": "^8.0.1",
"qr-code-styling": "^1.9.2",
"react": "^19.0.0",
"react-day-picker": "^9.6.7",
"react-dom": "^19.0.0",
Expand Down
37 changes: 6 additions & 31 deletions frontend/src/app/(auth)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,41 +1,16 @@
"use client";
import { redirect } from "next/navigation";

import { useEffect, useRef } from "react";
import { getSession } from "@/lib/utils/get-session";

import { useRouter } from "next/navigation";

import Loading from "@/app/loading";
import { useAccount } from "@/features/account/context";
import { useToast } from "@/features/system-feedback";
import { MESSAGES } from "@/lib/messages";

export default function AuthLayout({
export default async function AuthLayout({
children,
}: {
children: React.ReactNode;
}) {
const { loginState } = useAccount();
const router = useRouter();
const { addToast } = useToast();
const hasBeenLoggedOutRef = useRef(false);

useEffect(() => {
if (loginState === "logged_out") {
hasBeenLoggedOutRef.current = true;
}

if (loginState === "logged_in") {
// Check if the user was logged out to avoid this triggering on login
if (!hasBeenLoggedOutRef.current) {
router.replace("/dashboard");
addToast("info", MESSAGES.INFO_ALREADY_LOGGED_IN);
}
}
}, [loginState, router, addToast]);
const session = await getSession();

if (loginState === "logged_in") {
// Logged in status is included to avoid flickering on redirect
return <Loading />;
if (session.isLoggedIn) {
redirect("/dashboard?alreadyLoggedIn=true");
}

return <>{children}</>;
Expand Down
17 changes: 8 additions & 9 deletions frontend/src/app/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,29 @@
import { useState } from "react";

import Link from "next/link";
import { useRouter } from "next/navigation";
import { useRouter, useSearchParams } from "next/navigation";

import Checkbox from "@/components/checkbox";
import AuthPageLayout from "@/components/layout/auth-page";
import LinkText from "@/components/link-text";
import TextInputField from "@/components/text-input-field";
import { useAccount } from "@/features/account/context";
import ActionButton from "@/features/button/components/action";
import { useFormErrors } from "@/lib/hooks/use-form-errors";
import { MESSAGES } from "@/lib/messages";
import { clientPost } from "@/lib/utils/api/client-fetch";
import { ROUTES } from "@/lib/utils/api/endpoints";
import { ApiErrorResponse } from "@/lib/utils/api/fetch-wrapper";
import { getSafeRedirectUrl } from "@/lib/utils/url";

export default function Page() {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [rememberMe, setRememberMe] = useState(false);
const { login } = useAccount();
const router = useRouter();

const searchParams = useSearchParams();
const callbackUrl = getSafeRedirectUrl(searchParams.get("callbackUrl"));

// TOASTS AND ERROR STATES
const { errors, handleError, clearAllErrors } = useFormErrors();

Expand Down Expand Up @@ -52,16 +54,13 @@ export default function Page() {
}

try {
const data = await clientPost(ROUTES.auth.login, {
await clientPost(ROUTES.auth.login, {
email,
password,
remember_me: rememberMe,
});
login({
email: data.email,
defaultName: data.default_display_name,
});
router.push("/dashboard");
router.push(callbackUrl);
router.refresh();
return true;
} catch (e) {
const error = e as ApiErrorResponse;
Expand Down
92 changes: 34 additions & 58 deletions frontend/src/app/(event)/[event-code]/page-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,23 @@ import { useState } from "react";

import { PencilIcon, ShareIcon, SquarePenIcon } from "lucide-react";

import CopyToastButton from "@/components/copy-toast-button";
import KebabMenu from "@/components/kebab-menu";
import { EventInformation } from "@/core/event/types";
import ActionButton from "@/features/button/components/action";
import EmptyButton from "@/features/button/components/empty";
import LinkButton from "@/features/button/components/link";
import ScheduleGrid from "@/features/event/grid/grid";
import AttendeesPanel from "@/features/event/results/attendee-panel/panel";
import { getResultBanners } from "@/features/event/results/banners";
import AttendeesPanel from "@/features/event/results/attendees/desktop-panel";
import AttendeesDrawer from "@/features/event/results/attendees/mobile-drawer";
import { getResultBanners } from "@/features/event/results/components/banners";
import DisplaySettings from "@/features/event/results/components/display-settings";
import {
ResultsProvider,
useResultsContext,
} from "@/features/event/results/context";
import DisplaySettings from "@/features/event/results/display-settings";
import ResultsDrawer from "@/features/event/results/drawer";
import { ResultsInformation } from "@/features/event/results/lib/types";
import ShareMenu from "@/features/event/results/share-menu";
import HeaderSpacer from "@/features/header/components/header-spacer";
import { useToast } from "@/features/system-feedback";
import { MESSAGES } from "@/lib/messages";
import BaseDialog from "@/features/system-feedback/dialog/components/base";
import { cn } from "@/lib/utils/classname";

export default function ClientPage({
Expand Down Expand Up @@ -61,9 +60,6 @@ function EventResults({ eventData }: { eventData: EventInformation }) {
timeslots,
} = eventData;

/* TOAST PROVIDER */
const { addToast } = useToast();

/* TIMEZONE HANDLING */
const handleTZChange = (newTZ: string | number) => {
setTimezone(newTZ.toString());
Expand Down Expand Up @@ -110,44 +106,21 @@ function EventResults({ eventData }: { eventData: EventInformation }) {
/>
);

const shareButton = (buttonStyle: HeaderButtonStyle) => {
// Check if sharing is supported
if (typeof navigator !== "undefined" && !navigator.share) {
/* This condition means it will be rendered until mounted on the client, then it
* disappears if not supported. There are more browsers that support the API than
* don't, so this is a better trade-off than having the button appear after initial
* mount on supported browsers.
*
* This also won't be visible on mobile anyway, since the buttons are hidden in the
* kebab menu.
*/
return null;
} else {
return (
<ActionButton
buttonStyle={buttonStyle}
const shareButton = (
<BaseDialog
title="Share Event"
description="Share this event with others"
trigger={
<EmptyButton
buttonStyle="secondary"
icon={<ShareIcon />}
label="Share Event"
onClick={async () => {
try {
await navigator.share({
title: eventTitle,
url: window.location.href,
});
} catch (error) {
// An error is thrown if sharing is cancelled, ignore that
if (error instanceof Error && error.name !== "AbortError") {
addToast("error", MESSAGES.ERROR_GENERIC);
}
}
}}
/>
);
}
};

const copyButton = (buttonStyle: HeaderButtonStyle) => (
<CopyToastButton code={eventCode} buttonStyle={buttonStyle} />
}
showCloseButton
>
<ShareMenu eventTitle={eventTitle} eventCode={eventCode} />
</BaseDialog>
);

return (
Expand All @@ -158,18 +131,15 @@ function EventResults({ eventData }: { eventData: EventInformation }) {
<div className="flex flex-row justify-between gap-2 md:flex-wrap">
<h1 className="text-2xl font-bold">{eventTitle}</h1>

<div className="md:hidden">
<KebabMenu>
{isCreator && editButton("frosted glass inset")}
{shareButton("frosted glass inset")}
{copyButton("frosted glass inset")}
</KebabMenu>
</div>
{isCreator && (
<div className="md:hidden">
<KebabMenu>{editButton("frosted glass inset")}</KebabMenu>
</div>
)}

<div className="ml-auto hidden flex-wrap justify-end gap-2 md:flex">
{isCreator && editButton("secondary")}
{shareButton("secondary")}
{copyButton("secondary")}
{shareButton}
{paintingButton}
</div>
</div>
Expand All @@ -188,16 +158,22 @@ function EventResults({ eventData }: { eventData: EventInformation }) {
timeslots={timeslots}
/>

<div className="bg-panel shrink-0 rounded-3xl p-6 text-sm md:hidden">
<DisplaySettings
timezone={timezone}
onTimezoneChange={handleTZChange}
/>
</div>

{/* Mobile Spacer & Drawer */}
<div
className="w-full md:hidden"
style={{ height: getSpacerHeight() }}
/>
<div className="md:hidden">
<ResultsDrawer
timezone={timezone}
onTimezoneChange={handleTZChange}
<AttendeesDrawer
onSnapChange={setDrawerSnap}
eventTitle={eventTitle}
eventCode={eventCode}
/>
</div>
Expand Down
Loading
Loading