react-better-model 0.1.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/lib/index.d.ts +17 -0
- package/lib/index.js +103 -0
- package/package.json +29 -0
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Context } from 'react';
|
|
2
|
+
export declare class Model<S, E> {
|
|
3
|
+
state: S;
|
|
4
|
+
private subs;
|
|
5
|
+
private updateSubscribers;
|
|
6
|
+
constructor(state?: S);
|
|
7
|
+
eventListeners: Map<keyof E, Set<(eventData: E[keyof E]) => void>>;
|
|
8
|
+
evtDataTypes: E;
|
|
9
|
+
onStateChange: (k: keyof S, cb: (v: S[keyof S]) => void) => () => void;
|
|
10
|
+
setState(delta: Partial<S>): void;
|
|
11
|
+
onEvent: (evt: keyof typeof this.evtDataTypes, cb: (eventData: E[keyof E]) => void) => () => void;
|
|
12
|
+
emitEvent: (evt: keyof E, data: E[keyof E]) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function useModelInstanceState<M extends Model<M['state'], M['evtDataTypes']>>(viewModel: M, key: keyof M['state']): (M["state"][keyof M["state"]] | ((v: any) => void))[];
|
|
15
|
+
export declare function useModelCtxState<M extends Model<M['state'], M['evtDataTypes']>>(ctx: Context<M>, key: keyof M['state']): (M["state"][keyof M["state"]] | ((v: any) => void))[];
|
|
16
|
+
export declare function useModelInstanceEvent<M extends Model<M['state'], M['evtDataTypes']>, NS extends keyof M['evtDataTypes']>(viewModel: M, ns: NS, cb?: (eventData: M['evtDataTypes'][NS]) => void): (data: M['evtDataTypes'][NS]) => void;
|
|
17
|
+
export declare function useModelCtxEvent<M extends Model<M['state'], M['evtDataTypes']>, NS extends keyof M['evtDataTypes']>(ctx: Context<M>, ns: NS, cb?: (eventData: M['evtDataTypes'][NS]) => void): (data: M["evtDataTypes"][NS]) => void;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.useModelCtxEvent = exports.useModelInstanceEvent = exports.useModelCtxState = exports.useModelInstanceState = exports.Model = void 0;
|
|
15
|
+
var react_1 = require("react");
|
|
16
|
+
var Model = /** @class */ (function () {
|
|
17
|
+
function Model(state) {
|
|
18
|
+
var _this = this;
|
|
19
|
+
if (state === void 0) { state = {}; }
|
|
20
|
+
this.state = state;
|
|
21
|
+
this.subs = new Map();
|
|
22
|
+
this.updateSubscribers = function (delta) {
|
|
23
|
+
var keyVals = Object.entries(delta);
|
|
24
|
+
var _loop_1 = function (key, val) {
|
|
25
|
+
if (_this.subs.has(key)) {
|
|
26
|
+
_this.subs.get(key).forEach(function (cb) {
|
|
27
|
+
cb(val);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
for (var _i = 0, _a = keyVals; _i < _a.length; _i++) {
|
|
32
|
+
var _b = _a[_i], key = _b[0], val = _b[1];
|
|
33
|
+
_loop_1(key, val);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
this.eventListeners = new Map();
|
|
37
|
+
this.evtDataTypes = {};
|
|
38
|
+
this.onStateChange = function (k, cb) {
|
|
39
|
+
var keySubs = _this.subs.get(k);
|
|
40
|
+
if (!keySubs) {
|
|
41
|
+
keySubs = new Set();
|
|
42
|
+
_this.subs.set(k, keySubs);
|
|
43
|
+
}
|
|
44
|
+
keySubs.add(cb);
|
|
45
|
+
return function () {
|
|
46
|
+
keySubs.delete(cb);
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
this.onEvent = function (evt, cb) {
|
|
50
|
+
var listeners = _this.eventListeners.get(evt);
|
|
51
|
+
if (!listeners) {
|
|
52
|
+
listeners = new Set();
|
|
53
|
+
_this.eventListeners.set(evt, listeners);
|
|
54
|
+
}
|
|
55
|
+
listeners.add(cb);
|
|
56
|
+
return function () {
|
|
57
|
+
listeners.delete(cb);
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
this.emitEvent = function (evt, data) {
|
|
61
|
+
if (_this.eventListeners.has(evt)) {
|
|
62
|
+
_this.eventListeners.get(evt).forEach(function (cb) {
|
|
63
|
+
cb(data);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
Model.prototype.setState = function (delta) {
|
|
69
|
+
this.state = __assign(__assign({}, this.state), delta);
|
|
70
|
+
this.updateSubscribers(delta);
|
|
71
|
+
};
|
|
72
|
+
return Model;
|
|
73
|
+
}());
|
|
74
|
+
exports.Model = Model;
|
|
75
|
+
function useModelInstanceState(viewModel, key) {
|
|
76
|
+
var _a = (0, react_1.useState)(viewModel.state[key]), value = _a[0], setValue = _a[1];
|
|
77
|
+
(0, react_1.useEffect)(function () { return viewModel.onStateChange(key, setValue); }, []);
|
|
78
|
+
var setter = (0, react_1.useCallback)(function (v) {
|
|
79
|
+
var _a;
|
|
80
|
+
viewModel.setState((_a = {}, _a[key] = v, _a));
|
|
81
|
+
}, [key]);
|
|
82
|
+
return [value, setter];
|
|
83
|
+
}
|
|
84
|
+
exports.useModelInstanceState = useModelInstanceState;
|
|
85
|
+
function useModelCtxState(ctx, key) {
|
|
86
|
+
var viewModel = (0, react_1.useContext)(ctx);
|
|
87
|
+
return useModelInstanceState(viewModel, key);
|
|
88
|
+
}
|
|
89
|
+
exports.useModelCtxState = useModelCtxState;
|
|
90
|
+
function useModelInstanceEvent(viewModel, ns, cb) {
|
|
91
|
+
(0, react_1.useEffect)(function () {
|
|
92
|
+
if (cb) {
|
|
93
|
+
return viewModel.onEvent(ns, cb);
|
|
94
|
+
}
|
|
95
|
+
}, [cb]);
|
|
96
|
+
return function (data) { return viewModel.emitEvent(ns, data); };
|
|
97
|
+
}
|
|
98
|
+
exports.useModelInstanceEvent = useModelInstanceEvent;
|
|
99
|
+
function useModelCtxEvent(ctx, ns, cb) {
|
|
100
|
+
var viewModel = (0, react_1.useContext)(ctx);
|
|
101
|
+
return useModelInstanceEvent(viewModel, ns, cb);
|
|
102
|
+
}
|
|
103
|
+
exports.useModelCtxEvent = useModelCtxEvent;
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-better-model",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"types": "lib/index.d.ts",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git@github.com:ingvardm/react-model-hooks.git"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"lib"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "npx tsc",
|
|
16
|
+
"prepare": "yarn build"
|
|
17
|
+
},
|
|
18
|
+
"author": "igor poughtach <ingvardm@gmail.com>",
|
|
19
|
+
"license": "GPL-3.0",
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"react": "^17.0.2"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/react": "^17.0.34",
|
|
25
|
+
"typescript": "^4.4.4"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {},
|
|
28
|
+
"private": false
|
|
29
|
+
}
|