# QuickPoll Next.js 15 Demo Project - Summary

## Project Description

QuickPoll is a complete polling application built with **Next.js 15**, **TypeScript**, and **Tailwind CSS**. Designed specifically for live-coding classroom demonstrations, it includes git tags at each development step.

## Technology Stack

- **Next.js 15** - React framework with App Router
- **TypeScript** - Fully typed JavaScript
- **Tailwind CSS** - Utility-first CSS framework
- **In-Memory Data** - Mock "database" for demo purposes
- **React Hooks** - useState for client-side state management

## Project Structure

```
quickpoll-demo/
├── src/
│   ├── app/                    # Next.js App Router
│   │   ├── page.tsx           # Homepage with poll list
│   │   ├── layout.tsx         # Root layout with navbar
│   │   ├── globals.css        # Global Tailwind styles
│   │   ├── loading.tsx        # Loading skeleton
│   │   ├── error.tsx          # Error boundary
│   │   ├── not-found.tsx      # 404 page
│   │   ├── api/               # API route handlers
│   │   │   └── polls/
│   │   │       ├── route.ts   # GET all, POST create
│   │   │       ├── [id]/
│   │   │       │   ├── route.ts      # GET single poll
│   │   │       │   ├── vote/route.ts # POST vote
│   │   │       │   └── not-found.tsx
│   │   ├── poll/[id]/         # Dynamic poll detail page
│   │   │   └── page.tsx
│   │   └── create/            # Create new poll page
│   │       └── page.tsx
│   ├── components/            # Reusable components
│   │   └── VoteForm.tsx       # Voting component
│   ├── lib/                   # Utilities and data
│   │   └── data.ts            # Mock poll data & functions
│   ├── types/                 # TypeScript interfaces
│   │   └── index.ts           # Poll, VoteBody, CreatePollBody
│   └── middleware.ts          # Request logging middleware
├── .cursorrules               # Code style guidelines
├── package.json
├── tsconfig.json
└── tailwind.config.ts
```

## Core Features

### 1. **Display Polls** (Homepage)
- Show all available polls as cards
- Display question, option count, total votes
- Click to navigate to poll detail page

### 2. **Poll Details** (Dynamic Page)
- Show full poll question and options
- Real-time voting results with percentage bars
- Server-rendered for SEO

### 3. **Vote on Polls** (VoteForm Component)
- Select an option
- Submit vote via POST API
- See results immediately after voting
- Purple theme with gradient progress bars

### 4. **Create Polls** (Bonus Step)
- Form to create new polls
- Input validation
- Dynamic option fields (add/remove)
- Automatic redirect to new poll

### 5. **API Routes**
- `GET /api/polls` - Get all polls
- `GET /api/polls/[id]` - Get single poll
- `POST /api/polls` - Create new poll
- `POST /api/polls/[id]/vote` - Vote on poll

### 6. **Middleware**
- Log all requests with timing
- Track API and poll page access

### 7. **Error Handling**
- Loading skeleton (Suspense)
- Error boundary component
- 404 pages (global and poll-specific)

## Git Tags for Progression

| Tag | Step | What's Added |
|-----|------|-------------|
| `stap-0` | Project Setup | Types, data, file structure, .cursorrules |
| `stap-1` | Layout & Navigation | Navbar, layout, metadata |
| `stap-2` | Homepage | Poll cards grid, Links |
| `stap-3` | API Routes | GET all, GET single, POST create |
| `stap-4` | Vote API & Demo | POST vote, Demo form at /demo |
| `stap-5` | Poll Detail Page | Dynamic [id] route, metadata |
| `stap-6` | VoteForm Component | Client component with voting logic |
| `stap-7` | Error Handling | loading.tsx, error.tsx, not-found.tsx |
| `stap-8` | Middleware | Request logging middleware |
| `bonus` | Create Poll | Full form, navbar link, remove demo |

## How to Use in Class

### Before Class
```bash
unzip quickpoll-demo-complete.zip
cd quickpoll-demo
npm install
npm run dev
```

### During Class
```bash
# Jump to any step
git checkout stap-3

# View what changed
git diff stap-2 stap-3

# Go to final version
git checkout bonus
```

### Demo the Voting API (stap-4)
1. Navigate to http://localhost:3000/demo
2. Show the form (projector)
3. Open DevTools Console to show logging
4. Open DevTools Network tab to show POST request
5. Display the fetch code example

## Teaching Points

### TypeScript & Types
- Define interfaces for data structures
- Export from `src/types/index.ts`
- Use types in function parameters

### Next.js Features
- App Router with file-based routing
- Dynamic routes: `[id]` creates `/poll/1`, `/poll/2`, etc.
- Server Components by default
- Client Components with "use client" directive
- API routes in `/app/api`
- Special files: `layout.tsx`, `not-found.tsx`, `error.tsx`, `loading.tsx`

### React Patterns
- Server Components (default, no interactivity)
- Client Components with useState
- Component composition (VoteForm in PollDetailPage)
- Fetch API for server communication

### Tailwind CSS
- Utility-first approach
- Responsive design (md:, lg: prefixes)
- Color system (purple-500, purple-600, purple-700)
- Hover states and transitions

### Form Handling
- Controlled inputs with useState
- Validation before submit
- Loading states during submission
- Error handling and feedback

## Sample Data

Three pre-loaded polls:

1. **"Wat is je favoriete programmeer taal?"**
   - JavaScript, Python, TypeScript, Rust
   - Sample votes: 45, 32, 28, 15

2. **"Hoe veel uur slaap krijg je per nacht?"**
   - < 6 uur, 6-8 uur, 8+ uur
   - Sample votes: 12, 68, 35

3. **"Welke framework gebruik je het meest?"**
   - React, Vue, Svelte, Angular
   - Sample votes: 89, 34, 12, 8

## Color Scheme

**Purple Theme for QuickPoll:**
- `#7c3aed` - purple-500 (main color)
- `#a855f7` - purple-600 (hover)
- `#9333ea` - purple-700 (pressed)

**Neutral Colors:**
- Gray-50 to Gray-900 for text and backgrounds
- White for cards and backgrounds
- Red-600 for error states
- Blue-50 for information

## Building & Deployment

### Build for Production
```bash
npm run build
npm start
```

### Build Verification
```bash
npm run build
```

Output shows:
- Static pages: `/`, `/create`
- Dynamic pages: `/poll/[id]`
- API routes: `/api/polls`, `/api/polls/[id]`, etc.
- Middleware (Proxy)

## Files Per Step

Each zip file contains the complete project at that step:
- All source code
- package.json with dependencies
- Configuration files
- **Excludes:** `node_modules/`, `.next/`, `.git/`

The `quickpoll-demo-complete.zip` includes:
- Full git history
- All commits and tags
- Ability to `git checkout` any step

## Typical Class Flow

1. **stap-0 to stap-2** - Show basic structure and homepage (15 min)
2. **stap-3** - Explain API routes (10 min)
3. **stap-4** - Demo the voting API in action (15 min) ⭐ Key demo point
4. **stap-5 to stap-6** - Build the voting interface (15 min)
5. **stap-7 to stap-8** - Error handling and middleware (10 min)
6. **bonus** - Create poll feature (optional, 10 min)

## Key Takeaways for Students

- Next.js makes building full-stack apps easy
- Server Components are the default (simpler, faster)
- API routes live alongside your pages
- TypeScript catches errors early
- Tailwind makes styling fast and consistent
- Git tags let you track feature development

## Common Questions

**Q: Is this production-ready?**
A: No - it uses in-memory data. For production, add a real database like PostgreSQL or MongoDB.

**Q: Can I add authentication?**
A: Yes - add NextAuth.js or similar. Future lesson!

**Q: How do I deploy this?**
A: Deploy to Vercel (created by Next.js team) or any Node.js hosting. See https://nextjs.org/docs/app/building-your-application/deploying

**Q: Can students modify the code?**
A: Absolutely! Use it as a starting point for assignments.

---

**Created:** March 2026
**Next.js Version:** 15.x
**Node Version:** 18+ recommended
