@acvl/mobile-components 0.0.0-stage → 0.0.2
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 +147 -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/camara/CampoDeFotos.js +124 -0
- package/lib/module/camara/CampoDeFotos.js.map +1 -0
- package/lib/module/camara/elegir.js +104 -0
- package/lib/module/camara/elegir.js.map +1 -0
- package/lib/module/camara/index.js +10 -0
- package/lib/module/camara/index.js.map +1 -0
- package/lib/module/camara/reducir.js +93 -0
- package/lib/module/camara/reducir.js.map +1 -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 +63 -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 +72 -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 +501 -0
- package/lib/module/formularios/campos.js.map +1 -0
- package/lib/module/formularios/controlados.js +199 -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 +105 -0
- package/lib/module/fotos/elegir.js.map +1 -0
- package/lib/module/fotos/index.js +9 -0
- package/lib/module/fotos/index.js.map +1 -0
- package/lib/module/hoja/HojaDeLista.js +211 -0
- package/lib/module/hoja/HojaDeLista.js.map +1 -0
- package/lib/module/hoja/HojaInferior.js +112 -0
- package/lib/module/hoja/HojaInferior.js.map +1 -0
- package/lib/module/hoja/index.js +8 -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 +67 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/listas/HojaDeFiltros.js +270 -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 +666 -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/PantallaDeHistorial.js +328 -0
- package/lib/module/pantallas/PantallaDeHistorial.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/camara/CampoDeFotos.d.ts +30 -0
- package/lib/typescript/src/camara/CampoDeFotos.d.ts.map +1 -0
- package/lib/typescript/src/camara/elegir.d.ts +47 -0
- package/lib/typescript/src/camara/elegir.d.ts.map +1 -0
- package/lib/typescript/src/camara/index.d.ts +4 -0
- package/lib/typescript/src/camara/index.d.ts.map +1 -0
- package/lib/typescript/src/camara/reducir.d.ts +32 -0
- package/lib/typescript/src/camara/reducir.d.ts.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 +25 -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 +24 -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 +113 -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 +28 -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/hoja/HojaDeLista.d.ts +50 -0
- package/lib/typescript/src/hoja/HojaDeLista.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 +4 -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 +46 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/listas/HojaDeFiltros.d.ts +76 -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 +157 -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/PantallaDeHistorial.d.ts +65 -0
- package/lib/typescript/src/pantallas/PantallaDeHistorial.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 +140 -5
- package/src/camara/CampoDeFotos.tsx +132 -0
- package/src/camara/elegir.ts +113 -0
- package/src/camara/index.ts +15 -0
- package/src/camara/reducir.ts +87 -0
- 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 +58 -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 +60 -0
- package/src/formularios/SelectorDeOpcion.tsx +407 -0
- package/src/formularios/TextoDeAccesoControlado.tsx +72 -0
- package/src/formularios/campos.tsx +497 -0
- package/src/formularios/controlados.tsx +200 -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 +116 -0
- package/src/fotos/index.ts +6 -0
- package/src/hoja/HojaDeLista.tsx +214 -0
- package/src/hoja/HojaInferior.tsx +103 -0
- package/src/hoja/index.ts +5 -0
- package/src/hoja/useMasDeLaFicha.tsx +63 -0
- package/src/index.ts +151 -0
- package/src/listas/HojaDeFiltros.tsx +286 -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 +670 -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/PantallaDeHistorial.tsx +293 -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,172 @@
|
|
|
1
|
+
import { crearEstilos, renglon, tipografia, usePaleta } from "../tema";
|
|
2
|
+
import BotonGrande from "../componentes/BotonGrande";
|
|
3
|
+
import { Text } from "../texto";
|
|
4
|
+
import {
|
|
5
|
+
dialogoActual,
|
|
6
|
+
responderDialogo,
|
|
7
|
+
suscribirDialogos,
|
|
8
|
+
type BotonDeDialogo,
|
|
9
|
+
} from "./dialogos";
|
|
10
|
+
import MaterialCommunityIcons from "@expo/vector-icons/MaterialCommunityIcons";
|
|
11
|
+
import React from "react";
|
|
12
|
+
import { Modal, Pressable, ScrollView, useWindowDimensions, View } from "react-native";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Pinta los diálogos que abre `mostrarDialogo` (`dialogos.ts`), de uno en uno. Se monta una
|
|
16
|
+
* sola vez, en el layout raíz de la app.
|
|
17
|
+
*
|
|
18
|
+
* Es el diálogo de la casa —el `ConfirmDialog` de las revisiones de wms— con la letra grande de las apps:
|
|
19
|
+
* una tarjeta blanca sobre fondo oscuro, el icono arriba, título y mensaje sin recortar, y los
|
|
20
|
+
* botones **apilados a lo ancho**: lado a lado no caben con la letra al 180%. «Cancelar» va como
|
|
21
|
+
* texto discreto al pie. Atrás y el toque fuera cierran como cancelar, salvo que el diálogo diga
|
|
22
|
+
* que no es cancelable.
|
|
23
|
+
*/
|
|
24
|
+
const HostDeDialogos = () => {
|
|
25
|
+
const c = usePaleta();
|
|
26
|
+
const styles = useStyles();
|
|
27
|
+
const dialogo = React.useSyncExternalStore(suscribirDialogos, dialogoActual);
|
|
28
|
+
const { height } = useWindowDimensions();
|
|
29
|
+
|
|
30
|
+
if (!dialogo) return null;
|
|
31
|
+
|
|
32
|
+
const cancelable = dialogo.cancelable ?? true;
|
|
33
|
+
const cerrar = () => {
|
|
34
|
+
if (cancelable) responderDialogo(dialogo, undefined);
|
|
35
|
+
};
|
|
36
|
+
const acciones = dialogo.botones.filter((b) => b.estilo !== "cancelar");
|
|
37
|
+
const cancelar = dialogo.botones.find((b) => b.estilo === "cancelar");
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Modal
|
|
41
|
+
visible
|
|
42
|
+
transparent
|
|
43
|
+
animationType="fade"
|
|
44
|
+
statusBarTranslucent
|
|
45
|
+
navigationBarTranslucent
|
|
46
|
+
onRequestClose={cerrar}
|
|
47
|
+
>
|
|
48
|
+
<Pressable style={styles.fondo} onPress={cerrar} accessibilityLabel="Cerrar">
|
|
49
|
+
{/* El `Pressable` vacío de la tarjeta se queda con el toque: tocar adentro no cierra. */}
|
|
50
|
+
<Pressable
|
|
51
|
+
style={[styles.tarjeta, { maxHeight: height * 0.85 }]}
|
|
52
|
+
onPress={() => {}}
|
|
53
|
+
>
|
|
54
|
+
<ScrollView
|
|
55
|
+
contentContainerStyle={styles.contenido}
|
|
56
|
+
showsVerticalScrollIndicator={false}
|
|
57
|
+
>
|
|
58
|
+
{dialogo.icono ? (
|
|
59
|
+
<View style={styles.icono}>
|
|
60
|
+
<MaterialCommunityIcons
|
|
61
|
+
name={dialogo.icono}
|
|
62
|
+
size={34}
|
|
63
|
+
color={c.primary}
|
|
64
|
+
/>
|
|
65
|
+
</View>
|
|
66
|
+
) : null}
|
|
67
|
+
<Text style={styles.titulo}>{dialogo.titulo}</Text>
|
|
68
|
+
{dialogo.mensaje ? (
|
|
69
|
+
<Text style={styles.mensaje}>{dialogo.mensaje}</Text>
|
|
70
|
+
) : null}
|
|
71
|
+
|
|
72
|
+
<View style={styles.botones}>
|
|
73
|
+
{acciones.map((boton, i) => (
|
|
74
|
+
<Boton
|
|
75
|
+
key={`${boton.texto}-${i}`}
|
|
76
|
+
boton={boton}
|
|
77
|
+
onPress={() => responderDialogo(dialogo, boton.valor)}
|
|
78
|
+
/>
|
|
79
|
+
))}
|
|
80
|
+
{cancelar ? (
|
|
81
|
+
<Pressable
|
|
82
|
+
onPress={() => responderDialogo(dialogo, cancelar.valor)}
|
|
83
|
+
hitSlop={8}
|
|
84
|
+
accessibilityRole="button"
|
|
85
|
+
style={({ pressed }) => [
|
|
86
|
+
styles.cancelar,
|
|
87
|
+
pressed && { opacity: 0.6 },
|
|
88
|
+
]}
|
|
89
|
+
>
|
|
90
|
+
<Text style={styles.cancelarTexto}>{cancelar.texto}</Text>
|
|
91
|
+
</Pressable>
|
|
92
|
+
) : null}
|
|
93
|
+
</View>
|
|
94
|
+
</ScrollView>
|
|
95
|
+
</Pressable>
|
|
96
|
+
</Pressable>
|
|
97
|
+
</Modal>
|
|
98
|
+
);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
function Boton({ boton, onPress }: { boton: BotonDeDialogo<unknown>; onPress: () => void }) {
|
|
102
|
+
const estilo = boton.estilo ?? "principal";
|
|
103
|
+
return (
|
|
104
|
+
<BotonGrande
|
|
105
|
+
icono={boton.icono}
|
|
106
|
+
modo={
|
|
107
|
+
estilo === "secundario"
|
|
108
|
+
? "contorno"
|
|
109
|
+
: estilo === "destructivo"
|
|
110
|
+
? "destructivo"
|
|
111
|
+
: "relleno"
|
|
112
|
+
}
|
|
113
|
+
onPress={onPress}
|
|
114
|
+
>
|
|
115
|
+
{boton.texto}
|
|
116
|
+
</BotonGrande>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const useStyles = crearEstilos((c) => ({
|
|
121
|
+
fondo: {
|
|
122
|
+
flex: 1,
|
|
123
|
+
backgroundColor: c.velo,
|
|
124
|
+
justifyContent: "center",
|
|
125
|
+
padding: 20,
|
|
126
|
+
},
|
|
127
|
+
tarjeta: {
|
|
128
|
+
width: "100%",
|
|
129
|
+
maxWidth: 480,
|
|
130
|
+
alignSelf: "center",
|
|
131
|
+
backgroundColor: c.superficie,
|
|
132
|
+
borderRadius: 20,
|
|
133
|
+
overflow: "hidden",
|
|
134
|
+
elevation: 12,
|
|
135
|
+
shadowColor: c.sombra,
|
|
136
|
+
shadowOffset: { width: 0, height: 10 },
|
|
137
|
+
shadowOpacity: 0.25,
|
|
138
|
+
shadowRadius: 24,
|
|
139
|
+
},
|
|
140
|
+
contenido: { padding: 22, gap: 10 },
|
|
141
|
+
icono: {
|
|
142
|
+
alignSelf: "center",
|
|
143
|
+
width: 60,
|
|
144
|
+
height: 60,
|
|
145
|
+
borderRadius: 30,
|
|
146
|
+
backgroundColor: c.primaryWash,
|
|
147
|
+
alignItems: "center",
|
|
148
|
+
justifyContent: "center",
|
|
149
|
+
marginBottom: 4,
|
|
150
|
+
},
|
|
151
|
+
titulo: {
|
|
152
|
+
...renglon(tipografia.titulo),
|
|
153
|
+
fontWeight: "900",
|
|
154
|
+
color: c.texto,
|
|
155
|
+
textAlign: "center",
|
|
156
|
+
},
|
|
157
|
+
mensaje: {
|
|
158
|
+
...renglon(tipografia.cuerpo),
|
|
159
|
+
color: c.secondaryDark,
|
|
160
|
+
textAlign: "center",
|
|
161
|
+
},
|
|
162
|
+
botones: { gap: 10, marginTop: 12 },
|
|
163
|
+
cancelar: { alignSelf: "center", paddingVertical: 12, paddingHorizontal: 20 },
|
|
164
|
+
cancelarTexto: {
|
|
165
|
+
...renglon(tipografia.cuerpo),
|
|
166
|
+
fontWeight: "700",
|
|
167
|
+
color: c.secondary,
|
|
168
|
+
textAlign: "center",
|
|
169
|
+
},
|
|
170
|
+
}));
|
|
171
|
+
|
|
172
|
+
export default HostDeDialogos;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Los diálogos de las apps, con su diseño y no el `Alert` del sistema. Esto es la API: la abren las
|
|
2
|
+
// pantallas y también código que no es componente (una cola de envíos, la ubicación, la
|
|
3
|
+
// navegación). Los pinta `HostDeDialogos`, montado una vez en el layout raíz.
|
|
4
|
+
import type MaterialCommunityIcons from "@expo/vector-icons/MaterialCommunityIcons";
|
|
5
|
+
import type React from "react";
|
|
6
|
+
|
|
7
|
+
type NombreDeIcono = React.ComponentProps<typeof MaterialCommunityIcons>["name"];
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* - `principal`: la acción esperada, en rojo.
|
|
11
|
+
* - `secundario`: otra opción válida, en contorno.
|
|
12
|
+
* - `destructivo`: borra o deshace algo (Deshacer, Descartar, Cerrar sesión), en rojo oscuro.
|
|
13
|
+
* - `cancelar`: no hacer nada, como texto discreto al pie.
|
|
14
|
+
*/
|
|
15
|
+
export type EstiloDeBoton = "principal" | "secundario" | "destructivo" | "cancelar";
|
|
16
|
+
|
|
17
|
+
export interface BotonDeDialogo<V> {
|
|
18
|
+
texto: string;
|
|
19
|
+
estilo?: EstiloDeBoton;
|
|
20
|
+
icono?: NombreDeIcono;
|
|
21
|
+
/** Lo que resuelve la promesa de `mostrarDialogo` al tocarlo. */
|
|
22
|
+
valor: V;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface Dialogo<V> {
|
|
26
|
+
titulo: string;
|
|
27
|
+
mensaje?: string;
|
|
28
|
+
icono?: NombreDeIcono;
|
|
29
|
+
botones: BotonDeDialogo<V>[];
|
|
30
|
+
/**
|
|
31
|
+
* Si el botón atrás de Android y el toque fuera de la tarjeta lo cierran (resolviendo
|
|
32
|
+
* `undefined`, como cancelar). Por omisión, sí.
|
|
33
|
+
*/
|
|
34
|
+
cancelable?: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface EnEspera {
|
|
38
|
+
dialogo: Dialogo<unknown>;
|
|
39
|
+
responder: (valor: unknown) => void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* La fila de diálogos. Vive en `globalThis` para que Fast Refresh, al re-evaluar este módulo, no
|
|
44
|
+
* deje al host escuchando una fila vieja con promesas que nunca se resuelven.
|
|
45
|
+
*/
|
|
46
|
+
const g = globalThis as typeof globalThis & {
|
|
47
|
+
__dialogos?: { fila: EnEspera[]; oyentes: Set<() => void> };
|
|
48
|
+
};
|
|
49
|
+
const estado = (g.__dialogos ??= { fila: [], oyentes: new Set() });
|
|
50
|
+
|
|
51
|
+
const avisarCambio = () => estado.oyentes.forEach((oyente) => oyente());
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Abre un diálogo y espera la respuesta: el `valor` del botón tocado, o `undefined` si se cerró
|
|
55
|
+
* sin elegir (atrás, toque fuera). Si ya hay uno abierto, éste espera su turno: se muestran de uno
|
|
56
|
+
* en uno, en el orden en que llegaron.
|
|
57
|
+
*/
|
|
58
|
+
export function mostrarDialogo<V>(dialogo: Dialogo<V>): Promise<V | undefined> {
|
|
59
|
+
return new Promise((resolver) => {
|
|
60
|
+
estado.fila.push({
|
|
61
|
+
dialogo: dialogo as Dialogo<unknown>,
|
|
62
|
+
responder: resolver as (valor: unknown) => void,
|
|
63
|
+
});
|
|
64
|
+
avisarCambio();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Una pregunta de sí o no. Resuelve `true` sólo si se tocó el botón de confirmar; cancelar,
|
|
70
|
+
* atrás y el toque fuera dan `false`.
|
|
71
|
+
*/
|
|
72
|
+
export async function confirmar({
|
|
73
|
+
titulo,
|
|
74
|
+
mensaje,
|
|
75
|
+
textoConfirmar,
|
|
76
|
+
textoCancelar = "Cancelar",
|
|
77
|
+
destructivo = false,
|
|
78
|
+
icono,
|
|
79
|
+
}: {
|
|
80
|
+
titulo: string;
|
|
81
|
+
mensaje?: string;
|
|
82
|
+
textoConfirmar: string;
|
|
83
|
+
textoCancelar?: string;
|
|
84
|
+
destructivo?: boolean;
|
|
85
|
+
icono?: NombreDeIcono;
|
|
86
|
+
}): Promise<boolean> {
|
|
87
|
+
const respuesta = await mostrarDialogo({
|
|
88
|
+
titulo,
|
|
89
|
+
mensaje,
|
|
90
|
+
icono: icono ?? (destructivo ? "alert-circle-outline" : "help-circle-outline"),
|
|
91
|
+
botones: [
|
|
92
|
+
{
|
|
93
|
+
texto: textoConfirmar,
|
|
94
|
+
estilo: destructivo ? "destructivo" : "principal",
|
|
95
|
+
valor: true,
|
|
96
|
+
},
|
|
97
|
+
{ texto: textoCancelar, estilo: "cancelar", valor: false },
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
return respuesta === true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Un aviso con un solo botón. Resuelve al cerrarse. */
|
|
104
|
+
export async function avisar({
|
|
105
|
+
titulo,
|
|
106
|
+
mensaje,
|
|
107
|
+
icono = "information-outline",
|
|
108
|
+
textoBoton = "Entendido",
|
|
109
|
+
cancelable = true,
|
|
110
|
+
}: {
|
|
111
|
+
titulo: string;
|
|
112
|
+
mensaje?: string;
|
|
113
|
+
icono?: NombreDeIcono;
|
|
114
|
+
textoBoton?: string;
|
|
115
|
+
cancelable?: boolean;
|
|
116
|
+
}): Promise<void> {
|
|
117
|
+
await mostrarDialogo({
|
|
118
|
+
titulo,
|
|
119
|
+
mensaje,
|
|
120
|
+
icono,
|
|
121
|
+
cancelable,
|
|
122
|
+
botones: [{ texto: textoBoton, estilo: "principal", valor: true }],
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ==============================|| PARA EL HOST ||============================== //
|
|
127
|
+
|
|
128
|
+
/** El que se está mostrando, o `null`. */
|
|
129
|
+
export const dialogoActual = (): Dialogo<unknown> | null => estado.fila[0]?.dialogo ?? null;
|
|
130
|
+
|
|
131
|
+
export function suscribirDialogos(oyente: () => void): () => void {
|
|
132
|
+
estado.oyentes.add(oyente);
|
|
133
|
+
return () => {
|
|
134
|
+
estado.oyentes.delete(oyente);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Cierra `dialogo` con `valor` y pasa al siguiente de la fila. Sólo si `dialogo` sigue siendo el
|
|
140
|
+
* actual: el segundo toque de un doble toque llega con el diálogo que ya se contestó, y sin esta
|
|
141
|
+
* comparación contestaba también el siguiente de la fila sin que el operador lo viera.
|
|
142
|
+
*/
|
|
143
|
+
export function responderDialogo(dialogo: Dialogo<unknown>, valor: unknown): void {
|
|
144
|
+
if (estado.fila[0]?.dialogo !== dialogo) return;
|
|
145
|
+
const actual = estado.fila.shift();
|
|
146
|
+
actual?.responder(valor);
|
|
147
|
+
avisarCambio();
|
|
148
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { View } from "react-native";
|
|
2
|
+
import { crearEstilos, renglon, tipografia } from "../tema";
|
|
3
|
+
import { Text } from "../texto";
|
|
4
|
+
import { ErrorDelCampo } from "./campos";
|
|
5
|
+
import SelectorDeOpcion, {
|
|
6
|
+
SelectorDeVarias,
|
|
7
|
+
type Opcion,
|
|
8
|
+
type PropsDeSelectorDeOpcion,
|
|
9
|
+
type PropsDeSelectorDeVarias,
|
|
10
|
+
} from "./SelectorDeOpcion";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Un campo que se elige de una lista larga —un catálogo del servidor, uno guardado en el
|
|
14
|
+
* teléfono—: `SelectorDeOpcion` con el error del formulario debajo. Es el `ControlledAutocomplete`
|
|
15
|
+
* del portal.
|
|
16
|
+
*
|
|
17
|
+
* Quien lo usa trae las opciones y, si son del servidor, la búsqueda: en una app es su consulta del
|
|
18
|
+
* catálogo (`useBusqueda` para no pedir una vez por letra). Una lista fija se pasa sin `onBuscar`
|
|
19
|
+
* y se filtra sola.
|
|
20
|
+
*/
|
|
21
|
+
export default function CampoDeSeleccion<T extends Opcion>({
|
|
22
|
+
error,
|
|
23
|
+
ayuda,
|
|
24
|
+
...props
|
|
25
|
+
}: PropsDeSelectorDeOpcion<T> & { error?: string; ayuda?: string }) {
|
|
26
|
+
const styles = useStyles();
|
|
27
|
+
return (
|
|
28
|
+
<View style={styles.campo}>
|
|
29
|
+
<SelectorDeOpcion<T> {...props} />
|
|
30
|
+
{ayuda ? <Text style={styles.ayuda}>{ayuda}</Text> : null}
|
|
31
|
+
<ErrorDelCampo error={error} />
|
|
32
|
+
</View>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Lo mismo, pero se eligen varias (los recibos de un concepto, las piezas sobre las que se cobra
|
|
38
|
+
* un porcentaje): `SelectorDeVarias` con el error debajo. El valor es la lista de opciones
|
|
39
|
+
* enteras, igual que el de una es la opción entera.
|
|
40
|
+
*/
|
|
41
|
+
export function CampoDeVarias<T extends Opcion>({
|
|
42
|
+
error,
|
|
43
|
+
ayuda,
|
|
44
|
+
...props
|
|
45
|
+
}: PropsDeSelectorDeVarias<T> & { error?: string; ayuda?: string }) {
|
|
46
|
+
const styles = useStyles();
|
|
47
|
+
return (
|
|
48
|
+
<View style={styles.campo}>
|
|
49
|
+
<SelectorDeVarias<T> {...props} />
|
|
50
|
+
{ayuda ? <Text style={styles.ayuda}>{ayuda}</Text> : null}
|
|
51
|
+
<ErrorDelCampo error={error} />
|
|
52
|
+
</View>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// La ayuda con el mismo renglón y color que la de los demás campos (`Campo`).
|
|
57
|
+
const useStyles = crearEstilos((c) => ({
|
|
58
|
+
campo: { gap: 6 },
|
|
59
|
+
ayuda: { ...renglon(tipografia.secundario), color: c.secondary },
|
|
60
|
+
}));
|