From 5676de7984625a38a22875501e9d9d7d5a375d10 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 08:43:17 -0400 Subject: [PATCH 1/9] feat(linter): add extra linting tools and rules --- .eslintrc.json | 20 +++- .prettierc.js | 7 ++ package.json | 10 +- .../biometric/face-liveness-detector.tsx | 92 ------------------- src/components/form/input/index.tsx | 2 +- src/pages/api/biometric/index.ts | 2 +- src/pages/api/citizens/[cedula].ts | 2 +- src/pages/api/iam/index.ts | 4 +- tsconfig.json | 9 +- yarn.lock.REMOVED.git-id | 2 +- 10 files changed, 47 insertions(+), 103 deletions(-) create mode 100644 .prettierc.js diff --git a/.eslintrc.json b/.eslintrc.json index bffb357a..af761453 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,21 @@ { - "extends": "next/core-web-vitals" + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "next", + "next/core-web-vitals", + "prettier" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"] } diff --git a/.prettierc.js b/.prettierc.js new file mode 100644 index 00000000..8841e7fe --- /dev/null +++ b/.prettierc.js @@ -0,0 +1,7 @@ +module.exports = { + printWidth: 80, + semi: true, + singleQuote: true, + tabWidth: 2, + useTabs: false, +}; diff --git a/package.json b/package.json index e858481a..6f6f1571 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "aws-amplify": "^5.1.4", "axios": "^1.4.0", "cookie": "^0.5.0", - "eslint": "8.35.0", + "eslint": "^8.40.0", "eslint-config-next": "13.2.3", "next": "13.2.3", "prop-types": ">=15.7.0", @@ -44,6 +44,12 @@ "@types/node": "^18.16.3", "@types/react": "^18.2.1", "@types/react-dom": "^18.2.2", - "@types/react-google-recaptcha": "^2.1.5" + "@types/react-google-recaptcha": "^2.1.5", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.5", + "eslint-config-prettier": "^8.8.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-prettier": "^4.2.1", + "prettier": ">=2.0.0" } } diff --git a/src/components/biometric/face-liveness-detector.tsx b/src/components/biometric/face-liveness-detector.tsx index 34ca948d..eefa406a 100644 --- a/src/components/biometric/face-liveness-detector.tsx +++ b/src/components/biometric/face-liveness-detector.tsx @@ -3,7 +3,6 @@ import { ThemeProvider } from "@aws-amplify/ui-react"; import React from "react"; import { LoadingProgress } from "../elements/loading"; import { AlertErrorMessage } from "../elements/alert"; -import { View, Heading, Alert, Card, Text } from '@aws-amplify/ui-react'; import { defaultLivenessDisplayText } from './displayText' export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { @@ -38,30 +37,6 @@ export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { } }; - // const dictionary = { - // // use default strings for english - // en: null, - // es: { - // instructionsHeaderHeadingText: 'Verificación de vida', - // instructionsHeaderBodyText: - // 'Pasará por un proceso de verificación facial para demostrar que es una persona real.', - // instructionListStepOneText: - // 'Cuando aparezca un óvalo, rellena el óvalo con tu cara en 7 segundos.', - // instructionListStepTwoText: 'Maximiza el brillo de tu pantalla.', - // instructionListStepThreeText: - // 'Asegúrese de que su cara no esté cubierta con gafas de sol o una máscara.', - // instructionListStepFourText: - // 'Muévase a un lugar bien iluminado que no esté expuesto a la luz solar directa.', - // photosensitivyWarningHeadingText: 'Advertencia de fotosensibilidad', - // photosensitivyWarningBodyText: - // 'Esta verificación muestra luces de colores. Tenga cuidado si es fotosensible.', - // instructionListHeadingText: - // 'Siga las instrucciones para completar la verificación:', - // goodFitCaptionText: 'Buen ajuste', - // tooFarCaptionText: 'Demasiado lejos', - // }, - // }; - return ( <> {error && @@ -81,73 +56,6 @@ export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { onAnalysisComplete={handleAnalysisComplete} disableInstructionScreen={true} displayText={defaultLivenessDisplayText} - // components={{ - // Header: () => { - // return ( - // <> - // asd - // - // // - // // asd - // // - // // Yasdasd - // // - // // - // ); - // }, - // PhotosensitiveWarning: (): JSX.Element => { - // return ( - // <> - // asd - // - // // - // // asdasd - // // - // ); - // }, - // Instructions: (): JSX.Element => { - // return ( - // <> - // asd - // - // // - // // asdasd - // //
    - // //
  1. - // // asdasdasdmask. - // //
  2. - // //
  3. - // // Moasdasdas - // //
  4. - // //
  5. - // // Fill oasdasdasdasdasdold for colored lights. - // //
  6. - // //
- // //
- // ); - // }, - // ErrorView: ({ children } : any) => { - // return ( - // <> - //
- // - // {/* - // adasdsd - // {children} - // asdsd - // */} - // - // ); - // }, - // }} /> )} diff --git a/src/components/form/input/index.tsx b/src/components/form/input/index.tsx index 436a81ec..c452e5ef 100644 --- a/src/components/form/input/index.tsx +++ b/src/components/form/input/index.tsx @@ -5,7 +5,7 @@ import { styled } from "@mui/material/styles"; import { IconButton } from "@mui/material"; interface IProps { - label?: String; + label?: string; icon?: any; msg?: string; required?: boolean; diff --git a/src/pages/api/biometric/index.ts b/src/pages/api/biometric/index.ts index d3f28b08..e4c393b0 100644 --- a/src/pages/api/biometric/index.ts +++ b/src/pages/api/biometric/index.ts @@ -28,7 +28,7 @@ export default async function handler( }); let isLive: any; - let base64Image: string = ""; + let base64Image = ""; let result: any; if (response.Confidence) { diff --git a/src/pages/api/citizens/[cedula].ts b/src/pages/api/citizens/[cedula].ts index ce4b6541..bcb23396 100644 --- a/src/pages/api/citizens/[cedula].ts +++ b/src/pages/api/citizens/[cedula].ts @@ -23,7 +23,7 @@ export default async function handler( `/${cedula}/info/basic?api-key=${process.env.NEXT_PUBLIC_CEDULA_API_KEY}` ); - let { names, id } = citizen.payload; + const { names, id } = citizen.payload; const name = names.split(" ")[0]; res.status(200).json({ name, id }); diff --git a/src/pages/api/iam/index.ts b/src/pages/api/iam/index.ts index d015856b..434ea9ad 100644 --- a/src/pages/api/iam/index.ts +++ b/src/pages/api/iam/index.ts @@ -31,8 +31,8 @@ export default async function handler( const { body } = req; const { username, email, password } = body; - let success: boolean = true; - let statusCode: number = 201; + let success = true; + let statusCode = 201; const { data: citizen } = await axios.get( `${process.env.NEXT_PUBLIC_CEDULA_API}/${username}/info/basic?api-key=${process.env.NEXT_PUBLIC_CEDULA_API_KEY}` diff --git a/tsconfig.json b/tsconfig.json index 61c19abd..78eb66c1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,10 +14,15 @@ "isolatedModules": true, "jsx": "preserve", "incremental": true, + "baseUrl": ".", "paths": { - "@/*": ["./src/*"] + "@/*": ["src/*"], + "@components/*": ["components/*"], + "@utils/*": ["utils/*"], + "@lib/*": ["lib/*"], + "@services/*": ["services/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"] -} +} \ No newline at end of file diff --git a/yarn.lock.REMOVED.git-id b/yarn.lock.REMOVED.git-id index 23eb5494..9ea5ce2e 100644 --- a/yarn.lock.REMOVED.git-id +++ b/yarn.lock.REMOVED.git-id @@ -1 +1 @@ -4ea752c568807593c48f32b694392333beef9f3c \ No newline at end of file +4378fcbd380b0d164a32d4cf89056c2a398d9cd1 \ No newline at end of file From 9f9ccd6fdf70ebc97ce0a0bb93c073f742dad450 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 08:45:37 -0400 Subject: [PATCH 2/9] feat: allow to easily debug in vscode --- .vscode/launch.json | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..31414458 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Next.js: debug server-side", + "type": "node-terminal", + "request": "launch", + "command": "yarn run dev" + }, + { + "name": "Next.js: debug client-side", + "type": "chrome", + "request": "launch", + "url": "http://localhost:3000" + }, + { + "name": "Next.js: debug full stack", + "type": "node-terminal", + "request": "launch", + "command": "yarn run dev", + "serverReadyAction": { + "pattern": "started server on .+, url: (https?://.+)", + "uriFormat": "%s", + "action": "debugWithChrome" + } + } + ] +} From 40c74a147dd9f33aec7eb2faa19711e13c7e6664 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 10:34:37 -0400 Subject: [PATCH 3/9] lint(prettier): apply to all files --- .github/dependabot.yml | 12 +- .prettierc.js | 10 +- audit-ci.jsonc | 28 +- next.config.js | 8 +- src/components/biometric/displayText.ts | 251 +++++++++--------- .../biometric/face-liveness-detector.tsx | 6 +- src/components/elements/alert/index.tsx | 15 +- .../elements/boxContentCenter/index.tsx | 4 +- src/components/elements/loading/index.tsx | 10 +- src/components/form/input/index.tsx | 24 +- src/components/layout/footer.tsx | 18 +- src/components/layout/navBar.tsx | 14 +- src/pages/auth/index.tsx | 7 +- src/pages/auth/method/index.tsx | 153 +++++++---- src/pages/register/index.tsx | 22 +- src/styles/globals.css | 93 +++++-- tsconfig.json | 2 +- 17 files changed, 409 insertions(+), 268 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 807c8521..c71e63e4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,15 +1,15 @@ version: 2 updates: - - package-ecosystem: 'npm' - directory: '/' + - package-ecosystem: "npm" + directory: "/" target-branch: main schedule: - interval: 'weekly' + interval: "weekly" open-pull-requests-limit: 20 commit-message: - prefix: 'deps' - + prefix: "deps" + - package-ecosystem: "github-actions" directory: "/" schedule: - interval: "weekly" \ No newline at end of file + interval: "weekly" diff --git a/.prettierc.js b/.prettierc.js index 8841e7fe..cc760e48 100644 --- a/.prettierc.js +++ b/.prettierc.js @@ -1,7 +1,7 @@ module.exports = { - printWidth: 80, - semi: true, - singleQuote: true, - tabWidth: 2, - useTabs: false, + printWidth: 80, + semi: true, + singleQuote: true, + tabWidth: 2, + useTabs: false, }; diff --git a/audit-ci.jsonc b/audit-ci.jsonc index 09dffc4f..7f0f7425 100644 --- a/audit-ci.jsonc +++ b/audit-ci.jsonc @@ -1,16 +1,16 @@ { - // audit-ci supports reading JSON, JSONC, and JSON5 config files. - // Add a $schema property to enable JSON schema validation. - "$schema": "https://github.com/IBM/audit-ci/raw/main/docs/schema.json", - // You only need one of ["low", "moderate", "high", "critical"]. - "low": true, - "allowlist": [ - { - "GHSA-9c47-m6qq-7p4h|eslint-plugin-import>tsconfig-paths>json5": { - "active": true, // This field is optional and defaults to true. - "expiry": "", // There's no need to set an expiry date because we are unaffected. - "notes": "Transitive development-only dependency for linting doesn't impact the security of this application in production or for developers." - } + // audit-ci supports reading JSON, JSONC, and JSON5 config files. + // Add a $schema property to enable JSON schema validation. + "$schema": "https://github.com/IBM/audit-ci/raw/main/docs/schema.json", + // You only need one of ["low", "moderate", "high", "critical"]. + "low": true, + "allowlist": [ + { + "GHSA-9c47-m6qq-7p4h|eslint-plugin-import>tsconfig-paths>json5": { + "active": true, // This field is optional and defaults to true. + "expiry": "", // There's no need to set an expiry date because we are unaffected. + "notes": "Transitive development-only dependency for linting doesn't impact the security of this application in production or for developers." } - ] - } + } + ] +} diff --git a/next.config.js b/next.config.js index e4a7ff2b..ecfda618 100644 --- a/next.config.js +++ b/next.config.js @@ -7,10 +7,10 @@ const nextConfig = { NEXT_PUBLIC_CEDULA_API: process.env.NEXT_PUBLIC_CEDULA_API, NEXT_PUBLIC_CEDULA_API_KEY: process.env.NEXT_PUBLIC_CEDULA_API_KEY, NEXT_PUBLIC_SITE_KEY: process.env.NEXT_PUBLIC_SITE_KEY, - NEXT_PUBLIC_COOKIE_KEY: process.env.NEXT_PUBLIC_COOKIE_KEY + NEXT_PUBLIC_COOKIE_KEY: process.env.NEXT_PUBLIC_COOKIE_KEY, }, reactStrictMode: false, - output: 'standalone' -} + output: "standalone", +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/src/components/biometric/displayText.ts b/src/components/biometric/displayText.ts index 2d7cce2c..73014d1c 100644 --- a/src/components/biometric/displayText.ts +++ b/src/components/biometric/displayText.ts @@ -1,125 +1,128 @@ export type HintDisplayText = { - hintMoveFaceFrontOfCameraText?: string; - hintTooManyFacesText?: string; - hintFaceDetectedText?: string; - hintCanNotIdentifyText?: string; - hintTooCloseText?: string; - hintTooFarText?: string; - hintHoldFacePositionCountdownText?: string; - hintConnectingText?: string; - hintVerifyingText?: string; - hintIlluminationTooBrightText?: string; - hintIlluminationTooDarkText?: string; - hintIlluminationNormalText?: string; - hintHoldFaceForFreshnessText?: string; - }; - - export type CameraDisplayText = { - cameraMinSpecificationsHeadingText?: string; - cameraMinSpecificationsMessageText?: string; - cameraNotFoundHeadingText?: string; - cameraNotFoundMessageText?: string; - retryCameraPermissionsText?: string; - }; - - export type InstructionDisplayText = { - instructionsHeaderHeadingText?: string; - instructionsHeaderBodyText?: string; - instructionsBeginCheckText?: string; - photosensitivyWarningHeadingText?: string; - photosensitivyWarningBodyText?: string; - photosensitivyWarningInfoText?: string; - instructionListHeadingText?: string; - goodFitCaptionText?: string; - goodFitAltText?: string; - tooFarCaptionText?: string; - tooFarAltText?: string; - instructionListStepOneText?: string; - instructionListStepTwoText?: string; - instructionListStepThreeText?: string; - instructionListStepFourText?: string; - }; - - export type StreamDisplayText = { - recordingIndicatorText?: string; - cancelLivenessCheckText?: string; - }; - - export const defaultErrorDisplayText = { - timeoutHeaderText: 'Se acabó el tiempo', - timeoutMessageText: - "La cara no llenó el óvalo dentro del límite de tiempo. Vuelva a intentarlo y llene completamente el óvalo con la cara en 7 segundos.", - faceDistanceHeaderText: 'Comprobación fallida durante la cuenta atrás', - faceDistanceMessageText: - 'Evite acercarse durante la cuenta regresiva y asegúrese de que solo una cara esté frente a la cámara.', - clientHeaderText: 'Error del cliente', - clientMessageText: 'Verificación fallida debido a un problema con el cliente', - serverHeaderText: 'Problema del servidor', - serverMessageText: 'No se puede completar la verificación debido a un problema con el servidor', - landscapeHeaderText: 'Orientación horizontal no compatible', - landscapeMessageText: - 'Gire su dispositivo a la orientación vertical (retrato).', - portraitMessageText: - 'Asegúrese de que su dispositivo permanezca en orientación vertical (retrato) durante la verificación.', - tryAgainText: 'Intentar otra vez', - }; - - export type ErrorDisplayTextFoo = typeof defaultErrorDisplayText; - export type ErrorDisplayText = Partial; - - export const defaultLivenessDisplayText: Required = { - instructionsHeaderHeadingText: 'Liveness check', - instructionsHeaderBodyText: - 'You will go through a face verification process to prove that you are a real person.', - instructionsBeginCheckText: 'Begin check', - photosensitivyWarningHeadingText: 'Photosensitivity warning', - photosensitivyWarningBodyText: - 'This check displays colored lights. Use caution if you are photosensitive.', - photosensitivyWarningInfoText: - 'A small percentage of individuals may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.', - instructionListHeadingText: 'Follow the instructions to complete the check:', - goodFitCaptionText: 'Good fit', - goodFitAltText: - "Ilustration of a person's face, perfectly fitting inside of an oval.", - tooFarCaptionText: 'Too far', - tooFarAltText: - "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.", - instructionListStepOneText: - 'When an oval appears, fill the oval with your face within 7 seconds.', - instructionListStepTwoText: "Maximize your screen's brightness.", - instructionListStepThreeText: - 'Make sure your face is not covered with sunglasses or a mask.', - instructionListStepFourText: - 'Move to a well-lit place that is not in direct sunlight.', - cameraMinSpecificationsHeadingText: - 'Camera does not meet minimum specifications', - cameraMinSpecificationsMessageText: - 'Camera must support at least 320*240 resolution and 15 frames per second.', - cameraNotFoundHeadingText: 'Camera not accessible.', - cameraNotFoundMessageText: - 'Verifique que la cámara esté conectada y que los permisos de la cámara estén habilitados en la configuración antes de volver a intentarlo.', - retryCameraPermissionsText: 'Procesar de nuevo', - cancelLivenessCheckText: 'Cancelar comprobación de vitalidad', - recordingIndicatorText: 'Grabación', - hintMoveFaceFrontOfCameraText: 'Mover la cara frente a la cámara', - hintTooManyFacesText: 'Asegúrese de que solo una cara esté frente a la cámara', - hintFaceDetectedText: 'Cara detectada', - hintCanNotIdentifyText: 'Mover la cara frente a la cámara', - hintTooCloseText: 'Muévete mas atrás', - hintTooFarText: 'Muévete mas cerca', - hintHoldFacePositionCountdownText: 'Mantener la posición de la cara durante la cuenta regresiva', - hintConnectingText: 'Conectando...', - hintVerifyingText: 'Verificando...', - hintIlluminationTooBrightText: 'Mover al área de atenuación', - hintIlluminationTooDarkText: 'Mover a un área más brillante', - hintIlluminationNormalText: 'Condiciones de iluminación normales', - hintHoldFaceForFreshnessText: 'Quédate quieto', - ...defaultErrorDisplayText, - }; - - export interface LivenessDisplayText - extends HintDisplayText, - CameraDisplayText, - InstructionDisplayText, - ErrorDisplayText, - StreamDisplayText {} \ No newline at end of file + hintMoveFaceFrontOfCameraText?: string; + hintTooManyFacesText?: string; + hintFaceDetectedText?: string; + hintCanNotIdentifyText?: string; + hintTooCloseText?: string; + hintTooFarText?: string; + hintHoldFacePositionCountdownText?: string; + hintConnectingText?: string; + hintVerifyingText?: string; + hintIlluminationTooBrightText?: string; + hintIlluminationTooDarkText?: string; + hintIlluminationNormalText?: string; + hintHoldFaceForFreshnessText?: string; +}; + +export type CameraDisplayText = { + cameraMinSpecificationsHeadingText?: string; + cameraMinSpecificationsMessageText?: string; + cameraNotFoundHeadingText?: string; + cameraNotFoundMessageText?: string; + retryCameraPermissionsText?: string; +}; + +export type InstructionDisplayText = { + instructionsHeaderHeadingText?: string; + instructionsHeaderBodyText?: string; + instructionsBeginCheckText?: string; + photosensitivyWarningHeadingText?: string; + photosensitivyWarningBodyText?: string; + photosensitivyWarningInfoText?: string; + instructionListHeadingText?: string; + goodFitCaptionText?: string; + goodFitAltText?: string; + tooFarCaptionText?: string; + tooFarAltText?: string; + instructionListStepOneText?: string; + instructionListStepTwoText?: string; + instructionListStepThreeText?: string; + instructionListStepFourText?: string; +}; + +export type StreamDisplayText = { + recordingIndicatorText?: string; + cancelLivenessCheckText?: string; +}; + +export const defaultErrorDisplayText = { + timeoutHeaderText: "Se acabó el tiempo", + timeoutMessageText: + "La cara no llenó el óvalo dentro del límite de tiempo. Vuelva a intentarlo y llene completamente el óvalo con la cara en 7 segundos.", + faceDistanceHeaderText: "Comprobación fallida durante la cuenta atrás", + faceDistanceMessageText: + "Evite acercarse durante la cuenta regresiva y asegúrese de que solo una cara esté frente a la cámara.", + clientHeaderText: "Error del cliente", + clientMessageText: "Verificación fallida debido a un problema con el cliente", + serverHeaderText: "Problema del servidor", + serverMessageText: + "No se puede completar la verificación debido a un problema con el servidor", + landscapeHeaderText: "Orientación horizontal no compatible", + landscapeMessageText: + "Gire su dispositivo a la orientación vertical (retrato).", + portraitMessageText: + "Asegúrese de que su dispositivo permanezca en orientación vertical (retrato) durante la verificación.", + tryAgainText: "Intentar otra vez", +}; + +export type ErrorDisplayTextFoo = typeof defaultErrorDisplayText; +export type ErrorDisplayText = Partial; + +export const defaultLivenessDisplayText: Required = { + instructionsHeaderHeadingText: "Liveness check", + instructionsHeaderBodyText: + "You will go through a face verification process to prove that you are a real person.", + instructionsBeginCheckText: "Begin check", + photosensitivyWarningHeadingText: "Photosensitivity warning", + photosensitivyWarningBodyText: + "This check displays colored lights. Use caution if you are photosensitive.", + photosensitivyWarningInfoText: + "A small percentage of individuals may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.", + instructionListHeadingText: "Follow the instructions to complete the check:", + goodFitCaptionText: "Good fit", + goodFitAltText: + "Ilustration of a person's face, perfectly fitting inside of an oval.", + tooFarCaptionText: "Too far", + tooFarAltText: + "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.", + instructionListStepOneText: + "When an oval appears, fill the oval with your face within 7 seconds.", + instructionListStepTwoText: "Maximize your screen's brightness.", + instructionListStepThreeText: + "Make sure your face is not covered with sunglasses or a mask.", + instructionListStepFourText: + "Move to a well-lit place that is not in direct sunlight.", + cameraMinSpecificationsHeadingText: + "Camera does not meet minimum specifications", + cameraMinSpecificationsMessageText: + "Camera must support at least 320*240 resolution and 15 frames per second.", + cameraNotFoundHeadingText: "Camera not accessible.", + cameraNotFoundMessageText: + "Verifique que la cámara esté conectada y que los permisos de la cámara estén habilitados en la configuración antes de volver a intentarlo.", + retryCameraPermissionsText: "Procesar de nuevo", + cancelLivenessCheckText: "Cancelar comprobación de vitalidad", + recordingIndicatorText: "Grabación", + hintMoveFaceFrontOfCameraText: "Mover la cara frente a la cámara", + hintTooManyFacesText: + "Asegúrese de que solo una cara esté frente a la cámara", + hintFaceDetectedText: "Cara detectada", + hintCanNotIdentifyText: "Mover la cara frente a la cámara", + hintTooCloseText: "Muévete mas atrás", + hintTooFarText: "Muévete mas cerca", + hintHoldFacePositionCountdownText: + "Mantener la posición de la cara durante la cuenta regresiva", + hintConnectingText: "Conectando...", + hintVerifyingText: "Verificando...", + hintIlluminationTooBrightText: "Mover al área de atenuación", + hintIlluminationTooDarkText: "Mover a un área más brillante", + hintIlluminationNormalText: "Condiciones de iluminación normales", + hintHoldFaceForFreshnessText: "Quédate quieto", + ...defaultErrorDisplayText, +}; + +export interface LivenessDisplayText + extends HintDisplayText, + CameraDisplayText, + InstructionDisplayText, + ErrorDisplayText, + StreamDisplayText {} diff --git a/src/components/biometric/face-liveness-detector.tsx b/src/components/biometric/face-liveness-detector.tsx index eefa406a..e7596d69 100644 --- a/src/components/biometric/face-liveness-detector.tsx +++ b/src/components/biometric/face-liveness-detector.tsx @@ -3,7 +3,7 @@ import { ThemeProvider } from "@aws-amplify/ui-react"; import React from "react"; import { LoadingProgress } from "../elements/loading"; import { AlertErrorMessage } from "../elements/alert"; -import { defaultLivenessDisplayText } from './displayText' +import { defaultLivenessDisplayText } from "./displayText"; export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { const next = handleNextForm; @@ -39,12 +39,12 @@ export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { return ( <> - {error && + {error && ( - } + )}
{loading ? ( diff --git a/src/components/elements/alert/index.tsx b/src/components/elements/alert/index.tsx index 58fbcefb..686f424c 100644 --- a/src/components/elements/alert/index.tsx +++ b/src/components/elements/alert/index.tsx @@ -1,19 +1,20 @@ import Swal from "sweetalert2"; -import Alert from '@mui/material/Alert'; +import Alert from "@mui/material/Alert"; interface IPropsAlertErrorMessage { message: string; - type: "error" | "warning" | "info" | "success" + type: "error" | "warning" | "info" | "success"; } - interface IProps { +interface IProps { text?: string; } -export const AlertErrorMessage = ({message, type}: IPropsAlertErrorMessage) => ( - {message} -) +export const AlertErrorMessage = ({ + message, + type, +}: IPropsAlertErrorMessage) => {message}; - export const AlertError = (text?: string) => { +export const AlertError = (text?: string) => { return Swal.fire({ icon: "error", title: "Error", diff --git a/src/components/elements/boxContentCenter/index.tsx b/src/components/elements/boxContentCenter/index.tsx index 5fbde208..0c757934 100644 --- a/src/components/elements/boxContentCenter/index.tsx +++ b/src/components/elements/boxContentCenter/index.tsx @@ -11,7 +11,9 @@ export default function BoxContentCenter({ children }: any) { alignItems: "center", }} > - {children} + + {children} + ); } diff --git a/src/components/elements/loading/index.tsx b/src/components/elements/loading/index.tsx index 15e0c12d..74205b58 100644 --- a/src/components/elements/loading/index.tsx +++ b/src/components/elements/loading/index.tsx @@ -1,10 +1,10 @@ -import CircularProgress from '@mui/material/CircularProgress'; -import Box from '@mui/material/Box'; +import CircularProgress from "@mui/material/CircularProgress"; +import Box from "@mui/material/Box"; export const LoadingProgress = () => { return ( - - + + ); -} \ No newline at end of file +}; diff --git a/src/components/form/input/index.tsx b/src/components/form/input/index.tsx index c452e5ef..128f8e65 100644 --- a/src/components/form/input/index.tsx +++ b/src/components/form/input/index.tsx @@ -1,4 +1,4 @@ -import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; +import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined"; import Tooltip, { TooltipProps, tooltipClasses } from "@mui/material/Tooltip"; import { FormControl, InputLabel, Typography } from "@mui/material"; import { styled } from "@mui/material/styles"; @@ -39,7 +39,18 @@ export const FormControlApp = (props: IProps) => { error={props.msg ? true : false} shrink={true} > - {props.label} {props.required && "*"} {props.icon} + {props.label}{" "} + + {props.required && "*"} + {" "} + {props.icon} {props.tooltip && ( { } > - + diff --git a/src/components/layout/footer.tsx b/src/components/layout/footer.tsx index 89f03f9d..930c7767 100644 --- a/src/components/layout/footer.tsx +++ b/src/components/layout/footer.tsx @@ -14,7 +14,14 @@ export default function Index() { return ( <>
-
+
@@ -78,7 +85,14 @@ export default function Index() {
-
+
diff --git a/src/components/layout/navBar.tsx b/src/components/layout/navBar.tsx index 3e602cf7..ad6d96dd 100644 --- a/src/components/layout/navBar.tsx +++ b/src/components/layout/navBar.tsx @@ -19,16 +19,20 @@ export default function Index() { -
- +
+
- + logo
-
-
+
+
diff --git a/src/pages/auth/index.tsx b/src/pages/auth/index.tsx index 366303d2..ca901cce 100644 --- a/src/pages/auth/index.tsx +++ b/src/pages/auth/index.tsx @@ -69,7 +69,12 @@ export default function Index() { organismos gubernamentales.
- Lading Home + Lading Home diff --git a/src/pages/auth/method/index.tsx b/src/pages/auth/method/index.tsx index 4d13055c..9d75ad33 100644 --- a/src/pages/auth/method/index.tsx +++ b/src/pages/auth/method/index.tsx @@ -1,60 +1,113 @@ -import { useState } from 'react'; -import { useRouter } from 'next/router' -import { yupResolver } from '@hookform/resolvers/yup'; -import { useForm } from 'react-hook-form'; +import { useState } from "react"; +import { useRouter } from "next/router"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { useForm } from "react-hook-form"; import * as yup from "yup"; -import LockIcon from '@mui/icons-material/Lock'; -import PermContactCalendarIcon from '@mui/icons-material/PermContactCalendar'; +import LockIcon from "@mui/icons-material/Lock"; +import PermContactCalendarIcon from "@mui/icons-material/PermContactCalendar"; -import LadingChica from "../../../../public/assets/ladingChica.png" +import LadingChica from "../../../../public/assets/ladingChica.png"; -import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth" -import { GridContainer, GridItem } from "@/components/elements/grid" -import { TextBodyTiny, TextSubTitle, TextSubTitleBody, TextTitle } from "@/components/elements/typography" +import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; +import { GridContainer, GridItem } from "@/components/elements/grid"; +import { + TextBodyTiny, + TextSubTitle, + TextSubTitleBody, + TextTitle, +} from "@/components/elements/typography"; -import { FormControlApp } from '@/components/form/input'; -import { InputApp } from '@/themes/form/input'; -import { ButtonApp } from '@/components/elements/button'; -import { routes } from '@/constants/routes'; -import BoxContentCenter from '@/components/elements/boxContentCenter'; -import { labels } from '@/constants/labels'; -import { Typography } from '@mui/material'; +import { FormControlApp } from "@/components/form/input"; +import { InputApp } from "@/themes/form/input"; +import { ButtonApp } from "@/components/elements/button"; +import { routes } from "@/constants/routes"; +import BoxContentCenter from "@/components/elements/boxContentCenter"; +import { labels } from "@/constants/labels"; +import { Typography } from "@mui/material"; export default function Index() { + const router = useRouter(); - const router = useRouter() + return ( + + + + +
router.push("password")} + style={{ + border: "1px solid #E5E5E5", + cursor: "pointer", + borderRadius: "6px", + padding: "14px 12px", + marginBottom: "10px", + display: "flex", + alignItems: "center", + flexDirection: "row", + }} + > + +
+ + Contraseña + + + Iniciar sesión ingresando contraseña. + +
+
+
- return ( - - +
router.push("code")} + style={{ + border: "1px solid #E5E5E5", + cursor: "pointer", + borderRadius: "6px", + padding: "14px 12px", + marginBottom: "10px", + display: "flex", + alignItems: "center", + flexDirection: "row", + }} > - - -
router.push("password")} style={{border: "1px solid #E5E5E5", cursor: "pointer", borderRadius: "6px", padding: "14px 12px", marginBottom: "10px", display: "flex", alignItems: "center", flexDirection: "row"}}> - -
- Contraseña - Iniciar sesión ingresando contraseña. -
-
-
- - -
router.push("code")} style={{border: "1px solid #E5E5E5", cursor: "pointer", borderRadius: "6px", padding: "14px 12px", marginBottom: "10px", display: "flex", alignItems: "center", flexDirection: "row"}}> - -
- Código Autenticador - Ingrese un código de verificación de la aplicación de autenticación activa. -
-
-
-
- - - ) -} \ No newline at end of file + +
+ + Código Autenticador + + + Ingrese un código de verificación de la aplicación de + autenticación activa. + +
+
+
+ + + + ); +} diff --git a/src/pages/register/index.tsx b/src/pages/register/index.tsx index ca4377f0..1f011962 100644 --- a/src/pages/register/index.tsx +++ b/src/pages/register/index.tsx @@ -33,17 +33,17 @@ export default function Index() { // Lading Home // - // - - - - - + // + + + + + // // diff --git a/src/styles/globals.css b/src/styles/globals.css index f62090b0..2d75016c 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -1,4 +1,4 @@ -@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600&display=swap'); +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600&display=swap"); body { font-family: Poppins, sans-serif; @@ -20,57 +20,98 @@ body { color: #003670; } .text-success { - color: #2ECC71; + color: #2ecc71; } .text-secondary { - color: #0087FF; + color: #0087ff; } .text-error { - color: #EE2A24; + color: #ee2a24; } .text-info { - color: #23C3DF; + color: #23c3df; } .bg-primary { background: #003670; } .bg-success { - background: #2ECC71; + background: #2ecc71; } .bg-secondary { - background: #0087FF; + background: #0087ff; } .bg-error { - background: #EE2A24; + background: #ee2a24; } .bg-info { - background: #23C3DF; + background: #23c3df; } -.p-1 { padding: 5px; } -.py-1 { padding-top: 5px; padding-bottom: 5px; } -.px-1 { padding-left: 5px; padding-right: 5px; } +.p-1 { + padding: 5px; +} +.py-1 { + padding-top: 5px; + padding-bottom: 5px; +} +.px-1 { + padding-left: 5px; + padding-right: 5px; +} -.p-2 { padding: 10px; } -.py-2 { padding-top: 10px; padding-bottom: 10px; } -.px-2 { padding-left: 10px; padding-right: 10px; } +.p-2 { + padding: 10px; +} +.py-2 { + padding-top: 10px; + padding-bottom: 10px; +} +.px-2 { + padding-left: 10px; + padding-right: 10px; +} -.p-3 { padding: 15px; } -.py-3 { padding-top: 15px; padding-bottom: 15px; } -.px-3 { padding-left: 15px; padding-right: 15px; } +.p-3 { + padding: 15px; +} +.py-3 { + padding-top: 15px; + padding-bottom: 15px; +} +.px-3 { + padding-left: 15px; + padding-right: 15px; +} -.p-4 { padding: 20px; } -.py-4 { padding-top: 20px; padding-bottom: 20px; } -.px-4 { padding-left: 20px; padding-right: 20px; } +.p-4 { + padding: 20px; +} +.py-4 { + padding-top: 20px; + padding-bottom: 20px; +} +.px-4 { + padding-left: 20px; + padding-right: 20px; +} -.p-5 { padding: 25px; } -.py-5 { padding-top: 25px; padding-bottom: 25px; } -.px-5 { padding-left: 25px; padding-right: 25px; } +.p-5 { + padding: 25px; +} +.py-5 { + padding-top: 25px; + padding-bottom: 25px; +} +.px-5 { + padding-left: 25px; + padding-right: 25px; +} /* MUI global */ -.MuiStepLabel-iconContainer, .MuiStepConnector-horizontal { +.MuiStepLabel-iconContainer, +.MuiStepConnector-horizontal { display: none !important; } @@ -82,4 +123,4 @@ body { background: red; z-index: 500 !important; padding: 450px; -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json index 78eb66c1..97289f80 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -25,4 +25,4 @@ }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"] -} \ No newline at end of file +} From be48c9c524ba26ec8d4689a3a91eac7fb8d2113d Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 19:18:24 -0400 Subject: [PATCH 4/9] refactor(rekognition): handle errors with AWS examples --- .prettierc.js => .prettierrc.js | 0 package.json | 1 - .../biometric/face-liveness-detector.tsx | 43 ++++----- src/helpers/rekognition.ts | 20 ++-- src/pages/api/biometric/index.ts | 91 +++++++++++-------- 5 files changed, 79 insertions(+), 76 deletions(-) rename .prettierc.js => .prettierrc.js (100%) diff --git a/.prettierc.js b/.prettierrc.js similarity index 100% rename from .prettierc.js rename to .prettierrc.js diff --git a/package.json b/package.json index 6f6f1571..6f33eef3 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "yup": "0.32.11" }, "devDependencies": { - "@types/axios": "^0.14.0", "@types/cookie": "^0.5.1", "@types/node": "^18.16.3", "@types/react": "^18.2.1", diff --git a/src/components/biometric/face-liveness-detector.tsx b/src/components/biometric/face-liveness-detector.tsx index e7596d69..ca64bffa 100644 --- a/src/components/biometric/face-liveness-detector.tsx +++ b/src/components/biometric/face-liveness-detector.tsx @@ -1,20 +1,18 @@ -import { FaceLivenessDetector } from "@aws-amplify/ui-react-liveness"; -import { ThemeProvider } from "@aws-amplify/ui-react"; -import React from "react"; -import { LoadingProgress } from "../elements/loading"; -import { AlertErrorMessage } from "../elements/alert"; -import { defaultLivenessDisplayText } from "./displayText"; +import { FaceLivenessDetector } from '@aws-amplify/ui-react-liveness'; +import { Loader, ThemeProvider } from '@aws-amplify/ui-react'; +import { useState, useEffect } from "react"; +import { defaultLivenessDisplayText } from './displayText'; export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { const next = handleNextForm; const id = cedula; - const [loading, setLoading] = React.useState(true); - const [error, setError] = React.useState(false); - const [sessionId, setSessionId] = React.useState(""); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + const [sessionId, setSessionId] = useState(''); - React.useEffect(() => { + useEffect(() => { const fetchCreateLiveness = async () => { - const response = await fetch(`/api/biometric`, { method: "POST" }); + const response = await fetch(`/api/biometric`, { method: 'POST' }); const { sessionId } = await response.json(); setSessionId(sessionId); @@ -24,41 +22,38 @@ export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { fetchCreateLiveness(); }, []); + const onUserCancel = () => { + setSessionId(''); + setError(false); + }; + const handleAnalysisComplete = async () => { const response = await fetch( `/api/biometric?sessionId=${sessionId}&cedula=${id}` ); const data = await response.json(); - if (data.match) { + if (data.match === true) { next(); } else { - setError(true); + setError(error); } }; return ( - <> - {error && ( - - )} -
- + {loading ? ( - + ) : ( )} - ); } diff --git a/src/helpers/rekognition.ts b/src/helpers/rekognition.ts index 6c246630..596f2a41 100644 --- a/src/helpers/rekognition.ts +++ b/src/helpers/rekognition.ts @@ -1,21 +1,19 @@ -import { Rekognition } from "@aws-sdk/client-rekognition"; -import { Amplify, withSSRContext } from "aws-amplify"; -import { NextApiRequest } from "next/types"; +import { RekognitionClient } from '@aws-sdk/client-rekognition'; +import { Amplify, withSSRContext } from 'aws-amplify'; +import { NextApiRequest } from 'next/types'; -import awsExports from "../aws-exports"; +import awsExports from '../aws-exports'; Amplify.configure({ ...awsExports, ssr: true }); export async function getRekognitionClient( req: NextApiRequest -): Promise { - const { Credentials } = withSSRContext({ req }); - const credentials = await Credentials.get(); - const endpoint = "https://rekognition.us-east-1.amazonaws.com"; +): Promise { + const SSR = withSSRContext({ req }); + const credentials = await SSR.Credentials.get(); - return new Rekognition({ - region: "us-east-1", + return new RekognitionClient({ + region: awsExports.aws_project_region, credentials, - endpoint, }); } diff --git a/src/pages/api/biometric/index.ts b/src/pages/api/biometric/index.ts index e4c393b0..57c946ca 100644 --- a/src/pages/api/biometric/index.ts +++ b/src/pages/api/biometric/index.ts @@ -1,7 +1,12 @@ -import { NextApiRequest, NextApiResponse } from "next/types"; -import axios from "axios"; +import { NextApiRequest, NextApiResponse } from 'next/types'; +import axios from 'axios'; -import { getRekognitionClient } from "@/helpers"; +import { getRekognitionClient } from '@/helpers'; +import { + GetFaceLivenessSessionResultsCommand, + CompareFacesCommand, + CreateFaceLivenessSessionCommand, +} from '@aws-sdk/client-rekognition'; export default async function handler( req: NextApiRequest, @@ -17,65 +22,71 @@ export default async function handler( baseURL: process.env.NEXT_PUBLIC_PHOTO_API, }); - const rekognition = await getRekognitionClient(req); + const client = await getRekognitionClient(req); - if (req.method === "GET") { + if (req.method === 'GET') { const { sessionId, cedula } = req.query; const SessionId = sessionId as string; - const response = await rekognition.getFaceLivenessSessionResults({ + const command = new GetFaceLivenessSessionResultsCommand({ SessionId, }); + const response = await client.send(command); - let isLive: any; - let base64Image = ""; - let result: any; + let isLive; if (response.Confidence) { isLive = response.Confidence > 90; } - if (response.ReferenceImage && response.ReferenceImage.Bytes) { - base64Image = response.ReferenceImage.Bytes.toString(); - + if (isLive && response.ReferenceImage && response.ReferenceImage.Bytes) { const { data } = await http.get(`/${cedula}/photo`, { params: { - "api-key": process.env.NEXT_PUBLIC_PHOTO_API_KEY, + 'api-key': process.env.NEXT_PUBLIC_PHOTO_API_KEY, }, - responseType: "arraybuffer", + responseType: 'arraybuffer', }); + const buffer1 = Buffer.from(response.ReferenceImage.Bytes); + const buffer2 = Buffer.from(data, 'base64'); + const params = { + SourceImage: { + Bytes: buffer1, + }, + TargetImage: { + Bytes: buffer2, + }, + SimilarityThreshold: 90, + }; + + const command = new CompareFacesCommand(params); + let similarPercent = 0; + try { - result = await rekognition.compareFaces({ - SimilarityThreshold: 80, - TargetImage: { - Bytes: data, - }, - SourceImage: { - Bytes: response.ReferenceImage.Bytes, - }, - }); - } catch (ex) { + const compare = await client.send(command); + if (compare.FaceMatches && compare.FaceMatches.length) { + compare.FaceMatches.forEach((data) => { + similarPercent = data.Similarity as number; + }); + + if (similarPercent > 90) { + console.log(`Biometry validation successfully for citizen ${cedula}`); + res.status(200).end(JSON.stringify({match: true})); + } else { + console.log(`Biometry validation failed for citizen ${cedula}`); + res.status(200).end(JSON.stringify({match: false})); + } + } + } catch (error) { console.log(`Biometry validation failed for citizen ${cedula}`); - - return res.status(500).json({ - success: false, - }); + res.status(500).end(); } } - - const { FaceMatches } = result; - const isFaceMatched = - FaceMatches && FaceMatches.length && FaceMatches[0].Similarity > 90; - - console.log(`Biometry validation successfully for citizen ${cedula}`); - - return res.status(200).json({ - match: isFaceMatched, + } else if (req.method === 'POST') { + const command = new CreateFaceLivenessSessionCommand({ + ClientRequestToken: req.cookies.token, }); - } else if (req.method === "POST") { - const { SessionId: sessionId } = - await rekognition.createFaceLivenessSession({}); + const { SessionId: sessionId } = await client.send(command); return res.status(201).json({ sessionId }); } From 21302374f6ea1b23617d93c02ff665ad6fa379de Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 19:40:33 -0400 Subject: [PATCH 5/9] fix: lint all files and remove unused values --- ...git-id => landingChica.png.REMOVED.git-id} | 0 ...it-id => landingChica2.png.REMOVED.git-id} | 0 ....git-id => landingHome.svg.REMOVED.git-id} | 0 src/components/biometric/displayText.ts | 88 +++++++++---------- .../biometric/face-liveness-detector.tsx | 28 +++--- src/components/elements/cardAuth/index.tsx | 16 ++-- src/constants/labels.ts | 12 +-- src/constants/routes.ts | 12 +-- src/helpers/index.ts | 3 +- src/helpers/same-site-validator.ts | 10 --- src/models/challenge-response.ts | 20 ++--- src/pages/_app.tsx | 20 ++--- src/pages/_document.tsx | 2 +- src/pages/api/auth/index.ts | 12 +-- src/pages/api/biometric/index.ts | 8 +- src/pages/api/citizens/[cedula].ts | 8 +- src/pages/api/iam/index.ts | 10 +-- src/pages/api/types/index.ts | 2 +- src/pages/auth/code/index.tsx | 4 +- src/pages/auth/index.tsx | 6 +- src/pages/auth/method/index.tsx | 4 +- src/pages/auth/password/index.tsx | 4 +- src/pages/index.tsx | 2 +- src/pages/register/confirmation/index.tsx | 6 +- src/pages/register/index.tsx | 46 ++-------- src/pages/register/registered/index.tsx | 32 +++---- src/pages/register/stepper/index.tsx | 46 +++++----- src/pages/register/stepper/step1.tsx | 66 +++++++------- src/pages/register/stepper/step2.tsx | 86 +++++++++--------- src/pages/register/stepper/step2Modal.tsx | 43 +++++---- src/pages/register/stepper/step3.tsx | 54 ++++++------ tsconfig.json | 38 ++++++-- 32 files changed, 330 insertions(+), 358 deletions(-) rename public/assets/{ladingChica.png.REMOVED.git-id => landingChica.png.REMOVED.git-id} (100%) rename public/assets/{ladingChica2.png.REMOVED.git-id => landingChica2.png.REMOVED.git-id} (100%) rename public/assets/{ladingHome.svg.REMOVED.git-id => landingHome.svg.REMOVED.git-id} (100%) delete mode 100644 src/helpers/same-site-validator.ts diff --git a/public/assets/ladingChica.png.REMOVED.git-id b/public/assets/landingChica.png.REMOVED.git-id similarity index 100% rename from public/assets/ladingChica.png.REMOVED.git-id rename to public/assets/landingChica.png.REMOVED.git-id diff --git a/public/assets/ladingChica2.png.REMOVED.git-id b/public/assets/landingChica2.png.REMOVED.git-id similarity index 100% rename from public/assets/ladingChica2.png.REMOVED.git-id rename to public/assets/landingChica2.png.REMOVED.git-id diff --git a/public/assets/ladingHome.svg.REMOVED.git-id b/public/assets/landingHome.svg.REMOVED.git-id similarity index 100% rename from public/assets/ladingHome.svg.REMOVED.git-id rename to public/assets/landingHome.svg.REMOVED.git-id diff --git a/src/components/biometric/displayText.ts b/src/components/biometric/displayText.ts index 73014d1c..2f507e98 100644 --- a/src/components/biometric/displayText.ts +++ b/src/components/biometric/displayText.ts @@ -46,77 +46,77 @@ export type StreamDisplayText = { }; export const defaultErrorDisplayText = { - timeoutHeaderText: "Se acabó el tiempo", + timeoutHeaderText: 'Se acabó el tiempo', timeoutMessageText: - "La cara no llenó el óvalo dentro del límite de tiempo. Vuelva a intentarlo y llene completamente el óvalo con la cara en 7 segundos.", - faceDistanceHeaderText: "Comprobación fallida durante la cuenta atrás", + 'La cara no llenó el óvalo dentro del límite de tiempo. Vuelva a intentarlo y llene completamente el óvalo con la cara en 7 segundos.', + faceDistanceHeaderText: 'Comprobación fallida durante la cuenta atrás', faceDistanceMessageText: - "Evite acercarse durante la cuenta regresiva y asegúrese de que solo una cara esté frente a la cámara.", - clientHeaderText: "Error del cliente", - clientMessageText: "Verificación fallida debido a un problema con el cliente", - serverHeaderText: "Problema del servidor", + 'Evite acercarse durante la cuenta regresiva y asegúrese de que solo una cara esté frente a la cámara.', + clientHeaderText: 'Error del cliente', + clientMessageText: 'Verificación fallida debido a un problema con el cliente', + serverHeaderText: 'Problema del servidor', serverMessageText: - "No se puede completar la verificación debido a un problema con el servidor", - landscapeHeaderText: "Orientación horizontal no compatible", + 'No se puede completar la verificación debido a un problema con el servidor', + landscapeHeaderText: 'Orientación horizontal no compatible', landscapeMessageText: - "Gire su dispositivo a la orientación vertical (retrato).", + 'Gire su dispositivo a la orientación vertical (retrato).', portraitMessageText: - "Asegúrese de que su dispositivo permanezca en orientación vertical (retrato) durante la verificación.", - tryAgainText: "Intentar otra vez", + 'Asegúrese de que su dispositivo permanezca en orientación vertical (retrato) durante la verificación.', + tryAgainText: 'Intentar otra vez', }; export type ErrorDisplayTextFoo = typeof defaultErrorDisplayText; export type ErrorDisplayText = Partial; export const defaultLivenessDisplayText: Required = { - instructionsHeaderHeadingText: "Liveness check", + instructionsHeaderHeadingText: 'Liveness check', instructionsHeaderBodyText: - "You will go through a face verification process to prove that you are a real person.", - instructionsBeginCheckText: "Begin check", - photosensitivyWarningHeadingText: "Photosensitivity warning", + 'You will go through a face verification process to prove that you are a real person.', + instructionsBeginCheckText: 'Begin check', + photosensitivyWarningHeadingText: 'Photosensitivity warning', photosensitivyWarningBodyText: - "This check displays colored lights. Use caution if you are photosensitive.", + 'This check displays colored lights. Use caution if you are photosensitive.', photosensitivyWarningInfoText: - "A small percentage of individuals may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.", - instructionListHeadingText: "Follow the instructions to complete the check:", - goodFitCaptionText: "Good fit", + 'A small percentage of individuals may experience epileptic seizures when exposed to colored lights. Use caution if you, or anyone in your family, have an epileptic condition.', + instructionListHeadingText: 'Follow the instructions to complete the check:', + goodFitCaptionText: 'Good fit', goodFitAltText: "Ilustration of a person's face, perfectly fitting inside of an oval.", - tooFarCaptionText: "Too far", + tooFarCaptionText: 'Too far', tooFarAltText: "Illustration of a person's face inside of an oval; there is a gap between the perimeter of the face and the boundaries of the oval.", instructionListStepOneText: - "When an oval appears, fill the oval with your face within 7 seconds.", + 'When an oval appears, fill the oval with your face within 7 seconds.', instructionListStepTwoText: "Maximize your screen's brightness.", instructionListStepThreeText: - "Make sure your face is not covered with sunglasses or a mask.", + 'Make sure your face is not covered with sunglasses or a mask.', instructionListStepFourText: - "Move to a well-lit place that is not in direct sunlight.", + 'Move to a well-lit place that is not in direct sunlight.', cameraMinSpecificationsHeadingText: - "Camera does not meet minimum specifications", + 'Camera does not meet minimum specifications', cameraMinSpecificationsMessageText: - "Camera must support at least 320*240 resolution and 15 frames per second.", - cameraNotFoundHeadingText: "Camera not accessible.", + 'Camera must support at least 320*240 resolution and 15 frames per second.', + cameraNotFoundHeadingText: 'Camera not accessible.', cameraNotFoundMessageText: - "Verifique que la cámara esté conectada y que los permisos de la cámara estén habilitados en la configuración antes de volver a intentarlo.", - retryCameraPermissionsText: "Procesar de nuevo", - cancelLivenessCheckText: "Cancelar comprobación de vitalidad", - recordingIndicatorText: "Grabación", - hintMoveFaceFrontOfCameraText: "Mover la cara frente a la cámara", + 'Verifique que la cámara esté conectada y que los permisos de la cámara estén habilitados en la configuración antes de volver a intentarlo.', + retryCameraPermissionsText: 'Procesar de nuevo', + cancelLivenessCheckText: 'Cancelar comprobación de vitalidad', + recordingIndicatorText: 'Grabación', + hintMoveFaceFrontOfCameraText: 'Mover la cara frente a la cámara', hintTooManyFacesText: - "Asegúrese de que solo una cara esté frente a la cámara", - hintFaceDetectedText: "Cara detectada", - hintCanNotIdentifyText: "Mover la cara frente a la cámara", - hintTooCloseText: "Muévete mas atrás", - hintTooFarText: "Muévete mas cerca", + 'Asegúrese de que solo una cara esté frente a la cámara', + hintFaceDetectedText: 'Cara detectada', + hintCanNotIdentifyText: 'Mover la cara frente a la cámara', + hintTooCloseText: 'Muévete mas atrás', + hintTooFarText: 'Muévete mas cerca', hintHoldFacePositionCountdownText: - "Mantener la posición de la cara durante la cuenta regresiva", - hintConnectingText: "Conectando...", - hintVerifyingText: "Verificando...", - hintIlluminationTooBrightText: "Mover al área de atenuación", - hintIlluminationTooDarkText: "Mover a un área más brillante", - hintIlluminationNormalText: "Condiciones de iluminación normales", - hintHoldFaceForFreshnessText: "Quédate quieto", + 'Mantener la posición de la cara durante la cuenta regresiva', + hintConnectingText: 'Conectando...', + hintVerifyingText: 'Verificando...', + hintIlluminationTooBrightText: 'Mover al área de atenuación', + hintIlluminationTooDarkText: 'Mover a un área más brillante', + hintIlluminationNormalText: 'Condiciones de iluminación normales', + hintHoldFaceForFreshnessText: 'Quédate quieto', ...defaultErrorDisplayText, }; diff --git a/src/components/biometric/face-liveness-detector.tsx b/src/components/biometric/face-liveness-detector.tsx index ca64bffa..d4a1ef5c 100644 --- a/src/components/biometric/face-liveness-detector.tsx +++ b/src/components/biometric/face-liveness-detector.tsx @@ -1,6 +1,6 @@ import { FaceLivenessDetector } from '@aws-amplify/ui-react-liveness'; import { Loader, ThemeProvider } from '@aws-amplify/ui-react'; -import { useState, useEffect } from "react"; +import { useState, useEffect } from 'react'; import { defaultLivenessDisplayText } from './displayText'; export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { @@ -42,18 +42,18 @@ export function LivenessQuickStartReact({ handleNextForm, cedula }: any) { return ( - {loading ? ( - - ) : ( - - )} - + {loading ? ( + + ) : ( + + )} + ); } diff --git a/src/components/elements/cardAuth/index.tsx b/src/components/elements/cardAuth/index.tsx index 6d2da7b1..4683fe0b 100644 --- a/src/components/elements/cardAuth/index.tsx +++ b/src/components/elements/cardAuth/index.tsx @@ -10,22 +10,22 @@ export const CardAuth = ({ subTitle, subTitle2, children, - lading, - ladingWidth, - ladingHeight, + landing, + landingWidth, + landingHeight, icon, }: any) => { return (
- {lading && ( + {landing && (
Lading
)} diff --git a/src/constants/labels.ts b/src/constants/labels.ts index a64e29a7..5c58b0f9 100644 --- a/src/constants/labels.ts +++ b/src/constants/labels.ts @@ -1,12 +1,12 @@ export const labels = { form: { - requiredField: "Campo requerido", - requiredEmail: "El Correo Electrónico es obligatorio", - invalidEmail: "El Correo Electrónico no es válido", + requiredField: 'Campo requerido', + requiredEmail: 'El Correo Electrónico es obligatorio', + invalidEmail: 'El Correo Electrónico no es válido', }, select: { - select: "Sin Seleccionar", - selectFilters: "Todos(as)", - inputRequired: "Campo requerido", + select: 'Sin Seleccionar', + selectFilters: 'Todos(as)', + inputRequired: 'Campo requerido', }, }; diff --git a/src/constants/routes.ts b/src/constants/routes.ts index 59bf2f26..512c07c4 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -1,12 +1,12 @@ export const routes = { auth: { - home: "/", - password: "auth/password", - method: "method", + home: '/', + password: 'auth/password', + method: 'method', }, register: { - home: "register", - confirmation: "register/confirmation", - registered: "register/registered", + home: 'register', + confirmation: 'register/confirmation', + registered: 'register/registered', }, }; diff --git a/src/helpers/index.ts b/src/helpers/index.ts index 9de9c997..c95fe023 100644 --- a/src/helpers/index.ts +++ b/src/helpers/index.ts @@ -1,2 +1 @@ -export { validateSameSiteRequest } from "./same-site-validator"; -export { getRekognitionClient } from "./rekognition"; +export { getRekognitionClient } from './rekognition'; diff --git a/src/helpers/same-site-validator.ts b/src/helpers/same-site-validator.ts deleted file mode 100644 index d987f57d..00000000 --- a/src/helpers/same-site-validator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { IncomingHttpHeaders } from "node:http"; - -export function validateSameSiteRequest(headers: IncomingHttpHeaders) { - const fetchHeaderKey = "sec-fetch-site"; - const fetchHeaderValue = "same-origin"; - - return ( - headers[fetchHeaderKey] && headers[fetchHeaderKey] === fetchHeaderValue - ); -} diff --git a/src/models/challenge-response.ts b/src/models/challenge-response.ts index 0fcbdda1..c3617c96 100644 --- a/src/models/challenge-response.ts +++ b/src/models/challenge-response.ts @@ -16,8 +16,8 @@ export class Challenge { !this.sign?.PINKY ) { return { - text: "Muestra tu mano cerrada", - image: "fist", + text: 'Muestra tu mano cerrada', + image: 'fist', }; } @@ -29,8 +29,8 @@ export class Challenge { !this.sign?.PINKY ) { return { - text: "Muestra tu pulgar", - image: "thumb", + text: 'Muestra tu pulgar', + image: 'thumb', }; } @@ -42,8 +42,8 @@ export class Challenge { !this.sign?.PINKY ) { return { - text: "Muestra dos dedos", - image: "two-fingers", + text: 'Muestra dos dedos', + image: 'two-fingers', }; } @@ -55,8 +55,8 @@ export class Challenge { !this.sign?.PINKY ) { return { - text: "Muestra tres dedos", - image: "three-fingers", + text: 'Muestra tres dedos', + image: 'three-fingers', }; } @@ -68,8 +68,8 @@ export class Challenge { this.sign?.PINKY ) { return { - text: "Muestra tu mano abierta", - image: "open-hand", + text: 'Muestra tu mano abierta', + image: 'open-hand', }; } diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 72f85496..8069c35c 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,15 +1,15 @@ -import CssBaseline from "@mui/material/CssBaseline"; -import { ThemeProvider } from "@mui/material/styles"; -import type { AppProps } from "next/app"; -import { Amplify } from "aws-amplify"; -import Head from "next/head"; +import CssBaseline from '@mui/material/CssBaseline'; +import { ThemeProvider } from '@mui/material/styles'; +import type { AppProps } from 'next/app'; +import { Amplify } from 'aws-amplify'; +import Head from 'next/head'; -import Layout from "../components/layout"; -import awsExports from "../aws-exports"; -import { theme } from "../themes"; +import Layout from '../components/layout'; +import awsExports from '../aws-exports'; +import { theme } from '../themes'; -import "@aws-amplify/ui-react/styles.css"; -import "@/styles/globals.css"; +import '@aws-amplify/ui-react/styles.css'; +import '@/styles/globals.css'; Amplify.configure(awsExports); diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index e82cb215..367fe2be 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,4 +1,4 @@ -import { Html, Head, Main, NextScript } from "next/document"; +import { Html, Head, Main, NextScript } from 'next/document'; export default function Document() { return ( diff --git a/src/pages/api/auth/index.ts b/src/pages/api/auth/index.ts index 0b7b7c2f..c8f2788a 100644 --- a/src/pages/api/auth/index.ts +++ b/src/pages/api/auth/index.ts @@ -1,18 +1,18 @@ -import { NextApiRequest, NextApiResponse } from "next/types"; -import cookie from "cookie"; +import { NextApiRequest, NextApiResponse } from 'next/types'; +import cookie from 'cookie'; export default async function handler( req: NextApiRequest, res: NextApiResponse ): Promise { res.setHeader( - "Set-cookie", - cookie.serialize("token", process.env.NEXT_PUBLIC_COOKIE_KEY as string, { + 'Set-cookie', + cookie.serialize('token', process.env.NEXT_PUBLIC_COOKIE_KEY as string, { httpOnly: true, secure: true, maxAge: 60 * 60 * 10, - sameSite: "strict", - path: "/", + sameSite: 'strict', + path: '/', }) ); diff --git a/src/pages/api/biometric/index.ts b/src/pages/api/biometric/index.ts index 57c946ca..126044aa 100644 --- a/src/pages/api/biometric/index.ts +++ b/src/pages/api/biometric/index.ts @@ -70,11 +70,13 @@ export default async function handler( }); if (similarPercent > 90) { - console.log(`Biometry validation successfully for citizen ${cedula}`); - res.status(200).end(JSON.stringify({match: true})); + console.log( + `Biometry validation successfully for citizen ${cedula}` + ); + res.status(200).end(JSON.stringify({ match: true })); } else { console.log(`Biometry validation failed for citizen ${cedula}`); - res.status(200).end(JSON.stringify({match: false})); + res.status(200).end(JSON.stringify({ match: false })); } } } catch (error) { diff --git a/src/pages/api/citizens/[cedula].ts b/src/pages/api/citizens/[cedula].ts index bcb23396..e770ad4e 100644 --- a/src/pages/api/citizens/[cedula].ts +++ b/src/pages/api/citizens/[cedula].ts @@ -1,7 +1,7 @@ -import { NextApiRequest, NextApiResponse } from "next/types"; -import axios from "axios"; +import { NextApiRequest, NextApiResponse } from 'next/types'; +import axios from 'axios'; -import { CitizensBasicInformationResponse } from "../types"; +import { CitizensBasicInformationResponse } from '../types'; export default async function handler( req: NextApiRequest, @@ -24,7 +24,7 @@ export default async function handler( ); const { names, id } = citizen.payload; - const name = names.split(" ")[0]; + const name = names.split(' ')[0]; res.status(200).json({ name, id }); } diff --git a/src/pages/api/iam/index.ts b/src/pages/api/iam/index.ts index 434ea9ad..66ff8175 100644 --- a/src/pages/api/iam/index.ts +++ b/src/pages/api/iam/index.ts @@ -1,10 +1,10 @@ -import { NextApiRequest, NextApiResponse } from "next/types"; -import axios, { AxiosError } from "axios"; +import { NextApiRequest, NextApiResponse } from 'next/types'; +import axios, { AxiosError } from 'axios'; import { CitizensBasicInformationResponse, VerifyIamUserResponse, -} from "../types"; +} from '../types'; export default async function handler( req: NextApiRequest, @@ -20,14 +20,14 @@ export default async function handler( baseURL: process.env.NEXT_PUBLIC_IAM_API, }); - if (req.method === "GET") { + if (req.method === 'GET') { const { cedula } = req.query; const { data } = await http.get( `/auth/validations/users/existence?username=${cedula}` ); return res.status(200).json(data); - } else if (req.method === "POST") { + } else if (req.method === 'POST') { const { body } = req; const { username, email, password } = body; diff --git a/src/pages/api/types/index.ts b/src/pages/api/types/index.ts index bc5484ec..0dbe29e3 100644 --- a/src/pages/api/types/index.ts +++ b/src/pages/api/types/index.ts @@ -3,7 +3,7 @@ export type CitizenBasicInformation = { names: string; firstSurname: string; secondSurname: string; - gender: "M" | "F"; + gender: 'M' | 'F'; }; export type CitizensBasicInformationResponse = { diff --git a/src/pages/auth/code/index.tsx b/src/pages/auth/code/index.tsx index 45ebbc21..7b038f05 100644 --- a/src/pages/auth/code/index.tsx +++ b/src/pages/auth/code/index.tsx @@ -4,7 +4,7 @@ import { yupResolver } from "@hookform/resolvers/yup"; import { useForm } from "react-hook-form"; import * as yup from "yup"; -import LadingChica from "../../../../public/assets/ladingChica.png"; +import LandingChica from "../../../../public/assets/landingChica.png"; import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; import { GridContainer, GridItem } from "@/components/elements/grid"; @@ -56,7 +56,7 @@ export default function Index() { title="Acceso Cuenta Única" subTitle="Para acceder a su cuenta única ciudadana, por favor ingrese su contraseña o su código de autenticación de doble factor. Recuerde que su contraseña es sensible a mayúsculas y minúsculas." subTitle2="correo@usuario.com" - lading={LadingChica} + landing={LandingChica} > diff --git a/src/pages/auth/index.tsx b/src/pages/auth/index.tsx index ca901cce..8df1b1ee 100644 --- a/src/pages/auth/index.tsx +++ b/src/pages/auth/index.tsx @@ -13,7 +13,7 @@ import { } from "@/components/elements/typography"; import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; import { GridContainer, GridItem } from "@/components/elements/grid"; -import LadingHome from "../../../public/assets/ladingHome.svg"; +import LandingHome from "../../../public/assets/landingHome.svg"; import { ButtonApp } from "@/components/elements/button"; import { FormControlApp } from "@/components/form/input"; import { InputApp } from "@/themes/form/input"; @@ -70,8 +70,8 @@ export default function Index() {
Lading Home diff --git a/src/pages/auth/method/index.tsx b/src/pages/auth/method/index.tsx index 9d75ad33..d1d4f68f 100644 --- a/src/pages/auth/method/index.tsx +++ b/src/pages/auth/method/index.tsx @@ -7,7 +7,7 @@ import * as yup from "yup"; import LockIcon from "@mui/icons-material/Lock"; import PermContactCalendarIcon from "@mui/icons-material/PermContactCalendar"; -import LadingChica from "../../../../public/assets/ladingChica.png"; +import LandingChica from "../../../../public/assets/landingChica.png"; import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; import { GridContainer, GridItem } from "@/components/elements/grid"; @@ -35,7 +35,7 @@ export default function Index() { title="Seleccionar Método de Acceso" subTitle="Selecciona la opción de inicio de sesión" subTitle2="correo@usuario.com" - lading={LadingChica} + landing={LandingChica} > diff --git a/src/pages/auth/password/index.tsx b/src/pages/auth/password/index.tsx index 9390c2ef..3a14ccf3 100644 --- a/src/pages/auth/password/index.tsx +++ b/src/pages/auth/password/index.tsx @@ -4,7 +4,7 @@ import { yupResolver } from "@hookform/resolvers/yup"; import { useForm } from "react-hook-form"; import * as yup from "yup"; -import LadingChica from "../../../../public/assets/ladingChica.png"; +import LandingChica from "../../../../public/assets/landingChica.png"; import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; import { GridContainer, GridItem } from "@/components/elements/grid"; @@ -56,7 +56,7 @@ export default function Index() { title="Acceso Cuenta Única" subTitle="Para acceder a su cuenta única ciudadana, por favor ingrese su contraseña o su código de autenticación de doble factor. Recuerde que su contraseña es sensible a mayúsculas y minúsculas." subTitle2="correo@usuario.com" - lading={LadingChica} + landing={LandingChica} > diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 94137ed2..c0426b8f 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,4 +1,4 @@ -import Register from "./register"; +import Register from './register'; export default function Home() { return ; diff --git a/src/pages/register/confirmation/index.tsx b/src/pages/register/confirmation/index.tsx index 7b8d0a36..3a3ddee4 100644 --- a/src/pages/register/confirmation/index.tsx +++ b/src/pages/register/confirmation/index.tsx @@ -7,7 +7,7 @@ import * as yup from "yup"; import MarkEmailReadOutlinedIcon from "@mui/icons-material/MarkEmailReadOutlined"; import { GridContainer, GridItem } from "@/components/elements/grid"; import BoxContentCenter from "@/components/elements/boxContentCenter"; -import LadingChico from "../../../../public/assets/ladingChico.png"; +import LandingChico from "../../../../public/assets/landingChico.png"; import { CardAuth } from "@/components/elements/cardAuth"; import { ButtonApp } from "@/components/elements/button"; import { FormControlApp } from "@/components/form/input"; @@ -54,8 +54,8 @@ export default function Index() { } diff --git a/src/pages/register/index.tsx b/src/pages/register/index.tsx index 1f011962..a29365f7 100644 --- a/src/pages/register/index.tsx +++ b/src/pages/register/index.tsx @@ -1,51 +1,19 @@ -import { - TextSubTitle, - TextSubTitleBody, - TextTitle, -} from "@/components/elements/typography"; -import LadingChica2 from "../../../public/assets/ladingChica2.png"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import { CardAuth } from "@/components/elements/cardAuth"; -import StepperRegister from "./stepper"; -import Image from "next/image"; -import BoxContentCenter from "@/components/elements/boxContentCenter"; -import LadingChica from "../../../public/assets/ladingChica.png"; +import LandingChica2 from '../../../public/assets/landingChica.png'; +import { CardAuth } from '@/components/elements/cardAuth'; +import StepperRegister from './stepper'; +import BoxContentCenter from '@/components/elements/boxContentCenter'; export default function Index() { return ( - // - // - // - // ¡Bienvenido a la Plataforma Única de Autenticación{" "} - // Ciudadana! - // - // - // Accede o regístrate con un único usuario y contraseña, para solicitar - // o consultar todos tus servicios y trámites gubernamentales. - // - //
- // - // Una manera fácil y cómoda de identificarte, para realizar trámites - // desde tu computadora o celular sin necesidad de trasladarte a los - // organismos gubernamentales. - // - //
- // Lading Home - //
- - // - - // - //
); } diff --git a/src/pages/register/registered/index.tsx b/src/pages/register/registered/index.tsx index 1b170b81..a1dc1195 100644 --- a/src/pages/register/registered/index.tsx +++ b/src/pages/register/registered/index.tsx @@ -1,15 +1,15 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import * as yup from "yup"; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +import * as yup from 'yup'; -import CheckCircleOutlineOutlinedIcon from "@mui/icons-material/CheckCircleOutlineOutlined"; -import BoxContentCenter from "@/components/elements/boxContentCenter"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import LadingChico from "../../../../public/assets/ladingChico.png"; -import { TextBody } from "@/components/elements/typography"; -import { CardAuth } from "@/components/elements/cardAuth"; -import { ButtonApp } from "@/components/elements/button"; -import { labels } from "@/constants/labels"; +import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined'; +import BoxContentCenter from '@/components/elements/boxContentCenter'; +import { GridContainer, GridItem } from '@/components/elements/grid'; +import LandingChico from '../../../../public/assets/landingChico.png'; +import { TextBody } from '@/components/elements/typography'; +import { CardAuth } from '@/components/elements/cardAuth'; +import { ButtonApp } from '@/components/elements/button'; +import { labels } from '@/constants/labels'; interface IFormInputs { email: string; @@ -27,7 +27,7 @@ export default function Index() { const { formState: { errors }, } = useForm({ - reValidateMode: "onSubmit", + reValidateMode: 'onSubmit', shouldFocusError: false, resolver: yupResolver(schema), }); @@ -36,11 +36,11 @@ export default function Index() { } > @@ -63,7 +63,7 @@ export default function Index() { window.open( - "https://beta.auth.digital.gob.do/realms/master/account/" + 'https://beta.auth.digital.gob.do/realms/master/account/' ) } > diff --git a/src/pages/register/stepper/index.tsx b/src/pages/register/stepper/index.tsx index e453ca14..a118996d 100644 --- a/src/pages/register/stepper/index.tsx +++ b/src/pages/register/stepper/index.tsx @@ -1,19 +1,19 @@ -import Typography from "@mui/material/Typography"; -import StepLabel from "@mui/material/StepLabel"; -import Stepper from "@mui/material/Stepper"; -import Button from "@mui/material/Button"; -import Step from "@mui/material/Step"; -import Box from "@mui/material/Box"; -import * as React from "react"; -import axios from "axios"; - -import { routes } from "@/constants/routes"; -import { useRouter } from "next/router"; -import Step1 from "./step1"; -import Step2 from "./step2"; -import Step3 from "./step3"; - -const steps = ["PASO 1", "PASO 2", "PASO 3"]; +import Typography from '@mui/material/Typography'; +import StepLabel from '@mui/material/StepLabel'; +import Stepper from '@mui/material/Stepper'; +import Button from '@mui/material/Button'; +import Step from '@mui/material/Step'; +import Box from '@mui/material/Box'; +import * as React from 'react'; +import axios from 'axios'; + +import { routes } from '@/constants/routes'; +import { useRouter } from 'next/router'; +import Step1 from './step1'; +import Step2 from './step2'; +import Step3 from './step3'; + +const steps = ['PASO 1', 'PASO 2', 'PASO 3']; export async function getServerSideProps(ctx: any) { await axios.get(`/api/auth`); @@ -87,9 +87,9 @@ export default function StepperRegister() { }; return ( - + {steps.map((label, index) => { @@ -116,11 +116,11 @@ export default function StepperRegister() { - {label} + {label} ); @@ -131,13 +131,13 @@ export default function StepperRegister() { All steps completed - you're finished - - + + ) : ( -
+
{activeStep === 0 && ( )} diff --git a/src/pages/register/stepper/step1.tsx b/src/pages/register/stepper/step1.tsx index fb246519..50acef90 100644 --- a/src/pages/register/stepper/step1.tsx +++ b/src/pages/register/stepper/step1.tsx @@ -1,19 +1,19 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import ReCAPTCHA from "react-google-recaptcha"; -import { useForm } from "react-hook-form"; -import { useRef, useState } from "react"; -import getConfig from "next/config"; -import * as yup from "yup"; - -import { GridContainer, GridItem } from "@/components/elements/grid"; -import { CitizensBasicInformationResponse } from "@/pages/api/types"; -import LoadingBackdrop from "@/components/elements/loadingBackdrop"; -import { TextBody } from "@/components/elements/typography"; -import { AlertWarning } from "@/components/elements/alert"; -import { ButtonApp } from "@/components/elements/button"; -import { FormControlApp } from "@/components/form/input"; -import { InputApp } from "@/themes/form/input"; -import { labels } from "@/constants/labels"; +import { yupResolver } from '@hookform/resolvers/yup'; +import ReCAPTCHA from 'react-google-recaptcha'; +import { useForm } from 'react-hook-form'; +import { useRef, useState } from 'react'; +import getConfig from 'next/config'; +import * as yup from 'yup'; + +import { GridContainer, GridItem } from '@/components/elements/grid'; +import { CitizensBasicInformationResponse } from '@/pages/api/types'; +import LoadingBackdrop from '@/components/elements/loadingBackdrop'; +import { TextBody } from '@/components/elements/typography'; +import { AlertWarning } from '@/components/elements/alert'; +import { ButtonApp } from '@/components/elements/button'; +import { FormControlApp } from '@/components/form/input'; +import { InputApp } from '@/themes/form/input'; +import { labels } from '@/constants/labels'; const { publicRuntimeConfig } = getConfig(); @@ -26,7 +26,7 @@ const schema = yup.object({ .string() .trim() .required(labels.form.requiredField) - .min(11, "Debe contener 11 dígitos"), + .min(11, 'Debe contener 11 dígitos'), }); export default function Step1({ setInfoCedula, handleNext }: any) { @@ -42,15 +42,15 @@ export default function Step1({ setInfoCedula, handleNext }: any) { const handleChange = (e: any) => { const cedulaValue = e.target.value - .replace(/\D/g, "") + .replace(/\D/g, '') .match(/(\d{0,3})(\d{0,7})(\d{0,1})/); e.target.value = !cedulaValue[2] ? cedulaValue[1] : `${cedulaValue[1]}-${cedulaValue[2]}${`${ - cedulaValue[3] ? `-${cedulaValue[3]}` : "" - }`}${`${cedulaValue[4] ? `-${cedulaValue[4]}` : ""}`}`; - const numbers = e.target.value.replace(/(\D)/g, ""); - setValue("cedula", numbers); + cedulaValue[3] ? `-${cedulaValue[3]}` : '' + }`}${`${cedulaValue[4] ? `-${cedulaValue[4]}` : ''}`}`; + const numbers = e.target.value.replace(/(\D)/g, ''); + setValue('cedula', numbers); }; const { @@ -58,7 +58,7 @@ export default function Step1({ setInfoCedula, handleNext }: any) { formState: { errors }, setValue, } = useForm({ - reValidateMode: "onSubmit", + reValidateMode: 'onSubmit', shouldFocusError: false, resolver: yupResolver(schema), }); @@ -68,7 +68,7 @@ export default function Step1({ setInfoCedula, handleNext }: any) { if (!tokenCaptcha) { return AlertWarning( - "Necesitamos verificar que no eres un robot. Por favor complete el control de seguridad" + 'Necesitamos verificar que no eres un robot. Por favor complete el control de seguridad' ); } @@ -90,7 +90,7 @@ export default function Step1({ setInfoCedula, handleNext }: any) { handleNext(); }) .catch(() => { - AlertWarning("Parece que ha introducido una cédula inválida."); + AlertWarning('Parece que ha introducido una cédula inválida.'); }) .finally(() => setLoading(false)); }; @@ -133,19 +133,19 @@ export default function Step1({ setInfoCedula, handleNext }: any) {

diff --git a/src/pages/register/stepper/step2.tsx b/src/pages/register/stepper/step2.tsx index 9a7bf3fb..d7ff54f2 100644 --- a/src/pages/register/stepper/step2.tsx +++ b/src/pages/register/stepper/step2.tsx @@ -1,20 +1,20 @@ -import SentimentSatisfiedOutlinedIcon from "@mui/icons-material/SentimentSatisfiedOutlined"; -import CameraAltOutlinedIcon from "@mui/icons-material/CameraAltOutlined"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import { useState } from "react"; -import * as yup from "yup"; +import SentimentSatisfiedOutlinedIcon from '@mui/icons-material/SentimentSatisfiedOutlined'; +import CameraAltOutlinedIcon from '@mui/icons-material/CameraAltOutlined'; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +import { useState } from 'react'; +import * as yup from 'yup'; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import FormControlLabel from "@mui/material/FormControlLabel"; -import { TextBody } from "@/components/elements/typography"; -import { AlertWarning } from "@/components/elements/alert"; -import { ButtonApp } from "@/components/elements/button"; -import FormGroup from "@mui/material/FormGroup"; -import Checkbox from "@mui/material/Checkbox"; -import { labels } from "@/constants/labels"; -import { Typography } from "@mui/material"; -import Step2Modal from "./step2Modal"; +import { GridContainer, GridItem } from '@/components/elements/grid'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import { TextBody } from '@/components/elements/typography'; +import { AlertWarning } from '@/components/elements/alert'; +import { ButtonApp } from '@/components/elements/button'; +import FormGroup from '@mui/material/FormGroup'; +import Checkbox from '@mui/material/Checkbox'; +import { labels } from '@/constants/labels'; +import { Typography } from '@mui/material'; +import Step2Modal from './step2Modal'; interface IFormInputs { acceptTermAndConditions: boolean; @@ -33,13 +33,11 @@ export default function Step2({ infoCedula, handleNext }: any) { const handleClick = () => setOpen(!open); const { - register, handleSubmit, formState: { errors }, - control, setValue, } = useForm({ - reValidateMode: "onSubmit", + reValidateMode: 'onSubmit', shouldFocusError: false, resolver: yupResolver(schema), }); @@ -47,7 +45,7 @@ export default function Step2({ infoCedula, handleNext }: any) { const onSubmit = (data: IFormInputs) => { if (!data.acceptTermAndConditions) { return AlertWarning( - "Para continuar debe aceptar Términos y Políticas de Privacidad" + 'Para continuar debe aceptar Términos y Políticas de Privacidad' ); } handleClick(); @@ -57,8 +55,8 @@ export default function Step2({ infoCedula, handleNext }: any) { <>
- ¡Hola {infoCedula?.name}!{" "} - + ¡Hola {infoCedula?.name}!{' '} + Ahora vamos a verificar tu identidad mediante autenticación biométrica y continuar con el proceso de tú registro, asegúrate de disponer de los siguientes elementos: @@ -71,21 +69,21 @@ export default function Step2({ infoCedula, handleNext }: any) {
- Tener disponible un teléfono móvil o computadora con{" "} - cámara integrada. + Tener disponible un teléfono móvil o computadora con{' '} + cámara integrada.
@@ -93,21 +91,21 @@ export default function Step2({ infoCedula, handleNext }: any) {
- Permitir capturas de{" "} - + Permitir capturas de{' '} + fotografías de tu rostro. @@ -117,7 +115,7 @@ export default function Step2({ infoCedula, handleNext }: any) { Verificación con pasaporte disponible próximamente @@ -125,15 +123,15 @@ export default function Step2({ infoCedula, handleNext }: any) {

- + { - setValue("acceptTermAndConditions", e.target.checked); + setValue('acceptTermAndConditions', e.target.checked); }} control={} label={ - Aceptar Términos y Políticas de Privacidad{" "} + Aceptar Términos y Políticas de Privacidad{' '} * } diff --git a/src/pages/register/stepper/step2Modal.tsx b/src/pages/register/stepper/step2Modal.tsx index c3d8255f..a3b2cdb8 100644 --- a/src/pages/register/stepper/step2Modal.tsx +++ b/src/pages/register/stepper/step2Modal.tsx @@ -1,19 +1,17 @@ -import { TransitionProps } from "@mui/material/transitions"; -import { ThemeProvider } from "@aws-amplify/ui-react"; -import LogoutIcon from "@mui/icons-material/Logout"; -import Toolbar from "@mui/material/Toolbar"; -import AppBar from "@mui/material/AppBar"; -import Dialog from "@mui/material/Dialog"; -import Slide from "@mui/material/Slide"; -import { Box } from "@mui/material"; -import { forwardRef } from "react"; -import Image from "next/image"; +import { TransitionProps } from '@mui/material/transitions'; +import { ThemeProvider } from '@aws-amplify/ui-react'; +import LogoutIcon from '@mui/icons-material/Logout'; +import Toolbar from '@mui/material/Toolbar'; +import AppBar from '@mui/material/AppBar'; +import Dialog from '@mui/material/Dialog'; +import Slide from '@mui/material/Slide'; +import { Box } from '@mui/material'; +import { forwardRef } from 'react'; +import Image from 'next/image'; -import { LivenessQuickStartReact } from "@/components/biometric/face-liveness-detector"; -import { ContainerApp } from "@/components/elements/container"; -import { ButtonApp } from "@/components/elements/button"; -import Logo from "../../../../public/assets/logo.png"; -import { GridContainer, GridItem } from "@/components/elements/grid"; +import { LivenessQuickStartReact } from '@/components/biometric/face-liveness-detector'; +import { ButtonApp } from '@/components/elements/button'; +import Logo from '../../../../public/assets/logo.png'; const Transition = forwardRef(function Transition( props: TransitionProps & { @@ -25,7 +23,6 @@ const Transition = forwardRef(function Transition( }); export default function Step2Modal({ - open, handleClick, handleNextForm, identity, @@ -38,8 +35,8 @@ export default function Step2Modal({ onClose={handleClick} TransitionComponent={Transition} > - -
+ +
logo @@ -58,14 +55,14 @@ export default function Step2Modal({
diff --git a/src/pages/register/stepper/step3.tsx b/src/pages/register/stepper/step3.tsx index ef4947da..2e7db38f 100644 --- a/src/pages/register/stepper/step3.tsx +++ b/src/pages/register/stepper/step3.tsx @@ -1,17 +1,17 @@ -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import { useState } from "react"; -import * as yup from "yup"; -import axios from "axios"; +import { yupResolver } from '@hookform/resolvers/yup'; +import { useForm } from 'react-hook-form'; +import { useState } from 'react'; +import * as yup from 'yup'; +import axios from 'axios'; -import { AlertError, AlertWarning } from "@/components/elements/alert"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import LoadingBackdrop from "@/components/elements/loadingBackdrop"; -import { TextBody } from "@/components/elements/typography"; -import { FormControlApp } from "@/components/form/input"; -import { ButtonApp } from "@/components/elements/button"; -import { InputApp } from "@/themes/form/input"; -import { labels } from "@/constants/labels"; +import { AlertError, AlertWarning } from '@/components/elements/alert'; +import { GridContainer, GridItem } from '@/components/elements/grid'; +import LoadingBackdrop from '@/components/elements/loadingBackdrop'; +import { TextBody } from '@/components/elements/typography'; +import { FormControlApp } from '@/components/form/input'; +import { ButtonApp } from '@/components/elements/button'; +import { InputApp } from '@/themes/form/input'; +import { labels } from '@/constants/labels'; interface IFormInputs { email: string; @@ -30,24 +30,24 @@ const schema = yup.object({ .string() .trim() .required(labels.form.requiredField) - .oneOf([yup.ref("email")], "Los correos no coinciden"), + .oneOf([yup.ref('email')], 'Los correos no coinciden'), password: yup .string() - .min(8, "Debe contener al menos 8 caracteres") + .min(8, 'Debe contener al menos 8 caracteres') .required(labels.form.requiredField) .trim() .matches( /^.*(?=.{8,})((?=.*[!@#$%^&*()\-_=+{};:,<.>]){1})(?=.*\d)((?=.*[a-z]){1})((?=.*[A-Z]){1}).*$/, - "La contraseña debe contener una mayúscula, un número y un carácter especial" + 'La contraseña debe contener una mayúscula, un número y un carácter especial' ), passwordConfirm: yup .string() .required(labels.form.requiredField) - .oneOf([yup.ref("password")], "Las contraseñas no coinciden"), + .oneOf([yup.ref('password')], 'Las contraseñas no coinciden'), }); export default function Step3({ handleNext, infoCedula }: any) { - const [dataItem, setDataItem] = useState({}); + const [dataItem] = useState({}); const [loading, setLoading] = useState(false); @@ -56,10 +56,8 @@ export default function Step3({ handleNext, infoCedula }: any) { handleSubmit, formState: { errors }, getValues, - control, - setValue, } = useForm({ - mode: "onChange", + mode: 'onChange', resolver: yupResolver(schema), }); @@ -67,7 +65,7 @@ export default function Step3({ handleNext, infoCedula }: any) { setLoading(true); axios - .post("/api/iam", { + .post('/api/iam', { email: data.email, username: infoCedula.id, password: data.password, @@ -77,7 +75,7 @@ export default function Step3({ handleNext, infoCedula }: any) { }) .catch((err) => { if (err?.response?.status === 409) { - AlertWarning("El correo electrónico ya está registrado."); + AlertWarning('El correo electrónico ya está registrado.'); } else { AlertError(); } @@ -115,7 +113,7 @@ export default function Step3({ handleNext, infoCedula }: any) { return false; }} autoComplete="off" - {...register("email")} + {...register('email')} /> @@ -138,7 +136,7 @@ export default function Step3({ handleNext, infoCedula }: any) { return false; }} autoComplete="off" - {...register("emailConfirm")} + {...register('emailConfirm')} /> @@ -176,7 +174,7 @@ export default function Step3({ handleNext, infoCedula }: any) { return false; }} autoComplete="off" - {...register("password")} + {...register('password')} /> @@ -200,7 +198,7 @@ export default function Step3({ handleNext, infoCedula }: any) { return false; }} autoComplete="off" - {...register("passwordConfirm")} + {...register('passwordConfirm')} /> @@ -211,7 +209,7 @@ export default function Step3({ handleNext, infoCedula }: any) { disabled={ Object.values(getValues()).every( (value: any) => - value !== null && value !== undefined && value !== "" + value !== null && value !== undefined && value !== '' ) === false ? true : false diff --git a/tsconfig.json b/tsconfig.json index 97289f80..325ad8f7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -16,13 +20,29 @@ "incremental": true, "baseUrl": ".", "paths": { - "@/*": ["src/*"], - "@components/*": ["components/*"], - "@utils/*": ["utils/*"], - "@lib/*": ["lib/*"], - "@services/*": ["services/*"] + "@/*": [ + "src/*" + ], + "@components/*": [ + "components/*" + ], + "@utils/*": [ + "utils/*" + ], + "@lib/*": [ + "lib/*" + ], + "@services/*": [ + "services/*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file From aac2a35726ff6f6b7832815c6689cbcf0131da87 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 21:27:22 -0400 Subject: [PATCH 6/9] fix(deps): add needed `devDependencies` --- package.json | 1 + yarn.lock.REMOVED.git-id | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 6f33eef3..6ccae485 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@typescript-eslint/parser": "^5.59.5", "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.2.1", "prettier": ">=2.0.0" } diff --git a/yarn.lock.REMOVED.git-id b/yarn.lock.REMOVED.git-id index 9ea5ce2e..81b68624 100644 --- a/yarn.lock.REMOVED.git-id +++ b/yarn.lock.REMOVED.git-id @@ -1 +1 @@ -4378fcbd380b0d164a32d4cf89056c2a398d9cd1 \ No newline at end of file +fb297b2b79004dce6fe4782f5411f6a044d30c7a \ No newline at end of file From 66420b066d942c7a746596191ede4558b059b480 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 21:55:15 -0400 Subject: [PATCH 7/9] lint: fix all ESLint errors --- .eslintrc.json | 3 + src/components/elements/alert/index.tsx | 31 ++--- .../elements/loadingBackdrop/index.tsx | 14 +- src/components/layout/navBar.tsx | 25 ++-- src/pages/auth/code/index.tsx | 93 ------------- src/pages/auth/index.tsx | 127 ------------------ src/pages/auth/method/index.tsx | 113 ---------------- src/pages/auth/password/index.tsx | 110 --------------- src/pages/register/confirmation/index.tsx | 6 +- src/pages/register/registered/index.tsx | 2 +- src/pages/register/stepper/index.tsx | 25 +--- src/pages/register/stepper/step2.tsx | 2 +- 12 files changed, 41 insertions(+), 510 deletions(-) delete mode 100644 src/pages/auth/code/index.tsx delete mode 100644 src/pages/auth/index.tsx delete mode 100644 src/pages/auth/method/index.tsx delete mode 100644 src/pages/auth/password/index.tsx diff --git a/.eslintrc.json b/.eslintrc.json index af761453..4de216d1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -17,5 +17,8 @@ "ecmaVersion": 12, "sourceType": "module" }, + "rules": { + "@typescript-eslint/no-explicit-any": "off" + }, "plugins": ["@typescript-eslint"] } diff --git a/src/components/elements/alert/index.tsx b/src/components/elements/alert/index.tsx index 686f424c..b7b8c9aa 100644 --- a/src/components/elements/alert/index.tsx +++ b/src/components/elements/alert/index.tsx @@ -1,12 +1,9 @@ -import Swal from "sweetalert2"; -import Alert from "@mui/material/Alert"; +import Swal from 'sweetalert2'; +import Alert from '@mui/material/Alert'; interface IPropsAlertErrorMessage { message: string; - type: "error" | "warning" | "info" | "success"; -} -interface IProps { - text?: string; + type: 'error' | 'warning' | 'info' | 'success'; } export const AlertErrorMessage = ({ @@ -16,27 +13,27 @@ export const AlertErrorMessage = ({ export const AlertError = (text?: string) => { return Swal.fire({ - icon: "error", - title: "Error", - text: text ? text : "Ocurrió un error al procesar la solicitud", - confirmButtonColor: "#003670", + icon: 'error', + title: 'Error', + text: text ? text : 'Ocurrió un error al procesar la solicitud', + confirmButtonColor: '#003670', }); }; export const AlertWarning = (text: string) => { return Swal.fire({ - icon: "warning", - title: "Aviso", + icon: 'warning', + title: 'Aviso', text: text, - confirmButtonColor: "#003670", + confirmButtonColor: '#003670', }); }; export const AlertSuccess = (text?: string) => { return Swal.fire({ - icon: "success", - title: "Correcto", - text: text ? text : "Proceso realizado correctamente", - confirmButtonColor: "#003670", + icon: 'success', + title: 'Correcto', + text: text ? text : 'Proceso realizado correctamente', + confirmButtonColor: '#003670', }); }; diff --git a/src/components/elements/loadingBackdrop/index.tsx b/src/components/elements/loadingBackdrop/index.tsx index b487efa4..db3bbe9a 100644 --- a/src/components/elements/loadingBackdrop/index.tsx +++ b/src/components/elements/loadingBackdrop/index.tsx @@ -1,21 +1,21 @@ -import * as React from "react"; -import Backdrop from "@mui/material/Backdrop"; -import CircularProgress from "@mui/material/CircularProgress"; -import { Typography } from "@mui/material"; +import * as React from 'react'; +import Backdrop from '@mui/material/Backdrop'; +import CircularProgress from '@mui/material/CircularProgress'; +import { Typography } from '@mui/material'; interface IProps { text?: string; } export default function LoadingBackdrop({ text }: IProps) { - const [open, setOpen] = React.useState(true); + const [open] = React.useState(true); return ( theme.zIndex.modal + 1 }} + sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.modal + 1 }} open={open} > -
+
{text && {text}}
diff --git a/src/components/layout/navBar.tsx b/src/components/layout/navBar.tsx index ad6d96dd..9e8076ed 100644 --- a/src/components/layout/navBar.tsx +++ b/src/components/layout/navBar.tsx @@ -1,13 +1,12 @@ -import AppsIcon from "@mui/icons-material/Apps"; -import AppBar from "@mui/material/AppBar"; -import Toolbar from "@mui/material/Toolbar"; -import Box from "@mui/material/Box"; -import Script from "next/script"; -import Image from "next/image"; -import Link from "next/link"; +import AppsIcon from '@mui/icons-material/Apps'; +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import Box from '@mui/material/Box'; +import Script from 'next/script'; +import Image from 'next/image'; +import Link from 'next/link'; -import Logo from "../../../public/assets/logo.png"; -import { routes } from "@/constants/routes"; +import Logo from '../../../public/assets/logo.png'; export default function Index() { return ( @@ -19,12 +18,12 @@ export default function Index() { -
- -
+
+ +
logo diff --git a/src/pages/auth/code/index.tsx b/src/pages/auth/code/index.tsx deleted file mode 100644 index 7b038f05..00000000 --- a/src/pages/auth/code/index.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { useState } from "react"; -import { useRouter } from "next/router"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import * as yup from "yup"; - -import LandingChica from "../../../../public/assets/landingChica.png"; - -import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import { - TextBodyTiny, - TextSubTitle, - TextSubTitleBody, - TextTitle, -} from "@/components/elements/typography"; - -import { FormControlApp } from "@/components/form/input"; -import { InputApp } from "@/themes/form/input"; -import { ButtonApp } from "@/components/elements/button"; -import { routes } from "@/constants/routes"; -import BoxContentCenter from "@/components/elements/boxContentCenter"; -import { labels } from "@/constants/labels"; - -interface IFormInputs { - code: string; -} - -const schema = yup.object({ - code: yup.string().trim().required(labels.form.requiredField), -}); - -export default function Index() { - const router = useRouter(); - - const [dataItem, setDataItem] = useState({}); - - const { - register, - handleSubmit, - formState: { errors }, - control, - setValue, - } = useForm({ - reValidateMode: "onSubmit", - shouldFocusError: false, - resolver: yupResolver(schema), - }); - - const onSubmit = (data: IFormInputs) => {}; - - return ( -
- - - - - - - - - - - INICIAR SESIÓN - - - - router.push(routes.auth.method)} - > - Cambiar Método de Inicio de Sesión - - - - - -
- ); -} diff --git a/src/pages/auth/index.tsx b/src/pages/auth/index.tsx deleted file mode 100644 index 8df1b1ee..00000000 --- a/src/pages/auth/index.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import { useState } from "react"; -import { useRouter } from "next/router"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import Image from "next/image"; -import * as yup from "yup"; - -import { - TextBodyTiny, - TextSubTitle, - TextSubTitleBody, - TextTitle, -} from "@/components/elements/typography"; -import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import LandingHome from "../../../public/assets/landingHome.svg"; -import { ButtonApp } from "@/components/elements/button"; -import { FormControlApp } from "@/components/form/input"; -import { InputApp } from "@/themes/form/input"; -import { routes } from "@/constants/routes"; -import { labels } from "@/constants/labels"; - -interface IFormInputs { - cedulaOrEmail: string; -} - -const schema = yup.object({ - cedulaOrEmail: yup.string().trim().required(labels.form.requiredField), -}); - -export default function Index() { - const router = useRouter(); - - const [dataItem, setDataItem] = useState({}); - - const { - register, - handleSubmit, - formState: { errors }, - control, - setValue, - } = useForm({ - reValidateMode: "onSubmit", - shouldFocusError: false, - resolver: yupResolver(schema), - }); - - const onSubmit = (data: IFormInputs) => { - router.push(routes.auth.password); - }; - - return ( -
- - - - ¡Bienvenido al Sistema de Autenticación Gubernamental{" "} - Ciudadana! - - - Accede o regístrate con un único usuario y contraseña, para - solicitar o consultar todos tus servicios y trámites - gubernamentales. - -
- - Una manera fácil y cómoda de identificarte, para realizar trámites - desde tu computadora o celular sin necesidad de trasladarte a los - organismos gubernamentales. - -
- Landing Home -
- - - - - - - - - - - - INICIAR SESIÓN - - - - - - - ¿No tienes cuenta? - {" "} - Registrate, accede a trámites y servicios del estado dominicano - con un único usuario y contraseña, de forma segura y confiable. - -
- router.push(routes.register.home)} - > - CREAR TU CUENTA UNICA CIUDADANA - -
-
-
-
- ); -} diff --git a/src/pages/auth/method/index.tsx b/src/pages/auth/method/index.tsx deleted file mode 100644 index d1d4f68f..00000000 --- a/src/pages/auth/method/index.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { useState } from "react"; -import { useRouter } from "next/router"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import * as yup from "yup"; - -import LockIcon from "@mui/icons-material/Lock"; -import PermContactCalendarIcon from "@mui/icons-material/PermContactCalendar"; - -import LandingChica from "../../../../public/assets/landingChica.png"; - -import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import { - TextBodyTiny, - TextSubTitle, - TextSubTitleBody, - TextTitle, -} from "@/components/elements/typography"; - -import { FormControlApp } from "@/components/form/input"; -import { InputApp } from "@/themes/form/input"; -import { ButtonApp } from "@/components/elements/button"; -import { routes } from "@/constants/routes"; -import BoxContentCenter from "@/components/elements/boxContentCenter"; -import { labels } from "@/constants/labels"; -import { Typography } from "@mui/material"; - -export default function Index() { - const router = useRouter(); - - return ( - - - - -
router.push("password")} - style={{ - border: "1px solid #E5E5E5", - cursor: "pointer", - borderRadius: "6px", - padding: "14px 12px", - marginBottom: "10px", - display: "flex", - alignItems: "center", - flexDirection: "row", - }} - > - -
- - Contraseña - - - Iniciar sesión ingresando contraseña. - -
-
-
- - -
router.push("code")} - style={{ - border: "1px solid #E5E5E5", - cursor: "pointer", - borderRadius: "6px", - padding: "14px 12px", - marginBottom: "10px", - display: "flex", - alignItems: "center", - flexDirection: "row", - }} - > - -
- - Código Autenticador - - - Ingrese un código de verificación de la aplicación de - autenticación activa. - -
-
-
-
-
-
- ); -} diff --git a/src/pages/auth/password/index.tsx b/src/pages/auth/password/index.tsx deleted file mode 100644 index 3a14ccf3..00000000 --- a/src/pages/auth/password/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { useState } from "react"; -import { useRouter } from "next/router"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { useForm } from "react-hook-form"; -import * as yup from "yup"; - -import LandingChica from "../../../../public/assets/landingChica.png"; - -import { CardAuth, CardAuthFooter } from "@/components/elements/cardAuth"; -import { GridContainer, GridItem } from "@/components/elements/grid"; -import { - TextBodyTiny, - TextSubTitle, - TextSubTitleBody, - TextTitle, -} from "@/components/elements/typography"; - -import { FormControlApp } from "@/components/form/input"; -import { InputApp } from "@/themes/form/input"; -import { ButtonApp } from "@/components/elements/button"; -import { routes } from "@/constants/routes"; -import BoxContentCenter from "@/components/elements/boxContentCenter"; -import { labels } from "@/constants/labels"; - -interface IFormInputs { - password: string; -} - -const schema = yup.object({ - password: yup.string().trim().required(labels.form.requiredField), -}); - -export default function Index() { - const router = useRouter(); - - const [dataItem, setDataItem] = useState({}); - - const { - register, - handleSubmit, - formState: { errors }, - control, - setValue, - } = useForm({ - reValidateMode: "onSubmit", - shouldFocusError: false, - resolver: yupResolver(schema), - }); - - const onSubmit = (data: IFormInputs) => {}; - - return ( -
- - - - - - - - - - - - - ¿Olvidaste tu contraseña? - - - - - - INICIAR SESIÓN - - - {/* - router.push(routes.auth.method)} - > - Cambiar Método de Inicio de Sesión - - */} - - - - - - ¿No tienes cuenta?{" "} - Registrate aquí. - - - - - -
- ); -} diff --git a/src/pages/register/confirmation/index.tsx b/src/pages/register/confirmation/index.tsx index 3a3ddee4..510a6877 100644 --- a/src/pages/register/confirmation/index.tsx +++ b/src/pages/register/confirmation/index.tsx @@ -30,21 +30,19 @@ const schema = yup.object({ export default function Index() { const router = useRouter(); - const [dataItem, setDataItem] = useState({}); + const [dataItem] = useState({}); const { register, handleSubmit, formState: { errors }, - control, - setValue, } = useForm({ reValidateMode: "onSubmit", shouldFocusError: false, resolver: yupResolver(schema), }); - const onSubmit = (data: IFormInputs) => { + const onSubmit = () => { router.push(routes.register.registered); }; diff --git a/src/pages/register/registered/index.tsx b/src/pages/register/registered/index.tsx index a1dc1195..15738f78 100644 --- a/src/pages/register/registered/index.tsx +++ b/src/pages/register/registered/index.tsx @@ -25,7 +25,7 @@ const schema = yup.object({ export default function Index() { const { - formState: { errors }, + formState: { }, } = useForm({ reValidateMode: 'onSubmit', shouldFocusError: false, diff --git a/src/pages/register/stepper/index.tsx b/src/pages/register/stepper/index.tsx index a118996d..6624376e 100644 --- a/src/pages/register/stepper/index.tsx +++ b/src/pages/register/stepper/index.tsx @@ -15,7 +15,7 @@ import Step3 from './step3'; const steps = ['PASO 1', 'PASO 2', 'PASO 3']; -export async function getServerSideProps(ctx: any) { +export async function getServerSideProps() { await axios.get(`/api/auth`); return { @@ -39,10 +39,6 @@ export default function StepperRegister() { const [infoCedula, setInfoCedula] = React.useState({}); - const isStepOptional = (step: number) => { - return step === 1; - }; - const isStepSkipped = (step: number) => { return skipped.has(step); }; @@ -63,25 +59,6 @@ export default function StepperRegister() { setSkipped(newSkipped); }; - const handleBack = () => { - setActiveStep((prevActiveStep) => prevActiveStep - 1); - }; - - const handleSkip = () => { - if (!isStepOptional(activeStep)) { - // You probably want to guard against something like this, - // it should never occur unless someone's actively trying to break something. - throw new Error("You can't skip a step that isn't optional."); - } - - setActiveStep((prevActiveStep) => prevActiveStep + 1); - setSkipped((prevSkipped) => { - const newSkipped = new Set(prevSkipped.values()); - newSkipped.add(activeStep); - return newSkipped; - }); - }; - const handleReset = () => { setActiveStep(0); }; diff --git a/src/pages/register/stepper/step2.tsx b/src/pages/register/stepper/step2.tsx index d7ff54f2..77d77c87 100644 --- a/src/pages/register/stepper/step2.tsx +++ b/src/pages/register/stepper/step2.tsx @@ -34,7 +34,7 @@ export default function Step2({ infoCedula, handleNext }: any) { const { handleSubmit, - formState: { errors }, + formState: { }, setValue, } = useForm({ reValidateMode: 'onSubmit', From 912caf62d130e04018bce7e4b5e7e2de3e6e6c21 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 21:56:22 -0400 Subject: [PATCH 8/9] fix: optimize all images --- public/assets/forma.png.REMOVED.git-id | 2 +- public/assets/glass.png | Bin 1243 -> 1165 bytes public/assets/landingChica.png.REMOVED.git-id | 2 +- .../assets/landingChica2.png.REMOVED.git-id | 2 +- public/assets/landingChico.png.REMOVED.git-id | 1 + public/assets/landingHome.svg.REMOVED.git-id | 2 +- public/assets/logoCuentaUnica.png | Bin 16066 -> 15270 bytes public/assets/logoDedo.png | Bin 9021 -> 8849 bytes public/assets/logoGOB.png | Bin 8612 -> 7630 bytes public/assets/logoOGTIC.png | Bin 3014 -> 2886 bytes public/assets/smile.png | Bin 1460 -> 1400 bytes public/assets/sun.png | Bin 1381 -> 1317 bytes 12 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 public/assets/landingChico.png.REMOVED.git-id diff --git a/public/assets/forma.png.REMOVED.git-id b/public/assets/forma.png.REMOVED.git-id index ea83b860..64b491da 100644 --- a/public/assets/forma.png.REMOVED.git-id +++ b/public/assets/forma.png.REMOVED.git-id @@ -1 +1 @@ -d37a2f5aa588ebc67f5d8f8349f1ee83bef65bd0 \ No newline at end of file +b99d6dbb23d221d570860372d59978f77b3a739f \ No newline at end of file diff --git a/public/assets/glass.png b/public/assets/glass.png index 2fe34da97caf425e1a912e5b5922717410c530d4..d9a2191e12cf05403b322a09f3b0fb1895c71da4 100644 GIT binary patch delta 1145 zcmV-<1cv+D35^MmBYyx1a7bBm000XU000XU0RWnu7ytkSKS@MERA}DinM-mSNf3s= z1ZL!&IYR3MMkg?wK=KKMP9SSDVdROR35SGtLMIS9f#nl`P9Ww4(?>wN!5)*d=+X$P zU)2vSXw?RyqPrenWmf)~Eo8L|?a<%>0Aa~5dVH1zHEWH`Cx3+Q|NoUXO=etZ=QV=3 zLs-@wMmC6n1T^T?9Y(|HsXt^93!}jUmwNnqKy1Q*z;c~w9bicAH^%A#Gr-&GSNfdG z?dt(iQy5bC&6>fGQg7D?hLj$mCNQLuQEC7~DjR9XVH5-5Yn$KcBfK*k_l&;qA|R@S z@kP6|c#qIwjem#G1_F}|ey72lfdnrPVyqs*70OZWnaaQzYacj0Do*OX`-#Mba zVTNMYN_uIB*GNG$+=38>sSnN&0CVD_R1jmet!5ap1XlTO$EAz&c;g>Ua{7kPG*O+Q~V z;DkMVEOMSg4_EI-hVf?3bM%{mQ>w-abrz>F$v5Q$-}KXLTFcz-nF+}?q44HQOcp$-x!4T_CQ0AP=G*9@PTLT`Yg&v32O&$N~PDpZ-;_cAdZB9XD zTYrht<~KeTu3gw-X3cHFoF|T=%QbcPED2CRS=x(ja%y6HzV?P;MEfV5Ot{dXG>mYa z!#olo8N^Q}5vzb%E*N7Sq7h5F&WH%39CF+(@d_j3s2GTNnHnZymzwS-7uqqZ&d)8G z2Qp1Ly>u93?IS!yEYKl65C_73Lc$UNbAQ&{vnBxAH1QA)6Dmr9$p8bVdu1=31fhv$D60<_^KVLKV$T3PQm7YxqEXQxz(r_U5cO$gLCy60qXH zNbzJhi3`2L66MSl0=cW$p~)T@>+muGgawsy3EQ)E_@gQyV3 z?t`cZMm<1O0HZ!2(qN>0Ud$!2cLs#{%4Juth0|(sjopWlDf9mWZ%O|7KNg(&00000 LNkvXXu0mjfQG6hs delta 1224 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 JrI^vL{|7`}`|1Dy diff --git a/public/assets/logoDedo.png b/public/assets/logoDedo.png index 00a1dd0e1df2fd764e1da9c9f29f8abf85590905..be6a13dc6f31986041db2a147b7028915e6bc5f9 100644 GIT binary patch literal 8849 zcmV;CB5vJ@P)g?|iwjD^+ zIOfa!KKAqQ6jgm{*E#E~z1F+l_3p!xv1BY6OU9D1WGor~H%9o6Ig?#t!3KKB73G>W zE2B3LNAmA&7$TsPXqG>Z{S|h)q1$wTyLs`+W$>MR$``XCDG>CTJSY2 zpZ?l`X@V(oQw7fmUXpuN%?y>$`7h@`BDNT4Sq;m}tSVSZG#tYPLs3MI8TgCb?{v9I zCFK7%3|Wc2lnfH=DA-MIEkQG06TG0|FStqYvXa-$H^(dm%WKk0vrLn@n)J}3p_hiT zf?gWtE9k(Rs%rY^(xIlRYO1PT@VLI33=*s+vkAT|H&oC|aGl)#+QJ+E*@mpdq9#KH z2MTt^Aan?x5dB4TwVHdomslk>Ycdoo$gCo>x@b+&%A#ci1K#JCa?HVNcn&WLp2Tx< z�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 Tbdtos00000NkvXXu0mjf{K-L< literal 9021 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 diff --git a/public/assets/logoGOB.png b/public/assets/logoGOB.png index a33c1a51490884a27c41d0cfe27e7c2556962e0e..78679fa338c85139228ae634f937c4aaec90a4ce 100644 GIT binary patch literal 7630 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 Gd+|Tw#HH>4 diff --git a/public/assets/logoOGTIC.png b/public/assets/logoOGTIC.png index fc0f91bfaac9287ebf022404cfc74bab4876537f..d9ffe15c52dcbd80aebc3e62728c841139bcc06d 100644 GIT binary patch delta 2879 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 diff --git a/public/assets/sun.png b/public/assets/sun.png index 8090d6b7db32d9ae00c881b8eb027bda72e353f5..27a185d7363ac699d5639d8e5854d0db22dd6429 100644 GIT binary patch delta 1299 zcmV+u1?>9e3Z)8=BYyx1a7bBm000XU000XU0RWnu7ytkS*GWV{RA}DqnoV*VM-+g+ z9%DcS}PGIQ-ffEFFMp`hGOB%`>;S+#PAms#%P9SswlM@*4f?{}C^hn{S zd;S>4u7s}ALIZTauV2649z~JEmk!{qJQG@+tNyN+Rt1BKL4SfNe{qDTrn_9)DG;)3 zd@i_@_+{72JN!?^9&``72aOps>|XUd-+r#}(v#m2nkZa^JD^KjO;UK?5l~xuI;5={ zDZTdqMFn9R{=S=^Mt$iZ^no&h3)F#;HEfu*dIsDqJqei6N(reqOUqCOJg%gfpGJG~ zfKV}fG67CfX@53*93F*mn=-W3QC>D$j(DCKH`IaE1pTAbc+GpD9@>>ziW1;Uz=9ht)Ntw3S`6d_ z$k7>T8$1aowrRb*q6uF{lo%m2t&ppuhQk0~zHlk^aDUEP3}hnzkS>nK!;W9Vkm4cY zsK@&Q4Lri(>$Z^D%QTbS2xHDw)mU?G7wM-jRnGESinBDHK6^dtiOT_}z%jxj=c=Cw zQVTu_gFRvLQHfb?!h#zd-Xc8m#4v6BnqT3qv!;HGXYA5ef#rnMfKG(tnJ}Z8wLs4Y z)R!`f2Y-vhnE(wVpm{DY1U59hFr`zSa zdZ$dgHI2wa%LZYFx!8VN1@vUR5q=zwVQmeY?0=p5f^JU14)(Y@<%EoN@ ziGaL@a32-|%g48}7SC_3S(q;Xo)i94N9f1oqxEpY!4fAbAkB!Ioc^q<`Al3Aq zZS=Q^+%uz(gh%pTw3j1<{4;25FG{Di{^HFKZv`|(aj;pQr#>C~($CP)q%9iZ)v ztbc{YetfCrsET958h=JK+%`8wXemQQ;u^YlQ>%mN$=3}hw%{`ts<}0!4qsmkpqp2X zF|u!;)L+REwdTz9E>^eh4EAJTaW+S3=guPq99rD}V5@mQNyP#gWZA&&L3OGZ7(kt+Us#XA<< zbD@TLTpd^-TcNait-rY|ra2bX?$nwcAn9vH;|W;M06J?LPkpiFQEX-%SY|gxb;?lbDOGgs>_%NFC!ER`>5q zjRiGc@owo77Zl?#cO5e`*xr>iQCvqzmgpF#xd^_Ew7X{;&3ot^_9142V{>aKh3AWg zeBxv$g{0PS^evvl`}}OwR-8XW?tk)KzPMYw1dW5_pmRg!lNQnwm!90>i-doJ#OYxa z?A(%-WdglW-irrS;cG8xHF?POnh9(++>*iGguoMoR+9X;xYt;@9V79a;eX0p5NMH|sBSmka;^002ov JPDHLkV1jRVdawWh delta 1363 zcmV-Z1+4m|3grrrBYy=fNkl2o z|7W}qeQtOmS~=#}v+582-t_c-<)ts55V|ND2sgkfJvDW{Kavs9TDdx;r#c>E1i%1A z6JeIze_C{#yGJ8ALAV40ga*(CM%J=n!kh!(YU#?DIfouL1b}{6+J*oKIhStHt?nM} z%N;_~@XZw1^MCT}I(Q;!dazS^>RsOLJ~3+ZoHoG6v%bhD>4duTFNF!&_*y_463T9_ zlsl6q&}7+Q#f(QLJTfuf>qc^1WWGC5=oCyC@R~M|7U*B3#VbAn?If8B4 ztcFY9wsPhK9Xb^zBOQZ#$-rjFl0lIKL^7hz2%&2wnSVx$8UrHv#+kH}F>R{|Jo1BI z9W5q10dyHs++knpMFoGNbMT;oMoUAp|QLogb9iRpG?30 zel(N@Z`cPuAl!4LE}ckf!>38HClMc}vbBsUF;~=hi*U~aL*M;tbsKN3n({gYW3-aW zW=Oq4T7SR^_QW$~PJUL;K{Z4p2~gZw63!Ip7zvuk3ekkKP+am^xhtt9R3qvYCq|OO zggLv;BmsIVL@csU=&mbF$`g$wKxiAjnW8vYYpLmGnXNXOyB}Tj zerkMxl{sv-hk8{#5$($-Ahb%gNQTTgOcDM;U{uQw#Uk4o!Y!;2RZE|BJ-^1L!Xg0( zYsrT;!exOTZ6^ahp>Ek5R@;o8WUegRxx)p;QZrn{==Gg#Imb4z&v=*#y^5{voDu`2A$6+)M7Vb)n5H-{7&fdhP$6#JsZxX zNnZxktt4mGeX0YhYo&zJV24p||3}xqF^}A%_p1$Ryd|cU(yt~62OO!Jb5<_$Gs1>{A1MSHARzi z=@P0LpVa~S2%}6L9V6_bXc(5Y_raDQ(W0fftdM$Yi0j3zD0Bm#^p)&!KVPPV~{Be0)iU(x5Nb zL?X%Gz*!#Vku}-20(YXvDrAvCRr1=4uP1l7SP6k_!z~X_WUtVKrwE5G`b>9wud(W+ zVm{QJ^V{=zjn%aKU*P36*6Q#=^ts`MXyuqQvljL(yvDjcqM@1*8+%Kqn=UN?{{h~9 V4L3GFp1A-3002ovPDHLkV1mkqnNR=# From 16bb031de3b09152ab2e67e5b9118fc5656cf9f6 Mon Sep 17 00:00:00 2001 From: Gustavo Valverde Date: Sat, 13 May 2023 22:06:53 -0400 Subject: [PATCH 9/9] fix: other linters failures --- next.config.js | 8 ++++---- src/styles/globals.css | 24 +++++++++++++++++++++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/next.config.js b/next.config.js index ecfda618..e4a7ff2b 100644 --- a/next.config.js +++ b/next.config.js @@ -7,10 +7,10 @@ const nextConfig = { NEXT_PUBLIC_CEDULA_API: process.env.NEXT_PUBLIC_CEDULA_API, NEXT_PUBLIC_CEDULA_API_KEY: process.env.NEXT_PUBLIC_CEDULA_API_KEY, NEXT_PUBLIC_SITE_KEY: process.env.NEXT_PUBLIC_SITE_KEY, - NEXT_PUBLIC_COOKIE_KEY: process.env.NEXT_PUBLIC_COOKIE_KEY, + NEXT_PUBLIC_COOKIE_KEY: process.env.NEXT_PUBLIC_COOKIE_KEY }, reactStrictMode: false, - output: "standalone", -}; + output: 'standalone' +} -module.exports = nextConfig; +module.exports = nextConfig diff --git a/src/styles/globals.css b/src/styles/globals.css index 2d75016c..f5dfaf0e 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -19,15 +19,19 @@ body { .text-primary { color: #003670; } + .text-success { color: #2ecc71; } + .text-secondary { color: #0087ff; } + .text-error { color: #ee2a24; } + .text-info { color: #23c3df; } @@ -35,15 +39,19 @@ body { .bg-primary { background: #003670; } + .bg-success { background: #2ecc71; } + .bg-secondary { background: #0087ff; } + .bg-error { background: #ee2a24; } + .bg-info { background: #23c3df; } @@ -51,10 +59,12 @@ body { .p-1 { padding: 5px; } + .py-1 { padding-top: 5px; padding-bottom: 5px; } + .px-1 { padding-left: 5px; padding-right: 5px; @@ -63,10 +73,12 @@ body { .p-2 { padding: 10px; } + .py-2 { padding-top: 10px; padding-bottom: 10px; } + .px-2 { padding-left: 10px; padding-right: 10px; @@ -75,10 +87,12 @@ body { .p-3 { padding: 15px; } + .py-3 { padding-top: 15px; padding-bottom: 15px; } + .px-3 { padding-left: 15px; padding-right: 15px; @@ -87,10 +101,12 @@ body { .p-4 { padding: 20px; } + .py-4 { padding-top: 20px; padding-bottom: 20px; } + .px-4 { padding-left: 20px; padding-right: 20px; @@ -99,10 +115,12 @@ body { .p-5 { padding: 25px; } + .py-5 { padding-top: 25px; padding-bottom: 25px; } + .px-5 { padding-left: 25px; padding-right: 25px; @@ -110,12 +128,12 @@ body { /* MUI global */ -.MuiStepLabel-iconContainer, -.MuiStepConnector-horizontal { +.muisteplabel-iconcontainer, +.muistepconnector-horizontal { display: none !important; } -.MuiStepLabel-label { +.muisteplabel-label { color: #03397775; }