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/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
+ }
@@ -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
+ }