orquest-eventer 3.2.0
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/eventer_logo.svg +106 -0
- package/index.ts +1534 -0
- package/package.json +24 -0
- package/react-eventer.ts +248 -0
- package/readme.md +816 -0
- package/tsconfig.json +32 -0
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "orquest-eventer",
|
|
3
|
+
"version": "3.2.0",
|
|
4
|
+
"description": "Libreria para gestionar eventos en las apps",
|
|
5
|
+
"main": "./index.ts",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
9
|
+
},
|
|
10
|
+
"author": "Camilo Barbosa",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"eventer": "file:",
|
|
14
|
+
"sha256": "^0.2.0",
|
|
15
|
+
"typescript": "^5.7.2",
|
|
16
|
+
"uuid": "^11.1.0",
|
|
17
|
+
"react": "^19.0.0"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/react": "^19.0.7",
|
|
21
|
+
"@types/react-dom": "^19.0.3",
|
|
22
|
+
"react-dom": "^19.0.0"
|
|
23
|
+
}
|
|
24
|
+
}
|
package/react-eventer.ts
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { EventBroadcastController, EventController, eventer, EventObservableController, SubscriberController, ValidatorController } from "./index";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
type ObservableOrSubscriberFunctionInstancer<T> = EventObservableController<T> |
|
|
6
|
+
EventObservableController<T>["createSubscriber"] |
|
|
7
|
+
undefined;
|
|
8
|
+
|
|
9
|
+
type EventOrBroadcastOrListenerFunctionInstancer<Props extends any[], Returns> =
|
|
10
|
+
EventController<Props> | EventController<Props>["createListener"] |
|
|
11
|
+
EventBroadcastController<Props, Returns> |
|
|
12
|
+
EventBroadcastController<Props, Returns>["createBroadcastListener"] |
|
|
13
|
+
undefined;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Observar el conetenido de un EventObservableController o Subscriber
|
|
17
|
+
* @param observable
|
|
18
|
+
* @param callback2 funcion adicional si se desea
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
export function useObservable<T>(observable?: ObservableOrSubscriberFunctionInstancer<T>, callback2?: (v: T) => void):
|
|
22
|
+
[ObservableOrSubscriberFunctionInstancer<T> extends undefined ? unknown : T, ObservableOrSubscriberFunctionInstancer<T> extends undefined ? undefined : SubscriberController<T, string>, boolean] {
|
|
23
|
+
const [subscriber] = useState(typeof observable == "function" && observable() || (observable as EventObservableController<T> | undefined)?.createSubscriber());
|
|
24
|
+
const [subscriber2] = useState(callback2 ? (typeof observable == "function" && observable() || (observable as EventObservableController<T> | undefined)?.createSubscriber()) : undefined);
|
|
25
|
+
const state = useState(false);
|
|
26
|
+
const react = subscriber?.react();
|
|
27
|
+
useEffect(() => react?.updateEffect(state)(), [state[0]]);
|
|
28
|
+
useEffect(() => { callback2 && subscriber2?.subscribe(callback2); return () => callback2 && subscriber2?.unsubscribe() }, []);
|
|
29
|
+
const value = subscriber?.get() as ObservableOrSubscriberFunctionInstancer<T> extends undefined ? unknown : T;
|
|
30
|
+
const subs = subscriber as ObservableOrSubscriberFunctionInstancer<T> extends undefined ? undefined : SubscriberController<T, string>
|
|
31
|
+
return [value, subs, state[0]]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function useObservableData<T>(observable?: ObservableOrSubscriberFunctionInstancer<T>):
|
|
35
|
+
[T | undefined, (value: T, force?: boolean) => void] {
|
|
36
|
+
const [value, setValue] = useState<T | undefined>()
|
|
37
|
+
const [, subscriber] = useObservable(observable, (v) => {
|
|
38
|
+
setValue(() => v);
|
|
39
|
+
});
|
|
40
|
+
return [value, subscriber.next]
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Escuchar Evento o Brocast de Evento o un escuchador
|
|
46
|
+
* @param event
|
|
47
|
+
* @param callback
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
50
|
+
export function useListener<Props extends any[], Returns>(
|
|
51
|
+
event: EventOrBroadcastOrListenerFunctionInstancer<Props, Returns>,
|
|
52
|
+
callback?: (...props: Props) => EventOrBroadcastOrListenerFunctionInstancer<Props, Returns> extends EventBroadcastController<Props, Returns> ? Promise<Returns> :
|
|
53
|
+
EventOrBroadcastOrListenerFunctionInstancer<Props, Returns> extends EventBroadcastController<Props, Returns>["createBroadcastListener"] ? Promise<Returns> : void) {
|
|
54
|
+
const [listener] = useState(typeof event == "function" && event() || (event as EventController<Props>)?.createListener());
|
|
55
|
+
useEffect(() => { (listener as any)?.on(callback); return () => listener?.remove(); }, [])
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
const events = eventer();
|
|
61
|
+
const taskManager = events.createTasksManager("global-task-manage");
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Administrador global de tareas asyncronimas
|
|
65
|
+
* @returns
|
|
66
|
+
*/
|
|
67
|
+
export function useGlobalTaskManager() {
|
|
68
|
+
return taskManager;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Crear una tarea asincronima, se ejecuta desde administrador global de tareas
|
|
73
|
+
* @param callback
|
|
74
|
+
* @returns
|
|
75
|
+
*/
|
|
76
|
+
export function useTask(callback: () => Promise<void>, execute?: boolean) {
|
|
77
|
+
const [task] = useState(taskManager.createTaskInstance());
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
task.setTask(callback);
|
|
80
|
+
execute && taskManager.execTasks();
|
|
81
|
+
return () => {
|
|
82
|
+
task.remove();
|
|
83
|
+
}
|
|
84
|
+
}, [])
|
|
85
|
+
return taskManager;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Crear validador
|
|
90
|
+
* @returns
|
|
91
|
+
*/
|
|
92
|
+
export function useValidator<T extends object>(model?: T): [ValidatorController<T>, T | undefined] {
|
|
93
|
+
const [events] = useState(eventer());
|
|
94
|
+
const [validator] = useState(events.createValidator<T>("validator"));
|
|
95
|
+
useEffect(() => {
|
|
96
|
+
model && validator.setModel(model);
|
|
97
|
+
}, [model])
|
|
98
|
+
return [validator, model];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function useValidatorModel<T extends object>(model: T): [ValidatorController<T>, T] {
|
|
102
|
+
const [validator] = useValidator<T>(model);
|
|
103
|
+
const [model2] = useState(model);
|
|
104
|
+
return [validator, model2]
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Crea un nuevo validador y lo adjunta a un validador padre. Recmendado para hacer validaciones anidadas.
|
|
109
|
+
* @param key
|
|
110
|
+
* @param validator
|
|
111
|
+
* @returns
|
|
112
|
+
*/
|
|
113
|
+
export function useValidatorJoin<T extends object>(key: string, validator: ValidatorController<any>): [ValidatorController<T>] {
|
|
114
|
+
const [newValidator] = useValidator<T>();
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
useEffect(()=>validator.join(key, newValidator),[]);
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
return () => {
|
|
120
|
+
validator.join(key, null);
|
|
121
|
+
}
|
|
122
|
+
}, []);
|
|
123
|
+
return [newValidator];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Controlar lista desde react
|
|
129
|
+
* @param data lista del modelo
|
|
130
|
+
* @param create funcion para deifnir el nuevo modelo a crear dentro de la lisa del modelo
|
|
131
|
+
* @returns
|
|
132
|
+
*/
|
|
133
|
+
export function useArray<T, P>(data: Array<T>, create: (parent?: P) => T) {
|
|
134
|
+
const [array, setArray] = useState(data);
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
/**Lista de elementos */
|
|
139
|
+
array,
|
|
140
|
+
/**
|
|
141
|
+
* Crear modelo en la vista.
|
|
142
|
+
* @param parent
|
|
143
|
+
* @returns
|
|
144
|
+
*/
|
|
145
|
+
create(parent?: P) {
|
|
146
|
+
return () => {
|
|
147
|
+
const item = create(parent);
|
|
148
|
+
data.push(item);
|
|
149
|
+
setArray(() => [...data]);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* Insertar nuevo elemento en una posicion expecifica
|
|
154
|
+
* @param index
|
|
155
|
+
* @param parent
|
|
156
|
+
* @returns
|
|
157
|
+
*/
|
|
158
|
+
createByIndex(index: number, parent?: P) {
|
|
159
|
+
return () => {
|
|
160
|
+
const item = create(parent);
|
|
161
|
+
data.splice(index, 0, item);
|
|
162
|
+
setArray(() => [...data]);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Eliminar modelo de la vista
|
|
167
|
+
* @param item
|
|
168
|
+
* @returns
|
|
169
|
+
*/
|
|
170
|
+
remove(item: T) {
|
|
171
|
+
return () => {
|
|
172
|
+
const index = data.indexOf(item);
|
|
173
|
+
if (index !== -1) {
|
|
174
|
+
data.splice(index, 1);
|
|
175
|
+
setArray(() => [...data]);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
/**
|
|
180
|
+
* Elimina un modelo de la lsita en la vista por un índice
|
|
181
|
+
* @param index
|
|
182
|
+
* @returns
|
|
183
|
+
*/
|
|
184
|
+
removeByIndex(index: number) {
|
|
185
|
+
return () => {
|
|
186
|
+
data.splice(index, 1);
|
|
187
|
+
setArray(() => [...data]);
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
/**
|
|
191
|
+
* Actualiza un modelo de la lista en la vista
|
|
192
|
+
* @param item
|
|
193
|
+
* @returns
|
|
194
|
+
*/
|
|
195
|
+
update(item: T){
|
|
196
|
+
return () => {
|
|
197
|
+
const index = data.indexOf(item);
|
|
198
|
+
if (index !== -1) {
|
|
199
|
+
data[index] = item;
|
|
200
|
+
setArray(() => [...data]);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
/**
|
|
205
|
+
* Actualiza un modelo de la lista en la vista por un índice
|
|
206
|
+
* @param index
|
|
207
|
+
* @param item
|
|
208
|
+
* @returns
|
|
209
|
+
*/
|
|
210
|
+
updateByIndex(index: number, item: T){
|
|
211
|
+
return () => {
|
|
212
|
+
data[index] = item;
|
|
213
|
+
setArray(() => [...data]);
|
|
214
|
+
}
|
|
215
|
+
},
|
|
216
|
+
/**
|
|
217
|
+
* Actualiza todos los modelos de la lista
|
|
218
|
+
* @param callback
|
|
219
|
+
* @returns
|
|
220
|
+
*/
|
|
221
|
+
updateAll(callback: (item: T) => T) {
|
|
222
|
+
return ()=>{
|
|
223
|
+
setArray(() => data.map(callback));
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
/**
|
|
227
|
+
* Mover un modelo de un indice a otro
|
|
228
|
+
* @param from referecia incial
|
|
229
|
+
* @param to destino
|
|
230
|
+
* @returns
|
|
231
|
+
*/
|
|
232
|
+
move(from: number, to: number){
|
|
233
|
+
return () => {
|
|
234
|
+
const item = data[from];
|
|
235
|
+
data.splice(from, 1);
|
|
236
|
+
data.splice(to, 0, item);
|
|
237
|
+
setArray(() => [...data]);
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
/**
|
|
241
|
+
* Obtener la lista original
|
|
242
|
+
* @returns
|
|
243
|
+
*/
|
|
244
|
+
getArray(){
|
|
245
|
+
return data;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|