@acvl/mobile-components 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +146 -2
- package/assets/fonts/Inter_400Regular.ttf +0 -0
- package/assets/fonts/Inter_500Medium.ttf +0 -0
- package/assets/fonts/Inter_600SemiBold.ttf +0 -0
- package/assets/fonts/Inter_700Bold.ttf +0 -0
- package/assets/fonts/Inter_800ExtraBold.ttf +0 -0
- package/assets/fonts/Inter_900Black.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/lib/module/componentes/AccionesDelEncabezado.js +212 -0
- package/lib/module/componentes/AccionesDelEncabezado.js.map +1 -0
- package/lib/module/componentes/BotonDeAvatar.js +55 -0
- package/lib/module/componentes/BotonDeAvatar.js.map +1 -0
- package/lib/module/componentes/BotonGrande.js +105 -0
- package/lib/module/componentes/BotonGrande.js.map +1 -0
- package/lib/module/componentes/CabeceraEmpujada.js +101 -0
- package/lib/module/componentes/CabeceraEmpujada.js.map +1 -0
- package/lib/module/componentes/Chip.js +77 -0
- package/lib/module/componentes/Chip.js.map +1 -0
- package/lib/module/componentes/ContenidoDePantalla.js +56 -0
- package/lib/module/componentes/ContenidoDePantalla.js.map +1 -0
- package/lib/module/componentes/EstadoVacio.js +65 -0
- package/lib/module/componentes/EstadoVacio.js.map +1 -0
- package/lib/module/componentes/Foto.js +106 -0
- package/lib/module/componentes/Foto.js.map +1 -0
- package/lib/module/componentes/IconoDeRenglon.js +44 -0
- package/lib/module/componentes/IconoDeRenglon.js.map +1 -0
- package/lib/module/componentes/Logo.js +44 -0
- package/lib/module/componentes/Logo.js.map +1 -0
- package/lib/module/componentes/Nota.js +51 -0
- package/lib/module/componentes/Nota.js.map +1 -0
- package/lib/module/componentes/OpcionesExcluyentes.js +69 -0
- package/lib/module/componentes/OpcionesExcluyentes.js.map +1 -0
- package/lib/module/componentes/PantallaDeError.js +84 -0
- package/lib/module/componentes/PantallaDeError.js.map +1 -0
- package/lib/module/componentes/Pestanas.js +87 -0
- package/lib/module/componentes/Pestanas.js.map +1 -0
- package/lib/module/componentes/Rotulo.js +28 -0
- package/lib/module/componentes/Rotulo.js.map +1 -0
- package/lib/module/componentes/RotuloDeSeccion.js +87 -0
- package/lib/module/componentes/RotuloDeSeccion.js.map +1 -0
- package/lib/module/componentes/Tarjeta.js +47 -0
- package/lib/module/componentes/Tarjeta.js.map +1 -0
- package/lib/module/componentes/TarjetaDeDatos.js +79 -0
- package/lib/module/componentes/TarjetaDeDatos.js.map +1 -0
- package/lib/module/componentes/TiraDeFotos.js +184 -0
- package/lib/module/componentes/TiraDeFotos.js.map +1 -0
- package/lib/module/componentes/VisorDeFoto.js +171 -0
- package/lib/module/componentes/VisorDeFoto.js.map +1 -0
- package/lib/module/componentes/logos/bola-blanca.png +0 -0
- package/lib/module/componentes/logos/bola.png +0 -0
- package/lib/module/componentes/logos/logo-blanco.png +0 -0
- package/lib/module/componentes/logos/logo.png +0 -0
- package/lib/module/dialogos/HostDeDialogos.js +170 -0
- package/lib/module/dialogos/HostDeDialogos.js.map +1 -0
- package/lib/module/dialogos/dialogos.js +112 -0
- package/lib/module/dialogos/dialogos.js.map +1 -0
- package/lib/module/formularios/CampoDeSeleccion.js +47 -0
- package/lib/module/formularios/CampoDeSeleccion.js.map +1 -0
- package/lib/module/formularios/SelectorDeOpcion.js +406 -0
- package/lib/module/formularios/SelectorDeOpcion.js.map +1 -0
- package/lib/module/formularios/TextoDeAccesoControlado.js +73 -0
- package/lib/module/formularios/TextoDeAccesoControlado.js.map +1 -0
- package/lib/module/formularios/campos.js +493 -0
- package/lib/module/formularios/campos.js.map +1 -0
- package/lib/module/formularios/controlados.js +197 -0
- package/lib/module/formularios/controlados.js.map +1 -0
- package/lib/module/formularios/errores.js +91 -0
- package/lib/module/formularios/errores.js.map +1 -0
- package/lib/module/formularios/guardado.js +78 -0
- package/lib/module/formularios/guardado.js.map +1 -0
- package/lib/module/formularios/useBusqueda.js +22 -0
- package/lib/module/formularios/useBusqueda.js.map +1 -0
- package/lib/module/fotos/elegir.js +178 -0
- package/lib/module/fotos/elegir.js.map +1 -0
- package/lib/module/fotos/index.js +8 -0
- package/lib/module/fotos/index.js.map +1 -0
- package/lib/module/fotos/reducir.js +93 -0
- package/lib/module/fotos/reducir.js.map +1 -0
- package/lib/module/hoja/HojaInferior.js +108 -0
- package/lib/module/hoja/HojaInferior.js.map +1 -0
- package/lib/module/hoja/index.js +7 -0
- package/lib/module/hoja/index.js.map +1 -0
- package/lib/module/hoja/useMasDeLaFicha.js +48 -0
- package/lib/module/hoja/useMasDeLaFicha.js.map +1 -0
- package/lib/module/index.js +66 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/listas/HojaDeFiltros.js +260 -0
- package/lib/module/listas/HojaDeFiltros.js.map +1 -0
- package/lib/module/listas/ListaPaginada.js +103 -0
- package/lib/module/listas/ListaPaginada.js.map +1 -0
- package/lib/module/listas/TarjetaDeslizable.js +118 -0
- package/lib/module/listas/TarjetaDeslizable.js.map +1 -0
- package/lib/module/listas/paginado.js +11 -0
- package/lib/module/listas/paginado.js.map +1 -0
- package/lib/module/listas/piezas.js +603 -0
- package/lib/module/listas/piezas.js.map +1 -0
- package/lib/module/navegacion/BarraDePestanas.js +162 -0
- package/lib/module/navegacion/BarraDePestanas.js.map +1 -0
- package/lib/module/navegacion/BotonDeBarra.js +58 -0
- package/lib/module/navegacion/BotonDeBarra.js.map +1 -0
- package/lib/module/navegacion/encabezado.js +103 -0
- package/lib/module/navegacion/encabezado.js.map +1 -0
- package/lib/module/pantallas/PantallaDeAcceso.js +195 -0
- package/lib/module/pantallas/PantallaDeAcceso.js.map +1 -0
- package/lib/module/pantallas/PantallaDeEdicion.js +121 -0
- package/lib/module/pantallas/PantallaDeEdicion.js.map +1 -0
- package/lib/module/pantallas/PantallaDeFicha.js +94 -0
- package/lib/module/pantallas/PantallaDeFicha.js.map +1 -0
- package/lib/module/pantallas/PantallaDePerfil.js +137 -0
- package/lib/module/pantallas/PantallaDePerfil.js.map +1 -0
- package/lib/module/tema/ProveedorDeTema.js +122 -0
- package/lib/module/tema/ProveedorDeTema.js.map +1 -0
- package/lib/module/tema/estilos.js +54 -0
- package/lib/module/tema/estilos.js.map +1 -0
- package/lib/module/tema/fuentes.js +28 -0
- package/lib/module/tema/fuentes.js.map +1 -0
- package/lib/module/tema/index.js +8 -0
- package/lib/module/tema/index.js.map +1 -0
- package/lib/module/tema/paleta.js +107 -0
- package/lib/module/tema/paleta.js.map +1 -0
- package/lib/module/tema/tipografia.js +32 -0
- package/lib/module/tema/tipografia.js.map +1 -0
- package/lib/module/texto.js +48 -0
- package/lib/module/texto.js.map +1 -0
- package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts +34 -0
- package/lib/typescript/src/componentes/AccionesDelEncabezado.d.ts.map +1 -0
- package/lib/typescript/src/componentes/BotonDeAvatar.d.ts +17 -0
- package/lib/typescript/src/componentes/BotonDeAvatar.d.ts.map +1 -0
- package/lib/typescript/src/componentes/BotonGrande.d.ts +26 -0
- package/lib/typescript/src/componentes/BotonGrande.d.ts.map +1 -0
- package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts +18 -0
- package/lib/typescript/src/componentes/CabeceraEmpujada.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Chip.d.ts +14 -0
- package/lib/typescript/src/componentes/Chip.d.ts.map +1 -0
- package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts +17 -0
- package/lib/typescript/src/componentes/ContenidoDePantalla.d.ts.map +1 -0
- package/lib/typescript/src/componentes/EstadoVacio.d.ts +17 -0
- package/lib/typescript/src/componentes/EstadoVacio.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Foto.d.ts +41 -0
- package/lib/typescript/src/componentes/Foto.d.ts.map +1 -0
- package/lib/typescript/src/componentes/IconoDeRenglon.d.ts +25 -0
- package/lib/typescript/src/componentes/IconoDeRenglon.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Logo.d.ts +13 -0
- package/lib/typescript/src/componentes/Logo.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Nota.d.ts +7 -0
- package/lib/typescript/src/componentes/Nota.d.ts.map +1 -0
- package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts +14 -0
- package/lib/typescript/src/componentes/OpcionesExcluyentes.d.ts.map +1 -0
- package/lib/typescript/src/componentes/PantallaDeError.d.ts +23 -0
- package/lib/typescript/src/componentes/PantallaDeError.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Pestanas.d.ts +28 -0
- package/lib/typescript/src/componentes/Pestanas.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Rotulo.d.ts +6 -0
- package/lib/typescript/src/componentes/Rotulo.d.ts.map +1 -0
- package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts +20 -0
- package/lib/typescript/src/componentes/RotuloDeSeccion.d.ts.map +1 -0
- package/lib/typescript/src/componentes/Tarjeta.d.ts +15 -0
- package/lib/typescript/src/componentes/Tarjeta.d.ts.map +1 -0
- package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts +13 -0
- package/lib/typescript/src/componentes/TarjetaDeDatos.d.ts.map +1 -0
- package/lib/typescript/src/componentes/TiraDeFotos.d.ts +36 -0
- package/lib/typescript/src/componentes/TiraDeFotos.d.ts.map +1 -0
- package/lib/typescript/src/componentes/VisorDeFoto.d.ts +23 -0
- package/lib/typescript/src/componentes/VisorDeFoto.d.ts.map +1 -0
- package/lib/typescript/src/dialogos/HostDeDialogos.d.ts +14 -0
- package/lib/typescript/src/dialogos/HostDeDialogos.d.ts.map +1 -0
- package/lib/typescript/src/dialogos/dialogos.d.ts +65 -0
- package/lib/typescript/src/dialogos/dialogos.d.ts.map +1 -0
- package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts +22 -0
- package/lib/typescript/src/formularios/CampoDeSeleccion.d.ts.map +1 -0
- package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts +59 -0
- package/lib/typescript/src/formularios/SelectorDeOpcion.d.ts.map +1 -0
- package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts +18 -0
- package/lib/typescript/src/formularios/TextoDeAccesoControlado.d.ts.map +1 -0
- package/lib/typescript/src/formularios/campos.d.ts +107 -0
- package/lib/typescript/src/formularios/campos.d.ts.map +1 -0
- package/lib/typescript/src/formularios/controlados.d.ts +29 -0
- package/lib/typescript/src/formularios/controlados.d.ts.map +1 -0
- package/lib/typescript/src/formularios/errores.d.ts +36 -0
- package/lib/typescript/src/formularios/errores.d.ts.map +1 -0
- package/lib/typescript/src/formularios/guardado.d.ts +36 -0
- package/lib/typescript/src/formularios/guardado.d.ts.map +1 -0
- package/lib/typescript/src/formularios/useBusqueda.d.ts +7 -0
- package/lib/typescript/src/formularios/useBusqueda.d.ts.map +1 -0
- package/lib/typescript/src/fotos/elegir.d.ts +58 -0
- package/lib/typescript/src/fotos/elegir.d.ts.map +1 -0
- package/lib/typescript/src/fotos/index.d.ts +3 -0
- package/lib/typescript/src/fotos/index.d.ts.map +1 -0
- package/lib/typescript/src/fotos/reducir.d.ts +32 -0
- package/lib/typescript/src/fotos/reducir.d.ts.map +1 -0
- package/lib/typescript/src/hoja/HojaInferior.d.ts +21 -0
- package/lib/typescript/src/hoja/HojaInferior.d.ts.map +1 -0
- package/lib/typescript/src/hoja/index.d.ts +3 -0
- package/lib/typescript/src/hoja/index.d.ts.map +1 -0
- package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts +27 -0
- package/lib/typescript/src/hoja/useMasDeLaFicha.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +45 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/listas/HojaDeFiltros.d.ts +60 -0
- package/lib/typescript/src/listas/HojaDeFiltros.d.ts.map +1 -0
- package/lib/typescript/src/listas/ListaPaginada.d.ts +39 -0
- package/lib/typescript/src/listas/ListaPaginada.d.ts.map +1 -0
- package/lib/typescript/src/listas/TarjetaDeslizable.d.ts +33 -0
- package/lib/typescript/src/listas/TarjetaDeslizable.d.ts.map +1 -0
- package/lib/typescript/src/listas/paginado.d.ts +16 -0
- package/lib/typescript/src/listas/paginado.d.ts.map +1 -0
- package/lib/typescript/src/listas/piezas.d.ts +135 -0
- package/lib/typescript/src/listas/piezas.d.ts.map +1 -0
- package/lib/typescript/src/navegacion/BarraDePestanas.d.ts +57 -0
- package/lib/typescript/src/navegacion/BarraDePestanas.d.ts.map +1 -0
- package/lib/typescript/src/navegacion/BotonDeBarra.d.ts +15 -0
- package/lib/typescript/src/navegacion/BotonDeBarra.d.ts.map +1 -0
- package/lib/typescript/src/navegacion/encabezado.d.ts +44 -0
- package/lib/typescript/src/navegacion/encabezado.d.ts.map +1 -0
- package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts +32 -0
- package/lib/typescript/src/pantallas/PantallaDeAcceso.d.ts.map +1 -0
- package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts +38 -0
- package/lib/typescript/src/pantallas/PantallaDeEdicion.d.ts.map +1 -0
- package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts +35 -0
- package/lib/typescript/src/pantallas/PantallaDeFicha.d.ts.map +1 -0
- package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts +19 -0
- package/lib/typescript/src/pantallas/PantallaDePerfil.d.ts.map +1 -0
- package/lib/typescript/src/tema/ProveedorDeTema.d.ts +32 -0
- package/lib/typescript/src/tema/ProveedorDeTema.d.ts.map +1 -0
- package/lib/typescript/src/tema/estilos.d.ts +31 -0
- package/lib/typescript/src/tema/estilos.d.ts.map +1 -0
- package/lib/typescript/src/tema/fuentes.d.ts +20 -0
- package/lib/typescript/src/tema/fuentes.d.ts.map +1 -0
- package/lib/typescript/src/tema/index.d.ts +6 -0
- package/lib/typescript/src/tema/index.d.ts.map +1 -0
- package/lib/typescript/src/tema/paleta.d.ts +86 -0
- package/lib/typescript/src/tema/paleta.d.ts.map +1 -0
- package/lib/typescript/src/tema/tipografia.d.ts +29 -0
- package/lib/typescript/src/tema/tipografia.d.ts.map +1 -0
- package/lib/typescript/src/texto.d.ts +16 -0
- package/lib/typescript/src/texto.d.ts.map +1 -0
- package/package.json +135 -5
- package/src/componentes/AccionesDelEncabezado.tsx +247 -0
- package/src/componentes/BotonDeAvatar.tsx +59 -0
- package/src/componentes/BotonGrande.tsx +100 -0
- package/src/componentes/CabeceraEmpujada.tsx +69 -0
- package/src/componentes/Chip.tsx +60 -0
- package/src/componentes/ContenidoDePantalla.tsx +53 -0
- package/src/componentes/EstadoVacio.tsx +45 -0
- package/src/componentes/Foto.tsx +92 -0
- package/src/componentes/IconoDeRenglon.tsx +42 -0
- package/src/componentes/Logo.tsx +34 -0
- package/src/componentes/Nota.tsx +37 -0
- package/src/componentes/OpcionesExcluyentes.tsx +62 -0
- package/src/componentes/PantallaDeError.tsx +76 -0
- package/src/componentes/Pestanas.tsx +86 -0
- package/src/componentes/Rotulo.tsx +21 -0
- package/src/componentes/RotuloDeSeccion.tsx +71 -0
- package/src/componentes/Tarjeta.tsx +44 -0
- package/src/componentes/TarjetaDeDatos.tsx +62 -0
- package/src/componentes/TiraDeFotos.tsx +189 -0
- package/src/componentes/VisorDeFoto.tsx +181 -0
- package/src/componentes/logos/bola-blanca.png +0 -0
- package/src/componentes/logos/bola.png +0 -0
- package/src/componentes/logos/logo-blanco.png +0 -0
- package/src/componentes/logos/logo.png +0 -0
- package/src/dialogos/HostDeDialogos.tsx +172 -0
- package/src/dialogos/dialogos.ts +148 -0
- package/src/formularios/CampoDeSeleccion.tsx +46 -0
- package/src/formularios/SelectorDeOpcion.tsx +407 -0
- package/src/formularios/TextoDeAccesoControlado.tsx +72 -0
- package/src/formularios/campos.tsx +483 -0
- package/src/formularios/controlados.tsx +198 -0
- package/src/formularios/errores.ts +105 -0
- package/src/formularios/guardado.ts +76 -0
- package/src/formularios/useBusqueda.ts +19 -0
- package/src/fotos/elegir.ts +194 -0
- package/src/fotos/index.ts +15 -0
- package/src/fotos/reducir.ts +87 -0
- package/src/hoja/HojaInferior.tsx +102 -0
- package/src/hoja/index.ts +4 -0
- package/src/hoja/useMasDeLaFicha.tsx +63 -0
- package/src/index.ts +143 -0
- package/src/listas/HojaDeFiltros.tsx +261 -0
- package/src/listas/ListaPaginada.tsx +117 -0
- package/src/listas/TarjetaDeslizable.tsx +126 -0
- package/src/listas/paginado.ts +15 -0
- package/src/listas/piezas.tsx +594 -0
- package/src/navegacion/BarraDePestanas.tsx +198 -0
- package/src/navegacion/BotonDeBarra.tsx +61 -0
- package/src/navegacion/encabezado.tsx +88 -0
- package/src/pantallas/PantallaDeAcceso.tsx +184 -0
- package/src/pantallas/PantallaDeEdicion.tsx +116 -0
- package/src/pantallas/PantallaDeFicha.tsx +115 -0
- package/src/pantallas/PantallaDePerfil.tsx +126 -0
- package/src/tema/ProveedorDeTema.tsx +150 -0
- package/src/tema/estilos.ts +51 -0
- package/src/tema/fuentes.ts +20 -0
- package/src/tema/index.ts +10 -0
- package/src/tema/paleta.ts +147 -0
- package/src/tema/tipografia.ts +29 -0
- package/src/texto.tsx +44 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as Haptics from "expo-haptics";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
import { useWindowDimensions, View } from "react-native";
|
|
6
|
+
import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
|
|
7
|
+
import { crearEstilos, usePaleta } from "../tema";
|
|
8
|
+
import BotonDeBarra from "./BotonDeBarra";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Lo que una lista deja libre abajo para que su último renglón no quede debajo de la barra, que
|
|
12
|
+
* flota encima del contenido: lo que se separa del borde, lo que mide y un margen.
|
|
13
|
+
*/
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
+
export const HUECO_DE_LA_BARRA = 140;
|
|
16
|
+
|
|
17
|
+
// La barra se ajusta al número de pestañas: con una sola no queda un pastillón vacío
|
|
18
|
+
// alrededor del icono, y con cuatro no se sale de la pantalla. Cada pestaña mide lo que
|
|
19
|
+
// pueda hasta `TAB_WIDTH_MAX`, repartiendo el ancho disponible.
|
|
20
|
+
const TAB_WIDTH_MAX = 115;
|
|
21
|
+
const SCREEN_MARGIN = 24;
|
|
22
|
+
const INDICATOR_INSET = 25;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Lo que la barra lee de las props del `tabBar` de `Tabs` (`BottomTabBarProps`). Escrito a mano y
|
|
26
|
+
* no importado: cada versión de expo-router lo exporta desde otro lado.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* La barra de pestañas de abajo: una pastilla flotante con un icono por pestaña y la elegida
|
|
31
|
+
* resaltada en rojo. Va en el `tabBar` de `Tabs`:
|
|
32
|
+
*
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <Tabs tabBar={(props) => <BarraDePestanas {...props} iconos={ICONOS} />}>
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* Flota encima del contenido: las listas dejan `HUECO_DE_LA_BARRA` abajo.
|
|
38
|
+
*/
|
|
39
|
+
const BarraDePestanas = ({
|
|
40
|
+
state,
|
|
41
|
+
navigation,
|
|
42
|
+
descriptors,
|
|
43
|
+
iconos,
|
|
44
|
+
visibles
|
|
45
|
+
}) => {
|
|
46
|
+
const c = usePaleta();
|
|
47
|
+
const styles = useStyles();
|
|
48
|
+
// Sólo el alto se mide; el ancho lo fija el número de pestañas.
|
|
49
|
+
const [height, setHeight] = useState(0);
|
|
50
|
+
const {
|
|
51
|
+
width: screenWidth
|
|
52
|
+
} = useWindowDimensions();
|
|
53
|
+
const routes = visibles ? state.routes.filter(route => visibles.includes(route.name)) : state.routes;
|
|
54
|
+
const tabWidth = Math.min(TAB_WIDTH_MAX, (screenWidth - SCREEN_MARGIN * 2) / routes.length);
|
|
55
|
+
const indicatorWidth = Math.max(0, tabWidth - INDICATOR_INSET);
|
|
56
|
+
const indicatorX = index => tabWidth * index + (tabWidth - indicatorWidth) / 2;
|
|
57
|
+
|
|
58
|
+
// `state.index` cuenta sobre todas las rutas, incluidas las ocultas. Si la activa no
|
|
59
|
+
// está en la barra —sólo pasa navegando a mano a una ruta sin permiso— la pastilla se
|
|
60
|
+
// queda en la primera.
|
|
61
|
+
const activeIndex = Math.max(0, routes.findIndex(route => route.key === state.routes[state.index]?.key));
|
|
62
|
+
const onTabbarLayout = e => setHeight(e.nativeEvent.layout.height);
|
|
63
|
+
const tabPositionX = useSharedValue(indicatorX(activeIndex));
|
|
64
|
+
|
|
65
|
+
// La pastilla sigue a la pestaña activa (no al toque): así queda en su sitio cuando
|
|
66
|
+
// el grupo arranca en una ruta distinta de la primera, o cuando se navega sin tocar
|
|
67
|
+
// la barra.
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
tabPositionX.value = withSpring(indicatorX(activeIndex), {
|
|
70
|
+
duration: 350
|
|
71
|
+
});
|
|
72
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
73
|
+
}, [activeIndex, tabWidth, indicatorWidth, tabPositionX]);
|
|
74
|
+
const animatedStyle = useAnimatedStyle(() => {
|
|
75
|
+
return {
|
|
76
|
+
transform: [{
|
|
77
|
+
translateX: tabPositionX.value
|
|
78
|
+
}]
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
return /*#__PURE__*/_jsx(View, {
|
|
82
|
+
style: styles.wrapper,
|
|
83
|
+
children: /*#__PURE__*/_jsxs(View, {
|
|
84
|
+
onLayout: onTabbarLayout,
|
|
85
|
+
style: [styles.tabbar, {
|
|
86
|
+
width: tabWidth * routes.length
|
|
87
|
+
}],
|
|
88
|
+
children: [/*#__PURE__*/_jsx(Animated.View, {
|
|
89
|
+
style: [animatedStyle, {
|
|
90
|
+
position: "absolute",
|
|
91
|
+
borderRadius: 30,
|
|
92
|
+
backgroundColor: c.primary,
|
|
93
|
+
// Nada que pintar hasta la primera medición del alto.
|
|
94
|
+
height: Math.max(0, height - 15),
|
|
95
|
+
width: indicatorWidth
|
|
96
|
+
}]
|
|
97
|
+
}), routes.map((route, index) => {
|
|
98
|
+
const isFocused = index === activeIndex;
|
|
99
|
+
const onPress = () => {
|
|
100
|
+
const event = navigation.emit({
|
|
101
|
+
type: "tabPress",
|
|
102
|
+
target: route.key,
|
|
103
|
+
canPreventDefault: true
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Sólo el de `tabPress` (`canPreventDefault`) trae `defaultPrevented`.
|
|
107
|
+
const prevenido = "defaultPrevented" in event && event.defaultPrevented;
|
|
108
|
+
if (!isFocused && !prevenido) {
|
|
109
|
+
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
|
|
110
|
+
navigation.navigate(route.name, route.params);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const onLongPress = () => {
|
|
114
|
+
navigation.emit({
|
|
115
|
+
type: "tabLongPress",
|
|
116
|
+
target: route.key
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
return /*#__PURE__*/_jsx(BotonDeBarra, {
|
|
120
|
+
onPress: onPress,
|
|
121
|
+
onLongPress: onLongPress,
|
|
122
|
+
isFocused: isFocused,
|
|
123
|
+
icono: iconos[route.name],
|
|
124
|
+
etiqueta: descriptors?.[route.key]?.options.title ?? route.name,
|
|
125
|
+
color: isFocused ? c.sobrePrimario : c.primary
|
|
126
|
+
}, route.key);
|
|
127
|
+
})]
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const useStyles = crearEstilos(c => ({
|
|
132
|
+
wrapper: {
|
|
133
|
+
position: "absolute",
|
|
134
|
+
bottom: 30,
|
|
135
|
+
left: 0,
|
|
136
|
+
right: 0,
|
|
137
|
+
alignItems: "center"
|
|
138
|
+
},
|
|
139
|
+
tabbar: {
|
|
140
|
+
flexDirection: "row",
|
|
141
|
+
justifyContent: "space-between",
|
|
142
|
+
alignItems: "center",
|
|
143
|
+
backgroundColor: c.superficie,
|
|
144
|
+
paddingVertical: 22,
|
|
145
|
+
borderRadius: 35,
|
|
146
|
+
// android
|
|
147
|
+
elevation: 3,
|
|
148
|
+
// ios
|
|
149
|
+
shadowColor: c.sombra,
|
|
150
|
+
shadowOffset: {
|
|
151
|
+
width: 0,
|
|
152
|
+
height: 10
|
|
153
|
+
},
|
|
154
|
+
shadowRadius: 10,
|
|
155
|
+
shadowOpacity: 0.1,
|
|
156
|
+
// En oscuro la sombra no se ve: el borde separa la barra del mapa o la lista de abajo.
|
|
157
|
+
borderWidth: c.esOscuro ? 1 : 0,
|
|
158
|
+
borderColor: c.secondaryLighter
|
|
159
|
+
}
|
|
160
|
+
}));
|
|
161
|
+
export default BarraDePestanas;
|
|
162
|
+
//# sourceMappingURL=BarraDePestanas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Haptics","useEffect","useState","useWindowDimensions","View","Animated","useAnimatedStyle","useSharedValue","withSpring","crearEstilos","usePaleta","BotonDeBarra","jsx","_jsx","jsxs","_jsxs","HUECO_DE_LA_BARRA","TAB_WIDTH_MAX","SCREEN_MARGIN","INDICATOR_INSET","BarraDePestanas","state","navigation","descriptors","iconos","visibles","c","styles","useStyles","height","setHeight","width","screenWidth","routes","filter","route","includes","name","tabWidth","Math","min","length","indicatorWidth","max","indicatorX","index","activeIndex","findIndex","key","onTabbarLayout","e","nativeEvent","layout","tabPositionX","value","duration","animatedStyle","transform","translateX","style","wrapper","children","onLayout","tabbar","position","borderRadius","backgroundColor","primary","map","isFocused","onPress","event","emit","type","target","canPreventDefault","prevenido","defaultPrevented","impactAsync","ImpactFeedbackStyle","Light","navigate","params","onLongPress","icono","etiqueta","options","title","color","sobrePrimario","bottom","left","right","alignItems","flexDirection","justifyContent","superficie","paddingVertical","elevation","shadowColor","sombra","shadowOffset","shadowRadius","shadowOpacity","borderWidth","esOscuro","borderColor","secondaryLighter"],"sourceRoot":"../../../src","sources":["navegacion/BarraDePestanas.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import MaterialIcons from "@expo/vector-icons/MaterialIcons";
|
|
4
|
+
import React, { useEffect } from "react";
|
|
5
|
+
import { Pressable, StyleSheet } from "react-native";
|
|
6
|
+
import Animated, { interpolate, useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
/** Una pestaña de `BarraDePestanas`: su icono, que crece un poco al elegirla. */
|
|
9
|
+
const BotonDeBarra = ({
|
|
10
|
+
onPress,
|
|
11
|
+
onLongPress,
|
|
12
|
+
isFocused,
|
|
13
|
+
icono,
|
|
14
|
+
etiqueta,
|
|
15
|
+
color
|
|
16
|
+
}) => {
|
|
17
|
+
const scale = useSharedValue(0);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
scale.value = withSpring(isFocused ? 1 : 0, {
|
|
20
|
+
duration: 350
|
|
21
|
+
});
|
|
22
|
+
}, [scale, isFocused]);
|
|
23
|
+
const animatedIconStyle = useAnimatedStyle(() => {
|
|
24
|
+
const scaleValue = interpolate(scale.value, [0, 1], [1, 1.2]);
|
|
25
|
+
return {
|
|
26
|
+
transform: [{
|
|
27
|
+
scale: scaleValue
|
|
28
|
+
}]
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
return /*#__PURE__*/_jsx(Pressable, {
|
|
32
|
+
onPress: onPress,
|
|
33
|
+
onLongPress: onLongPress,
|
|
34
|
+
accessibilityRole: "tab",
|
|
35
|
+
accessibilityLabel: etiqueta,
|
|
36
|
+
accessibilityState: {
|
|
37
|
+
selected: isFocused
|
|
38
|
+
},
|
|
39
|
+
style: styles.tabbarItem,
|
|
40
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
41
|
+
style: animatedIconStyle,
|
|
42
|
+
children: icono ? /*#__PURE__*/_jsx(MaterialIcons, {
|
|
43
|
+
name: icono,
|
|
44
|
+
size: 24,
|
|
45
|
+
color: color
|
|
46
|
+
}) : null
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const styles = StyleSheet.create({
|
|
51
|
+
tabbarItem: {
|
|
52
|
+
flex: 1,
|
|
53
|
+
justifyContent: "center",
|
|
54
|
+
alignItems: "center"
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
export default BotonDeBarra;
|
|
58
|
+
//# sourceMappingURL=BotonDeBarra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MaterialIcons","React","useEffect","Pressable","StyleSheet","Animated","interpolate","useAnimatedStyle","useSharedValue","withSpring","jsx","_jsx","BotonDeBarra","onPress","onLongPress","isFocused","icono","etiqueta","color","scale","value","duration","animatedIconStyle","scaleValue","transform","accessibilityRole","accessibilityLabel","accessibilityState","selected","style","styles","tabbarItem","children","View","name","size","create","flex","justifyContent","alignItems"],"sourceRoot":"../../../src","sources":["navegacion/BotonDeBarra.tsx"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,kCAAkC;AAC5D,OAAOC,KAAK,IAAIC,SAAS,QAAQ,OAAO;AACxC,SAASC,SAAS,EAAEC,UAAU,QAAQ,cAAc;AACpD,OAAOC,QAAQ,IACXC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,EACdC,UAAU,QACP,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAajC;AACA,MAAMC,YAAY,GAAGA,CAAC;EAAEC,OAAO;EAAEC,WAAW;EAAEC,SAAS;EAAEC,KAAK;EAAEC,QAAQ;EAAEC;AAAa,CAAC,KAAK;EACzF,MAAMC,KAAK,GAAGX,cAAc,CAAC,CAAC,CAAC;EAE/BN,SAAS,CAAC,MAAM;IACZiB,KAAK,CAACC,KAAK,GAAGX,UAAU,CAACM,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE;MAAEM,QAAQ,EAAE;IAAI,CAAC,CAAC;EAClE,CAAC,EAAE,CAACF,KAAK,EAAEJ,SAAS,CAAC,CAAC;EAEtB,MAAMO,iBAAiB,GAAGf,gBAAgB,CAAC,MAAM;IAC7C,MAAMgB,UAAU,GAAGjB,WAAW,CAACa,KAAK,CAACC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO;MACHI,SAAS,EAAE,CAAC;QAAEL,KAAK,EAAEI;MAAW,CAAC;IACrC,CAAC;EACL,CAAC,CAAC;EAEF,oBACIZ,IAAA,CAACR,SAAS;IACNU,OAAO,EAAEA,OAAQ;IACjBC,WAAW,EAAEA,WAAY;IACzBW,iBAAiB,EAAC,KAAK;IACvBC,kBAAkB,EAAET,QAAS;IAC7BU,kBAAkB,EAAE;MAAEC,QAAQ,EAAEb;IAAU,CAAE;IAC5Cc,KAAK,EAAEC,MAAM,CAACC,UAAW;IAAAC,QAAA,eAEzBrB,IAAA,CAACN,QAAQ,CAAC4B,IAAI;MAACJ,KAAK,EAAEP,iBAAkB;MAAAU,QAAA,EACnChB,KAAK,gBAAGL,IAAA,CAACX,aAAa;QAACkC,IAAI,EAAElB,KAAM;QAACmB,IAAI,EAAE,EAAG;QAACjB,KAAK,EAAEA;MAAM,CAAE,CAAC,GAAG;IAAI,CAC3D;EAAC,CACT,CAAC;AAEpB,CAAC;AAED,MAAMY,MAAM,GAAG1B,UAAU,CAACgC,MAAM,CAAC;EAC7BL,UAAU,EAAE;IACRM,IAAI,EAAE,CAAC;IACPC,cAAc,EAAE,QAAQ;IACxBC,UAAU,EAAE;EAChB;AACJ,CAAC,CAAC;AAEF,eAAe3B,YAAY","ignoreList":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { View } from "react-native";
|
|
5
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
6
|
+
import { Logo } from "../componentes/Logo";
|
|
7
|
+
import { Text } from "../texto";
|
|
8
|
+
import { crearEstilos, renglon, tipografia, usePaleta } from "../tema";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Alto del header por debajo de la barra de estado. Iguala el de `CabeceraEmpujada` (10 de
|
|
12
|
+
* padding + la fila de 45 del botón de atrás + 13), y se suma al inset porque `headerStyle.height`
|
|
13
|
+
* de React Navigation incluye la franja de la barra de estado: un alto fijo salía bien en iOS
|
|
14
|
+
* —inset grande— y desproporcionado en Android.
|
|
15
|
+
*/
|
|
16
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
17
|
+
export const ALTO_DEL_ENCABEZADO = 76;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* El título del header de las pestañas: un rótulo arriba (quién entró, la yarda, el nombre de la
|
|
21
|
+
* app) y el de la pestaña en rojo.
|
|
22
|
+
*/
|
|
23
|
+
export function TituloDelEncabezado({
|
|
24
|
+
eyebrow,
|
|
25
|
+
children
|
|
26
|
+
}) {
|
|
27
|
+
const styles = useStyles();
|
|
28
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
29
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
30
|
+
style: styles.eyebrow,
|
|
31
|
+
children: eyebrow.toUpperCase()
|
|
32
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
33
|
+
numberOfLines: 1,
|
|
34
|
+
adjustsFontSizeToFit: true,
|
|
35
|
+
style: styles.titulo,
|
|
36
|
+
children: children
|
|
37
|
+
})]
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* El header de las pestañas de una app, igual en todas: la bola a la izquierda, el rótulo y el
|
|
43
|
+
* título, y a la derecha lo que la app ponga (sus pendientes, el avatar). Va en el `screenOptions`
|
|
44
|
+
* de `Tabs`:
|
|
45
|
+
*
|
|
46
|
+
* ```tsx
|
|
47
|
+
* const encabezado = useOpcionesDelEncabezado({ eyebrow: "Operador", derecha: <BotonDeAvatar … /> });
|
|
48
|
+
* <Tabs screenOptions={encabezado} tabBar={…}>
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function useOpcionesDelEncabezado({
|
|
52
|
+
eyebrow,
|
|
53
|
+
derecha
|
|
54
|
+
}) {
|
|
55
|
+
const c = usePaleta();
|
|
56
|
+
const styles = useStyles();
|
|
57
|
+
const insets = useSafeAreaInsets();
|
|
58
|
+
return {
|
|
59
|
+
headerShadowVisible: false,
|
|
60
|
+
headerStyle: {
|
|
61
|
+
height: insets.top + ALTO_DEL_ENCABEZADO,
|
|
62
|
+
backgroundColor: c.superficie
|
|
63
|
+
},
|
|
64
|
+
headerTitleAlign: "left",
|
|
65
|
+
headerTitle: props => /*#__PURE__*/_jsx(TituloDelEncabezado, {
|
|
66
|
+
eyebrow: eyebrow,
|
|
67
|
+
children: props.children
|
|
68
|
+
}),
|
|
69
|
+
headerLeft: () => /*#__PURE__*/_jsx(View, {
|
|
70
|
+
style: styles.izquierda,
|
|
71
|
+
children: /*#__PURE__*/_jsx(Logo, {})
|
|
72
|
+
}),
|
|
73
|
+
headerRight: derecha ? () => /*#__PURE__*/_jsx(View, {
|
|
74
|
+
style: styles.derecha,
|
|
75
|
+
children: derecha
|
|
76
|
+
}) : undefined,
|
|
77
|
+
tabBarHideOnKeyboard: true
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const useStyles = crearEstilos(c => ({
|
|
81
|
+
// Con la letra mínima (`etiqueta`): a 11 el nombre no se leía.
|
|
82
|
+
eyebrow: {
|
|
83
|
+
...renglon(tipografia.etiqueta),
|
|
84
|
+
fontWeight: "700",
|
|
85
|
+
letterSpacing: 1.4,
|
|
86
|
+
color: c.eyebrow
|
|
87
|
+
},
|
|
88
|
+
titulo: {
|
|
89
|
+
fontSize: 30,
|
|
90
|
+
fontWeight: "800",
|
|
91
|
+
color: c.primary
|
|
92
|
+
},
|
|
93
|
+
izquierda: {
|
|
94
|
+
marginLeft: 20
|
|
95
|
+
},
|
|
96
|
+
derecha: {
|
|
97
|
+
flexDirection: "row",
|
|
98
|
+
alignItems: "center",
|
|
99
|
+
gap: 6,
|
|
100
|
+
marginRight: 20
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
//# sourceMappingURL=encabezado.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","View","useSafeAreaInsets","Logo","Text","crearEstilos","renglon","tipografia","usePaleta","jsx","_jsx","jsxs","_jsxs","ALTO_DEL_ENCABEZADO","TituloDelEncabezado","eyebrow","children","styles","useStyles","style","toUpperCase","numberOfLines","adjustsFontSizeToFit","titulo","useOpcionesDelEncabezado","derecha","c","insets","headerShadowVisible","headerStyle","height","top","backgroundColor","superficie","headerTitleAlign","headerTitle","props","headerLeft","izquierda","headerRight","undefined","tabBarHideOnKeyboard","etiqueta","fontWeight","letterSpacing","color","fontSize","primary","marginLeft","flexDirection","alignItems","gap","marginRight"],"sourceRoot":"../../../src","sources":["navegacion/encabezado.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import * as Haptics from "expo-haptics";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { useForm } from "react-hook-form";
|
|
6
|
+
import { useWindowDimensions, View } from "react-native";
|
|
7
|
+
import { KeyboardAvoidingView } from "react-native-keyboard-controller";
|
|
8
|
+
import { Button, Card, Chip, Snackbar } from "react-native-paper";
|
|
9
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
10
|
+
import { LogoCompleto } from "../componentes/Logo";
|
|
11
|
+
import { setErrors } from "../formularios/errores";
|
|
12
|
+
import TextoDeAccesoControlado from "../formularios/TextoDeAccesoControlado";
|
|
13
|
+
import { crearEstilos, usePaleta } from "../tema";
|
|
14
|
+
import { Text } from "../texto";
|
|
15
|
+
|
|
16
|
+
// Mismo corte que ContenidoDePantalla: de aquí para abajo es teléfono.
|
|
17
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
18
|
+
const ANCHO_DE_TABLETA = 700;
|
|
19
|
+
|
|
20
|
+
/** Lo que se escribe, con los nombres del servidor: así `setErrors` lo cuelga de su campo. */
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Lo que pasó al intentar entrar: `null` si entró (la app ya guardó la sesión y su layout la
|
|
24
|
+
* lleva adentro), o lo que se le dice a quien escribe.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* La pantalla de entrada de las apps: el logo con el nombre de la app, usuario, contraseña e
|
|
29
|
+
* «Iniciar Sesión», y la versión abajo. En una tableta va en una tarjeta centrada; en un teléfono,
|
|
30
|
+
* directo sobre el fondo.
|
|
31
|
+
*
|
|
32
|
+
* Lo de cada app es `onEntrar`: llama a su login y dice qué contestar a cada respuesta (una cuenta
|
|
33
|
+
* deshabilitada, una que no tiene acceso a esta app). El aviso sale **arriba**, porque el teclado
|
|
34
|
+
* tapa uno anclado abajo, y dura lo que tarda en leerse.
|
|
35
|
+
*/
|
|
36
|
+
export default function PantallaDeAcceso({
|
|
37
|
+
nombre,
|
|
38
|
+
version,
|
|
39
|
+
onEntrar
|
|
40
|
+
}) {
|
|
41
|
+
const c = usePaleta();
|
|
42
|
+
const styles = useStyles();
|
|
43
|
+
const insets = useSafeAreaInsets();
|
|
44
|
+
const {
|
|
45
|
+
width
|
|
46
|
+
} = useWindowDimensions();
|
|
47
|
+
const form = useForm({
|
|
48
|
+
defaultValues: {
|
|
49
|
+
username: "",
|
|
50
|
+
password: ""
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const [entrando, setEntrando] = useState(false);
|
|
54
|
+
const [aviso, setAviso] = useState(null);
|
|
55
|
+
const entrar = form.handleSubmit(async datos => {
|
|
56
|
+
setEntrando(true);
|
|
57
|
+
try {
|
|
58
|
+
const resultado = await onEntrar(datos);
|
|
59
|
+
if (!resultado) {
|
|
60
|
+
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Success);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
Haptics.notificationAsync(resultado.tono === "aviso" ? Haptics.NotificationFeedbackType.Warning : Haptics.NotificationFeedbackType.Error);
|
|
64
|
+
if (resultado.errorDelServidor) setErrors(form, resultado.errorDelServidor);
|
|
65
|
+
setAviso(resultado.mensaje);
|
|
66
|
+
} catch {
|
|
67
|
+
// `onEntrar` contesta lo que conoce; lo que se le escape no deja el botón cargando.
|
|
68
|
+
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Error);
|
|
69
|
+
setAviso("No se pudo iniciar sesión. Intente de nuevo.");
|
|
70
|
+
} finally {
|
|
71
|
+
setEntrando(false);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
const contenido = /*#__PURE__*/_jsxs(_Fragment, {
|
|
75
|
+
children: [/*#__PURE__*/_jsxs(View, {
|
|
76
|
+
style: styles.marca,
|
|
77
|
+
children: [/*#__PURE__*/_jsx(LogoCompleto, {}), /*#__PURE__*/_jsx(Text, {
|
|
78
|
+
style: styles.nombre,
|
|
79
|
+
children: nombre
|
|
80
|
+
})]
|
|
81
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
82
|
+
style: styles.campos,
|
|
83
|
+
children: [/*#__PURE__*/_jsx(TextoDeAccesoControlado, {
|
|
84
|
+
name: "username",
|
|
85
|
+
control: form.control,
|
|
86
|
+
etiqueta: "Usuario",
|
|
87
|
+
entrada: {
|
|
88
|
+
autoCapitalize: "none"
|
|
89
|
+
}
|
|
90
|
+
}), /*#__PURE__*/_jsx(TextoDeAccesoControlado, {
|
|
91
|
+
name: "password",
|
|
92
|
+
control: form.control,
|
|
93
|
+
etiqueta: "Contrase\xF1a",
|
|
94
|
+
contrasena: true,
|
|
95
|
+
entrada: {
|
|
96
|
+
autoCapitalize: "none"
|
|
97
|
+
}
|
|
98
|
+
})]
|
|
99
|
+
}), /*#__PURE__*/_jsx(Button, {
|
|
100
|
+
mode: "contained",
|
|
101
|
+
loading: entrando,
|
|
102
|
+
disabled: entrando,
|
|
103
|
+
onPress: entrar,
|
|
104
|
+
style: styles.boton,
|
|
105
|
+
children: "Iniciar Sesi\xF3n"
|
|
106
|
+
})]
|
|
107
|
+
});
|
|
108
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
109
|
+
style: styles.root,
|
|
110
|
+
children: [/*#__PURE__*/_jsx(KeyboardAvoidingView, {
|
|
111
|
+
style: styles.centro,
|
|
112
|
+
behavior: "padding",
|
|
113
|
+
children: /*#__PURE__*/_jsx(View, {
|
|
114
|
+
style: styles.columna,
|
|
115
|
+
children: width > ANCHO_DE_TABLETA ? /*#__PURE__*/_jsx(Card, {
|
|
116
|
+
style: styles.card,
|
|
117
|
+
children: /*#__PURE__*/_jsx(Card.Content, {
|
|
118
|
+
children: contenido
|
|
119
|
+
})
|
|
120
|
+
}) : contenido
|
|
121
|
+
})
|
|
122
|
+
}), version ? /*#__PURE__*/_jsx(View, {
|
|
123
|
+
style: styles.version,
|
|
124
|
+
children: /*#__PURE__*/_jsxs(Chip, {
|
|
125
|
+
compact: true,
|
|
126
|
+
textStyle: {
|
|
127
|
+
color: c.secondary,
|
|
128
|
+
fontSize: 11
|
|
129
|
+
},
|
|
130
|
+
style: {
|
|
131
|
+
backgroundColor: c.superficieTenue
|
|
132
|
+
},
|
|
133
|
+
children: ["v ", version]
|
|
134
|
+
})
|
|
135
|
+
}) : null, /*#__PURE__*/_jsx(Snackbar, {
|
|
136
|
+
visible: aviso !== null,
|
|
137
|
+
onDismiss: () => setAviso(null)
|
|
138
|
+
// Un aviso largo se queda lo que tarda en leerse.
|
|
139
|
+
,
|
|
140
|
+
duration: Math.max(2400, (aviso?.length ?? 0) * 60),
|
|
141
|
+
wrapperStyle: {
|
|
142
|
+
top: insets.top + 12,
|
|
143
|
+
bottom: undefined
|
|
144
|
+
},
|
|
145
|
+
children: aviso
|
|
146
|
+
})]
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
const useStyles = crearEstilos(c => ({
|
|
150
|
+
root: {
|
|
151
|
+
flex: 1,
|
|
152
|
+
backgroundColor: c.fondo
|
|
153
|
+
},
|
|
154
|
+
centro: {
|
|
155
|
+
flex: 1,
|
|
156
|
+
justifyContent: "center",
|
|
157
|
+
padding: 24,
|
|
158
|
+
backgroundColor: c.fondo
|
|
159
|
+
},
|
|
160
|
+
columna: {
|
|
161
|
+
width: "100%",
|
|
162
|
+
maxWidth: 400,
|
|
163
|
+
alignSelf: "center"
|
|
164
|
+
},
|
|
165
|
+
card: {
|
|
166
|
+
backgroundColor: c.superficie
|
|
167
|
+
},
|
|
168
|
+
marca: {
|
|
169
|
+
alignItems: "center",
|
|
170
|
+
marginBottom: 20
|
|
171
|
+
},
|
|
172
|
+
nombre: {
|
|
173
|
+
fontSize: 15,
|
|
174
|
+
color: c.primary,
|
|
175
|
+
fontWeight: "bold",
|
|
176
|
+
fontStyle: "italic",
|
|
177
|
+
paddingHorizontal: 3
|
|
178
|
+
},
|
|
179
|
+
campos: {
|
|
180
|
+
gap: 15,
|
|
181
|
+
paddingBottom: 20
|
|
182
|
+
},
|
|
183
|
+
boton: {
|
|
184
|
+
marginTop: 10,
|
|
185
|
+
borderRadius: 15
|
|
186
|
+
},
|
|
187
|
+
version: {
|
|
188
|
+
position: "absolute",
|
|
189
|
+
bottom: 50,
|
|
190
|
+
left: 0,
|
|
191
|
+
right: 0,
|
|
192
|
+
alignItems: "center"
|
|
193
|
+
}
|
|
194
|
+
}));
|
|
195
|
+
//# sourceMappingURL=PantallaDeAcceso.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Haptics","useState","useForm","useWindowDimensions","View","KeyboardAvoidingView","Button","Card","Chip","Snackbar","useSafeAreaInsets","LogoCompleto","setErrors","TextoDeAccesoControlado","crearEstilos","usePaleta","Text","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","ANCHO_DE_TABLETA","PantallaDeAcceso","nombre","version","onEntrar","c","styles","useStyles","insets","width","form","defaultValues","username","password","entrando","setEntrando","aviso","setAviso","entrar","handleSubmit","datos","resultado","notificationAsync","NotificationFeedbackType","Success","tono","Warning","Error","errorDelServidor","mensaje","contenido","children","style","marca","campos","name","control","etiqueta","entrada","autoCapitalize","contrasena","mode","loading","disabled","onPress","boton","root","centro","behavior","columna","card","Content","compact","textStyle","color","secondary","fontSize","backgroundColor","superficieTenue","visible","onDismiss","duration","Math","max","length","wrapperStyle","top","bottom","undefined","flex","fondo","justifyContent","padding","maxWidth","alignSelf","superficie","alignItems","marginBottom","primary","fontWeight","fontStyle","paddingHorizontal","gap","paddingBottom","marginTop","borderRadius","position","left","right"],"sourceRoot":"../../../src","sources":["pantallas/PantallaDeAcceso.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { ActivityIndicator, ScrollView, View } from "react-native";
|
|
5
|
+
import { KeyboardAvoidingView } from "react-native-keyboard-controller";
|
|
6
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
7
|
+
import BotonGrande from "../componentes/BotonGrande";
|
|
8
|
+
import CabeceraEmpujada from "../componentes/CabeceraEmpujada";
|
|
9
|
+
import EstadoVacio from "../componentes/EstadoVacio";
|
|
10
|
+
import Nota from "../componentes/Nota";
|
|
11
|
+
import { mensajeDeError } from "../formularios/errores";
|
|
12
|
+
import { crearEstilos, usePaleta } from "../tema";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* El armazón de una pantalla que edita algo (un viaje, un tracto, una caja, un operador). Dos
|
|
16
|
+
* partes, porque el formulario nace cuando ya llegó lo que edita (sus valores iniciales salen de
|
|
17
|
+
* ahí):
|
|
18
|
+
*
|
|
19
|
+
* - `EsperaDeEdicion`: lo que se ve antes: sin permiso, cargando o si falló, con «Reintentar».
|
|
20
|
+
* - `FormularioDeEdicion`: la cabecera, los campos en un scroll que esquiva el teclado, el error
|
|
21
|
+
* del último intento y «Guardar» abajo, fijo.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** Lo que la espera lee de un `use…Query` de RTK Query. */
|
|
25
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
26
|
+
export function EsperaDeEdicion({
|
|
27
|
+
eyebrow,
|
|
28
|
+
puede,
|
|
29
|
+
sinPermiso,
|
|
30
|
+
consulta,
|
|
31
|
+
queEs
|
|
32
|
+
}) {
|
|
33
|
+
const c = usePaleta();
|
|
34
|
+
const styles = useStyles();
|
|
35
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
36
|
+
style: styles.root,
|
|
37
|
+
children: [/*#__PURE__*/_jsx(CabeceraEmpujada, {
|
|
38
|
+
eyebrow: eyebrow,
|
|
39
|
+
titulo: "\u2026"
|
|
40
|
+
}), !puede ? /*#__PURE__*/_jsx(EstadoVacio, {
|
|
41
|
+
icono: "lock-outline",
|
|
42
|
+
titulo: "No tienes permiso",
|
|
43
|
+
texto: sinPermiso
|
|
44
|
+
}) : consulta.isError ? /*#__PURE__*/_jsx(EstadoVacio, {
|
|
45
|
+
icono: "cloud-alert",
|
|
46
|
+
titulo: `No se pudo cargar ${queEs}`,
|
|
47
|
+
texto: mensajeDeError(consulta.error, "Revisa la señal e intenta de nuevo."),
|
|
48
|
+
children: /*#__PURE__*/_jsx(BotonGrande, {
|
|
49
|
+
icono: "refresh",
|
|
50
|
+
modo: "contorno",
|
|
51
|
+
onPress: consulta.refetch,
|
|
52
|
+
children: "Reintentar"
|
|
53
|
+
})
|
|
54
|
+
}) : /*#__PURE__*/_jsx(ActivityIndicator, {
|
|
55
|
+
color: c.primary,
|
|
56
|
+
style: styles.cargando
|
|
57
|
+
})]
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function FormularioDeEdicion({
|
|
61
|
+
eyebrow,
|
|
62
|
+
titulo,
|
|
63
|
+
error,
|
|
64
|
+
guardando,
|
|
65
|
+
onGuardar,
|
|
66
|
+
textoDeGuardar = "Guardar",
|
|
67
|
+
children
|
|
68
|
+
}) {
|
|
69
|
+
const styles = useStyles();
|
|
70
|
+
const insets = useSafeAreaInsets();
|
|
71
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
72
|
+
style: styles.root,
|
|
73
|
+
children: [/*#__PURE__*/_jsx(CabeceraEmpujada, {
|
|
74
|
+
eyebrow: eyebrow,
|
|
75
|
+
titulo: titulo
|
|
76
|
+
}), /*#__PURE__*/_jsxs(KeyboardAvoidingView, {
|
|
77
|
+
behavior: "padding",
|
|
78
|
+
style: styles.flex,
|
|
79
|
+
children: [/*#__PURE__*/_jsxs(ScrollView, {
|
|
80
|
+
contentContainerStyle: styles.contenido,
|
|
81
|
+
keyboardShouldPersistTaps: "handled",
|
|
82
|
+
children: [children, error ? /*#__PURE__*/_jsx(Nota, {
|
|
83
|
+
tono: "aviso",
|
|
84
|
+
texto: error
|
|
85
|
+
}) : null]
|
|
86
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
87
|
+
style: [styles.pie, {
|
|
88
|
+
paddingBottom: insets.bottom + 16
|
|
89
|
+
}],
|
|
90
|
+
children: /*#__PURE__*/_jsx(BotonGrande, {
|
|
91
|
+
icono: "check",
|
|
92
|
+
onPress: onGuardar,
|
|
93
|
+
cargando: guardando,
|
|
94
|
+
children: guardando ? "Guardando…" : textoDeGuardar
|
|
95
|
+
})
|
|
96
|
+
})]
|
|
97
|
+
})]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
const useStyles = crearEstilos(c => ({
|
|
101
|
+
root: {
|
|
102
|
+
flex: 1,
|
|
103
|
+
backgroundColor: c.fondo
|
|
104
|
+
},
|
|
105
|
+
flex: {
|
|
106
|
+
flex: 1
|
|
107
|
+
},
|
|
108
|
+
cargando: {
|
|
109
|
+
marginTop: 24
|
|
110
|
+
},
|
|
111
|
+
contenido: {
|
|
112
|
+
padding: 20,
|
|
113
|
+
gap: 12
|
|
114
|
+
},
|
|
115
|
+
pie: {
|
|
116
|
+
paddingHorizontal: 20,
|
|
117
|
+
paddingTop: 12,
|
|
118
|
+
backgroundColor: c.superficie
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
//# sourceMappingURL=PantallaDeEdicion.js.map
|