README bilingue: Português e English
Ignite Café é uma aplicação React (Vite + TypeScript) construída como parte do desafio "Coffee Delivery" da trilha ReactJS do Ignite (Rocketseat). O app simula uma cafeteria online, permitindo adicionar cafés ao carrinho, ajustar quantidades, preencher o endereço, escolher forma de pagamento e confirmar o pedido, exibindo um resumo na página de sucesso.
- Listagem de produtos (cafés) com nome, descrição, preço e tags.
- Adicionar ao carrinho e controlar quantidade de cada item.
- Remover item do carrinho.
- Cálculo automático:
- Total de itens (somatório dos preços x quantidades)
- Taxa de entrega fixa (R$ 3,50 quando há itens)
- Total geral (itens + entrega)
- Formulário de endereço com React Hook Form + Zod.
- Seleção de forma de pagamento.
- Contador de produtos no carrinho exibido no Header.
- Página de sucesso com resumo do pedido (endereço, previsão, forma de pagamento).
- React 18 + Vite 4 + TypeScript 5
- styled-components (tema, GlobalStyle e componentes estilizados)
- react-router-dom (rotas: Home, Checkout, Success)
- react-hook-form + zod (formulários e validação)
- Context API + useReducer + immer (estado global e imutabilidade do carrinho)
- phosphor-react (ícones)
- uuid (IDs únicos)
- ESLint com @rocketseat/eslint-config
npm run dev— inicia o servidor de desenvolvimento (Vite)npm run build— compila o projeto (TypeScript + Vite)npm run preview— pré-visualiza a versão de produçãonpm run lint— executa o ESLint na pastasrc
- Node.js 18+ (recomendado)
- npm 9+ ou outro gerenciador de pacotes equivalente
- Instale as dependências:
npm install
- Execute em modo desenvolvimento:
npm run dev
- Build de produção:
npm run build
- Pré-visualização do build:
npm run preview
ignite-cafe/
├─ public/
│ └─ assets/ (imagens dos produtos e ilustrações)
├─ src/
│ ├─ components/
│ │ └─ Header/ (logo, localização, botão de carrinho)
│ ├─ contexts/
│ │ ├─ Cart/ (CartContextProvider)
│ │ └─ Order/ (OrderContext)
│ ├─ layouts/
│ │ └─ DefaultLayout/ (Header + Outlet)
│ ├─ pages/
│ │ ├─ Home/ (listagem de cafés)
│ │ ├─ Checkout/ (endereço, pagamento, carrinho)
│ │ └─ Success/ (resumo do pedido)
│ ├─ reducers/
│ │ └─ cart/ (actions + reducer com immer)
│ ├─ mocks/
│ │ └─ products.ts (dados mockados dos cafés)
│ ├─ styles/ (GlobalStyle, tema default)
│ ├─ utils/
│ │ └─ formatPrice.ts (formatação BRL)
│ ├─ App.tsx, Router.tsx, main.tsx
└─ package.json
- GlobalProvider: envolve o app com
OrderContextProvidereCartContextProvider. - CartContext (estado global do carrinho):
- Estado:
cart[],productsTotalPrice,deliveryPrice,cartTotalPrice. - Ações:
addInCart,removeFromCart,increaseQuantity,decreaseQuantity,cleanCart. - Reducer: calcula totais e aplica imutabilidade com
immer.
- Estado:
- OrderContext: armazena pedidos confirmados e permite
setInOrders(order). - Router: rotas
"/"(Home),"/checkout"(Checkout) e"/success/:orderId"(Success), dentro doDefaultLayout(Header + Outlet). - Estilização:
styled-componentscom tema (styles/themes/default.ts) eGlobalStyle(styles/global.ts). - Dados:
src/mocks/products.tsdefine a interfaceIProducte uma lista mockada de cafés. - Utilitário:
formatPrice.tsformata valores no padrãopt-BRcom moedaBRL.
- Na Home, selecione cafés e adicione ao carrinho.
- No Checkout, ajuste quantidades, preencha o endereço e selecione o pagamento.
- Confirme o pedido para limpar o carrinho e ser redirecionado para a página de sucesso, que exibe o resumo.
- O badge do carrinho no Header exibe a quantidade de produtos distintos (
cart.length). Se desejar exibir o total de unidades, somequantitydos itens. - A taxa de entrega é fixa (R$ 3,50) quando o carrinho possui itens.
- A validação com Zod está básica (
string()); regras mais rígidas (min length, padrões) podem ser adicionadas conforme necessidade. - No estado atual, não há persistência em
localStorage. Caso deseje persistir o carrinho/pedido entre recargas, é possível integrarlocalStorageou outra estratégia.
- Notion: https://efficient-sloth-d85.notion.site/Desafio-02-Coffee-Delivery-30e42a21fdb44b09a85244fc2c3dbdf9
- Figma: https://www.figma.com/file/5yT9ZzZmRQRS4yivGGB3pl/Coffee-Delivery/duplicate
Este repositório não declara uma licença explícita.
Ignite Café is a React application (Vite + TypeScript) built as part of the "Coffee Delivery" challenge from the Ignite ReactJS track (Rocketseat). It simulates an online coffee shop: add coffees to the cart, adjust quantities, fill in the address, choose a payment method, confirm the order, and see a summary on the success page.
- Products listing with name, description, price, and tags.
- Add to cart and control item quantity.
- Remove items from cart.
- Automatic calculation:
- Items subtotal (sum of price × quantity)
- Fixed delivery fee (R$ 3.50 when there are items)
- Grand total (subtotal + delivery)
- Address form powered by React Hook Form + Zod.
- Payment method selection.
- Cart count badge displayed in the Header.
- Success page with order summary (address, ETA, payment method).
- React 18 + Vite 4 + TypeScript 5
- styled-components (theme, GlobalStyle, styled components)
- react-router-dom (routing: Home, Checkout, Success)
- react-hook-form + zod (forms and validation)
- Context API + useReducer + immer (global state and immutability)
- phosphor-react (icons)
- uuid (unique IDs)
- ESLint with @rocketseat/eslint-config
npm run dev— start the development server (Vite)npm run build— build the project (TypeScript + Vite)npm run preview— preview the production buildnpm run lint— run ESLint onsrc
- Node.js 18+ (recommended)
- npm 9+ or equivalent package manager
- Install dependencies:
npm install
- Run in development mode:
npm run dev
- Production build:
npm run build
- Preview the build:
npm run preview
ignite-cafe/
├─ public/
│ └─ assets/ (product images and illustrations)
├─ src/
│ ├─ components/
│ │ └─ Header/ (logo, location tag, cart button)
│ ├─ contexts/
│ │ ├─ Cart/ (CartContextProvider)
│ │ └─ Order/ (OrderContext)
│ ├─ layouts/
│ │ └─ DefaultLayout/ (Header + Outlet)
│ ├─ pages/
│ │ ├─ Home/
│ │ ├─ Checkout/
│ │ └─ Success/
│ ├─ reducers/
│ │ └─ cart/ (actions + reducer with immer)
│ ├─ mocks/
│ │ └─ products.ts (mocked products data)
│ ├─ styles/ (GlobalStyle, default theme)
│ ├─ utils/
│ │ └─ formatPrice.ts (BRL formatting)
│ ├─ App.tsx, Router.tsx, main.tsx
└─ package.json
- GlobalProvider: wraps the app with
OrderContextProviderandCartContextProvider. - CartContext (global cart state):
- State:
cart[],productsTotalPrice,deliveryPrice,cartTotalPrice. - Actions:
addInCart,removeFromCart,increaseQuantity,decreaseQuantity,cleanCart. - Reducer: computes totals and uses
immerto ensure immutability.
- State:
- OrderContext: stores confirmed orders and exposes
setInOrders(order). - Router: routes
"/"(Home),"/checkout"(Checkout),"/success/:orderId"(Success) insideDefaultLayout(Header + Outlet). - Styling:
styled-componentswith theme (styles/themes/default.ts) andGlobalStyle(styles/global.ts). - Data:
src/mocks/products.tsdefinesIProductand a mocked list. - Utility:
formatPrice.tsformats currency inpt-BRandBRL.
- On Home, select coffees and add them to the cart.
- On Checkout, adjust quantities, fill in the address and select the payment method.
- Confirm the order to clear the cart and be redirected to the success page, which shows the order summary.
- The cart badge in the Header shows the number of distinct products (
cart.length). If you want the total of units, sum thequantityof the items. - The delivery fee is fixed (R$ 3.50) when the cart has items.
- Current Zod validation is basic (
string()); stricter rules (min length, patterns) can be added. - As of now, there is no
localStoragepersistence. If desired, add persistence for cart/order across reloads.
- Notion: https://efficient-sloth-d85.notion.site/Desafio-02-Coffee-Delivery-30e42a21fdb44b09a85244fc2c3dbdf9
- Figma: https://www.figma.com/file/5yT9ZzZmRQRS4yivGGB3pl/Coffee-Delivery/duplicate
No explicit license declared in this repository.