@pihanga2/core 0.3.3 → 0.3.4
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/dist/card.d.ts +3 -2
- package/dist/card.d.ts.map +1 -1
- package/dist/card.js +12 -6
- package/dist/card.js.map +1 -1
- package/dist/reducer.d.ts.map +1 -1
- package/dist/reducer.js +65 -18
- package/dist/reducer.js.map +1 -1
- package/dist/redux.d.ts.map +1 -1
- package/dist/redux.js.map +1 -1
- package/dist/register_cards.d.ts.map +1 -1
- package/dist/register_cards.js +1 -1
- package/dist/register_cards.js.map +1 -1
- package/dist/router.d.ts +11 -5
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +33 -28
- package/dist/router.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/card.tsx +12 -7
- package/src/reducer.ts +133 -76
- package/src/redux.ts +26 -25
- package/src/register_cards.ts +25 -24
- package/src/router.ts +129 -100
- package/src/types.ts +10 -7
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,KAAK,CAAC;IAEb,OAAO,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
1
|
+
export const DEF_REDUCER_PRIORITY = 0;
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkDA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC"}
|
package/package.json
CHANGED
package/src/card.tsx
CHANGED
|
@@ -71,13 +71,19 @@ export function Card(props: CardProp): JSX.Element {
|
|
|
71
71
|
|
|
72
72
|
export function usePiReducer<S extends ReduxState, A extends ReduxAction>(
|
|
73
73
|
eventType: string,
|
|
74
|
-
mapper: ReduceF<S, A
|
|
74
|
+
mapper: ReduceF<S, A>, // (state: S, action: A, dispatch: DispatchF) => S,
|
|
75
|
+
cardName: string
|
|
75
76
|
) {
|
|
76
77
|
const store = useStore();
|
|
77
|
-
|
|
78
|
+
let key: string;
|
|
79
|
+
if (cardName !== "") {
|
|
80
|
+
key = `inside card '${cardName}'`;
|
|
81
|
+
} else {
|
|
82
|
+
key = useId();
|
|
83
|
+
}
|
|
78
84
|
useEffect(() => {
|
|
79
85
|
const r = (store as any).piReducer as PiReducer;
|
|
80
|
-
return r.register(eventType, mapper, 0,
|
|
86
|
+
return r.register(eventType, mapper, 0, key);
|
|
81
87
|
});
|
|
82
88
|
}
|
|
83
89
|
|
|
@@ -306,7 +312,7 @@ type CardState = {
|
|
|
306
312
|
dispatch: Dispatch<Action>
|
|
307
313
|
) => void;
|
|
308
314
|
changed: (cardName: string, isUnchanged: boolean, props: CompProps) => void;
|
|
309
|
-
reducer:
|
|
315
|
+
reducer: ReduceF<ReduxState, Action>;
|
|
310
316
|
};
|
|
311
317
|
|
|
312
318
|
export const RegisterCardState = createCardState();
|
|
@@ -376,7 +382,7 @@ function createCardState(): CardState {
|
|
|
376
382
|
resetTimer();
|
|
377
383
|
}
|
|
378
384
|
};
|
|
379
|
-
const reducer = (state: ReduxState)
|
|
385
|
+
const reducer = (state: ReduxState) => {
|
|
380
386
|
const pi = Object.values(s)
|
|
381
387
|
.filter((s) => s.reportedAt > lastReport)
|
|
382
388
|
.reduce((p, s) => {
|
|
@@ -392,9 +398,8 @@ function createCardState(): CardState {
|
|
|
392
398
|
p[name] = props;
|
|
393
399
|
return p;
|
|
394
400
|
}, {} as {[k: string]: any});
|
|
395
|
-
state.pihanga = pi;
|
|
401
|
+
(state.pihanga ??= {}).cards = pi;
|
|
396
402
|
lastReport = Date.now();
|
|
397
|
-
return state;
|
|
398
403
|
};
|
|
399
404
|
return {props, changed, reducer};
|
|
400
405
|
}
|
package/src/reducer.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {Action, Reducer} from "@reduxjs/toolkit";
|
|
2
2
|
import {
|
|
3
3
|
DispatchF,
|
|
4
4
|
PiReducer,
|
|
@@ -9,110 +9,137 @@ import {
|
|
|
9
9
|
ReduceOnceF,
|
|
10
10
|
ReduxAction,
|
|
11
11
|
ReduxState,
|
|
12
|
-
} from "./types"
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import StackTrace from "stacktrace-js"
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
12
|
+
} from "./types";
|
|
13
|
+
import {produce} from "immer";
|
|
14
|
+
import {RegisterCardState, UPDATE_STATE_ACTION} from "./card";
|
|
15
|
+
import StackTrace from "stacktrace-js";
|
|
16
|
+
import {getLogger} from "./logger";
|
|
17
|
+
import {Dispatch} from "react";
|
|
18
|
+
import {currentRoute} from "./router";
|
|
19
19
|
|
|
20
|
-
const logger = getLogger("reducer")
|
|
20
|
+
const logger = getLogger("reducer");
|
|
21
21
|
|
|
22
22
|
type ReducerDef<S extends ReduxState, A extends ReduxAction> = {
|
|
23
|
-
|
|
24
|
-
mapperOnce?: ReduceOnceF<S, A
|
|
25
|
-
priority?: number
|
|
26
|
-
key?: string
|
|
27
|
-
definedIn?: StackTrace.StackFrame
|
|
28
|
-
|
|
23
|
+
mapperMulti?: ReduceF<S, A>;
|
|
24
|
+
mapperOnce?: ReduceOnceF<S, A>;
|
|
25
|
+
priority?: number;
|
|
26
|
+
key?: string;
|
|
27
|
+
definedIn?: StackTrace.StackFrame;
|
|
28
|
+
targetMapper?: ReduceF<S, A>;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
type Source = {
|
|
32
|
+
file?: string;
|
|
33
|
+
line?: number;
|
|
34
|
+
column?: number;
|
|
35
|
+
functionName?: string;
|
|
36
|
+
};
|
|
29
37
|
|
|
30
38
|
export function createReducer(
|
|
31
39
|
initialState: ReduxState,
|
|
32
|
-
dispatcher: Dispatch<any
|
|
40
|
+
dispatcher: Dispatch<any>
|
|
33
41
|
): [Reducer<ReduxState, Action>, PiReducer] {
|
|
34
|
-
const mappings: {
|
|
35
|
-
mappings[UPDATE_STATE_ACTION] = [
|
|
42
|
+
const mappings: {[k: string]: ReducerDef<ReduxState, Action>[]} = {};
|
|
43
|
+
mappings[UPDATE_STATE_ACTION] = [
|
|
44
|
+
{
|
|
45
|
+
mapperMulti: RegisterCardState.reducer,
|
|
46
|
+
key: "@builtin:card:UPDATE_STATE_ACTION",
|
|
47
|
+
},
|
|
48
|
+
];
|
|
36
49
|
|
|
37
50
|
const delayedDispatcher = (a: any): void => {
|
|
38
|
-
setTimeout(() => dispatcher(a), 0)
|
|
39
|
-
}
|
|
51
|
+
setTimeout(() => dispatcher(a), 0);
|
|
52
|
+
};
|
|
40
53
|
const reducer = (
|
|
41
54
|
state: ReduxState | undefined,
|
|
42
|
-
action: Action
|
|
55
|
+
action: Action
|
|
43
56
|
): ReduxState => {
|
|
44
|
-
const s = state || initialState
|
|
45
|
-
const ra = mappings[action.type]
|
|
46
|
-
const rany = mappings["*"]
|
|
57
|
+
const s = state || initialState;
|
|
58
|
+
const ra = mappings[action.type];
|
|
59
|
+
const rany = mappings["*"];
|
|
47
60
|
if ((!ra || ra.length === 0) && (!rany || rany.length === 0)) {
|
|
48
|
-
return s
|
|
61
|
+
return s;
|
|
49
62
|
}
|
|
50
63
|
|
|
51
64
|
const nextState = produce<ReduxState, ReduxState>(s, (draft) => {
|
|
65
|
+
if (!draft.pihanga) {
|
|
66
|
+
draft.pihanga = {};
|
|
67
|
+
}
|
|
68
|
+
draft.pihanga.reducers = [];
|
|
52
69
|
if (ra) {
|
|
53
|
-
const rout = _reduce(ra, draft, action, delayedDispatcher)
|
|
54
|
-
mappings[action.type] = rout
|
|
70
|
+
const rout = _reduce(ra, draft, action, delayedDispatcher);
|
|
71
|
+
mappings[action.type] = rout;
|
|
55
72
|
}
|
|
56
73
|
if (rany) {
|
|
57
|
-
const rout2 = _reduce(rany, draft, action, delayedDispatcher)
|
|
58
|
-
mappings["*"] = rout2
|
|
74
|
+
const rout2 = _reduce(rany, draft, action, delayedDispatcher);
|
|
75
|
+
mappings["*"] = rout2;
|
|
59
76
|
}
|
|
60
|
-
return
|
|
61
|
-
})
|
|
62
|
-
return nextState
|
|
63
|
-
}
|
|
77
|
+
return;
|
|
78
|
+
});
|
|
79
|
+
return nextState;
|
|
80
|
+
};
|
|
64
81
|
|
|
65
82
|
const registerReducer: PiRegisterReducerF = <
|
|
66
83
|
S extends ReduxState,
|
|
67
|
-
A extends ReduxAction
|
|
84
|
+
A extends ReduxAction
|
|
68
85
|
>(
|
|
69
86
|
eventType: string,
|
|
70
87
|
mapper: ReduceF<S, A>,
|
|
71
88
|
priority: number = 0,
|
|
72
|
-
key
|
|
89
|
+
key?: string,
|
|
90
|
+
targetMapper?: ReduceF<S, A>
|
|
73
91
|
): PiReducerCancelF => {
|
|
74
|
-
return addReducer(eventType, {
|
|
75
|
-
|
|
92
|
+
return addReducer(eventType, {
|
|
93
|
+
mapperMulti: mapper,
|
|
94
|
+
priority,
|
|
95
|
+
key,
|
|
96
|
+
targetMapper,
|
|
97
|
+
});
|
|
98
|
+
};
|
|
76
99
|
|
|
77
100
|
const registerOneShot: PiRegisterOneShotReducerF = <
|
|
78
101
|
S extends ReduxState,
|
|
79
|
-
A extends ReduxAction
|
|
102
|
+
A extends ReduxAction
|
|
80
103
|
>(
|
|
81
104
|
eventType: string,
|
|
82
105
|
mapper: (state: S, action: A, dispatch: DispatchF) => boolean,
|
|
83
106
|
priority: number = 0,
|
|
84
107
|
key: string | undefined = undefined
|
|
85
108
|
): PiReducerCancelF => {
|
|
86
|
-
return addReducer(eventType, {
|
|
87
|
-
}
|
|
109
|
+
return addReducer(eventType, {mapperOnce: mapper, priority, key});
|
|
110
|
+
};
|
|
88
111
|
|
|
89
|
-
const nonCancelF = () => {}
|
|
112
|
+
const nonCancelF = () => {};
|
|
90
113
|
|
|
91
114
|
function addReducer<S extends ReduxState, A extends ReduxAction>(
|
|
92
115
|
eventType: string,
|
|
93
|
-
reducerDef: ReducerDef<S, A
|
|
116
|
+
reducerDef: ReducerDef<S, A>
|
|
94
117
|
): PiReducerCancelF {
|
|
95
|
-
let m = mappings[eventType] || []
|
|
96
|
-
const key = reducerDef.key
|
|
97
|
-
m = removeReducer(key, m)
|
|
98
|
-
m.push(reducerDef as any as ReducerDef<ReduxState, Action<any>>) // keep typing happy
|
|
99
|
-
m.sort((a, b) => (b.priority || 0) - (a.priority || 0))
|
|
100
|
-
mappings[eventType] = m
|
|
101
|
-
|
|
102
|
-
const callback = (frames: StackTrace.StackFrame[]) => {
|
|
103
|
-
// const stack = frames.map((sf) => `${sf.fileName}:${sf.lineNumber}`)
|
|
104
|
-
// console.log(stack)
|
|
105
|
-
reducerDef.definedIn = frames[2]
|
|
106
|
-
}
|
|
118
|
+
let m = mappings[eventType] || [];
|
|
119
|
+
const key = reducerDef.key;
|
|
120
|
+
m = removeReducer(key, m);
|
|
121
|
+
m.push(reducerDef as any as ReducerDef<ReduxState, Action<any>>); // keep typing happy
|
|
122
|
+
m.sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
123
|
+
mappings[eventType] = m;
|
|
107
124
|
|
|
108
|
-
|
|
109
|
-
|
|
125
|
+
if (!reducerDef.key) {
|
|
126
|
+
const frames = StackTrace.getSync();
|
|
127
|
+
const sf = _get_source_frame(frames);
|
|
128
|
+
if (sf) {
|
|
129
|
+
// reducerDef.definedIn = sf;
|
|
130
|
+
reducerDef.key = sf.toString();
|
|
131
|
+
} else {
|
|
132
|
+
reducerDef.definedIn = sf;
|
|
133
|
+
console.log(">> cannot find source frame", eventType, frames);
|
|
134
|
+
}
|
|
110
135
|
}
|
|
111
|
-
|
|
112
|
-
return key
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
136
|
+
|
|
137
|
+
return key
|
|
138
|
+
? () => {
|
|
139
|
+
let m = mappings[eventType] || [];
|
|
140
|
+
mappings[eventType] = removeReducer(key, m);
|
|
141
|
+
}
|
|
142
|
+
: nonCancelF;
|
|
116
143
|
}
|
|
117
144
|
|
|
118
145
|
const piReducer: PiReducer = {
|
|
@@ -120,9 +147,9 @@ export function createReducer(
|
|
|
120
147
|
registerOneShot,
|
|
121
148
|
dispatch: dispatcher,
|
|
122
149
|
dispatchFromReducer: delayedDispatcher,
|
|
123
|
-
}
|
|
150
|
+
};
|
|
124
151
|
|
|
125
|
-
return [reducer, piReducer]
|
|
152
|
+
return [reducer, piReducer];
|
|
126
153
|
}
|
|
127
154
|
|
|
128
155
|
function removeReducer(
|
|
@@ -130,9 +157,9 @@ function removeReducer(
|
|
|
130
157
|
m: ReducerDef<ReduxState, Action>[]
|
|
131
158
|
) {
|
|
132
159
|
if (key) {
|
|
133
|
-
return m.filter((r) => r.key !== key)
|
|
160
|
+
return m.filter((r) => r.key !== key);
|
|
134
161
|
} else {
|
|
135
|
-
return m
|
|
162
|
+
return m;
|
|
136
163
|
}
|
|
137
164
|
}
|
|
138
165
|
|
|
@@ -140,23 +167,53 @@ function _reduce(
|
|
|
140
167
|
ra: ReducerDef<ReduxState, Action>[],
|
|
141
168
|
draft: ReduxState,
|
|
142
169
|
action: Action,
|
|
143
|
-
delayedDispatcher: (a: any) => void
|
|
170
|
+
delayedDispatcher: (a: any) => void
|
|
144
171
|
): ReducerDef<ReduxState, Action<any>>[] {
|
|
145
|
-
const rout: ReducerDef<ReduxState, Action<any>>[] = []
|
|
172
|
+
const rout: ReducerDef<ReduxState, Action<any>>[] = [];
|
|
146
173
|
ra.forEach((m) => {
|
|
147
174
|
try {
|
|
148
|
-
if (m.
|
|
149
|
-
|
|
150
|
-
|
|
175
|
+
// if (m.definedIn || m.key) {
|
|
176
|
+
// console.log(">>> executing reducer", action.type, m.key, m.definedIn);
|
|
177
|
+
// }
|
|
178
|
+
if (m.mapperMulti) {
|
|
179
|
+
draft.pihanga?.reducers?.push(m.definedIn || m.key || "unknown");
|
|
180
|
+
m.mapperMulti(draft, action, delayedDispatcher);
|
|
181
|
+
rout.push(m);
|
|
151
182
|
} else if (m.mapperOnce) {
|
|
152
|
-
|
|
183
|
+
draft.pihanga?.reducers?.push(m.definedIn || m.key || "unknown");
|
|
184
|
+
const flag = m.mapperOnce(draft, action, delayedDispatcher);
|
|
153
185
|
if (!flag) {
|
|
154
|
-
rout.push(m)
|
|
186
|
+
rout.push(m);
|
|
155
187
|
}
|
|
156
188
|
}
|
|
157
189
|
} catch (err: any) {
|
|
158
|
-
logger.error(err.message, m.definedIn)
|
|
190
|
+
logger.error(err.message, m.definedIn);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
return rout;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function _get_source_frame(
|
|
197
|
+
frames: StackTrace.StackFrame[]
|
|
198
|
+
): StackTrace.StackFrame | undefined {
|
|
199
|
+
// Heuristic: frame 0 = Error, 1 = getCallerSiteInBrowser, 2 = your function, 3 = its caller
|
|
200
|
+
for (let i = 3; i < frames.length; i++) {
|
|
201
|
+
const f = frames[i];
|
|
202
|
+
const fn = f.fileName;
|
|
203
|
+
if (_is_src_file(fn)) {
|
|
204
|
+
return f;
|
|
159
205
|
}
|
|
160
|
-
}
|
|
161
|
-
return
|
|
162
|
-
}
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function _is_src_file(url: string | undefined): boolean {
|
|
211
|
+
if (!url) return false;
|
|
212
|
+
const m = url.match(/^(?:[a-z][a-z0-9+.-]*:)?\/\/[^\/]+\/([^\/?#]+)/);
|
|
213
|
+
if (m) {
|
|
214
|
+
const p1 = m[1];
|
|
215
|
+
const flag = !(p1.startsWith("@") || p1 === "node_modules");
|
|
216
|
+
return flag;
|
|
217
|
+
}
|
|
218
|
+
return true;
|
|
219
|
+
}
|
package/src/redux.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import {PiRegister} from ".";
|
|
2
|
+
import {pihanga as logger} from "./logger";
|
|
3
|
+
import {CardAction, ReduceF, ReduxState} from "./types";
|
|
4
4
|
|
|
5
|
-
const ns2Actions: {
|
|
5
|
+
const ns2Actions: {[k: string]: boolean} = {};
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Register a set of actions for a particular namespace.
|
|
@@ -18,32 +18,32 @@ const ns2Actions: { [k: string]: boolean } = {}
|
|
|
18
18
|
*/
|
|
19
19
|
export function registerActions<T extends string>(
|
|
20
20
|
namespace: string,
|
|
21
|
-
actions: readonly T[]
|
|
22
|
-
): {
|
|
21
|
+
actions: readonly T[]
|
|
22
|
+
): {[S in Uppercase<T>]: string} {
|
|
23
23
|
if (ns2Actions[namespace]) {
|
|
24
|
-
logger.warn(`Overwriting action namespace "${namespace}"`)
|
|
24
|
+
logger.warn(`Overwriting action namespace "${namespace}"`);
|
|
25
25
|
}
|
|
26
|
-
const ah: any = {}
|
|
26
|
+
const ah: any = {};
|
|
27
27
|
actions.forEach((a) => {
|
|
28
|
-
ah[a.toUpperCase()] = `${namespace}/${a}
|
|
29
|
-
})
|
|
30
|
-
logger.info(`Register action ns "${namespace}"`)
|
|
31
|
-
ns2Actions[namespace] = true
|
|
32
|
-
return ah as {
|
|
28
|
+
ah[a.toUpperCase()] = `${namespace}/${a}`;
|
|
29
|
+
});
|
|
30
|
+
logger.info(`Register action ns "${namespace}"`);
|
|
31
|
+
ns2Actions[namespace] = true;
|
|
32
|
+
return ah as {[S in Uppercase<T>]: string};
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
export function actionTypesToEvents(actionTypes: {
|
|
36
|
-
[k: string]: string
|
|
35
|
+
export function actionTypesToEvents(actionTypes: {[k: string]: string}): {
|
|
36
|
+
[k: string]: string;
|
|
37
37
|
} {
|
|
38
38
|
return Object.entries(actionTypes).reduce((p, el) => {
|
|
39
|
-
const [k, v] = el
|
|
39
|
+
const [k, v] = el;
|
|
40
40
|
const n = k
|
|
41
41
|
.split("_")
|
|
42
42
|
.map((s) => s.charAt(0).toUpperCase() + s.slice(1).toLowerCase())
|
|
43
|
-
.join("")
|
|
44
|
-
p[`on${n}`] = v
|
|
45
|
-
return p
|
|
46
|
-
}, {} as {
|
|
43
|
+
.join("");
|
|
44
|
+
p[`on${n}`] = v;
|
|
45
|
+
return p;
|
|
46
|
+
}, {} as {[k: string]: string});
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -53,12 +53,13 @@ export function actionTypesToEvents(actionTypes: { [k: string]: string }): {
|
|
|
53
53
|
* @param {string} actionType
|
|
54
54
|
* @returns a function to register a reducer for 'actionType'
|
|
55
55
|
*/
|
|
56
|
-
export function createOnAction<E>(
|
|
56
|
+
export function createOnAction<E>(
|
|
57
|
+
actionType: string
|
|
58
|
+
): <S extends ReduxState>(
|
|
57
59
|
register: PiRegister,
|
|
58
|
-
|
|
59
|
-
f: ReduceF<S, CardAction & E>,
|
|
60
|
+
f: ReduceF<S, CardAction & E>
|
|
60
61
|
) => void {
|
|
61
62
|
return (register, f) => {
|
|
62
|
-
register.reducer.register(actionType, f)
|
|
63
|
-
}
|
|
63
|
+
register.reducer.register(actionType, f);
|
|
64
|
+
};
|
|
64
65
|
}
|
package/src/register_cards.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import equal from "deep-equal";
|
|
2
|
-
import {
|
|
2
|
+
import {getLogger} from "./logger";
|
|
3
3
|
import {
|
|
4
4
|
CSSModuleClasses,
|
|
5
5
|
CardAction,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
StateMapper,
|
|
19
19
|
StateMapperContext,
|
|
20
20
|
} from "./types";
|
|
21
|
-
import {
|
|
21
|
+
import {Action, AnyAction, Dispatch} from "@reduxjs/toolkit";
|
|
22
22
|
|
|
23
23
|
const logger = getLogger("card-register");
|
|
24
24
|
|
|
@@ -28,11 +28,11 @@ export function isCardRef(p: any): boolean {
|
|
|
28
28
|
|
|
29
29
|
export type Mapping = {
|
|
30
30
|
cardType: string;
|
|
31
|
-
props: {
|
|
31
|
+
props: {[k: string]: unknown};
|
|
32
32
|
eventMappers: {
|
|
33
33
|
[k: string]: (ev: Action, ctxtProps: CardProp) => Action | null;
|
|
34
34
|
};
|
|
35
|
-
cardEvents: {
|
|
35
|
+
cardEvents: {[key: string]: string};
|
|
36
36
|
parameters: PiCardDef; // original
|
|
37
37
|
};
|
|
38
38
|
|
|
@@ -40,14 +40,14 @@ export type MetaCard = {
|
|
|
40
40
|
type: string;
|
|
41
41
|
registerCard: RegisterCardF;
|
|
42
42
|
mapper: MetaCardMapperF;
|
|
43
|
-
events?: {
|
|
43
|
+
events?: {[key: string]: string};
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
-
export const cardTypes: {
|
|
47
|
-
export const metacardTypes: {
|
|
46
|
+
export const cardTypes: {[k: string]: PiRegisterComponent} = {};
|
|
47
|
+
export const metacardTypes: {[k: string]: MetaCard} = {};
|
|
48
48
|
|
|
49
49
|
export let framework: string; // name of active UI framework
|
|
50
|
-
export const cardMappings: {
|
|
50
|
+
export const cardMappings: {[k: string]: Mapping} = {};
|
|
51
51
|
export const dispatch2registerReducer: [
|
|
52
52
|
React.Dispatch<any>,
|
|
53
53
|
PiRegisterReducerF
|
|
@@ -71,12 +71,12 @@ export function registerCardComponent(card: PiRegisterComponent): void {
|
|
|
71
71
|
|
|
72
72
|
export function registerMetacard(registerCard: RegisterCardF) {
|
|
73
73
|
function f<C>(declaration: PiRegisterMetaCard) {
|
|
74
|
-
const {
|
|
74
|
+
const {type, mapper, events} = declaration;
|
|
75
75
|
if (metacardTypes[type]) {
|
|
76
76
|
logger.warn(`Overwriting definition for meta card type "${type}"`);
|
|
77
77
|
}
|
|
78
78
|
logger.info(`Register meta card type "${type}"`);
|
|
79
|
-
metacardTypes[type] = {
|
|
79
|
+
metacardTypes[type] = {type, registerCard, mapper, events};
|
|
80
80
|
}
|
|
81
81
|
return f;
|
|
82
82
|
}
|
|
@@ -100,7 +100,7 @@ export function updateOrRegisterCard(
|
|
|
100
100
|
dispatch2registerReducer.push([dispatchF, registerReducer]);
|
|
101
101
|
return (
|
|
102
102
|
name: string,
|
|
103
|
-
parameters: {
|
|
103
|
+
parameters: {[key: string]: GenericCardParameterT}
|
|
104
104
|
): PiCardRef => {
|
|
105
105
|
return _updateCard(name, parameters, registerReducer);
|
|
106
106
|
};
|
|
@@ -110,7 +110,7 @@ export function _registerCard(
|
|
|
110
110
|
name: string,
|
|
111
111
|
parameters: PiCardDef,
|
|
112
112
|
registerReducer: PiRegisterReducerF,
|
|
113
|
-
overrideEvents?: {
|
|
113
|
+
overrideEvents?: {[key: string]: string}
|
|
114
114
|
): PiCardRef {
|
|
115
115
|
if (cardMappings[name]) {
|
|
116
116
|
logger.warn(`Overwriting definition for card "${name}"`);
|
|
@@ -137,9 +137,9 @@ export function _registerCard(
|
|
|
137
137
|
|
|
138
138
|
export function _updateCard(
|
|
139
139
|
name: string,
|
|
140
|
-
parameters: {
|
|
140
|
+
parameters: {[key: string]: GenericCardParameterT},
|
|
141
141
|
registerReducer: PiRegisterReducerF,
|
|
142
|
-
overrideEvents?: {
|
|
142
|
+
overrideEvents?: {[key: string]: string}
|
|
143
143
|
): PiCardRef {
|
|
144
144
|
const mappings = cardMappings[name];
|
|
145
145
|
if (!mappings) {
|
|
@@ -152,7 +152,7 @@ export function _updateCard(
|
|
|
152
152
|
return _registerCard(name, p, registerReducer, overrideEvents);
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
const p = {
|
|
155
|
+
const p = {...mappings.parameters, ...parameters};
|
|
156
156
|
_createCardMapping(name, p, registerReducer, mappings.cardEvents);
|
|
157
157
|
return name;
|
|
158
158
|
}
|
|
@@ -161,10 +161,10 @@ export function _createCardMapping(
|
|
|
161
161
|
name: string,
|
|
162
162
|
parameters: PiCardDef,
|
|
163
163
|
registerReducer: PiRegisterReducerF,
|
|
164
|
-
cardEvents: {
|
|
164
|
+
cardEvents: {[key: string]: string}
|
|
165
165
|
) {
|
|
166
|
-
const props = {} as {
|
|
167
|
-
const eventMappers = {} as {
|
|
166
|
+
const props = {} as {[k: string]: unknown};
|
|
167
|
+
const eventMappers = {} as {[k: string]: (ev: Action) => Action};
|
|
168
168
|
|
|
169
169
|
Object.entries(parameters).forEach(([k, v]) => {
|
|
170
170
|
if (k === "cardType") return;
|
|
@@ -272,8 +272,8 @@ export function createCardDeclaration<Props = {}, Events = {}>(
|
|
|
272
272
|
function processEventParameter(
|
|
273
273
|
propName: string,
|
|
274
274
|
value: unknown,
|
|
275
|
-
events: {
|
|
276
|
-
eventMappers: {
|
|
275
|
+
events: {[key: string]: string},
|
|
276
|
+
eventMappers: {[k: string]: (ev: Action) => Action},
|
|
277
277
|
registerReducer: PiRegisterReducerF,
|
|
278
278
|
cardName: string
|
|
279
279
|
): boolean {
|
|
@@ -304,7 +304,8 @@ function processEventParameter(
|
|
|
304
304
|
return s;
|
|
305
305
|
},
|
|
306
306
|
0,
|
|
307
|
-
|
|
307
|
+
`on card ${cardName} for ${propName}`,
|
|
308
|
+
r
|
|
308
309
|
);
|
|
309
310
|
}
|
|
310
311
|
if (propName === `${evName}Mapper`) {
|
|
@@ -350,9 +351,9 @@ export function memo<P, T, S extends ReduxState, C = any>(
|
|
|
350
351
|
filterF: (state: S, context: StateMapperContext<C>) => P,
|
|
351
352
|
mapperF: (partial: P, context: StateMapperContext<C>, state: S) => T
|
|
352
353
|
): (state: S, context: StateMapperContext<C>) => T {
|
|
353
|
-
const lastFilter: {
|
|
354
|
-
const lastValue: {
|
|
355
|
-
const isNotFirst: {
|
|
354
|
+
const lastFilter: {[k: string]: P} = {};
|
|
355
|
+
const lastValue: {[k: string]: T} = {};
|
|
356
|
+
const isNotFirst: {[k: string]: boolean} = {};
|
|
356
357
|
|
|
357
358
|
return (state: S, context: StateMapperContext<C>): T => {
|
|
358
359
|
const k = context.cardKey || "-";
|