@furystack/shades 8.1.1 → 10.0.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/esm/components/router.d.ts.map +1 -1
- package/esm/components/router.js +9 -8
- package/esm/components/router.js.map +1 -1
- package/esm/models/render-options.d.ts +4 -3
- package/esm/models/render-options.d.ts.map +1 -1
- package/esm/services/location-service.d.ts +3 -1
- package/esm/services/location-service.d.ts.map +1 -1
- package/esm/services/location-service.js +23 -11
- package/esm/services/location-service.js.map +1 -1
- package/esm/services/resource-manager.d.ts +2 -2
- package/esm/services/resource-manager.d.ts.map +1 -1
- package/esm/services/resource-manager.js +2 -2
- package/esm/services/resource-manager.js.map +1 -1
- package/esm/shade.d.ts +0 -5
- package/esm/shade.d.ts.map +1 -1
- package/esm/shade.js +4 -1
- package/esm/shade.js.map +1 -1
- package/package.json +6 -6
- package/src/components/router.tsx +14 -8
- package/src/models/render-options.ts +2 -4
- package/src/services/location-service.tsx +27 -13
- package/src/services/resource-manager.ts +4 -4
- package/src/shade.ts +4 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAIhE,MAAM,WAAW,KAAK,CAAC,YAAY,SAAS,MAAM;IAChD,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;KAAE,KAAK,GAAG,CAAC,OAAO,CAAA;IAC7F,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC/B,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;CACjB;AACD,eAAO,MAAM,MAAM;;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAExE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAIhE,MAAM,WAAW,KAAK,CAAC,YAAY,SAAS,MAAM;IAChD,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,CAAC,OAAO,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,CAAA;KAAE,KAAK,GAAG,CAAC,OAAO,CAAA;IAC7F,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7D;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,mBAAmB,CAAA;IAC3B,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IACzB,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IAC/B,iBAAiB,CAAC,EAAE,GAAG,CAAA;IACvB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAA;CACjB;AACD,eAAO,MAAM,MAAM;;iFAsDjB,CAAA"}
|
package/esm/components/router.js
CHANGED
|
@@ -30,14 +30,14 @@ export const Router = Shade({
|
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
if (lastRoute
|
|
34
|
-
await lastRoute
|
|
33
|
+
if (lastRoute !== null) {
|
|
34
|
+
await lastRoute?.onLeave?.({ ...options, element: lastJsx });
|
|
35
|
+
setState({
|
|
36
|
+
jsx: options.props.notFound || createComponent("div", null),
|
|
37
|
+
activeRoute: null,
|
|
38
|
+
activeRouteParams: null,
|
|
39
|
+
});
|
|
35
40
|
}
|
|
36
|
-
setState({
|
|
37
|
-
jsx: options.props.notFound || createComponent("div", null),
|
|
38
|
-
activeRoute: null,
|
|
39
|
-
activeRouteParams: null,
|
|
40
|
-
});
|
|
41
41
|
}
|
|
42
42
|
catch (e) {
|
|
43
43
|
// path updates can be async, this can be ignored
|
|
@@ -49,7 +49,8 @@ export const Router = Shade({
|
|
|
49
49
|
lock?.release();
|
|
50
50
|
}
|
|
51
51
|
};
|
|
52
|
-
useObservable('locationPathChanged', injector.getInstance(LocationService).onLocationPathChanged, updateUrl
|
|
52
|
+
const [locationPath] = useObservable('locationPathChanged', injector.getInstance(LocationService).onLocationPathChanged, { onChange: updateUrl });
|
|
53
|
+
updateUrl(locationPath);
|
|
53
54
|
return state.jsx;
|
|
54
55
|
},
|
|
55
56
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEtC,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAqBjE,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAc;IACvC,aAAa,EAAE,cAAc;IAC7B,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAc,aAAa,EAAE;YAC7D,GAAG,EAAE,4BAAO;SACb,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,KAAK,EAAE,UAAkB,EAAE,EAAE;YAC7C,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAc,aAAa,EAAE,KAAK,CAAC,CAAA;YAC/D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;YAC9F,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;gBACpB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,cAAc,CAAC,CAAA;oBACtD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;oBACvC,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;4BAClG,MAAM,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;4BAClE,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;4BAClE,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;4BACpF,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;wBACxD,CAAC;wBACD,OAAM;oBACR,CAAC;gBACH,CAAC;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/components/router.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Injector } from '@furystack/inject';
|
|
2
2
|
import type { ChildrenList } from './children-list.js';
|
|
3
|
-
import type { Disposable, ObservableValue } from '@furystack/utils';
|
|
3
|
+
import type { Disposable, ObservableValue, ValueObserverOptions } from '@furystack/utils';
|
|
4
4
|
import type { PartialElement } from './partial-element.js';
|
|
5
5
|
export type RenderOptions<TProps, TElementBase extends HTMLElement = HTMLElement> = {
|
|
6
6
|
readonly props: TProps & PartialElement<TElementBase>;
|
|
@@ -20,10 +20,11 @@ export type RenderOptions<TProps, TElementBase extends HTMLElement = HTMLElement
|
|
|
20
20
|
* @param key The key for caching the observable value
|
|
21
21
|
* @param observable The observable value to observe
|
|
22
22
|
* @param callback Optional callback for reacting to changes. If no callback provided, the component will re-render on change
|
|
23
|
-
* @param getLast An option to trigger the callback with the initial value
|
|
24
23
|
* @returns tuple with the current value and a setter function
|
|
25
24
|
*/
|
|
26
|
-
useObservable: <T>(key: string, observable: ObservableValue<T>,
|
|
25
|
+
useObservable: <T>(key: string, observable: ObservableValue<T>, options?: ValueObserverOptions<T> & {
|
|
26
|
+
onChange?: (newValue: T) => void;
|
|
27
|
+
}) => [value: T, setValue: (newValue: T) => void];
|
|
27
28
|
/**
|
|
28
29
|
* Creates a state object that will trigger a component re-render on change
|
|
29
30
|
* @param key The Key for caching the observable value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-options.d.ts","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"render-options.d.ts","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,MAAM,MAAM,aAAa,CAAC,MAAM,EAAE,YAAY,SAAS,WAAW,GAAG,WAAW,IAAI;IAClF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,CAAA;IACrD,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B;;;;;OAKG;IACH,aAAa,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEzE;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAA;KAAE,KACrE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAEhD;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAE1F;;;;;OAKG;IACH,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAEhG;;;;;;OAMG;IACH,cAAc,EAAE,CAAC,CAAC,EAChB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,EACf,WAAW,CAAC,EAAE,OAAO,KAClB,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;CACjD,CAAA"}
|
|
@@ -16,7 +16,7 @@ export declare class LocationService implements Disposable {
|
|
|
16
16
|
onLocationSearchChanged: ObservableValue<string>;
|
|
17
17
|
onDeserializedLocationSearchChanged: ObservableValue<any>;
|
|
18
18
|
locationDeserializerObserver: import("@furystack/utils").ValueObserver<string>;
|
|
19
|
-
updateState()
|
|
19
|
+
updateState: () => void;
|
|
20
20
|
readonly searchParamObservables: Map<string, ObservableValue<any>>;
|
|
21
21
|
/**
|
|
22
22
|
*
|
|
@@ -27,6 +27,8 @@ export declare class LocationService implements Disposable {
|
|
|
27
27
|
useSearchParam<T>(key: string, defaultValue: T): ObservableValue<T>;
|
|
28
28
|
private pushStateTracer;
|
|
29
29
|
private replaceStateTracer;
|
|
30
|
+
private popStateListener;
|
|
31
|
+
private hashChangeListener;
|
|
30
32
|
constructor();
|
|
31
33
|
}
|
|
32
34
|
//# sourceMappingURL=location-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.d.ts","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAS,MAAM,kBAAkB,CAAA;AAGzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAWd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAA+C;IAEtE,mCAAmC,
|
|
1
|
+
{"version":3,"file":"location-service.d.ts","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAS,MAAM,kBAAkB,CAAA;AAGzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAWd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAA+C;IAEtE,mCAAmC,uBAA+D;IAElG,4BAA4B,mDAEjC;IAEK,WAAW,aAIL;IAEb,SAAgB,sBAAsB,oCAA0C;IAEhF;;;;;OAKG;IACI,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IA+BrD,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;IAEtC,OAAO,CAAC,gBAAgB,CAEvB;IAED,OAAO,CAAC,kBAAkB,CAEzB;;CAoBF"}
|
|
@@ -12,8 +12,8 @@ import { Injectable } from '@furystack/inject';
|
|
|
12
12
|
import { deserializeQueryString, serializeToQueryString } from '@furystack/rest';
|
|
13
13
|
let LocationService = class LocationService {
|
|
14
14
|
dispose() {
|
|
15
|
-
window.removeEventListener('popstate', this.
|
|
16
|
-
window.removeEventListener('hashchange', this.
|
|
15
|
+
window.removeEventListener('popstate', this.popStateListener);
|
|
16
|
+
window.removeEventListener('hashchange', this.hashChangeListener);
|
|
17
17
|
this.pushStateTracer.dispose();
|
|
18
18
|
this.replaceStateTracer.dispose();
|
|
19
19
|
this.onLocationPathChanged.dispose();
|
|
@@ -33,15 +33,15 @@ let LocationService = class LocationService {
|
|
|
33
33
|
* Observable value that will be updated when the location search (e.g. ?search=1) changes
|
|
34
34
|
*/
|
|
35
35
|
onLocationSearchChanged = new ObservableValue(location.search);
|
|
36
|
-
onDeserializedLocationSearchChanged = new ObservableValue(deserializeQueryString(
|
|
36
|
+
onDeserializedLocationSearchChanged = new ObservableValue(deserializeQueryString(location.search));
|
|
37
37
|
locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
38
38
|
this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search));
|
|
39
39
|
});
|
|
40
|
-
updateState() {
|
|
40
|
+
updateState = (() => {
|
|
41
41
|
this.onLocationPathChanged.setValue(location.pathname);
|
|
42
42
|
this.onLocationHashChanged.setValue(location.hash);
|
|
43
43
|
this.onLocationSearchChanged.setValue(location.search);
|
|
44
|
-
}
|
|
44
|
+
}).bind(this);
|
|
45
45
|
searchParamObservables = new Map();
|
|
46
46
|
/**
|
|
47
47
|
*
|
|
@@ -52,13 +52,19 @@ let LocationService = class LocationService {
|
|
|
52
52
|
useSearchParam(key, defaultValue) {
|
|
53
53
|
const existing = this.searchParamObservables.get(key);
|
|
54
54
|
if (!existing) {
|
|
55
|
-
const
|
|
55
|
+
const currentDeserialized = this.onDeserializedLocationSearchChanged.getValue();
|
|
56
|
+
const actualValue = Object.prototype.hasOwnProperty.call(currentDeserialized, key)
|
|
57
|
+
? currentDeserialized[key]
|
|
58
|
+
: defaultValue;
|
|
56
59
|
const newObservable = new ObservableValue(actualValue);
|
|
57
60
|
this.searchParamObservables.set(key, newObservable);
|
|
58
61
|
newObservable.subscribe((value) => {
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
const currentQueryStringObject = this.onDeserializedLocationSearchChanged.getValue();
|
|
63
|
+
if (currentQueryStringObject[key] !== value) {
|
|
64
|
+
const params = serializeToQueryString({ ...currentQueryStringObject, [key]: value });
|
|
65
|
+
const newUrl = `${location.pathname}?${params}`;
|
|
66
|
+
history.pushState({}, '', newUrl);
|
|
67
|
+
}
|
|
62
68
|
});
|
|
63
69
|
this.onDeserializedLocationSearchChanged.subscribe((search) => {
|
|
64
70
|
const value = search[key] ?? defaultValue;
|
|
@@ -70,9 +76,15 @@ let LocationService = class LocationService {
|
|
|
70
76
|
}
|
|
71
77
|
pushStateTracer;
|
|
72
78
|
replaceStateTracer;
|
|
79
|
+
popStateListener = (_ev) => {
|
|
80
|
+
this.updateState();
|
|
81
|
+
};
|
|
82
|
+
hashChangeListener = (_ev) => {
|
|
83
|
+
this.updateState();
|
|
84
|
+
};
|
|
73
85
|
constructor() {
|
|
74
|
-
window.addEventListener('popstate',
|
|
75
|
-
window.addEventListener('hashchange',
|
|
86
|
+
window.addEventListener('popstate', this.popStateListener);
|
|
87
|
+
window.addEventListener('hashchange', this.hashChangeListener);
|
|
76
88
|
this.pushStateTracer = Trace.method({
|
|
77
89
|
object: history,
|
|
78
90
|
method: history.pushState,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAEzE,IAAM,eAAe,GAArB,MAAM,eAAe;IACnB,OAAO;QACZ,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ObservableValue } from '@furystack/utils';
|
|
2
|
-
import type { Disposable, ValueChangeCallback } from '@furystack/utils';
|
|
2
|
+
import type { Disposable, ValueChangeCallback, ValueObserverOptions } from '@furystack/utils';
|
|
3
3
|
import type { ValueObserver } from '@furystack/utils';
|
|
4
4
|
/**
|
|
5
5
|
* Class for managing observables and disposables for components, based on key-value maps
|
|
@@ -8,7 +8,7 @@ export declare class ResourceManager {
|
|
|
8
8
|
private readonly disposables;
|
|
9
9
|
useDisposable<T extends Disposable>(key: string, factory: () => T): T;
|
|
10
10
|
readonly observers: Map<string, ValueObserver<any>>;
|
|
11
|
-
useObservable: <T>(key: string, observable: ObservableValue<T>,
|
|
11
|
+
useObservable: <T>(key: string, observable: ObservableValue<T>, onChange: ValueChangeCallback<T>, options?: ValueObserverOptions<T>) => [value: T, setValue: (newValue: T) => void];
|
|
12
12
|
readonly stateObservers: Map<string, ObservableValue<any>>;
|
|
13
13
|
useState: <T>(key: string, initialValue: T, callback: ValueChangeCallback<T>) => [value: T, setValue: (newValue: T) => void];
|
|
14
14
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.d.ts","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"resource-manager.d.ts","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAErD,aAAa,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;IAU5E,SAAgB,SAAS,kCAAwC;IAE1D,aAAa,WACb,MAAM,cACC,gBAAgB,CAAC,CAAC,YACpB,oBAAoB,CAAC,CAAC,YACtB,qBAAqB,CAAC,CAAC,qCACA,CAAC,KAAK,IAAI,EAQ5C;IAED,SAAgB,cAAc,oCAA0C;IAEjE,QAAQ,WACR,MAAM,gBACG,CAAC,YACL,oBAAoB,CAAC,CAAC,qCACC,CAAC,KAAK,IAAI,EAQ5C;IAEM,OAAO;CASf"}
|
|
@@ -14,12 +14,12 @@ export class ResourceManager {
|
|
|
14
14
|
return existing;
|
|
15
15
|
}
|
|
16
16
|
observers = new Map();
|
|
17
|
-
useObservable = (key, observable,
|
|
17
|
+
useObservable = (key, observable, onChange, options) => {
|
|
18
18
|
const alreadyUsed = this.observers.get(key);
|
|
19
19
|
if (alreadyUsed) {
|
|
20
20
|
return [alreadyUsed.observable.getValue(), alreadyUsed.observable.setValue.bind(alreadyUsed.observable)];
|
|
21
21
|
}
|
|
22
|
-
const observer = observable.subscribe(
|
|
22
|
+
const observer = observable.subscribe(onChange, options);
|
|
23
23
|
this.observers.set(key, observer);
|
|
24
24
|
return [observable.getValue(), observable.setValue.bind(observable)];
|
|
25
25
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IAErD,aAAa,CAAuB,GAAW,EAAE,OAAgB;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,OAAO,EAAE,CAAA;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAClC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,QAAa,CAAA;IACtB,CAAC;IAEe,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAA;IAE1D,aAAa,GAAG,CACrB,GAAW,EACX,UAA8B,EAC9B,QAAgC,EAChC,
|
|
1
|
+
{"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../../src/services/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;IAErD,aAAa,CAAuB,GAAW,EAAE,OAAgB;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,OAAO,GAAG,OAAO,EAAE,CAAA;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAClC,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,QAAa,CAAA;IACtB,CAAC;IAEe,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAA;IAE1D,aAAa,GAAG,CACrB,GAAW,EACX,UAA8B,EAC9B,QAAgC,EAChC,OAAiC,EACY,EAAE;QAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAiC,CAAA;QAC3E,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;QAC1G,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACxD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IAEe,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAA;IAEjE,QAAQ,GAAG,CAChB,GAAW,EACX,YAAe,EACf,QAAgC,EACa,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,aAAa,GAAG,IAAI,eAAe,CAAI,YAAY,CAAC,CAAA;YAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;YAC3C,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAuB,CAAA;QACrE,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,CAAC,CAAA;IAEM,OAAO;QACZ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAA;QACxB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QAEtB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;IAC7B,CAAC;CACF"}
|
package/esm/shade.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Disposable } from '@furystack/utils';
|
|
2
1
|
import type { Constructable } from '@furystack/inject';
|
|
3
2
|
import type { ChildrenList, PartialElement, RenderOptions } from './models/index.js';
|
|
4
3
|
export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
|
|
@@ -22,10 +21,6 @@ export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
|
|
|
22
21
|
* Will be executed when the element is detached from the DOM.
|
|
23
22
|
*/
|
|
24
23
|
onDetach?: (options: RenderOptions<TProps, TElementBase>) => void;
|
|
25
|
-
/**
|
|
26
|
-
* A factory method that creates a list of disposable resources that will be disposed when the element is detached.
|
|
27
|
-
*/
|
|
28
|
-
resources?: (options: RenderOptions<TProps, TElementBase>) => Disposable[];
|
|
29
24
|
/**
|
|
30
25
|
* Name of the HTML Element's base class. Needs to be defined if the elementBase is set. E.g.: 'div', 'button', 'input'
|
|
31
26
|
*/
|
package/esm/shade.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKpF,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,YAAY,SAAS,WAAW,IAAI;IACnE;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAErF;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KACzC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAE/E;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,KAAK,IAAI,CAAA;IAEjE;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAEzC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;CACrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,8DACb,aAAa,MAAM,EAAE,YAAY,CAAC,aAwNtB,MAAM,GAAG,eAAe,YAAY,CAAC,aAAa,YAAY,qBAc9E,CAAA"}
|
package/esm/shade.js
CHANGED
|
@@ -58,7 +58,10 @@ export const Shade = (o) => {
|
|
|
58
58
|
children: this.shadeChildren,
|
|
59
59
|
element: this,
|
|
60
60
|
renderCount: this._renderCount,
|
|
61
|
-
useObservable: (key, obesrvable,
|
|
61
|
+
useObservable: (key, obesrvable, options) => {
|
|
62
|
+
const onChange = options?.onChange || (() => this.updateComponent());
|
|
63
|
+
return this.resourceManager.useObservable(key, obesrvable, onChange, options);
|
|
64
|
+
},
|
|
62
65
|
useState: (key, initialValue) => this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
|
|
63
66
|
useSearchState: (key, initialValue) => this.resourceManager.useObservable(`useSearchState-${key}`, this.injector.getInstance(LocationService).useSearchParam(key, initialValue), () => this.updateComponent()),
|
|
64
67
|
useStoredState: (key, initialValue, storageArea = localStorage) => {
|
package/esm/shade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/shades",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "10.0.0",
|
|
4
4
|
"description": "Google Authentication Provider for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -38,15 +38,15 @@
|
|
|
38
38
|
"homepage": "https://github.com/furystack/furystack",
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/jsdom": "^21.1.6",
|
|
41
|
-
"@types/node": "^20.11.
|
|
41
|
+
"@types/node": "^20.11.29",
|
|
42
42
|
"jsdom": "^24.0.0",
|
|
43
43
|
"typescript": "^5.4.2",
|
|
44
|
-
"vitest": "^1.
|
|
44
|
+
"vitest": "^1.4.0"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@furystack/inject": "^
|
|
48
|
-
"@furystack/rest": "^
|
|
49
|
-
"@furystack/utils": "^
|
|
47
|
+
"@furystack/inject": "^10.0.0",
|
|
48
|
+
"@furystack/rest": "^7.0.0",
|
|
49
|
+
"@furystack/utils": "^6.0.0",
|
|
50
50
|
"path-to-regexp": "^6.2.1",
|
|
51
51
|
"semaphore-async-await": "^1.5.1"
|
|
52
52
|
},
|
|
@@ -53,14 +53,15 @@ export const Router = Shade<RouterProps>({
|
|
|
53
53
|
return
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
|
|
57
|
+
if (lastRoute !== null) {
|
|
58
|
+
await lastRoute?.onLeave?.({ ...options, element: lastJsx })
|
|
59
|
+
setState({
|
|
60
|
+
jsx: options.props.notFound || <div />,
|
|
61
|
+
activeRoute: null,
|
|
62
|
+
activeRouteParams: null,
|
|
63
|
+
})
|
|
58
64
|
}
|
|
59
|
-
setState({
|
|
60
|
-
jsx: options.props.notFound || <div />,
|
|
61
|
-
activeRoute: null,
|
|
62
|
-
activeRouteParams: null,
|
|
63
|
-
})
|
|
64
65
|
} catch (e) {
|
|
65
66
|
// path updates can be async, this can be ignored
|
|
66
67
|
if (!(e instanceof ObservableAlreadyDisposedError)) {
|
|
@@ -71,7 +72,12 @@ export const Router = Shade<RouterProps>({
|
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
const [locationPath] = useObservable(
|
|
76
|
+
'locationPathChanged',
|
|
77
|
+
injector.getInstance(LocationService).onLocationPathChanged,
|
|
78
|
+
{ onChange: updateUrl },
|
|
79
|
+
)
|
|
80
|
+
updateUrl(locationPath)
|
|
75
81
|
return state.jsx
|
|
76
82
|
},
|
|
77
83
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Injector } from '@furystack/inject'
|
|
2
2
|
import type { ChildrenList } from './children-list.js'
|
|
3
|
-
import type { Disposable, ObservableValue } from '@furystack/utils'
|
|
3
|
+
import type { Disposable, ObservableValue, ValueObserverOptions } from '@furystack/utils'
|
|
4
4
|
import type { PartialElement } from './partial-element.js'
|
|
5
5
|
|
|
6
6
|
export type RenderOptions<TProps, TElementBase extends HTMLElement = HTMLElement> = {
|
|
@@ -22,14 +22,12 @@ export type RenderOptions<TProps, TElementBase extends HTMLElement = HTMLElement
|
|
|
22
22
|
* @param key The key for caching the observable value
|
|
23
23
|
* @param observable The observable value to observe
|
|
24
24
|
* @param callback Optional callback for reacting to changes. If no callback provided, the component will re-render on change
|
|
25
|
-
* @param getLast An option to trigger the callback with the initial value
|
|
26
25
|
* @returns tuple with the current value and a setter function
|
|
27
26
|
*/
|
|
28
27
|
useObservable: <T>(
|
|
29
28
|
key: string,
|
|
30
29
|
observable: ObservableValue<T>,
|
|
31
|
-
onChange?: (newValue: T) => void,
|
|
32
|
-
getLast?: boolean,
|
|
30
|
+
options?: ValueObserverOptions<T> & { onChange?: (newValue: T) => void },
|
|
33
31
|
) => [value: T, setValue: (newValue: T) => void]
|
|
34
32
|
|
|
35
33
|
/**
|
|
@@ -5,8 +5,8 @@ import { deserializeQueryString, serializeToQueryString } from '@furystack/rest'
|
|
|
5
5
|
@Injectable({ lifetime: 'singleton' })
|
|
6
6
|
export class LocationService implements Disposable {
|
|
7
7
|
public dispose() {
|
|
8
|
-
window.removeEventListener('popstate', this.
|
|
9
|
-
window.removeEventListener('hashchange', this.
|
|
8
|
+
window.removeEventListener('popstate', this.popStateListener)
|
|
9
|
+
window.removeEventListener('hashchange', this.hashChangeListener)
|
|
10
10
|
this.pushStateTracer.dispose()
|
|
11
11
|
this.replaceStateTracer.dispose()
|
|
12
12
|
this.onLocationPathChanged.dispose()
|
|
@@ -30,19 +30,17 @@ export class LocationService implements Disposable {
|
|
|
30
30
|
*/
|
|
31
31
|
public onLocationSearchChanged = new ObservableValue<string>(location.search)
|
|
32
32
|
|
|
33
|
-
public onDeserializedLocationSearchChanged = new ObservableValue(
|
|
34
|
-
deserializeQueryString(this.onLocationSearchChanged.getValue()),
|
|
35
|
-
)
|
|
33
|
+
public onDeserializedLocationSearchChanged = new ObservableValue(deserializeQueryString(location.search))
|
|
36
34
|
|
|
37
35
|
public locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
|
|
38
36
|
this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search))
|
|
39
37
|
})
|
|
40
38
|
|
|
41
|
-
public updateState() {
|
|
39
|
+
public updateState = (() => {
|
|
42
40
|
this.onLocationPathChanged.setValue(location.pathname)
|
|
43
41
|
this.onLocationHashChanged.setValue(location.hash)
|
|
44
42
|
this.onLocationSearchChanged.setValue(location.search)
|
|
45
|
-
}
|
|
43
|
+
}).bind(this)
|
|
46
44
|
|
|
47
45
|
public readonly searchParamObservables = new Map<string, ObservableValue<any>>()
|
|
48
46
|
|
|
@@ -56,14 +54,22 @@ export class LocationService implements Disposable {
|
|
|
56
54
|
const existing = this.searchParamObservables.get(key)
|
|
57
55
|
|
|
58
56
|
if (!existing) {
|
|
59
|
-
const
|
|
57
|
+
const currentDeserialized = this.onDeserializedLocationSearchChanged.getValue()
|
|
58
|
+
|
|
59
|
+
const actualValue = Object.prototype.hasOwnProperty.call(currentDeserialized, key)
|
|
60
|
+
? (currentDeserialized[key] as T)
|
|
61
|
+
: defaultValue
|
|
62
|
+
|
|
60
63
|
const newObservable = new ObservableValue(actualValue)
|
|
61
64
|
this.searchParamObservables.set(key, newObservable)
|
|
62
65
|
|
|
63
66
|
newObservable.subscribe((value) => {
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
const currentQueryStringObject = this.onDeserializedLocationSearchChanged.getValue()
|
|
68
|
+
if (currentQueryStringObject[key] !== value) {
|
|
69
|
+
const params = serializeToQueryString({ ...currentQueryStringObject, [key]: value })
|
|
70
|
+
const newUrl = `${location.pathname}?${params}`
|
|
71
|
+
history.pushState({}, '', newUrl)
|
|
72
|
+
}
|
|
67
73
|
})
|
|
68
74
|
|
|
69
75
|
this.onDeserializedLocationSearchChanged.subscribe((search) => {
|
|
@@ -78,9 +84,17 @@ export class LocationService implements Disposable {
|
|
|
78
84
|
private pushStateTracer: Disposable
|
|
79
85
|
private replaceStateTracer: Disposable
|
|
80
86
|
|
|
87
|
+
private popStateListener = (_ev: PopStateEvent) => {
|
|
88
|
+
this.updateState()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private hashChangeListener = (_ev: HashChangeEvent) => {
|
|
92
|
+
this.updateState()
|
|
93
|
+
}
|
|
94
|
+
|
|
81
95
|
constructor() {
|
|
82
|
-
window.addEventListener('popstate',
|
|
83
|
-
window.addEventListener('hashchange',
|
|
96
|
+
window.addEventListener('popstate', this.popStateListener)
|
|
97
|
+
window.addEventListener('hashchange', this.hashChangeListener)
|
|
84
98
|
|
|
85
99
|
this.pushStateTracer = Trace.method({
|
|
86
100
|
object: history,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ObservableValue } from '@furystack/utils'
|
|
2
|
-
import type { Disposable, ValueChangeCallback } from '@furystack/utils'
|
|
2
|
+
import type { Disposable, ValueChangeCallback, ValueObserverOptions } from '@furystack/utils'
|
|
3
3
|
import type { ValueObserver } from '@furystack/utils'
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -23,14 +23,14 @@ export class ResourceManager {
|
|
|
23
23
|
public useObservable = <T>(
|
|
24
24
|
key: string,
|
|
25
25
|
observable: ObservableValue<T>,
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
onChange: ValueChangeCallback<T>,
|
|
27
|
+
options?: ValueObserverOptions<T>,
|
|
28
28
|
): [value: T, setValue: (newValue: T) => void] => {
|
|
29
29
|
const alreadyUsed = this.observers.get(key) as ValueObserver<T> | undefined
|
|
30
30
|
if (alreadyUsed) {
|
|
31
31
|
return [alreadyUsed.observable.getValue(), alreadyUsed.observable.setValue.bind(alreadyUsed.observable)]
|
|
32
32
|
}
|
|
33
|
-
const observer = observable.subscribe(
|
|
33
|
+
const observer = observable.subscribe(onChange, options)
|
|
34
34
|
this.observers.set(key, observer)
|
|
35
35
|
return [observable.getValue(), observable.setValue.bind(observable)]
|
|
36
36
|
}
|
package/src/shade.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Disposable } from '@furystack/utils'
|
|
2
1
|
import { ObservableValue } from '@furystack/utils'
|
|
3
2
|
import type { Constructable } from '@furystack/inject'
|
|
4
3
|
import { Injector } from '@furystack/inject'
|
|
@@ -35,11 +34,6 @@ export type ShadeOptions<TProps, TElementBase extends HTMLElement> = {
|
|
|
35
34
|
*/
|
|
36
35
|
onDetach?: (options: RenderOptions<TProps, TElementBase>) => void
|
|
37
36
|
|
|
38
|
-
/**
|
|
39
|
-
* A factory method that creates a list of disposable resources that will be disposed when the element is detached.
|
|
40
|
-
*/
|
|
41
|
-
resources?: (options: RenderOptions<TProps, TElementBase>) => Disposable[]
|
|
42
|
-
|
|
43
37
|
/**
|
|
44
38
|
* Name of the HTML Element's base class. Needs to be defined if the elementBase is set. E.g.: 'div', 'button', 'input'
|
|
45
39
|
*/
|
|
@@ -125,8 +119,10 @@ export const Shade = <TProps, TElementBase extends HTMLElement = HTMLElement>(
|
|
|
125
119
|
children: this.shadeChildren,
|
|
126
120
|
element: this,
|
|
127
121
|
renderCount: this._renderCount,
|
|
128
|
-
useObservable: (key, obesrvable,
|
|
129
|
-
|
|
122
|
+
useObservable: (key, obesrvable, options) => {
|
|
123
|
+
const onChange = options?.onChange || (() => this.updateComponent())
|
|
124
|
+
return this.resourceManager.useObservable(key, obesrvable, onChange, options)
|
|
125
|
+
},
|
|
130
126
|
useState: (key, initialValue) =>
|
|
131
127
|
this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
|
|
132
128
|
useSearchState: (key, initialValue) =>
|