# 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