ywana-core8 0.0.987 → 0.0.989

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ywana-core8",
3
- "version": "0.0.987",
3
+ "version": "0.0.989",
4
4
  "description": "ywana-core8",
5
5
  "homepage": "https://ywana.github.io/workspace",
6
6
  "author": "Ernesto Roldan Garcia",
@@ -11,7 +11,8 @@
11
11
  "module": "dist/index.modern.js",
12
12
  "scripts": {
13
13
  "build": "microbundle --no-compress --jsx React.createElement",
14
- "dev": "microbundle watch --no-compress --jsx React.createElement"
14
+ "dev": "microbundle watch --no-compress --jsx React.createElement",
15
+ "test": "jest"
15
16
  },
16
17
  "bugs": {
17
18
  "url": "https://github.com/ywana/ywana-core8/issues"
@@ -25,6 +26,7 @@
25
26
  },
26
27
  "devDependencies": {
27
28
  "gh-pages": "^3.2.3",
29
+ "jest": "^29.7.0",
28
30
  "microbundle": "^0.14.2",
29
31
  "react": "^17.0.2",
30
32
  "react-dom": "^17.0.2"
@@ -13,11 +13,15 @@ export const TaskContext = React.createContext({})
13
13
  */
14
14
  export const TaskContextProvider = (props) => {
15
15
 
16
- const { host, url = "/tasks", frequency = 1000, children } = props
16
+ const { host, url = "/tasks", frequency = 1000, children, ctx } = props
17
17
  const API = CollectionAPI(url, host, "")
18
18
  const [ listeners, setListeners ] = useState({})
19
+ const appContext = useContext(ctx)
19
20
 
20
21
  useEffect(() => {
22
+
23
+ if (Object.keys(listeners).length === 0) return
24
+
21
25
  const _interval = setInterval(async () => {
22
26
  const taskIDs = Object.keys(listeners)
23
27
  for (let i = 0; i < taskIDs.length; i++) {
@@ -26,7 +30,7 @@ export const TaskContextProvider = (props) => {
26
30
  const tsk = await task(taskID)
27
31
 
28
32
  const listener = listeners[taskID]
29
- if (listener) listener(tsk)
33
+ if (listener) listener(tsk,appContext)
30
34
 
31
35
  }
32
36
  }, frequency)
@@ -80,13 +84,12 @@ export const TaskContextProvider = (props) => {
80
84
  }
81
85
 
82
86
  function addListener(taskID, listener) {
83
- const next = Object.assign({}, listeners)
84
- next[taskID] = listener
87
+ const next = { ...listeners, [taskID]: listener }
85
88
  setListeners(next)
86
89
  }
87
90
 
88
91
  function addListeners(newListeners) {
89
- const next = Object.assign({}, listeners, newListeners)
92
+ const next = { ...listeners, ...newListeners }
90
93
  setListeners(next)
91
94
  }
92
95
 
@@ -124,7 +127,6 @@ export const TASK_STATES = {
124
127
  "COMPLETED": "COMPLETED",
125
128
  "FAULTED": "FAULTED",
126
129
  "CANCELED": "CANCELED",
127
-
128
130
  "QUEUED": "QUEUED",
129
131
  }
130
132
 
@@ -1,5 +1,6 @@
1
- import React, { useState } from 'react'
1
+ import React, { useState, useEffect } from 'react'
2
2
  import { TextField, Text, Button } from '../../html'
3
+ import { validatePassword } from './login_commons'
3
4
  import './ResetPasswordBox.css'
4
5
 
5
6
  /**
@@ -8,10 +9,21 @@ import './ResetPasswordBox.css'
8
9
  export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN", children, onOK, onClose }) => {
9
10
 
10
11
  const [form, setForm] = useState({})
12
+ const [isValid, setIsValid] = useState(false)
11
13
  const [error, setError] = useState()
12
14
 
13
- function canOK() {
14
- return form.password1 && form.password2
15
+ useEffect(() => {
16
+ setIsValid(validate())
17
+ }, [form.password1, form.password2])
18
+
19
+ function validate() {
20
+ const hasRequiredUser = userRequired ? form.user && form.user.length > 0 : true
21
+ const hasPassword1 = form.password1 && form.password1.length > 0
22
+ const [isValid, error] = hasPassword1 ? validatePassword(form.password1) : [false, "La contraseña es requerida."]
23
+ setError(error)
24
+ const areEqual = form.password1 === form.password2
25
+ if (isValid && !areEqual) setError("Las contraseñas no coinciden.")
26
+ return hasRequiredUser && areEqual && isValid
15
27
  }
16
28
 
17
29
  function changeField(id, value) {
@@ -21,14 +33,7 @@ export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN"
21
33
 
22
34
  function ok() {
23
35
  if (onOK && canOK()) {
24
- if (form.password1 === form.password2) {
25
- setError(null)
26
- onOK(form)
27
- } else {
28
-
29
- const errorLabel = lang === "EN" ? "Passwords do not match" : "Las claves no coinciden"
30
- setError(errorLabel)
31
- }
36
+ onOK(form)
32
37
  }
33
38
  }
34
39
 
@@ -59,7 +64,7 @@ export const ResetPasswordBox = ({ logo, title, userRequired = true, lang = "EN"
59
64
  </main>
60
65
  <footer>
61
66
  <Button label={cancelLabel} action={close} />
62
- <Button label={okLabel} raised disabled={!canOK()} action={ok} />
67
+ <Button label={okLabel} raised disabled={!isValid} action={ok} />
63
68
  </footer>
64
69
  </div>
65
70
  )
@@ -0,0 +1,24 @@
1
+ import React, { useState } from 'react'
2
+ import { Icon , Button, Text, TextField } from '../../html'
3
+ import { ResetPasswordBox } from './ResetPasswordBox'
4
+
5
+ /**
6
+ * Reset Password Box
7
+ */
8
+ export const ResetPasswordBoxTest = (prop) => {
9
+
10
+ const config = {
11
+ title: 'Reset Password',
12
+ userRequired: false,
13
+ lang: 'EN',
14
+ onOK: (form) => {
15
+ console.log('onOK', form)
16
+ },
17
+ onClose: () => {
18
+ console.log('onClose')
19
+ }
20
+ }
21
+ return (
22
+ <ResetPasswordBox {...config} />
23
+ )
24
+ }
@@ -0,0 +1,45 @@
1
+ export function validatePassword(contraseña) {
2
+
3
+ let error = ""
4
+
5
+ // Verificar longitud mínima y máxima
6
+ if (contraseña.length < 15 || contraseña.length > 50) {
7
+ error = 'La contraseña debe tener entre 15 y 50 caracteres.';
8
+ return [ false, error]
9
+ }
10
+
11
+ // Verificar al menos una letra (mayúscula o minúscula)
12
+ if (!/[A-Za-z]/.test(contraseña)) {
13
+ error = 'La contraseña debe contener al menos una letra (A-Z o a-z).';
14
+ return [ false, error]
15
+ }
16
+
17
+ // Verificar al menos un número
18
+ if (!/[0-9]/.test(contraseña)) {
19
+ error = 'La contraseña debe contener al menos un número (0-9).';
20
+ return [ false, error]
21
+ }
22
+
23
+ // Verificar al menos una minúscula
24
+ if (!/[a-z]/.test(contraseña)) {
25
+ error = 'La contraseña debe contener al menos una letra en minúscula (a-z).';
26
+ return [ false, error]
27
+ }
28
+
29
+ // Verificar al menos una mayúscula
30
+ if (!/[A-Z]/.test(contraseña)) {
31
+ error = 'La contraseña debe contener al menos una letra en mayúscula (A-Z).';
32
+ return [ false, error]
33
+ }
34
+
35
+ // Verificar al menos un carácter especial
36
+ if (!/[<>+&!?*\-_%\.:=]/.test(contraseña)) {
37
+ error = 'La contraseña debe contener al menos un carácter especial (< > + & ! ? * - _ % . : =).';
38
+ return [ false, error]
39
+ }
40
+
41
+ // Si todas las validaciones pasan
42
+ return [true, error];
43
+ }
44
+
45
+ //module.exports = { validatePassword }
@@ -0,0 +1,51 @@
1
+ const login_commons = require('./login_commons');
2
+ const { validatePassword } = login_commons;
3
+
4
+ describe('validatePassword', () => {
5
+ test('debería devolver un error si la longitud es menor a 15 caracteres', () => {
6
+ const [isValid, error] = validatePassword('Abc123!');
7
+ expect(isValid).toBe(false);
8
+ expect(error).toBe('La contraseña debe tener entre 15 y 50 caracteres.');
9
+ });
10
+
11
+ test('debería devolver un error si la longitud es mayor a 50 caracteres', () => {
12
+ const [isValid, error] = validatePassword('A'.repeat(51) + '1!aB');
13
+ expect(isValid).toBe(false);
14
+ expect(error).toBe('La contraseña debe tener entre 15 y 50 caracteres.');
15
+ });
16
+
17
+ test('debería devolver un error si no contiene letras', () => {
18
+ const [isValid, error] = validatePassword('1234567890!@#$%^&*()');
19
+ expect(isValid).toBe(false);
20
+ expect(error).toBe('La contraseña debe contener al menos una letra (A-Z o a-z).');
21
+ });
22
+
23
+ test('debería devolver un error si no contiene números', () => {
24
+ const [isValid, error] = validatePassword('Aaaaaaaa!aaaaaaa');
25
+ expect(isValid).toBe(false);
26
+ expect(error).toBe('La contraseña debe contener al menos un número (0-9).');
27
+ });
28
+
29
+ test('debería devolver un error si no contiene minúsculas', () => {
30
+ const [isValid, error] = validatePassword('AAAAAAAAAAAAA1!');
31
+ expect(isValid).toBe(false);
32
+ expect(error).toBe('La contraseña debe contener al menos una letra en minúscula (a-z).');
33
+ });
34
+
35
+ test('debería devolver un error si no contiene mayúsculas', () => {
36
+ const [isValid, error] = validatePassword('aaaaaaaaaaaaa1!');
37
+ expect(isValid).toBe(false);
38
+ expect(error).toBe('La contraseña debe contener al menos una letra en mayúscula (A-Z).');
39
+ });
40
+
41
+ test('debería devolver un error si no contiene un carácter especial', () => {
42
+ const [isValid, error] = validatePassword('Aaaaaaaa1Aaaaaaaa');
43
+ expect(isValid).toBe(false);
44
+ expect(error).toBe('La contraseña debe contener al menos un carácter especial (< > + & ! ? * - _ % . : =).');
45
+ });
46
+
47
+ test('debería devolver true si la contraseña es válida', () => {
48
+ const [isValid, error] = validatePassword('Aaaaaaaa1Aaaaa!a');
49
+ expect(isValid).toBe(true);
50
+ });
51
+ });