React y Angular son algunos de los frameworks y librerías de JavaScript más utilizados por lxs desarrolladorxs alrededor del mundo, y hay una razón para eso. En el contexto del navegador, mantener la interfaz sincronizada con el estado es difícil. Al elegir un framework o librería para nuestra interfaz, nos apoyamos en una serie de convenciones e implementaciones probadas y documentadas para resolver un problema común a toda interfaz web. Esto nos permite concentrarnos mejor (dedicar más tiempo) en las características específicas de nuestra aplicación.
Cuando elegimos una de estas tecnologías no solo importamos un pedacito de código para reusarlo (lo cuál es un gran valor per se), si no que adoptamos una arquitectura, una serie de principios de diseño, un paradigma, unas abstracciones, un vocabulario, una comunidad, etc.
Como desarrolladora Front-end, estos kits de desarrollo pueden resultarte de gran ayuda para implementar rápidamente características de los proyectos en los que trabajes.
Un pequeño restaurante de hamburguesas, que está creciendo, necesita un sistema a través del cual puedan tomar pedidos usando una tablet, y enviarlos a la cocina para que se preparen ordenada y eficientemente.
Este proyecto tiene dos áreas: interfaz (cliente) y API (servidor). Nuestra clienta nos ha solicitado desarrollar la interfaz que se integre con una API.
Esta vez tenemos un proyecto 100% por encargo. Si bien siempre puedes (y debes) hacer sugerencias de mejoras y/o cambios, muchas veces trabajarás en proyectos en los que primero hay que asegurarse de cumplir con lo requerido.
Esta es la información que tenemos de la clienta:
Somos Burguer Queen, una cadena de comida 24hrs.
Nuestra propuesta de servicio 24hrs ha tenido muy buena acogida y, para seguir creciendo, necesitamos un sistema que nos ayude a tomar los pedidos de nuestrxs clientxs.
Tenemos 2 menús: uno muy sencillo para el desayuno:
Ítem Precio $ Café americano 5 Café con leche 7 Sandwich de jamón y queso 10 Jugo de frutas natural 7 Y otro menú para el resto del día:
Ítem Precio Hamburguesas $ Hamburguesa simple 10 Hamburguesa doble 15 Acompañamientos $ Papas fritas 5 Aros de cebolla 5 Para tomar $ Agua 500ml 5 Agua 750ml 7 Bebida/gaseosa 500ml 7 Bebida/gaseosa 750ml 10 Nuestrxs clientxs son bastante indecisos, por lo que es muy común que cambien el pedido varias veces antes de finalizarlo.
La interfaz debe mostrar los dos menús (desayuno y resto del día), cada uno con todos sus productos. La usuaria debe poder ir eligiendo qué productos agregar y la interfaz debe ir mostrando el resumen del pedido con el costo total.
Además la clienta nos ha dado un link a la documentación que especifica el comportamiento esperado de la API HTTP que deberás consumir. Ahí puedes encontrar todos los detalles de los endpoints, como por ejemplo qué parámetros esperan, qué deben responder, etc.
El objetivo principal de es aprender a construir una interfaz web usando el framework elegido (React, Angular o Vue). Todos estos frameworks de Front-end tratan de solucionar el mismo problema: cómo mantener la interfaz y el estado sincronizados. Así que esta experiencia espera familiarizarte con el concepto de estado de pantalla, y como cada cambio sobre el estado se va a ir reflejando en la interfaz (por ejemplo, cada vez que agregamos un producto a un pedido, la interfaz debe actualizar la lista del pedido y el total).
Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo.
[ ] Uso de HTML semántico
* [HTML semántico](https://curriculum.laboratoria.la/es/topics/html/02-html5/02-semantic-html) * [Semantics - MDN Web Docs Glossary](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML)
[ ] Uso de selectores de CSS
* [Intro a CSS](https://curriculum.laboratoria.la/es/topics/css/01-css/01-intro-css) * [CSS Selectors - MDN](https://developer.mozilla.org/es/docs/Web/CSS/CSS_Selectors)
[ ] Modelo de caja (box model): borde, margen, padding
* [Box Model & Display](https://curriculum.laboratoria.la/es/topics/css/01-css/02-boxmodel-and-display) * [The box model - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model) * [Introduction to the CSS box model - MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) * [CSS display - MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/display) * [display - CSS Tricks](https://css-tricks.com/almanac/properties/d/display/)
[ ] Uso de flexbox en CSS
* [A Complete Guide to Flexbox - CSS Tricks](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) * [Flexbox Froggy](https://flexboxfroggy.com/#es) * [Flexbox - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox)
[ ] Uso de CSS Grid Layout
* [A Complete Guide to Grid - CSS Tricks](https://css-tricks.com/snippets/css/complete-guide-grid/) * [Grids - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids)
[ ] Uso de media queries
* [CSS media queries - MDN](https://developer.mozilla.org/es/docs/CSS/Media_queries)
[ ] Pruebas unitarias (unit tests)
* [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started)
[ ] Pruebas asíncronas
* [Tests de código asincrónico con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/asynchronous)
[ ] Uso de mocks y espías
* [Manual Mocks con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/manual-mocks)
[ ] Módulos de ECMAScript (ES Modules)
* [import - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/import) * [export - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/export)
[ ] Uso de linter (ESLINT)
[ ] Uso de identificadores descriptivos (Nomenclatura y Semántica)
[ ] Git: Instalación y configuración
[ ] Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)
[ ] Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)
[ ] GitHub: Creación de cuenta y repos, configuración de llaves SSH
[ ] GitHub: Despliegue con GitHub Pages
* [Sitio oficial de GitHub Pages](https://pages.github.com/)
[ ] GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)
[ ] GitHub: Organización en Github (projects | issues | labels | milestones | releases)
[ ] Consulta o petición (request) y respuesta (response).
* [Generalidades del protocolo HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Overview) * [Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages)
[ ] Cabeceras (headers)
* [HTTP headers - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Headers)
[ ] Cuerpo (body)
* [Cuerpo de Mensajes HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Messages#cuerpo)
[ ] Verbos HTTP
* [Métodos de petición HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Methods)
[ ] Códigos de status de HTTP
* [Códigos de estado de respuesta HTTP - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/Status) * [The Complete Guide to Status Codes for Meaningful ReST APIs - dev.to](https://dev.to/khaosdoctor/the-complete-guide-to-status-codes-for-meaningful-rest-apis-1-5c5)
[ ] Encodings y JSON
* [Introducción a JSON - Documentación oficial](https://www.json.org/json-es.html)
[ ] CORS (Cross-Origin Resource Sharing)
* [Control de acceso HTTP (CORS) - MDN](https://developer.mozilla.org/es/docs/Web/HTTP/CORS)
[ ] Components & templates
* [Angular Components Overview - Documentación oficial (en inglés)](https://angular.io/guide/component-overview) * [Introduction to components and templates - Documentación oficial (en inglés)](https://angular.io/guide/architecture-components#introduction-to-components)
[ ] Directivas estructurales (ngIf / ngFor)
* [Writing structural directives - Documentación oficial (en inglés)](https://angular.io/guide/structural-directives)
[ ] @Input | @Output
* [Component interaction - Documentación oficial (en inglés)](https://angular.io/guide/component-interaction#component-interaction)
[ ] Creación y uso de servicios
* [Providing services - Documentación oficial (en inglés)](https://angular.io/guide/architecture-services#providing-services)
[ ] Manejo de rutas
* [In-app navigation: routing to views - Documentación oficial (en inglés)](https://angular.io/guide/router)
[ ] Creación y uso de Observables.
* [Observables in Angular - Documentación oficial (en inglés)](https://angular.io/guide/observables-in-angular)
[ ] Uso de HttpClient
* [Communicating with backend services using HTTP - Documentación oficial (en inglés)](https://angular.io/guide/http)
[ ] Estilos de componentes (ngStyle / ngClass)
* [Template syntax - Documentación oficial (en inglés)](https://angular.io/guide/template-syntax#built-in-directives)
[ ] JSX
* [Presentando JSX - Documentación oficial](https://es.react.dev/learn/writing-markup-with-jsx)
[ ] Componentes y propiedades (props)
* [Componentes y propiedades - Documentación oficial](https://es.react.dev/learn/passing-props-to-a-component)
[ ] Manejo de eventos
* [Manejando eventos - Documentación oficial](https://es.react.dev/learn/responding-to-events)
[ ] Listas y keys
* [Listas y keys - Documentación oficial](https://es.react.dev/learn/rendering-lists)
[ ] Renderizado condicional
* [Renderizado condicional - Documentación oficial](https://es.react.dev/learn/conditional-rendering)
[ ] Elevación de estado
* [Levantando el estado - Documentación oficial](https://es.react.dev/learn/sharing-state-between-components)
[ ] Hooks
* [Presentando Hooks - Documentación oficial](https://es.react.dev/reference/react)
[ ] CSS modules
* [Adding a CSS Modules Stylesheet - Documentación de Create React App (en inglés)](https://vitejs.dev/guide/features.html#css-modules)
[ ] React Router
* [Quick Start - Documentación oficial (en inglés)](https://reactrouter.com/en/main/start/tutorial)
[ ] Instancia de Vue.js
* [La instancia Vue - Documentación oficial](https://es.vuejs.org/v2/guide/instance.html)
[ ] Datos y métodos
* [Datos y Métodos - Documentación oficial](https://es.vuejs.org/v2/guide/instance.html#Datos-y-Metodos)
[ ] Uso y creación de componentes
* [Conceptos Básicos de Componentes - Documentación oficial](https://es.vuejs.org/v2/guide/components.html)
[ ] Props
* [Pasando datos a componentes secundarios con Props - Documentación oficial](https://es.vuejs.org/v2/guide/components.html#Pasando-datos-a-componentes-secundarios-con-Props)
[ ] Directivas (v-bind | v-model)
* [v-bind - Documentación oficial](https://es.vuejs.org/v2/api/#v-bind) * [Binding en Formularios - Documentación oficial](https://es.vuejs.org/v2/guide/forms.html)
[ ] Iteración (v-for)
* [Mapeando una matriz a elementos con v-for - Documentación oficial](https://es.vuejs.org/v2/guide/list.html#Mapeando-una-matriz-a-elementos-con-v-for)
[ ] Eventos (v-on)
* [Manejo de eventos - Documentación oficial](https://es.vuejs.org/v2/guide/events.html)
[ ] Propiedades Computadas y Observadores
* [Propiedades Computadas y Observadores](https://es.vuejs.org/v2/guide/computed.html)
[ ] Routing
* [Getting Started - Documentación oficial de Vue Router](https://router.vuejs.org/guide/#html)
[ ] Clases y Estilos
* [Enlace Clases y Estilos - Documentación oficial](https://es.vuejs.org/v2/guide/class-and-style.html)
[ ] Chequeo estático de tipos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/basic-types.html#static-type-checking)
[ ] Rigurosidad
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/basic-types.html#strictness) * [Documentación oficial de Typescript](https://www.typescriptlang.org/tsconfig#Type_Checking_6248)
[ ] Tipos primitivos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#the-primitives-string-number-and-boolean)
[ ] Arreglos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#arrays)
[ ] Tipo any
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#any)
[ ] Funciones
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#functions) * [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/functions.html)
[ ] Propiedades opcionales
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#optional-properties)
[ ] Tipos Union
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#union-types)
[ ] Alias de tipos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-aliases)
[ ] Interfaces
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#interfaces)
[ ] Type assertions
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions)
[ ] Tipos literales
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types)
[ ] basic-types/null-and-undefined
[ ] Enums
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums)
[ ] Narrowing
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/narrowing.html)
[ ] classes/members/fields
[ ] classes/members/constructor
[ ] classes/members/methods
[ ] classes/members/getter-setters
[ ] classes/class-heritage/implements
[ ] classes/class-heritage/extends
[ ] classes/member-visibility/public
[ ] classes/member-visibility/protected
[ ] classes/member-visibility/private
[ ] Miembros de clase estáticos
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#static-members)
[ ] this
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#this-at-runtime-in-classes)
[ ] Clases abstractas
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/2/classes.html#abstract-classes-and-members)
[ ] Decoradores
* [Documentación oficial de Typescript](https://www.typescriptlang.org/docs/handbook/decorators.html)
[ ] Crear prototipos de alta fidelidad que incluyan interacciones
[ ] Seguir los principios básicos de diseño visual
[ ] Planear y ejecutar testeos de usabilidad de prototipos en distintos niveles de fidelidad
* [Intro a testeos usabilidad](https://coda.io/@bootcamp-laboratoria/contenido-ux/test-de-usabilidad-15) * [Pruebas con Usuarios 1 — ¿Qué, cuándo y para qué testeamos?](https://eugeniacasabona.medium.com/pruebas-con-usuarios-1-qu%C3%A9-cu%C3%A1ndo-y-para-qu%C3%A9-testeamos-7c3a89b4b5e7)
Este proyecto se debe "resolver" en duplas y para trabajar con el backend te sugerimos elegir un metodo entre las siguientes opciones:
Usando una mock API. Puedes crear tu propia mock API con las herramientas json-server y json-server-auth o puedes hacer fork y clonar este repo de una mock API.
Consumiendo una API desplegada. Puedes usar una que desarrollarán tus compañeras o puedes usar esta API que hemos desarrollado.
Puedes empezar usando una mock API y en cualquier momento del proyecto pasarte a la API desplegada. Esta situación suele ocurrir en Desarrollo Web cuando se necesita avanzar con la implementación del frontend mientras las personas encargadas del backend aún están en proceso de diseño o desarrollo de la API.
El rango de tiempo estimado para completar el proyecto es de 3 a 5 Sprints.
Trabaja en una historia hasta terminarla antes de pasar a la siguiente. Trabaja hasta la historia que puedas en el tiempo especificado.
La lógica del proyecto debe estar implementada completamente en JavaScript (ES6+), HTML y CSS y empaquetada de manera automatizada.
Uno de los mayores objetivos de este proyecto es aprender a usar una librería o framework popular para desarrollar una web app. Debes elegir entre React o Angular.
Ten en cuenta que si eliges Angular, tienes la obligación de usar TypeScript. Typescript es un lenguaje de programación fuertemente tipado basado en javascript.
Si eliges React, la decisión de usar Typescript es opcional (pero te lo recomendamos!). Aquí puedes encontrar más información en relación a cómo iniciar tu proyecto con Typescript y React.
La aplicación debe ser un Single Page App. Los pedidos los tomaremos desde una tablet, pero no queremos una app nativa, sino una web app que sea mobile-first.
Necesitamos pensar bien en el aspecto UX de de quienes van a tomar los pedidos, el tamaño y aspecto de los botones, la visibilidad del estado actual del pedido, etc.
La aplicación desplegada debe tener 80% o más el las puntuaciones de Performance, Progressive Web App, Accessibility y Best Practices de Lighthouse.
La aplicación debe hacer uso de npm-scripts
y contar con scripts start
,
test
, build
y deploy
, que se encarguen de arrancar, correr las pruebas,
empaquetar y desplegar la aplicación respectivamente.
Los tests unitarios deben cubrir un mínimo del 90% de statements, functions, lines y branches.
Por otro lado, deberás definir la estructura de carpetas y archivos que consideres necesaria. Puedes guiarte de las convenciones del framework elegido. Por ende, los tests y el setup necesario para ejecutarlos, serán hechos por ti.
El Product Owner nos presenta este backlog que es el resultado de su trabajo con el clientx hasta hoy.
Yo como meserx quiero poder ingresar al sistema de pedidos.
Lo que debe ocurrir para que se satisfagan las necesidades del usuario.
Lo acordado que debe ocurrir para decir que la historia está terminada.
Yo como meserx quiero tomar el pedido de unx clientx para no depender de mi mala memoria, para saber cuánto cobrar, y enviarlo a la cocina para evitar errores y que se puedan ir preparando en orden.
Lo que debe ocurrir para que se satisfagan las necesidades del usuario
Lo acordado que debe ocurrir para decir que la historia está terminada.
Yo como jefx de cocina quiero ver los pedidos de lxs clientxs en orden y marcar cuáles están listos para saber qué se debe cocinar y avisar a lxs meserxs que un pedido está listo para servirlo a un clientx.
Yo como meserx quiero ver los pedidos que están preparados para entregarlos rápidamente a lxs clientxs que las hicieron.
Yo como administrador(a) de tienda quiero gestionar a los usuarios de la plataforma para mantener actualizado la informacion de mis trabajadorxs.
Yo como administrador(a) de tienda quiero gestionar los productos para mantener actualizado el menú.
Puedes elegir el proveedor (o proveedores) que prefieras junto con el mecanismo de despligue y estrategia de alojamiento. Recuerda que si mockeaste la API, también tienes que desplegarla. Te recomendamos explorar las siguientes opciones:
Súmate al canal de Slack #project-bq-api-client para conversar y pedir ayuda del proyecto.