@blac/react 0.0.16 → 0.0.18
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/blac-react.d.ts +16 -19
- package/dist/blac-react.esm.js +55 -98
- package/dist/blac-react.esm.js.map +1 -1
- package/dist/blac-react.js +54 -99
- package/dist/blac-react.js.map +1 -1
- package/dist/vitest.config.js +3 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +7 -16
- package/readme.md +4 -4
package/dist/blac-react.d.ts
CHANGED
|
@@ -1,31 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import React, { FC, ReactNode } from 'react';
|
|
3
|
-
|
|
4
|
-
declare const BlacApp: FC<{
|
|
5
|
-
children: ReactNode;
|
|
6
|
-
blac?: Blac<any>;
|
|
7
|
-
}>;
|
|
8
|
-
|
|
9
|
-
declare class BlacReact {
|
|
10
|
-
static pluginKey: string;
|
|
11
|
-
blac: Blac<any>;
|
|
12
|
-
blacContext: React.Context<Blac<any>>;
|
|
13
|
-
constructor(blac: Blac<any>, blacContext: React.Context<Blac<any>>);
|
|
14
|
-
static getInstance(throwError?: boolean): BlacReact;
|
|
15
|
-
setup(): void;
|
|
16
|
-
}
|
|
1
|
+
import { BlocBase, ValueType, BlocConstructor, BlocInstanceId, CubitPropsType } from 'blac';
|
|
17
2
|
|
|
18
3
|
interface ExternalStore<B extends BlocBase<any>> {
|
|
19
4
|
subscribe: (onStoreChange: () => void) => () => void;
|
|
20
5
|
getSnapshot: () => ValueType<B>;
|
|
21
6
|
getServerSnapshot?: () => ValueType<B>;
|
|
22
7
|
}
|
|
23
|
-
declare const externalBlocStore: <B extends BlocBase<any>>(bloc: B) => ExternalStore<B>;
|
|
8
|
+
declare const externalBlocStore: <B extends BlocBase<any>>(bloc: B, dependencySelector: (state: ValueType<B>) => unknown) => ExternalStore<B>;
|
|
24
9
|
|
|
25
10
|
type BlocHookData<B extends BlocBase<S>, S> = [
|
|
26
11
|
value: ValueType<B>,
|
|
27
12
|
instance: B
|
|
28
13
|
];
|
|
29
|
-
|
|
14
|
+
interface BlocHookOptions<B extends BlocBase<S>, S> {
|
|
15
|
+
id?: string;
|
|
16
|
+
dependencySelector?: (state: ValueType<B>) => unknown;
|
|
17
|
+
props?: CubitPropsType<B>;
|
|
18
|
+
}
|
|
19
|
+
type BlocHookDependencySelector<B extends BlocBase<S>, S> = (state: ValueType<B>) => unknown;
|
|
20
|
+
declare class UseBlocClass {
|
|
21
|
+
static useBloc<B extends BlocBase<S>, S>(bloc: BlocConstructor<B>): BlocHookData<B, S>;
|
|
22
|
+
static useBloc<B extends BlocBase<S>, S>(bloc: BlocConstructor<B>, options: BlocHookOptions<B, S>): BlocHookData<B, S>;
|
|
23
|
+
static useBloc<B extends BlocBase<S>, S>(bloc: BlocConstructor<B>, depsSelector: BlocHookDependencySelector<B, S>): BlocHookData<B, S>;
|
|
24
|
+
static useBloc<B extends BlocBase<S>, S>(bloc: BlocConstructor<B>, instanceId: BlocInstanceId): BlocHookData<B, S>;
|
|
25
|
+
}
|
|
26
|
+
declare const useBloc: typeof UseBlocClass.useBloc;
|
|
30
27
|
|
|
31
|
-
export {
|
|
28
|
+
export { externalBlocStore, useBloc };
|
package/dist/blac-react.esm.js
CHANGED
|
@@ -1,112 +1,69 @@
|
|
|
1
|
+
import { useMemo, useSyncExternalStore, useEffect } from 'react';
|
|
1
2
|
import { Blac } from 'blac';
|
|
2
|
-
import React, { createContext, useMemo, useContext, useSyncExternalStore } from 'react';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
blac;
|
|
7
|
-
blacContext;
|
|
8
|
-
constructor(blac, blacContext) {
|
|
9
|
-
const blacReact = blac.getPluginKey(BlacReact.pluginKey);
|
|
10
|
-
// new setup
|
|
11
|
-
this.blac = blac;
|
|
12
|
-
this.blacContext = blacContext;
|
|
13
|
-
this.setup();
|
|
14
|
-
if (blacReact) {
|
|
15
|
-
return blacReact;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
static getInstance(throwError = true) {
|
|
19
|
-
// const blac = (globalThis as any).blac;
|
|
20
|
-
const blac = BlacContext._currentValue;
|
|
21
|
-
if (!blac) {
|
|
22
|
-
throw new Error("BlacReact: blac instance not found, the <BlacApp> provider component might be missing");
|
|
23
|
-
}
|
|
24
|
-
const blacReact = blac.getPluginKey(BlacReact.pluginKey);
|
|
25
|
-
if (!blacReact) {
|
|
26
|
-
throw new Error("BlacReact: blacReact instance not found");
|
|
27
|
-
}
|
|
28
|
-
return blacReact;
|
|
29
|
-
}
|
|
30
|
-
setup() {
|
|
31
|
-
// (globalThis as any).blac = this.blac;
|
|
32
|
-
this.blac.addPluginKey(BlacReact.pluginKey, this);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const BlacContext = createContext(null);
|
|
37
|
-
const BlacApp = (props) => {
|
|
38
|
-
const { children, blac } = props;
|
|
39
|
-
const blacInstance = useMemo(() => blac ?? new Blac(), [blac]);
|
|
40
|
-
const blacApp = useMemo(() => new BlacReact(blacInstance, BlacContext), [blacInstance]);
|
|
41
|
-
if (!blacApp) {
|
|
42
|
-
throw new Error("BlacReact failed to initialize");
|
|
43
|
-
}
|
|
44
|
-
return React.createElement(BlacContext.Provider, { value: blacInstance }, children);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const externalBlocStore = (bloc) => {
|
|
4
|
+
var externalBlocStore = function (bloc, dependencySelector) {
|
|
5
|
+
var lastDependencyCheck = dependencySelector(bloc.state);
|
|
48
6
|
return {
|
|
49
|
-
subscribe: (listener)
|
|
50
|
-
|
|
51
|
-
|
|
7
|
+
subscribe: function (listener) {
|
|
8
|
+
var unSub = bloc.addEventListenerStateChange(function (data) {
|
|
9
|
+
var newDependencyCheck = dependencySelector(data);
|
|
10
|
+
if (newDependencyCheck !== lastDependencyCheck) {
|
|
11
|
+
lastDependencyCheck = newDependencyCheck;
|
|
12
|
+
listener();
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
return function () {
|
|
52
16
|
unSub();
|
|
53
17
|
};
|
|
54
18
|
},
|
|
55
|
-
getSnapshot: ()
|
|
19
|
+
getSnapshot: function () { return bloc.state; },
|
|
20
|
+
getServerSnapshot: function () { return bloc.state; }
|
|
56
21
|
};
|
|
57
22
|
};
|
|
58
23
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
const isLiveBloc = !isFunction &&
|
|
66
|
-
typeof bloc === "object" &&
|
|
67
|
-
bloc?.isBlacLive;
|
|
68
|
-
// if it is a create function, call it
|
|
69
|
-
if (!isBloc && isFunction) {
|
|
70
|
-
return bloc();
|
|
71
|
-
}
|
|
72
|
-
if (bloc?.isBlacLive) {
|
|
73
|
-
return bloc;
|
|
74
|
-
}
|
|
75
|
-
// if it is a class
|
|
76
|
-
const blocClass = bloc;
|
|
77
|
-
if (isLiveBloc) {
|
|
78
|
-
return bloc;
|
|
79
|
-
}
|
|
80
|
-
const registered = blacReact.blac.getBloc(blocClass);
|
|
81
|
-
if (registered) {
|
|
82
|
-
return registered;
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
const useResolvedBloc = (bloc) => {
|
|
86
|
-
const blacReact = BlacReact.getInstance();
|
|
87
|
-
const blacInstance = useContext(BlacContext);
|
|
88
|
-
const resolvedBloc = useMemo(() => {
|
|
89
|
-
if (!blacReact) {
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
return resolveBloc({
|
|
93
|
-
bloc,
|
|
94
|
-
blacInstance,
|
|
95
|
-
blacReact
|
|
96
|
-
});
|
|
97
|
-
}, []);
|
|
98
|
-
return resolvedBloc;
|
|
24
|
+
var useResolvedBloc = function (bloc, options) {
|
|
25
|
+
if (options === void 0) { options = {}; }
|
|
26
|
+
return useMemo(function () { return Blac.getInstance().getBloc(bloc, {
|
|
27
|
+
id: options.id,
|
|
28
|
+
props: options.props
|
|
29
|
+
}); }, [options.id]);
|
|
99
30
|
};
|
|
100
31
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (!resolvedBloc) {
|
|
104
|
-
throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);
|
|
32
|
+
var UseBlocClass = /** @class */ (function () {
|
|
33
|
+
function UseBlocClass() {
|
|
105
34
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
};
|
|
35
|
+
UseBlocClass.useBloc = function (bloc, options) {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
// default options
|
|
38
|
+
var dependencySelector = function (state) { return state; };
|
|
39
|
+
var blocId;
|
|
40
|
+
var props = {};
|
|
41
|
+
// parse options
|
|
42
|
+
if (typeof options === "function") {
|
|
43
|
+
dependencySelector = options;
|
|
44
|
+
}
|
|
45
|
+
if (typeof options === "string") {
|
|
46
|
+
blocId = options;
|
|
47
|
+
}
|
|
48
|
+
if (typeof options === "object") {
|
|
49
|
+
dependencySelector = (_a = options.dependencySelector) !== null && _a !== void 0 ? _a : dependencySelector;
|
|
50
|
+
blocId = options.id;
|
|
51
|
+
props = (_b = options.props) !== null && _b !== void 0 ? _b : props;
|
|
52
|
+
}
|
|
53
|
+
var resolvedBloc = useResolvedBloc(bloc, { id: blocId, props: props });
|
|
54
|
+
if (!resolvedBloc) {
|
|
55
|
+
throw new Error("useBloc: could not resolve: ".concat(bloc.name || bloc));
|
|
56
|
+
}
|
|
57
|
+
var _c = useMemo(function () { return externalBlocStore(resolvedBloc, dependencySelector); }, [resolvedBloc]), subscribe = _c.subscribe, getSnapshot = _c.getSnapshot, getServerSnapshot = _c.getServerSnapshot;
|
|
58
|
+
var state = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
59
|
+
useEffect(function () {
|
|
60
|
+
resolvedBloc.props = props;
|
|
61
|
+
}, [props]);
|
|
62
|
+
return [state, resolvedBloc];
|
|
63
|
+
};
|
|
64
|
+
return UseBlocClass;
|
|
65
|
+
}());
|
|
66
|
+
var useBloc = UseBlocClass.useBloc;
|
|
110
67
|
|
|
111
|
-
export {
|
|
68
|
+
export { externalBlocStore, useBloc };
|
|
112
69
|
//# sourceMappingURL=blac-react.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blac-react.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blac-react.esm.js","sources":["../src/externalBlocStore.ts","../src/useResolvedBloc.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase, ValueType } from \"blac\";\n\nexport interface ExternalStore<B extends BlocBase<any>> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => ValueType<B>;\n getServerSnapshot?: () => ValueType<B>;\n}\n\nconst externalBlocStore = <B extends BlocBase<any>>(\n bloc: B,\n dependencySelector: (state: ValueType<B>) => unknown\n): ExternalStore<B> => {\n let lastDependencyCheck = dependencySelector(bloc.state);\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange(data => {\n const newDependencyCheck = dependencySelector(data);\n if (newDependencyCheck !== lastDependencyCheck) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): ValueType<B> => bloc.state,\n getServerSnapshot: (): ValueType<B> => bloc.state\n };\n};\n\nexport default externalBlocStore;\n","import { Blac, BlocBase, BlocConstructor, BlocInstanceId, BlocProps } from \"blac\";\nimport { useMemo } from \"react\";\n\nconst useResolvedBloc = <B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options: { id?: BlocInstanceId; props?: BlocProps } = {}\n): B => useMemo(() => Blac.getInstance().getBloc(bloc, {\n id: options.id,\n props: options.props\n}), [options.id]);\n\nexport default useResolvedBloc;\n","import { BlocBase, BlocConstructor, BlocInstanceId, BlocProps, CubitPropsType, ValueType } from \"blac\";\nimport { useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport externalBlocStore, { ExternalStore } from \"./externalBlocStore\";\nimport useResolvedBloc from \"./useResolvedBloc\";\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: (state: ValueType<B>) => unknown;\n props?: CubitPropsType<B>;\n}\n\nexport type BlocHookDependencySelector<B extends BlocBase<S>, S> = (state: ValueType<B>) => unknown;\n\nclass UseBlocClass {\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options: BlocHookOptions<B, S>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n depsSelector: BlocHookDependencySelector<B, S>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n instanceId: BlocInstanceId\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options?: BlocHookOptions<B, S> | BlocHookDependencySelector<B, S> | BlocInstanceId\n ): BlocHookData<B, S> {\n // default options\n let dependencySelector: BlocHookDependencySelector<B, S> = (state: ValueType<B>) => state;\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps = {};\n\n // parse options\n if (typeof options === \"function\") {\n dependencySelector = options;\n }\n\n if (typeof options === \"string\") {\n blocId = options;\n }\n\n if (typeof options === \"object\") {\n dependencySelector = options.dependencySelector ?? dependencySelector;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n\n const resolvedBloc = useResolvedBloc<B, S>(bloc, { id: blocId, props });\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo<ExternalStore<B>>(\n () => externalBlocStore(resolvedBloc, dependencySelector),\n [resolvedBloc]\n );\n\n const state = useSyncExternalStore<ValueType<B>>(subscribe, getSnapshot, getServerSnapshot);\n\n useEffect(() => {\n resolvedBloc.props = props;\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":[],"mappings":"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"}
|
package/dist/blac-react.js
CHANGED
|
@@ -1,117 +1,72 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var react = require('react');
|
|
3
4
|
var blac = require('blac');
|
|
4
|
-
var React = require('react');
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
blac;
|
|
9
|
-
blacContext;
|
|
10
|
-
constructor(blac, blacContext) {
|
|
11
|
-
const blacReact = blac.getPluginKey(BlacReact.pluginKey);
|
|
12
|
-
// new setup
|
|
13
|
-
this.blac = blac;
|
|
14
|
-
this.blacContext = blacContext;
|
|
15
|
-
this.setup();
|
|
16
|
-
if (blacReact) {
|
|
17
|
-
return blacReact;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
static getInstance(throwError = true) {
|
|
21
|
-
// const blac = (globalThis as any).blac;
|
|
22
|
-
const blac = BlacContext._currentValue;
|
|
23
|
-
if (!blac) {
|
|
24
|
-
throw new Error("BlacReact: blac instance not found, the <BlacApp> provider component might be missing");
|
|
25
|
-
}
|
|
26
|
-
const blacReact = blac.getPluginKey(BlacReact.pluginKey);
|
|
27
|
-
if (!blacReact) {
|
|
28
|
-
throw new Error("BlacReact: blacReact instance not found");
|
|
29
|
-
}
|
|
30
|
-
return blacReact;
|
|
31
|
-
}
|
|
32
|
-
setup() {
|
|
33
|
-
// (globalThis as any).blac = this.blac;
|
|
34
|
-
this.blac.addPluginKey(BlacReact.pluginKey, this);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const BlacContext = React.createContext(null);
|
|
39
|
-
const BlacApp = (props) => {
|
|
40
|
-
const { children, blac: blac$1 } = props;
|
|
41
|
-
const blacInstance = React.useMemo(() => blac$1 ?? new blac.Blac(), [blac$1]);
|
|
42
|
-
const blacApp = React.useMemo(() => new BlacReact(blacInstance, BlacContext), [blacInstance]);
|
|
43
|
-
if (!blacApp) {
|
|
44
|
-
throw new Error("BlacReact failed to initialize");
|
|
45
|
-
}
|
|
46
|
-
return React.createElement(BlacContext.Provider, { value: blacInstance }, children);
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
const externalBlocStore = (bloc) => {
|
|
6
|
+
var externalBlocStore = function (bloc, dependencySelector) {
|
|
7
|
+
var lastDependencyCheck = dependencySelector(bloc.state);
|
|
50
8
|
return {
|
|
51
|
-
subscribe: (listener)
|
|
52
|
-
|
|
53
|
-
|
|
9
|
+
subscribe: function (listener) {
|
|
10
|
+
var unSub = bloc.addEventListenerStateChange(function (data) {
|
|
11
|
+
var newDependencyCheck = dependencySelector(data);
|
|
12
|
+
if (newDependencyCheck !== lastDependencyCheck) {
|
|
13
|
+
lastDependencyCheck = newDependencyCheck;
|
|
14
|
+
listener();
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return function () {
|
|
54
18
|
unSub();
|
|
55
19
|
};
|
|
56
20
|
},
|
|
57
|
-
getSnapshot: ()
|
|
21
|
+
getSnapshot: function () { return bloc.state; },
|
|
22
|
+
getServerSnapshot: function () { return bloc.state; }
|
|
58
23
|
};
|
|
59
24
|
};
|
|
60
25
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const isLiveBloc = !isFunction &&
|
|
68
|
-
typeof bloc === "object" &&
|
|
69
|
-
bloc?.isBlacLive;
|
|
70
|
-
// if it is a create function, call it
|
|
71
|
-
if (!isBloc && isFunction) {
|
|
72
|
-
return bloc();
|
|
73
|
-
}
|
|
74
|
-
if (bloc?.isBlacLive) {
|
|
75
|
-
return bloc;
|
|
76
|
-
}
|
|
77
|
-
// if it is a class
|
|
78
|
-
const blocClass = bloc;
|
|
79
|
-
if (isLiveBloc) {
|
|
80
|
-
return bloc;
|
|
81
|
-
}
|
|
82
|
-
const registered = blacReact.blac.getBloc(blocClass);
|
|
83
|
-
if (registered) {
|
|
84
|
-
return registered;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
const useResolvedBloc = (bloc) => {
|
|
88
|
-
const blacReact = BlacReact.getInstance();
|
|
89
|
-
const blacInstance = React.useContext(BlacContext);
|
|
90
|
-
const resolvedBloc = React.useMemo(() => {
|
|
91
|
-
if (!blacReact) {
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
return resolveBloc({
|
|
95
|
-
bloc,
|
|
96
|
-
blacInstance,
|
|
97
|
-
blacReact
|
|
98
|
-
});
|
|
99
|
-
}, []);
|
|
100
|
-
return resolvedBloc;
|
|
26
|
+
var useResolvedBloc = function (bloc, options) {
|
|
27
|
+
if (options === void 0) { options = {}; }
|
|
28
|
+
return react.useMemo(function () { return blac.Blac.getInstance().getBloc(bloc, {
|
|
29
|
+
id: options.id,
|
|
30
|
+
props: options.props
|
|
31
|
+
}); }, [options.id]);
|
|
101
32
|
};
|
|
102
33
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (!resolvedBloc) {
|
|
106
|
-
throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);
|
|
34
|
+
var UseBlocClass = /** @class */ (function () {
|
|
35
|
+
function UseBlocClass() {
|
|
107
36
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
};
|
|
37
|
+
UseBlocClass.useBloc = function (bloc, options) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
// default options
|
|
40
|
+
var dependencySelector = function (state) { return state; };
|
|
41
|
+
var blocId;
|
|
42
|
+
var props = {};
|
|
43
|
+
// parse options
|
|
44
|
+
if (typeof options === "function") {
|
|
45
|
+
dependencySelector = options;
|
|
46
|
+
}
|
|
47
|
+
if (typeof options === "string") {
|
|
48
|
+
blocId = options;
|
|
49
|
+
}
|
|
50
|
+
if (typeof options === "object") {
|
|
51
|
+
dependencySelector = (_a = options.dependencySelector) !== null && _a !== void 0 ? _a : dependencySelector;
|
|
52
|
+
blocId = options.id;
|
|
53
|
+
props = (_b = options.props) !== null && _b !== void 0 ? _b : props;
|
|
54
|
+
}
|
|
55
|
+
var resolvedBloc = useResolvedBloc(bloc, { id: blocId, props: props });
|
|
56
|
+
if (!resolvedBloc) {
|
|
57
|
+
throw new Error("useBloc: could not resolve: ".concat(bloc.name || bloc));
|
|
58
|
+
}
|
|
59
|
+
var _c = react.useMemo(function () { return externalBlocStore(resolvedBloc, dependencySelector); }, [resolvedBloc]), subscribe = _c.subscribe, getSnapshot = _c.getSnapshot, getServerSnapshot = _c.getServerSnapshot;
|
|
60
|
+
var state = react.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
61
|
+
react.useEffect(function () {
|
|
62
|
+
resolvedBloc.props = props;
|
|
63
|
+
}, [props]);
|
|
64
|
+
return [state, resolvedBloc];
|
|
65
|
+
};
|
|
66
|
+
return UseBlocClass;
|
|
67
|
+
}());
|
|
68
|
+
var useBloc = UseBlocClass.useBloc;
|
|
112
69
|
|
|
113
|
-
exports.BlacApp = BlacApp;
|
|
114
|
-
exports.BlacReact = BlacReact;
|
|
115
70
|
exports.externalBlocStore = externalBlocStore;
|
|
116
71
|
exports.useBloc = useBloc;
|
|
117
72
|
//# sourceMappingURL=blac-react.js.map
|
package/dist/blac-react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blac-react.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blac-react.js","sources":["../src/externalBlocStore.ts","../src/useResolvedBloc.ts","../src/useBloc.tsx"],"sourcesContent":["import { BlocBase, ValueType } from \"blac\";\n\nexport interface ExternalStore<B extends BlocBase<any>> {\n subscribe: (onStoreChange: () => void) => () => void;\n getSnapshot: () => ValueType<B>;\n getServerSnapshot?: () => ValueType<B>;\n}\n\nconst externalBlocStore = <B extends BlocBase<any>>(\n bloc: B,\n dependencySelector: (state: ValueType<B>) => unknown\n): ExternalStore<B> => {\n let lastDependencyCheck = dependencySelector(bloc.state);\n return {\n subscribe: (listener: () => void) => {\n const unSub = bloc.addEventListenerStateChange(data => {\n const newDependencyCheck = dependencySelector(data);\n if (newDependencyCheck !== lastDependencyCheck) {\n lastDependencyCheck = newDependencyCheck;\n listener();\n }\n });\n return () => {\n unSub();\n };\n },\n getSnapshot: (): ValueType<B> => bloc.state,\n getServerSnapshot: (): ValueType<B> => bloc.state\n };\n};\n\nexport default externalBlocStore;\n","import { Blac, BlocBase, BlocConstructor, BlocInstanceId, BlocProps } from \"blac\";\nimport { useMemo } from \"react\";\n\nconst useResolvedBloc = <B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options: { id?: BlocInstanceId; props?: BlocProps } = {}\n): B => useMemo(() => Blac.getInstance().getBloc(bloc, {\n id: options.id,\n props: options.props\n}), [options.id]);\n\nexport default useResolvedBloc;\n","import { BlocBase, BlocConstructor, BlocInstanceId, BlocProps, CubitPropsType, ValueType } from \"blac\";\nimport { useEffect, useMemo, useSyncExternalStore } from \"react\";\nimport externalBlocStore, { ExternalStore } from \"./externalBlocStore\";\nimport useResolvedBloc from \"./useResolvedBloc\";\n\nexport type BlocHookData<B extends BlocBase<S>, S> = [\n value: ValueType<B>,\n instance: B,\n];\n\n\nexport interface BlocHookOptions<B extends BlocBase<S>, S> {\n id?: string;\n dependencySelector?: (state: ValueType<B>) => unknown;\n props?: CubitPropsType<B>;\n}\n\nexport type BlocHookDependencySelector<B extends BlocBase<S>, S> = (state: ValueType<B>) => unknown;\n\nclass UseBlocClass {\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options: BlocHookOptions<B, S>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n depsSelector: BlocHookDependencySelector<B, S>\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n instanceId: BlocInstanceId\n ): BlocHookData<B, S>;\n static useBloc<B extends BlocBase<S>, S>(\n bloc: BlocConstructor<B>,\n options?: BlocHookOptions<B, S> | BlocHookDependencySelector<B, S> | BlocInstanceId\n ): BlocHookData<B, S> {\n // default options\n let dependencySelector: BlocHookDependencySelector<B, S> = (state: ValueType<B>) => state;\n let blocId: BlocInstanceId | undefined;\n let props: BlocProps = {};\n\n // parse options\n if (typeof options === \"function\") {\n dependencySelector = options;\n }\n\n if (typeof options === \"string\") {\n blocId = options;\n }\n\n if (typeof options === \"object\") {\n dependencySelector = options.dependencySelector ?? dependencySelector;\n blocId = options.id;\n props = options.props ?? props;\n }\n\n\n const resolvedBloc = useResolvedBloc<B, S>(bloc, { id: blocId, props });\n\n if (!resolvedBloc) {\n throw new Error(`useBloc: could not resolve: ${bloc.name || bloc}`);\n }\n\n const { subscribe, getSnapshot, getServerSnapshot } = useMemo<ExternalStore<B>>(\n () => externalBlocStore(resolvedBloc, dependencySelector),\n [resolvedBloc]\n );\n\n const state = useSyncExternalStore<ValueType<B>>(subscribe, getSnapshot, getServerSnapshot);\n\n useEffect(() => {\n resolvedBloc.props = props;\n }, [props]);\n\n return [state, resolvedBloc];\n }\n}\n\nconst useBloc = UseBlocClass.useBloc;\n\nexport default useBloc;\n"],"names":["useMemo","Blac","useSyncExternalStore","useEffect"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.config.js","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,eAAe,YAAY,CAAC,EAE3B,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blac/react",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/blac-react.js",
|
|
6
6
|
"module": "dist/blac-react.esm.js",
|
|
7
7
|
"typings": "dist/blac-react.d.ts",
|
|
8
|
-
"type": "module",
|
|
9
8
|
"keywords": [
|
|
10
9
|
"react",
|
|
11
10
|
"typescript",
|
|
@@ -17,27 +16,19 @@
|
|
|
17
16
|
"bloc-pattern"
|
|
18
17
|
],
|
|
19
18
|
"scripts": {
|
|
20
|
-
"dev": "vite",
|
|
21
|
-
"build:demo": "vite build",
|
|
22
19
|
"build": "rollup -c rollup.config.lib.js",
|
|
20
|
+
"dev": "rollup -c rollup.config.lib.js --watch",
|
|
23
21
|
"prettier": "prettier --write ./src",
|
|
24
|
-
"test": "vitest run"
|
|
25
|
-
"test:watch": "vitest --watch",
|
|
26
|
-
"coverage": "vitest run --coverage"
|
|
22
|
+
"test": "vitest run --coverage"
|
|
27
23
|
},
|
|
28
24
|
"dependencies": {
|
|
29
25
|
"blac": "*"
|
|
30
26
|
},
|
|
31
27
|
"devDependencies": {
|
|
32
|
-
"@
|
|
33
|
-
"@types/react
|
|
34
|
-
"@types/react-highlight": "^0.12.5",
|
|
35
|
-
"@vitejs/plugin-react": "^4.0.3",
|
|
36
|
-
"highlight.js": "^11.8.0",
|
|
28
|
+
"@rollup/plugin-typescript": "^11.1.2",
|
|
29
|
+
"@types/react": "^18.2.20",
|
|
37
30
|
"react": "^18.2.0",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"vite": "^4.4.7",
|
|
41
|
-
"vitest": "^0.33.0"
|
|
31
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
32
|
+
"vitest": "^0.34.1"
|
|
42
33
|
}
|
|
43
34
|
}
|
package/readme.md
CHANGED
|
@@ -10,7 +10,7 @@ npm install blac-react
|
|
|
10
10
|
|
|
11
11
|
## Examples
|
|
12
12
|
|
|
13
|
-
- [Counter with Bloc](ui/examples/CounterWithBloc.tsx)
|
|
14
|
-
- [Counter with Cubit](ui/examples/CounterWithCubit.tsx)
|
|
15
|
-
- [Counter with Global State](ui/examples/CounterWithCubitGlobal.tsx)
|
|
16
|
-
- [Counters with Local State](ui/examples/
|
|
13
|
+
- [Counter with Bloc](../../apps/react-demo/ui/examples/CounterWithBloc.tsx)
|
|
14
|
+
- [Counter with Cubit](../../apps/react-demo/ui/examples/CounterWithCubit.tsx)
|
|
15
|
+
- [Counter with Global State](../../apps/react-demo/ui/examples/CounterWithCubitGlobal.tsx)
|
|
16
|
+
- [Counters with Local State](../../apps/react-demo/ui/examples/CounterMultiInstance.tsx)
|