Lesson 16 · Project
Final project: Kanban
Put everything together into one app.
Loading lesson…
Lesson 16 · Project
Put everything together into one app.
Loading lesson…
Nobody builds a house by hanging the curtains first and then looking for where to put the walls. The order is the opposite: a plan (where the rooms will be), the foundations, the shell, then the wiring and plumbing – and the furniture last. Each phase stands on the previous one, and when the foundations are done well, the upper floors hold up on their own.
An app is built the same way:
Now it's time to put everything together. Build a Kanban board – a small but real app that uses most of what you've learned. Work through the milestones and tick each one off.
Before you tackle the whole kanban, warm up on its smallest part – a single card.
CHALLENGE: A task card
The task list and the delete function are done. The TaskCard component doesn't show anything yet.
1. In TaskCard, render the task title: {task.title}
2. Make the "×" button call onDelete(task.id)
This is the smallest piece of the kanban you'll build in the project below.row, stack, card, list, btn, input or muted are the course's ready-made styles in src/styles.css (row = side by side, stack = stacked, card = bordered box, muted = grey text).Loading the interactive part…
Before you start writing, think about these questions. Each one matches an image from the course: a notebook (state), a bank account (reducer), a loudspeaker (Context), a drawer (ref), the light in a room (effect). The reference solution picks the answers in the right-hand column – yours may differ.
| Question | Reference solution | Why |
|---|---|---|
| Where do the cards live? | useReducer + Context | Many different actions on the same data (the bank account), and several components need it (the loudspeaker). State and dispatch in separate contexts. |
| Do I store the column in the card, or the cards in the columns? | column in the card, a flat array | Moving = changing one value, no copying between arrays. The card counts in the columns are simply computed. |
| Where is the search text? | Local useState in Board | A thing in one component's pocket. In an app with a router it would belong in the address (the wish list for a room). |
| A card edit in progress? | A local draft in the modal | Papers on the desk: it goes to the "bank" only after Save, so Cancel doesn't have to undo anything. |
| How does undo work? | A history in the reducer | The reducer is the only place where changes happen – the bank statement comes for free. |
| Persistence? | An effect syncs cards → localStorage | localStorage is the outside world (the light in the room); the reducer's lazy initialization loads it on start. |
Try the reference solution in the "Reference solution" tab – it saves to localStorage, so it survives a reload.
Medium and hard challenges are a bonus for signed-in readers. Signing up is free – just an e-mail, no password.