EdgeTimer organizes its screens into two groups: auth screens shown before login, and app screens shown after. The type system reflects this directly —Documentation Index
Fetch the complete documentation index at: https://mintlify.com/JulietaEM/EdgeTimer/llms.txt
Use this file to discover all available pages before exploring further.
AuthScreen covers 'role' | 'login' | 'register' and AppScreen covers 'home' | 'agenda' | 'perfil'. Both client and barber users move through the same screen names, but the content each screen renders adapts to the active role.
Auth screens
Role
The first screen every user sees. It displays two buttons — Barbero and Usuario — and no form fields. Tapping Barbero routes to the login screen with the barber role pre-selected. Tapping Usuario routes to registration, because new clients must create an account before they can log in.Barbers cannot self-register through the app. Barber accounts must be created through the backend directly.
Login
Collects email and password. The role chosen on the Role screen is passed invisibly; the backend returns a session token and a profile object on success. TheAuthorization: Bearer <token> header is then set on the shared Axios instance for all subsequent requests.
Clients see a “Don’t have an account? Register” link at the bottom. Barbers do not, because registration is not available for that role in the app. Both roles see a “Back to roles” link.
Register
Only accessible when the client role is active. Collects four fields:- Nombre — full name
- Email — used as the login identifier
- Teléfono — phone number
- Contraseña — password
App screens
After login, theAppShell component wraps all three app screens and provides consistent navigation. On desktop (≥ 820 px) a sidebar is always visible. On mobile a header bar with a toggle button reveals the menu on demand.
- Client flow
- Barber flow
Home — client view
The client home screen loads four data sets in parallel on mount: the barber catalog, the procedure catalog, the client’s own appointments, and all currently available time slots.Available slots sectionOpen slots published by barbers appear as cards showing the barber’s photo, name, date, and start time. Each card has a Reservar button that opens the Reserve modal.Reserve modal — the client selects one or more procedures from a pill-picker list. The app calculates the estimated end time and total cost in real time. Submitting posts to/citas/reservar and creates a confirmada appointment immediately.Barbers sectionAll registered barbers appear as cards with their photo, specialties, working hours, and average rating. Tapping a card navigates to that barber’s Perfil screen. Each card also has a Solicitar Cita button that opens the Request modal with the barber pre-selected.Request modal — the client picks a barber (if not pre-selected), one or more procedures, a date, and a preferred start time. The estimated duration and end time are shown. Submitting posts to /citas/solicitar, which creates a pending appointment request.Agenda — client view
The Agenda screen shows the client’s full appointment history, filtered by the active tab.| Tab | Contents |
|---|---|
| Proximas | Confirmed appointments with a future end time |
| Solicitadas | Appointments in pendiente, rechazada, or cancelada state |
| Pasadas | Completed appointments (realizada), sorted newest first |
| Calendario | Monthly calendar with a day detail panel (visible on narrow screens) |
- Reprogramar — opens a modal to pick a new date and start time (disabled within 1 day of the appointment)
- Cancelar — cancels the appointment (disabled within 1 day)
Perfil — client view
Displays the client’s profile photo, full name, username, and registration date. A Actualizar foto button opens the device image picker (requires media library permission on native). The selected image is uploaded to/catalogos/clientes/:id/foto.Clients can also reach a barber’s Perfil screen by tapping a barber card on Home. The barber’s Perfil shows their photo, average rating, working hours, and a grid of service cards listing each specialty with name, description, price, and duration.Screen type reference
src/types.ts
App component holds the active Screen in state and renders the correct screen. When the screen is one of the AppScreen values, AppShell wraps the content. Auth screens render inside a plain SafeAreaView with the app logo and a scroll-friendly layout.