Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
486 commits
Select commit Hold shift + click to select a range
65fdef3
Merge pull request #23 from plan-cake/logo-link
mirmirmirr Oct 10, 2025
7fcf988
Merge pull request #24 from plan-cake/misinformation-removal
mirmirmirr Oct 10, 2025
6ef732d
Update app/ui/components/weekday-calendar.tsx
mirmirmirr Oct 10, 2025
a866b80
Merge pull request #26 from plan-cake/weekday-range-select
jzgom067 Oct 10, 2025
866bdd5
Merge branch 'main-preview' into more-api-connection
jzgom067 Oct 10, 2025
020f619
create Weekday type and day variable
mirmirmirr Oct 11, 2025
5480594
find range from weekday map
mirmirmirr Oct 11, 2025
1a3fc46
create functions from timeslot generation
mirmirmirr Oct 11, 2025
e356387
organize schedule utilities
mirmirmirr Oct 11, 2025
878d825
implement convert availability to grid function
mirmirmirr Oct 11, 2025
0bbfaa1
add new reducer dispatch option
mirmirmirr Oct 11, 2025
9ac12eb
add handleSubmitAvailability
mirmirmirr Oct 11, 2025
e9a1693
set up availability painting pages
mirmirmirr Oct 11, 2025
5c572f4
implement results api
mirmirmirr Oct 11, 2025
4d86d83
move fetching logic into a new file for reuse
mirmirmirr Oct 11, 2025
90e439a
pre-format api data
mirmirmirr Oct 11, 2025
fa911dd
Implement weekday event API
jzgom067 Oct 11, 2025
863e092
restructure results for new availability `get-all` endpoint
mirmirmirr Oct 12, 2025
4ea8a93
Merge remote-tracking branch 'origin/finish-new-event-api' into more-…
mirmirmirr Oct 12, 2025
2e7bf12
update grid slot generation
mirmirmirr Oct 12, 2025
11b7adc
use a set date for weekday timeslot generation
mirmirmirr Oct 12, 2025
12c8af0
clean up and use localIso to check availability
mirmirmirr Oct 12, 2025
6eab8f5
make error page global
mirmirmirr Oct 12, 2025
02f4fde
Update app/ui/layout/availability-page.tsx
mirmirmirr Oct 12, 2025
48e946e
Update app/new-event/page.tsx
mirmirmirr Oct 12, 2025
c17aedc
remove event code console log
mirmirmirr Oct 12, 2025
87ecea5
remove event range console log
mirmirmirr Oct 12, 2025
f6afd01
spell creator correctly
mirmirmirr Oct 12, 2025
03d6f9f
github-actions: auto-format code
github-actions[bot] Oct 12, 2025
75b40c3
Merge branch 'more-api-connection' of https://github.com/plan-cake/fr…
mirmirmirr Oct 12, 2025
67936bc
remove default "john doe" name
mirmirmirr Oct 12, 2025
f9c7157
Merge remote-tracking branch 'origin/main-preview' into README-updates
liug88 Oct 12, 2025
76d3afb
github-actions: auto-format code
github-actions[bot] Oct 12, 2025
4e53e79
Merge pull request #27 from plan-cake/more-api-connection
jzgom067 Oct 13, 2025
7e91fb1
Fix landing page background colors
jzgom067 Oct 13, 2025
5987bbc
Rename Logo component to LogoArea
jzgom067 Oct 13, 2025
3ff9901
Create Logo component
jzgom067 Oct 13, 2025
a83b6b6
Add logo to bottom of landing page
jzgom067 Oct 13, 2025
8a00bb0
Capitalize Plancake
jzgom067 Oct 13, 2025
23ad68f
Remove "use client" from landing page
jzgom067 Oct 13, 2025
ab4776d
Remove red from "golden stack recipe" section
jzgom067 Oct 13, 2025
8b49efe
Change auth nomenclature
jzgom067 Oct 13, 2025
c52a2a9
Add show password buttons to register page
jzgom067 Oct 13, 2025
3605a22
Add show password button to login page
jzgom067 Oct 13, 2025
0cd683e
Add remember me to login
jzgom067 Oct 13, 2025
1679fc0
Create TextInputField component
jzgom067 Oct 13, 2025
bf8f842
Add light mode accent color to checkbox
jzgom067 Oct 13, 2025
4882241
Create useDebounce hook
jzgom067 Oct 14, 2025
04b36c0
Implement password check API functionality
jzgom067 Oct 14, 2025
e7a9962
Add error clearing on password deletion
jzgom067 Oct 14, 2025
1278e4f
Change password check API data format
jzgom067 Oct 14, 2025
2444261
Create PasswordCriteria component
jzgom067 Oct 14, 2025
72e4629
Implement password check API to password reset
jzgom067 Oct 14, 2025
ab555d2
Fix capitalization and nomenclature on auth pages
jzgom067 Oct 14, 2025
c12316f
Fix remember me capitalization
jzgom067 Oct 14, 2025
4b37ef7
Create LinkText component
jzgom067 Oct 14, 2025
5af2c00
Add proper styling to link text on auth pages
jzgom067 Oct 14, 2025
7dea40a
Add TextInputField to forgot and reset password
jzgom067 Oct 14, 2025
0efd976
Remove debug logs
jzgom067 Oct 14, 2025
1db2ad0
Add error clearing on reset password page
jzgom067 Oct 14, 2025
9de8a59
Merge pull request #28 from plan-cake/landing-page-fixes
mirmirmirr Oct 14, 2025
a054fc1
Merge pull request #29 from plan-cake/auth-page-fixes
mirmirmirr Oct 14, 2025
2d28975
Mir and Jack Changes
liug88 Oct 14, 2025
67b905f
github-actions: auto-format code
github-actions[bot] Oct 14, 2025
54509e5
Add basic square painting
jzgom067 Oct 14, 2025
95564c7
Fix mobile painting functionality
jzgom067 Oct 15, 2025
9c5ce92
Remove cursor pointer on grid
jzgom067 Oct 15, 2025
35b87bd
Change toggle to only toggle one way
jzgom067 Oct 15, 2025
e5a4c47
Fix slot hover color
jzgom067 Oct 15, 2025
3457e12
Fix hover color while dragging
jzgom067 Oct 15, 2025
92e1508
Simplify timeslot background color logic
jzgom067 Oct 15, 2025
df2ea68
Add shift painting
jzgom067 Oct 15, 2025
2db3c7d
Fix prop error for results timeblock
jzgom067 Oct 15, 2025
8d72b93
Fix background color for results timeslots
jzgom067 Oct 15, 2025
722e913
Fix stopDragging dependency
jzgom067 Oct 15, 2025
b454430
Optimize isDragging logic
jzgom067 Oct 15, 2025
0af5da4
Remove commented line
jzgom067 Oct 15, 2025
c0b8a2d
Merge pull request #25 from plan-cake/README-updates
mirmirmirr Oct 15, 2025
dc74ada
Merge pull request #30 from plan-cake/new-square-painting
mirmirmirr Oct 15, 2025
84d59d8
create error toast
mirmirmirr Oct 15, 2025
9495e8f
update copy toast
mirmirmirr Oct 15, 2025
0eca81e
Add server cookie forwarding
jzgom067 Oct 15, 2025
07e813e
Add no attendees message to results
jzgom067 Oct 15, 2025
c5d6149
Change cookies to optional in fetchEventDetails
jzgom067 Oct 15, 2025
2708797
Move availability page layout to components
jzgom067 Oct 15, 2025
31116e1
Create EventEditor component
jzgom067 Oct 15, 2025
52e05fb
Simplify auth cookie util function
jzgom067 Oct 16, 2025
abca3c2
Add data pre-population to edit event page
jzgom067 Oct 16, 2025
8d57cb0
Add functionality to edit event button
jzgom067 Oct 16, 2025
34168cd
Fix bad navigation on edit success
jzgom067 Oct 16, 2025
deeed25
Add new event button shrink on mobile
jzgom067 Oct 16, 2025
a2bb2f6
Change light mode frosted glass color to violet
jzgom067 Oct 16, 2025
71c3e77
Add subtle shadow to frosted glass
jzgom067 Oct 16, 2025
1784cc6
Change logo area background to frosted glass
jzgom067 Oct 16, 2025
7f815ba
Replace hamburger menu with version number
jzgom067 Oct 16, 2025
67454ed
Add header spacer to dashboard
jzgom067 Oct 16, 2025
9e369c1
Add dashboard button to header
jzgom067 Oct 16, 2025
4419bb7
Create HeaderSpacer component
jzgom067 Oct 16, 2025
ac4594d
Simplify initial data code
jzgom067 Oct 16, 2025
0ccd9e8
Fix edit event date inconsistency
jzgom067 Oct 16, 2025
a9e0fce
Fix cursor on results page timeslots
jzgom067 Oct 16, 2025
947c31e
Add early start date to calendar picker
jzgom067 Oct 16, 2025
733487c
Merge pull request #31 from plan-cake/header-fixes
mirmirmirr Oct 16, 2025
b0f2722
Bump next from 15.3.1 to 15.4.7
dependabot[bot] Oct 16, 2025
273c410
github-actions: auto-format code
github-actions[bot] Oct 16, 2025
da80d2e
Merge branch 'main-preview' into dependabot/npm_and_yarn/next-15.4.7
mirmirmirr Oct 16, 2025
6d1b97c
format changes
mirmirmirr Oct 16, 2025
1726647
Merge pull request #32 from plan-cake/dependabot/npm_and_yarn/next-15…
mirmirmirr Oct 16, 2025
b7e5766
Add event date length checking to selector
jzgom067 Oct 17, 2025
6eed579
Remove custom code functionality for event edit
jzgom067 Oct 17, 2025
b54d171
add toast context
mirmirmirr Oct 17, 2025
3a6322a
add toast and api guards to new event
mirmirmirr Oct 17, 2025
f9a1505
add toast and api guards to availability
mirmirmirr Oct 17, 2025
78c06b5
update results
mirmirmirr Oct 17, 2025
feac3b7
make copy event link work
mirmirmirr Oct 17, 2025
65dc6cb
add data and time range checks to new event
mirmirmirr Oct 17, 2025
f22e3e1
Merge branch 'main-preview' into toast-and-event-api-guards
mirmirmirr Oct 17, 2025
2541950
syntax fixes
mirmirmirr Oct 17, 2025
aeff63e
Merge branch 'toast-and-event-api-guards' of https://github.com/plan-…
mirmirmirr Oct 17, 2025
08adf91
Add availability prepopulation
jzgom067 Oct 17, 2025
f96b498
Fix hydration mismatch error
jzgom067 Oct 17, 2025
a0de72b
Remove console.log statements
jzgom067 Oct 17, 2025
b2b0822
Adjust button text on painting page
jzgom067 Oct 17, 2025
3fd5cd3
Change edit event button to Link
jzgom067 Oct 17, 2025
c3791f2
Add edit/add availability button to results page
jzgom067 Oct 17, 2025
f2e037c
Remove duration display when not present
jzgom067 Oct 17, 2025
f6a7bc8
Change duration to optional in event editor
jzgom067 Oct 17, 2025
d382399
Disable event type switching on edit
jzgom067 Oct 17, 2025
f2a5569
Rename disabled property to editing
jzgom067 Oct 17, 2025
7dc502d
Disable event type switching on mobile edit
jzgom067 Oct 17, 2025
f720c3b
Disable event code changes on mobile edit
jzgom067 Oct 17, 2025
3033779
Add event date length check on submit
jzgom067 Oct 17, 2025
a074239
Change mobile availability add button icon
jzgom067 Oct 17, 2025
41d1805
Change mobile duration default
jzgom067 Oct 17, 2025
f4c6ec1
Merge pull request #34 from plan-cake/results-page-fixes
mirmirmirr Oct 17, 2025
f8563df
simplify thrown error messages
mirmirmirr Oct 17, 2025
652a5ef
simplify thrown error messages for weekday event creation
mirmirmirr Oct 17, 2025
938365a
Merge branch 'main-preview' into toast-and-event-api-guards
mirmirmirr Oct 17, 2025
bbb2697
update event editor with error guards
mirmirmirr Oct 17, 2025
467bcfa
fix event code check
mirmirmirr Oct 17, 2025
b754c2c
outsource validation code
mirmirmirr Oct 17, 2025
3422928
change toast color into lion
mirmirmirr Oct 17, 2025
d7a87bb
Change loading page for every page
jzgom067 Oct 18, 2025
bf696c3
Move dashboard page to component
jzgom067 Oct 18, 2025
8549a6b
dynamically render background colors
mirmirmirr Oct 18, 2025
1134f6d
Merge pull request #33 from plan-cake/toast-and-event-api-guards
jzgom067 Oct 18, 2025
3a8fe23
Move dashboard data fetching to server
jzgom067 Oct 18, 2025
c5be808
add max width
mirmirmirr Oct 18, 2025
d594de5
add header spacer
mirmirmirr Oct 18, 2025
92336be
remove button glow
mirmirmirr Oct 18, 2025
a7388a0
adjust new event button to dark and light mode accent colors
mirmirmirr Oct 18, 2025
c42fdcc
adjust logo stroke to light mode
mirmirmirr Oct 18, 2025
9b9aa56
Add basic layout for new dashboard
jzgom067 Oct 18, 2025
f2d22a6
Create DashboardTabButton component
jzgom067 Oct 18, 2025
4fa7a43
Add mobile layout for tab buttons
jzgom067 Oct 18, 2025
af8fb70
Add event grid background container
jzgom067 Oct 18, 2025
54a017d
Fix button text wrapping
jzgom067 Oct 18, 2025
544fb93
Add dashboard data processing
jzgom067 Oct 18, 2025
aa65396
Fix key error
jzgom067 Oct 18, 2025
e91a366
Adjust grid spacing
jzgom067 Oct 18, 2025
55edeb4
Add more layout to dashboard events
jzgom067 Oct 18, 2025
18bf362
header spacer on top
mirmirmirr Oct 18, 2025
96213e5
adjust grid preview dialog for mobile display
mirmirmirr Oct 18, 2025
ffeca6f
adjust sidebar and attendees bar for results
mirmirmirr Oct 18, 2025
d88e338
add shadow to attendees panel
mirmirmirr Oct 18, 2025
959e5ca
Add WeekdayRow component
jzgom067 Oct 18, 2025
e6fbd4b
Change weekday row to continuous background
jzgom067 Oct 18, 2025
da22c35
Add DateRangeRow component
jzgom067 Oct 18, 2025
3948db8
Add extra grid column at XL screen size
jzgom067 Oct 18, 2025
823f99a
Adjust text colors on date and weekday ranges
jzgom067 Oct 18, 2025
d479970
Shorten dashboard date format
jzgom067 Oct 18, 2025
2d3199d
Add edit button to dashboard events
jzgom067 Oct 18, 2025
ba61258
Add copy link button to dashboard events
jzgom067 Oct 18, 2025
c55b5df
Fix text color on copy link button
jzgom067 Oct 18, 2025
e45434c
Add hover states to dashboard elements
jzgom067 Oct 18, 2025
cf6561b
Move copy button to separate component
jzgom067 Oct 18, 2025
f971def
Add event code to dashboard display
jzgom067 Oct 18, 2025
fcf8883
Adjust event title line height
jzgom067 Oct 18, 2025
49243ce
Remove dashboard tab button spacing
jzgom067 Oct 18, 2025
ed0cc0f
Merge branch 'main-preview' into new-dashboard
jzgom067 Oct 18, 2025
71ce8c6
Remove className prop from date rows
jzgom067 Oct 18, 2025
8a1033d
Shorten top spacing on day row
jzgom067 Oct 18, 2025
f19a88b
Add hover state to tab buttons
jzgom067 Oct 18, 2025
c3ccfe2
Add toast to copy button
jzgom067 Oct 18, 2025
7c89995
Change dashboard tab names
jzgom067 Oct 18, 2025
a6e9a2e
Fix account cookie name
jzgom067 Oct 18, 2025
d5ffddb
Change login context to have a null state
jzgom067 Oct 18, 2025
61a46c7
Add guest account notice to dashboard
jzgom067 Oct 18, 2025
d2fbb22
Fix Link inside of Link error
jzgom067 Oct 18, 2025
197edab
Fix preview timeblock error
jzgom067 Oct 18, 2025
4000e89
Fix week event data submission
jzgom067 Oct 18, 2025
3029740
Add strict equality checking to hours
jzgom067 Oct 18, 2025
76c47d5
Fix login button text wrap
mirmirmirr Oct 18, 2025
17a93f9
Add link to Create an account text
jzgom067 Oct 18, 2025
08253b0
Adjust corner rounding of guest info
jzgom067 Oct 18, 2025
3f8e223
Fix event grid child keys
jzgom067 Oct 18, 2025
5143d25
auth page button adjustments for dark mode
mirmirmirr Oct 18, 2025
4066f0c
adjust toast padding
mirmirmirr Oct 18, 2025
3f00d5a
results page icons
mirmirmirr Oct 18, 2025
a4e43dc
schedule-grid scroll auto
mirmirmirr Oct 18, 2025
130f575
change bottom action button to floating
mirmirmirr Oct 18, 2025
b78ac63
adjust spacing to be consistent with header
mirmirmirr Oct 18, 2025
dd588d4
uncenter header buttons
mirmirmirr Oct 18, 2025
7a8d5d8
do not allow custom code editing
mirmirmirr Oct 18, 2025
8659f8e
Merge pull request #35 from plan-cake/new-dashboard
mirmirmirr Oct 18, 2025
451829e
Merge branch 'main-preview' into small-ui-fixes
mirmirmirr Oct 18, 2025
3cae3eb
add loading pages
mirmirmirr Oct 19, 2025
749eb69
undo hard code for isCreator
mirmirmirr Oct 19, 2025
0d648a4
fixed dashboard spacing
mirmirmirr Oct 19, 2025
6307e6e
Remove archived components
jzgom067 Oct 19, 2025
b9ca3c5
Remove unused imports
jzgom067 Oct 19, 2025
8580499
Fix const linting errors
jzgom067 Oct 19, 2025
c0ec9be
Fix unused variable errors
jzgom067 Oct 19, 2025
2222731
Fix miscellaneous linting errors
jzgom067 Oct 19, 2025
78feee0
Fix ButtonData enum type errors
jzgom067 Oct 19, 2025
a15db91
Fix useEffect warnings
jzgom067 Oct 19, 2025
fa1b9ad
Add API data return types
jzgom067 Oct 19, 2025
0fd1b36
Propagate API detail types to fix linting errors
jzgom067 Oct 19, 2025
92c1b2e
Fix miscellaneous linting errors
jzgom067 Oct 19, 2025
ef19b25
Fix format API error type errors
jzgom067 Oct 19, 2025
12b57b2
Fix duration display
jzgom067 Oct 19, 2025
b12b944
Fix URL params build error
jzgom067 Oct 19, 2025
7230ba4
Fix session storage build error
jzgom067 Oct 19, 2025
15719ab
Fix new useEffect warning for email sent page
jzgom067 Oct 19, 2025
5ec712c
fix date range mismatch in drawer
mirmirmirr Oct 19, 2025
1d5a995
remove htmlFor
mirmirmirr Oct 19, 2025
800024c
add ids to all custom select dropdowns
mirmirmirr Oct 19, 2025
1b8165b
adjust month calendar styles
mirmirmirr Oct 19, 2025
8b051e2
add custom selectors
mirmirmirr Oct 19, 2025
7432d79
clean up
mirmirmirr Oct 19, 2025
b312f2c
change dark mode loading
mirmirmirr Oct 19, 2025
b0ea5c9
add event name guard
mirmirmirr Oct 19, 2025
386de2d
Update app/ui/components/selectors/duration-selector.tsx
mirmirmirr Oct 19, 2025
68708d6
Update app/ui/components/schedule/grid-preview-dialog.tsx
mirmirmirr Oct 19, 2025
ce6eec6
Update weekday-calendar.tsx
mirmirmirr Oct 19, 2025
357b750
Change logo area
jzgom067 Oct 19, 2025
66613c4
header spacer fix
mirmirmirr Oct 19, 2025
e6bd4a2
Landing page adjustment
jzgom067 Oct 19, 2025
e06ed1f
Merge pull request #36 from plan-cake/small-ui-fixes
jzgom067 Oct 19, 2025
6b03606
Merge branch 'main-preview' into build-error-fixes
jzgom067 Oct 19, 2025
003b386
Resolve ESLint error
jzgom067 Oct 19, 2025
f9a32b9
Re-add header padding
jzgom067 Oct 19, 2025
9fa66c4
Fix calendar component errors
jzgom067 Oct 20, 2025
913a91a
Re-add time zone to availability data
jzgom067 Oct 20, 2025
c5a25c8
Rename API URL .env attribute
jzgom067 Oct 20, 2025
824a909
Revert "Re-add header padding"
jzgom067 Oct 20, 2025
09e5c45
Fix Copilot complaints
jzgom067 Oct 20, 2025
a30da76
Fix header padding
jzgom067 Oct 20, 2025
db90000
Fix landing page buttons
jzgom067 Oct 20, 2025
bbd0ef9
Merge pull request #37 from plan-cake/build-error-fixes
mirmirmirr Oct 20, 2025
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
8 changes: 4 additions & 4 deletions .github/workflows/formatting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ jobs:
runs-on: ubuntu-latest

permissions:
contents: write # Required to push to the repo
contents: write # Required to push to the repo

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }} # Checkout PR branch
ref: ${{ github.head_ref }} # Checkout PR branch

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
node-version: "20"
cache: "npm"

- name: Install dependencies
run: npm ci
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,5 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

certificates
141 changes: 123 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,137 @@
# plancake Frontend
# Plancake Frontend

This repository contains the frontend code for plancake.
A modern, responsive web application for scheduling and meeting coordination built with Next.js 15, React 19, and Tailwind CSS.

## Getting Started
## Overview

To clone and run this application, [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer:
Plancake is a meeting scheduling tool that helps users coordinate availability across time zones. The application allows users to create events, share availability grids, and find optimal meeting times.

---

## Architecture

### Tech Stack

**Core Framework:**

- [Next.js 15.3.1](https://nextjs.org/) - React framework with App Router
- [React 19](https://react.dev/) - UI library
- [TypeScript 5](https://www.typescriptlang.org/) - Type safety

**Styling:**

- [Tailwind CSS 4.1.4](https://tailwindcss.com/) - Utility-first CSS framework
- [Tailwind Merge](https://github.com/dcastil/tailwind-merge) - Conditional class merging
- [clsx](https://github.com/lukeed/clsx) - Utility for constructing className strings

**UI Components:**

- [Radix UI](https://www.radix-ui.com/) - Accessible component primitives
- Dialog
- Popover
- Select
- Icons
- [Framer Motion](https://www.framer.com/motion/) - Animation library
- [Vaul](https://vaul.emilkowal.ski/) - Drawer component
- [next-themes](https://github.com/pacocoursey/next-themes) - Dark mode support

**Date/Time Handling:**

- [date-fns-tz](https://date-fns.org/) - Timezone utilities
- [react-day-picker](https://react-day-picker.js.org/) - Date picker component

**Development Tools:**

- [ESLint 9](https://eslint.org/) - Code linting
- [Prettier 3.5.3](https://prettier.io/) - Code formatting
- [Turbopack](https://turbo.build/pack) - Fast bundler (dev mode)

### `.env` Setup

Create a file called `.env` in the root directory, copying the contents of `example.env`.

Replace all values in the file with the relevant information.

## Local Development Setup

### Prerequisites

- **Node.js** 20+ (LTS recommended)
- **npm** 10+ or compatible package manager
- **Git** for version control

### Installation Steps

1. **Clone the repository**

```bash
https://github.com/plan-cake/frontend.git
cd frontend
```

2. **Install dependencies**

```bash
npm install
```

This will install all dependencies listed in [package.json](package.json), including:

- Next.js 15.3.1 with React 19
- Tailwind CSS 4.1.4
- Radix UI components
- TypeScript and type definitions

3. **Run the development server**

```bash
npm run dev
```

The application will start on `http://localhost:3000` using Turbopack for fast refresh.

4. **Open your browser**
Navigate to [http://localhost:3000](http://localhost:3000) to see the application.

### Available Scripts

```bash
npm install npm@latest -g
# Development server with Turbopack (fast refresh)
npm run dev

# Production build
npm run build

# Start production server (requires build first)
npm run start

# Lint code with ESLint
npm run lint

# Format code with Prettier
npm run format

# Check formatting without modifying files
npm run check-format
```

### Installation
### Building for Production

```bash
# Clone this repository
$ git clone https://github.com/tomeeto/frontend.git
# Create optimized production build
npm run build

# Install dependencies
$ npm install

# Run the app
$ npm run dev
# Test production build locally
npm run start
```

## Credits
The production build:

- Optimizes and minifies JavaScript/CSS
- Generates static pages where possible
- Creates optimized images
- Outputs to `.next/` directory

This project is built with the following:
---

- [Next.js](https://nextjs.org/)
- [Tailwind.css](https://tailwindcss.com/)
- [Radix UI Elements](https://www.radix-ui.com/)
**Made with** [Next.js](https://nextjs.org/) **•** [Tailwind CSS](https://tailwindcss.com/) **•** [Radix UI](https://www.radix-ui.com/)
26 changes: 26 additions & 0 deletions app/[event-code]/edit/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import HeaderSpacer from "@/app/ui/components/header/header-spacer";

export default function Loading() {
return (
<div className="flex animate-pulse flex-col space-y-4 pr-6 pl-6">
<HeaderSpacer />

<div className="flex w-full flex-wrap items-center justify-between md:flex-row">
<div className="h-12 w-3/4 rounded-3xl bg-gray-200 md:w-1/2 dark:bg-[#343249]" />
<div className="hidden h-10 w-50 rounded-full bg-gray-200 dark:bg-[#343249]" />
</div>

<div className="grid w-full grid-cols-1 grid-rows-[auto] gap-y-4 md:grow md:grid-cols-[200px_auto] md:grid-rows-[auto_auto] md:gap-x-4 md:gap-y-4">
<div className="hidden h-20 rounded-3xl bg-gray-200 md:block dark:bg-[#343249]" />
<div className="col-span-3 hidden h-20 rounded-3xl bg-gray-200 md:block dark:bg-[#343249]" />
<div className="hidden h-20 rounded-3xl bg-gray-200 md:col-start-1 md:row-start-2 md:block dark:bg-[#343249]" />
<div className="hidden h-120 rounded-3xl bg-gray-200 md:col-span-10 md:col-start-2 md:row-span-10 md:row-start-2 md:block dark:bg-[#343249]" />
<div className="hidden h-60 rounded-3xl bg-gray-200 md:col-start-1 md:row-start-11 md:block dark:bg-[#343249]" />

<div className="h-20 w-3/4 rounded-3xl bg-gray-200 md:hidden" />
<div className="h-20 w-3/4 rounded-3xl bg-gray-200 md:hidden" />
<div className="h-100 rounded-3xl bg-gray-200 md:hidden" />
</div>
</div>
);
}
23 changes: 23 additions & 0 deletions app/[event-code]/edit/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { EventCodePageProps } from "@/app/_lib/types/event-code-page-props";
import { fetchEventDetails } from "@/app/_utils/fetch-data";
import { processEventData } from "@/app/_utils/process-event-data";
import EventEditor from "../../ui/layout/event-editor";
import notFound from "../not-found";

export default async function Page({ params }: EventCodePageProps) {
const { "event-code": eventCode } = await params;

if (!eventCode) {
notFound();
}

const eventData = await fetchEventDetails(eventCode);
const { eventName, eventRange } = processEventData(eventData);

return (
<EventEditor
type="edit"
initialData={{ title: eventName, code: eventCode, eventRange }}
/>
);
}
28 changes: 28 additions & 0 deletions app/[event-code]/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import HeaderSpacer from "@/app/ui/components/header/header-spacer";

export default function Loading() {
return (
<div className="flex animate-pulse flex-col space-y-4 pr-6 pl-6">
<HeaderSpacer />

<div className="flex w-full flex-wrap items-center justify-between md:flex-row">
<div className="h-12 w-1/2 rounded-3xl bg-gray-200 dark:bg-[#343249]" />

<div className="h-10 w-40 rounded-full bg-gray-200 dark:bg-[#343249]" />
</div>

<div className="mb-8 flex h-full flex-col gap-4 md:mb-0 md:flex-row">
<div className="h-fit w-full shrink-0 space-y-6 overflow-y-auto md:w-80">
<div className="space-y-3">
<div className="h-8 w-3/4 rounded-3xl bg-gray-200 dark:bg-[#343249]" />
<div className="h-8 w-1/2 rounded-3xl bg-gray-200 dark:bg-[#343249]" />
</div>
<div className="hidden h-70 rounded-3xl bg-gray-200 md:block dark:bg-[#343249]" />
<div className="h-20 rounded-3xl bg-gray-200 dark:bg-[#343249]" />
</div>

<div className="h-96 w-full rounded-3xl bg-gray-200 dark:bg-[#343249]" />
</div>
</div>
);
}
3 changes: 3 additions & 0 deletions app/[event-code]/not-found.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function NotFound() {
return <div>404 - Page Not Found :p</div>;
}
31 changes: 31 additions & 0 deletions app/[event-code]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { notFound } from "next/navigation";
import { fetchEventDetails, fetchSelfAvailability } from "../_utils/fetch-data";
import { processEventData } from "../_utils/process-event-data";

import AvailabilityClientPage from "@/app/ui/layout/availability-page";
import { EventCodePageProps } from "../_lib/types/event-code-page-props";
import { getAuthCookieString } from "../_utils/cookie-utils";

export default async function Page({ params }: EventCodePageProps) {
const { "event-code": eventCode } = await params;
const authCookies = await getAuthCookieString();

if (!eventCode) {
notFound();
}

const [eventData, initialAvailabilityData] = await Promise.all([
fetchEventDetails(eventCode),
fetchSelfAvailability(eventCode, authCookies),
]);
const { eventName, eventRange } = processEventData(eventData);

return (
<AvailabilityClientPage
eventCode={eventCode}
eventName={eventName}
eventRange={eventRange}
initialData={initialAvailabilityData}
/>
);
}
26 changes: 26 additions & 0 deletions app/[event-code]/results/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import HeaderSpacer from "@/app/ui/components/header/header-spacer";

export default function Loading() {
return (
<div className="flex animate-pulse flex-col space-y-4 pr-6 pl-6">
<HeaderSpacer />

<div className="flex w-full flex-wrap items-center justify-between md:flex-row">
<div className="h-12 w-1/2 rounded-3xl bg-gray-200 dark:bg-[#343249]" />

<div className="h-10 w-50 rounded-full bg-gray-200 dark:bg-[#343249]" />
</div>

<div className="mb-8 flex h-full flex-col gap-4 md:mb-0 md:flex-row">
<div className="h-96 w-full rounded-3xl bg-gray-200 dark:bg-[#343249]" />

<div className="h-fit w-full shrink-0 space-y-4 overflow-y-auto md:w-80">
<div className="hidden h-20 rounded-3xl bg-gray-200 md:block dark:bg-[#343249]" />

<div className="hidden h-70 rounded-3xl bg-gray-200 md:block dark:bg-[#343249]" />
<div className="h-20 rounded-3xl bg-gray-200 dark:bg-[#343249]" />
</div>
</div>
</div>
);
}
36 changes: 36 additions & 0 deletions app/[event-code]/results/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { notFound } from "next/navigation";
import {
fetchEventDetails,
fetchAvailabilityData,
} from "@/app/_utils/fetch-data";
import { processEventData } from "@/app/_utils/process-event-data";

import ResultsPage from "@/app/ui/layout/results-page";
import { getAuthCookieString } from "@/app/_utils/cookie-utils";
import { EventCodePageProps } from "@/app/_lib/types/event-code-page-props";

export default async function Page({ params }: EventCodePageProps) {
const { "event-code": eventCode } = await params;
const authCookies = await getAuthCookieString();

if (!eventCode) {
notFound();
}

const [initialEventData, availabilityData] = await Promise.all([
fetchEventDetails(eventCode, authCookies),
fetchAvailabilityData(eventCode, authCookies),
]);

// Process the data here, on the server!
const { eventName, eventRange } = processEventData(initialEventData);

return (
<ResultsPage
eventCode={eventCode}
eventName={eventName} // Pass the processed name
eventRange={eventRange} // Pass the processed range
initialAvailabilityData={availabilityData}
/>
);
}
Loading