@furystack/shades 7.0.0 → 7.1.1

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.
@@ -1,26 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- // export type RenderOptionsState<TState> = unknown extends TState
4
- // ? {}
5
- // : {
6
- // /**
7
- // * @returns the current state object
8
- // */
9
- // getState: () => TState
10
- // /**
11
- // * Update the current component state's multiple properties in one-shot
12
- // *
13
- // * @param newState The partial new state object
14
- // * @param skipRender Option to skip the render process
15
- // */
16
- // updateState: (newState: PartialElement<TState>, skipRender?: boolean) => void
17
- // /**
18
- // * @param key The key on the state object
19
- // * @returns A tuple with the value and the setter function
20
- // */
21
- // useState: <T extends keyof TState>(
22
- // key: T,
23
- // ) => [value: TState[T], setValue: (newValue: TState[T], skipRender?: boolean) => void]
24
- // }
25
- // export type RenderOptions<TProps, TState> = RenderOptionsBase<TProps, TState> & RenderOptionsState<TState>
26
3
  //# sourceMappingURL=render-options.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-options.js","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":";;AAoBA,kEAAkE;AAClE,SAAS;AACT,QAAQ;AACR,YAAY;AACZ,6CAA6C;AAC7C,YAAY;AACZ,+BAA+B;AAC/B,YAAY;AACZ,gFAAgF;AAChF,WAAW;AACX,wDAAwD;AACxD,+DAA+D;AAC/D,YAAY;AACZ,sFAAsF;AACtF,YAAY;AACZ,kDAAkD;AAClD,mEAAmE;AACnE,YAAY;AACZ,4CAA4C;AAC5C,kBAAkB;AAClB,+FAA+F;AAC/F,QAAQ;AAER,6GAA6G"}
1
+ {"version":3,"file":"render-options.js","sourceRoot":"","sources":["../../src/models/render-options.ts"],"names":[],"mappings":""}
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.LocationService = void 0;
13
13
  const utils_1 = require("@furystack/utils");
14
14
  const inject_1 = require("@furystack/inject");
15
+ const rest_1 = require("@furystack/rest");
15
16
  let LocationService = class LocationService {
16
17
  dispose() {
17
18
  window.removeEventListener('popstate', this.updateState);
@@ -19,12 +20,37 @@ let LocationService = class LocationService {
19
20
  this.pushStateTracer.dispose();
20
21
  this.replaceStateTracer.dispose();
21
22
  this.onLocationPathChanged.dispose();
23
+ this.onLocationSearchChanged.dispose();
24
+ this.onDeserializedLocationSearchChanged.dispose();
25
+ this.locationDeserializerObserver.dispose();
22
26
  }
23
27
  updateState() {
24
28
  this.onLocationPathChanged.setValue(location.pathname);
25
29
  this.onLocationHashChanged.setValue(location.hash);
26
30
  this.onLocationSearchChanged.setValue(location.search);
27
31
  }
32
+ /**
33
+ *
34
+ * @param key The search param key (e.g. ?search=1 -> search)
35
+ * @param defaultValue The default value if not provided
36
+ * @returns An observable with the current value (or default value) of the search param
37
+ */
38
+ useSearchParam(key, defaultValue) {
39
+ const actualValue = this.onDeserializedLocationSearchChanged.getValue()[key] ?? defaultValue;
40
+ if (!this.searchParamObservables.has(key)) {
41
+ const newObservable = new utils_1.ObservableValue(actualValue);
42
+ this.searchParamObservables.set(key, newObservable);
43
+ newObservable.subscribe((value) => {
44
+ const params = (0, rest_1.serializeToQueryString)({ ...(0, rest_1.deserializeQueryString)(location.search), [key]: value });
45
+ history.pushState({}, '', `${location.pathname}?${params}`);
46
+ });
47
+ this.onDeserializedLocationSearchChanged.subscribe((search) => {
48
+ const value = search[key] ?? defaultValue;
49
+ this.searchParamObservables.get(key)?.setValue(value);
50
+ });
51
+ }
52
+ return this.searchParamObservables.get(key);
53
+ }
28
54
  constructor() {
29
55
  /**
30
56
  * Observable value that will be updated when the location pathname (e.g. /page/1) changes
@@ -38,6 +64,11 @@ let LocationService = class LocationService {
38
64
  * Observable value that will be updated when the location search (e.g. ?search=1) changes
39
65
  */
40
66
  this.onLocationSearchChanged = new utils_1.ObservableValue(location.search);
67
+ this.onDeserializedLocationSearchChanged = new utils_1.ObservableValue((0, rest_1.deserializeQueryString)(this.onLocationSearchChanged.getValue()));
68
+ this.locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
69
+ this.onDeserializedLocationSearchChanged.setValue((0, rest_1.deserializeQueryString)(search));
70
+ });
71
+ this.searchParamObservables = new Map();
41
72
  window.addEventListener('popstate', () => this.updateState());
42
73
  window.addEventListener('hashchange', () => this.updateState());
43
74
  this.pushStateTracer = utils_1.Trace.method({
@@ -1 +1 @@
1
- {"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,4CAAyD;AACzD,8CAA8C;AAEvC,IAAM,eAAe,GAArB,MAAM,eAAe;IACnB,OAAO;QACZ,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACxD,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAC1D,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAA;QAC9B,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAA;QACjC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAA;IACtC,CAAC;IAiBM,WAAW;QAChB,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACtD,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxD,CAAC;IAKD;QAxBA;;WAEG;QACI,0BAAqB,GAAG,IAAI,uBAAe,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;QAEnF;;WAEG;QACI,0BAAqB,GAAG,IAAI,uBAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAEjE;;WAEG;QACI,4BAAuB,GAAG,IAAI,uBAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAYnE,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAC7D,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QAE/D,IAAI,CAAC,eAAe,GAAG,aAAK,CAAC,MAAM,CAAC;YAClC,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,OAAO,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;SACrC,CAAC,CAAA;QAEF,IAAI,CAAC,kBAAkB,GAAG,aAAK,CAAC,MAAM,CAAC;YACrC,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,OAAO,CAAC,YAAY;YAC5B,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;SACrC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAnDY,eAAe;IAD3B,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;;GACzB,eAAe,CAmD3B;AAnDY,0CAAe"}
1
+ {"version":3,"file":"location-service.js","sourceRoot":"","sources":["../../src/services/location-service.tsx"],"names":[],"mappings":"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"}
@@ -9,14 +9,14 @@ const _1 = require("./");
9
9
  describe('LocationService', () => {
10
10
  beforeEach(() => (document.body.innerHTML = '<div id="root"></div>'));
11
11
  afterEach(() => (document.body.innerHTML = ''));
12
- it('Shuld be constructed', async () => {
13
- await (0, utils_1.usingAsync)(new inject_1.Injector(), async (i) => {
12
+ it('Shuld be constructed', () => {
13
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
14
14
  const s = i.getInstance(_1.LocationService);
15
15
  expect(s).toBeInstanceOf(_1.LocationService);
16
16
  });
17
17
  });
18
- it('Shuld update state on events', async () => {
19
- await (0, utils_1.usingAsync)(new inject_1.Injector(), async (i) => {
18
+ it('Shuld update state on events', () => {
19
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
20
20
  const onLocaionChanged = jest.fn();
21
21
  const s = i.getInstance(_1.LocationService);
22
22
  s.onLocationPathChanged.subscribe(onLocaionChanged);
@@ -32,5 +32,55 @@ describe('LocationService', () => {
32
32
  // expect(onLocaionChanged).toBeCalledTimes(4)
33
33
  });
34
34
  });
35
+ describe('useSearchParam', () => {
36
+ it('Should create observables lazily', () => {
37
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
38
+ const service = i.getInstance(_1.LocationService);
39
+ const observables = service.searchParamObservables;
40
+ const testSearchParam = service.useSearchParam('test', null);
41
+ expect(observables.size).toBe(1);
42
+ const testSearchParam2 = service.useSearchParam('test', null);
43
+ expect(observables.size).toBe(1);
44
+ expect(testSearchParam).toBe(testSearchParam2);
45
+ const testSearchParam3 = service.useSearchParam('test2', undefined);
46
+ expect(observables.size).toBe(2);
47
+ expect(testSearchParam3).not.toBe(testSearchParam2);
48
+ });
49
+ });
50
+ it('Should return the default value, if not present in the query string', () => {
51
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
52
+ const service = i.getInstance(_1.LocationService);
53
+ const testSearchParam = service.useSearchParam('test', { value: 'foo' });
54
+ expect(testSearchParam.getValue()).toEqual({ value: 'foo' });
55
+ });
56
+ });
57
+ it('Should return the value from the query string', () => {
58
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
59
+ const service = i.getInstance(_1.LocationService);
60
+ history.pushState(null, '', '/loc1?test=1');
61
+ const testSearchParam = service.useSearchParam('test', 123);
62
+ expect(testSearchParam.getValue()).toBe(1);
63
+ });
64
+ });
65
+ it('should update the observable value on push / replace states', () => {
66
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
67
+ const service = i.getInstance(_1.LocationService);
68
+ history.pushState(null, '', '/loc1?test=1');
69
+ const testSearchParam = service.useSearchParam('test', 234);
70
+ expect(testSearchParam.getValue()).toBe(1);
71
+ history.replaceState(null, '', '/loc1?test=2');
72
+ expect(testSearchParam.getValue()).toBe(2);
73
+ });
74
+ });
75
+ it('Should update the URL based on search value change', () => {
76
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
77
+ const service = i.getInstance(_1.LocationService);
78
+ history.pushState(null, '', '/loc1?test=2');
79
+ const testSearchParam = service.useSearchParam('test', '');
80
+ testSearchParam.setValue('2');
81
+ expect(location.search).toBe('?test=2');
82
+ });
83
+ });
84
+ });
35
85
  });
36
86
  //# sourceMappingURL=location-service.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":";;AAAA,+BAA+C;AAE/C,MAAM,CAAC,WAAW,GAAG,kBAAW,CAAA;AAChC,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAA;AAEvC,8CAA4C;AAC5C,4CAA6C;AAC7C,yBAAoC;AAEpC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,uBAAuB,CAAC,CAAC,CAAA;IACrE,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAA;IAE/C,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,IAAA,kBAAU,EAAC,IAAI,iBAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,kBAAe,CAAC,CAAA;YACxC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,kBAAe,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,IAAA,kBAAU,EAAC,IAAI,iBAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;YAClC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,kBAAe,CAAC,CAAA;YACxC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;YACnD,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC3C,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;YACpC,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAC3C,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;YACvC,MAAM,CAAC,gBAAgB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAE3C,iEAAiE;YACjE,+EAA+E;YAC/E,8CAA8C;YAC9C,0DAA0D;YAC1D,8CAA8C;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"location-service.spec.js","sourceRoot":"","sources":["../../src/services/location-service.spec.ts"],"names":[],"mappings":"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"}
package/dist/shade.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Shade = void 0;
4
+ const utils_1 = require("@furystack/utils");
4
5
  const inject_1 = require("@furystack/inject");
5
6
  const resource_manager_1 = require("./services/resource-manager");
7
+ const services_1 = require("./services");
6
8
  /**
7
9
  * Factory method for creating Shade components
8
10
  *
@@ -34,6 +36,50 @@ const Shade = (o) => {
34
36
  element: this,
35
37
  useObservable: (key, obesrvable, callback, getLast) => this.resourceManager.useObservable(key, obesrvable, callback || (() => this.updateComponent()), getLast),
36
38
  useState: (key, initialValue) => this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
39
+ useSearchState: (key, initialValue) => this.resourceManager.useObservable(`useSearchState-${key}`, this.injector.getInstance(services_1.LocationService).useSearchParam(key, initialValue), () => this.updateComponent()),
40
+ useStoredState: (key, initialValue, storageArea = localStorage) => {
41
+ const getFromStorage = () => {
42
+ const value = storageArea?.getItem(key);
43
+ return value ? JSON.parse(value) : initialValue;
44
+ };
45
+ const setToStorage = (value) => {
46
+ if (JSON.stringify(value) !== storageArea?.getItem(key)) {
47
+ const newValue = JSON.stringify(value);
48
+ storageArea?.setItem(key, newValue);
49
+ }
50
+ if (JSON.stringify(observable.getValue()) !== JSON.stringify(value)) {
51
+ observable.setValue(value);
52
+ }
53
+ };
54
+ const observable = this.resourceManager.useDisposable(`useStoredState-${key}`, () => new utils_1.ObservableValue(getFromStorage()));
55
+ const updateFromStorageEvent = (e) => {
56
+ e.key === key &&
57
+ e.storageArea === storageArea &&
58
+ setToStorage((e.newValue && JSON.parse(e.newValue)) || initialValue);
59
+ };
60
+ this.resourceManager.useDisposable(`useStoredState-${key}-storage-event`, () => {
61
+ window.addEventListener('storage', updateFromStorageEvent);
62
+ const channelName = `useStoredState-broadcast-channel`;
63
+ const messageChannel = new BroadcastChannel(channelName);
64
+ messageChannel.onmessage = (e) => {
65
+ if (e.data.key === key) {
66
+ setToStorage(e.data.value);
67
+ }
68
+ };
69
+ const subscription = observable.subscribe((value) => {
70
+ messageChannel.postMessage({ key, value });
71
+ });
72
+ return {
73
+ dispose: () => {
74
+ window.removeEventListener('storage', updateFromStorageEvent);
75
+ subscription.dispose();
76
+ messageChannel.close();
77
+ },
78
+ };
79
+ });
80
+ observable.subscribe(setToStorage);
81
+ return this.resourceManager.useObservable(`useStoredState-${key}`, observable, () => this.updateComponent());
82
+ },
37
83
  useDisposable: this.resourceManager.useDisposable.bind(this.resourceManager),
38
84
  };
39
85
  return renderOptions;
package/dist/shade.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shade.js","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":";;;AACA,4CAAkD;AAClD,8CAA4C;AAE5C,kEAA6D;AAC7D,yCAA4C;AAoC5C;;;;;GAKG;AACI,MAAM,KAAK,GAAG,CAAS,CAAuB,EAAE,EAAE;IACvD,8BAA8B;IAC9B,MAAM,iBAAiB,GAAG,CAAC,CAAC,aAAa,CAAA;IAEzC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACtD,IAAI,CAAC,QAAQ,EAAE;QACb,cAAc,CAAC,MAAM,CACnB,iBAAiB,EACjB,KAAM,SAAQ,WAAW;YAAzB;;gBACS,oBAAe,GAAG,IAAI,kCAAe,EAAE,CAAA;gBAuB9C;;;mBAGG;gBACI,WAAM,GAAG,CAAC,OAA8B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAErE;;mBAEG;gBACK,qBAAgB,GAAG,GAA0B,EAAE;oBACrD,MAAM,aAAa,GAA0B;wBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBAEvB,QAAQ,EAAE,IAAI,CAAC,aAAa;wBAC5B,OAAO,EAAE,IAAI;wBACb,aAAa,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CACpD,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,OAAO,CAAC;wBAC1G,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CAC9B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACnF,cAAc,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,CACpC,IAAI,CAAC,eAAe,CAAC,aAAa,CAChC,kBAAkB,GAAG,EAAE,EACvB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,0BAAe,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,CAAC,EAC5E,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,CAC7B;wBAEH,cAAc,EAAE,CAAI,GAAW,EAAE,YAAe,EAAE,WAAW,GAAG,YAAY,EAAE,EAAE;4BAC9E,MAAM,cAAc,GAAG,GAAG,EAAE;gCAC1B,MAAM,KAAK,GAAG,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;gCACvC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;4BACjD,CAAC,CAAA;4BAED,MAAM,YAAY,GAAG,CAAC,KAAQ,EAAE,EAAE;gCAChC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;oCACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;oCACtC,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;iCACpC;gCACD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;oCACnE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;iCAC3B;4BACH,CAAC,CAAA;4BAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CACnD,kBAAkB,GAAG,EAAE,EACvB,GAAG,EAAE,CAAC,IAAI,uBAAe,CAAC,cAAc,EAAE,CAAC,CAC5C,CAAA;4BAED,MAAM,sBAAsB,GAAG,CAAC,CAAe,EAAE,EAAE;gCACjD,CAAC,CAAC,GAAG,KAAK,GAAG;oCACX,CAAC,CAAC,WAAW,KAAK,WAAW;oCAC7B,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,YAAY,CAAC,CAAA;4BACxE,CAAC,CAAA;4BAED,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,GAAG,gBAAgB,EAAE,GAAG,EAAE;gCAC7E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;gCAC1D,MAAM,WAAW,GAAG,kCAAkC,CAAA;gCACtD,MAAM,cAAc,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAA;gCACxD,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE;oCAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE;wCACtB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;qCAC3B;gCACH,CAAC,CAAA;gCACD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;oCAClD,cAAc,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAA;gCAC5C,CAAC,CAAC,CAAA;gCAEF,OAAO;oCACL,OAAO,EAAE,GAAG,EAAE;wCACZ,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAA;wCAC7D,YAAY,CAAC,OAAO,EAAE,CAAA;wCACtB,cAAc,CAAC,KAAK,EAAE,CAAA;oCACxB,CAAC;iCACF,CAAA;4BACH,CAAC,CAAC,CAAA;4BAEF,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;4BAElC,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,GAAG,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAClF,IAAI,CAAC,eAAe,EAAE,CACvB,CAAA;wBACH,CAAC;wBACD,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;qBAC7E,CAAA;oBAED,OAAO,aAAsC,CAAA;gBAC/C,CAAC,CAAA;gBAsCO,YAAO,GAAwB,SAAS,CAAA;YAoClD,CAAC;YArLQ,iBAAiB;gBACtB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBACjD,IAAI,CAAC,eAAe,EAAE,CAAA;YACxB,CAAC;YAEM,oBAAoB;gBACzB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBACjD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAA;gBAC9B,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAA;YAChC,CAAC;YAoGD;;eAEG;YACI,eAAe;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBAEzD,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE;oBACvD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;iBACpB;gBAED,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;oBACxE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAA;iBAC9B;gBAED,IAAI,YAAY,YAAY,WAAW,EAAE;oBACvC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;iBACnC;gBACD,IAAI,YAAY,YAAY,gBAAgB,EAAE;oBAC5C,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;iBACnC;YACH,CAAC;YAED;;eAEG;YACI,eAAe;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAA;gBAC7E,IAAI,aAAa,YAAY,OAAO,EAAE;oBACpC,aAAa,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAA;iBAC1D;qBAAM;oBACL,yBAAyB;oBACzB,IAAI,CAAC,OAAO,GAAG,aAAa,CAAA;iBAC7B;YACH,CAAC;YAMO,qBAAqB;gBAC3B,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;gBAC/B,OAAO,MAAM,EAAE;oBACb,IAAK,MAAsB,CAAC,QAAQ,EAAE;wBACpC,OAAQ,MAAsB,CAAC,QAAQ,CAAA;qBACxC;oBACD,MAAM,GAAG,MAAM,CAAC,aAAa,CAAA;iBAC9B;YACH,CAAC;YAED,IAAW,QAAQ;gBACjB,IAAI,IAAI,CAAC,SAAS,EAAE;oBAClB,OAAO,IAAI,CAAC,SAAS,CAAA;iBACtB;gBAED,MAAM,SAAS,GAAI,IAAI,CAAC,KAAa,EAAE,QAAQ,CAAA;gBAC/C,IAAI,SAAS,IAAI,SAAS,YAAY,iBAAQ,EAAE;oBAC9C,OAAO,SAAS,CAAA;iBACjB;gBAED,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;gBAC/C,IAAI,UAAU,EAAE;oBACd,IAAI,CAAC,SAAS,GAAG,UAAU,CAAA;oBAC3B,OAAO,UAAU,CAAA;iBAClB;gBACD,wDAAwD;gBACxD,OAAO,IAAI,iBAAQ,EAAE,CAAA;YACvB,CAAC;YAED,IAAW,QAAQ,CAAC,CAAW;gBAC7B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;YACpB,CAAC;SACF,CACF,CAAA;KACF;SAAM;QACL,MAAM,KAAK,CAAC,wCAAwC,CAAC,CAAC,aAAa,gCAAgC,CAAC,CAAA;KACrG;IAED,OAAO,CAAC,KAAa,EAAE,QAAsB,EAAE,EAAE;QAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,iBAAiB,EAAE;YACnD,GAAI,KAAyC;SAC9C,CAAwB,CAAA;QACzB,EAAE,CAAC,KAAK,GAAG,KAAK,IAAK,EAAa,CAAA;QAClC,EAAE,CAAC,aAAa,GAAG,QAAQ,CAAA;QAC3B,OAAO,EAAiB,CAAA;IAC1B,CAAC,CAAA;AACH,CAAC,CAAA;AA9MY,QAAA,KAAK,SA8MjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/shades",
3
- "version": "7.0.0",
3
+ "version": "7.1.1",
4
4
  "description": "Google Authentication Provider for FuryStack",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -29,15 +29,16 @@
29
29
  },
30
30
  "homepage": "https://github.com/furystack/furystack",
31
31
  "devDependencies": {
32
- "@types/jest": "^29.2.6",
32
+ "@types/jest": "^29.4.0",
33
33
  "@types/jsdom": "^20.0.1",
34
34
  "@types/node": "^18.11.18",
35
- "jsdom": "^21.0.0"
35
+ "jsdom": "^21.1.0"
36
36
  },
37
37
  "dependencies": {
38
- "@furystack/core": "^11.2.3",
39
- "@furystack/inject": "^7.1.5",
40
- "@furystack/utils": "^3.1.5",
38
+ "@furystack/core": "^11.2.4",
39
+ "@furystack/inject": "^7.1.6",
40
+ "@furystack/rest": "^4.1.8",
41
+ "@furystack/utils": "^3.1.6",
41
42
  "path-to-regexp": "^6.2.1",
42
43
  "semaphore-async-await": "^1.5.1"
43
44
  },
@@ -8,37 +8,59 @@ export type RenderOptions<TProps> = {
8
8
  injector: Injector
9
9
  children?: ChildrenList
10
10
  element: JSX.Element<TProps>
11
+ /**
12
+ * Creates and disposes a resource after the component has been detached from the DOM
13
+ *
14
+ * @param key The key for caching the disposable resource
15
+ * @param factory A factory method for creating the disposable resource
16
+ * @returns The Disposable instance
17
+ */
11
18
  useDisposable: <T extends Disposable>(key: string, factory: () => T) => T
19
+
20
+ /**
21
+ *
22
+ * @param key The key for caching the observable value
23
+ * @param observable The observable value to observe
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
+ * @returns tuple with the current value and a setter function
27
+ */
12
28
  useObservable: <T>(
13
29
  key: string,
14
30
  observable: ObservableValue<T>,
15
- callback?: (newValue: T) => void,
31
+ onChange?: (newValue: T) => void,
16
32
  getLast?: boolean,
17
33
  ) => [value: T, setValue: (newValue: T) => void]
34
+
35
+ /**
36
+ * Creates a state object that will trigger a component re-render on change
37
+ *
38
+ * @param key The Key for caching the observable value
39
+ * @param initialValue The initial value for the observable
40
+ * @returns tuple with the current value and a setter function
41
+ */
18
42
  useState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void]
19
- }
20
43
 
21
- // export type RenderOptionsState<TState> = unknown extends TState
22
- // ? {}
23
- // : {
24
- // /**
25
- // * @returns the current state object
26
- // */
27
- // getState: () => TState
28
- // /**
29
- // * Update the current component state's multiple properties in one-shot
30
- // *
31
- // * @param newState The partial new state object
32
- // * @param skipRender Option to skip the render process
33
- // */
34
- // updateState: (newState: PartialElement<TState>, skipRender?: boolean) => void
35
- // /**
36
- // * @param key The key on the state object
37
- // * @returns A tuple with the value and the setter function
38
- // */
39
- // useState: <T extends keyof TState>(
40
- // key: T,
41
- // ) => [value: TState[T], setValue: (newValue: TState[T], skipRender?: boolean) => void]
42
- // }
44
+ /**
45
+ * Creates a state object that will use a value from the search string of the current location. Triggers a component re-render on change
46
+ *
47
+ * @param key The Key for caching the observable value
48
+ * @param initialValue The initial value - if the value is not found in the search string
49
+ * @returns a tuple with the current value and a setter function
50
+ */
51
+ useSearchState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void]
43
52
 
44
- // export type RenderOptions<TProps, TState> = RenderOptionsBase<TProps, TState> & RenderOptionsState<TState>
53
+ /**
54
+ * Creates a state object that will use a value from the storage area. Triggers a component re-render on change
55
+ *
56
+ * @param key The key in the storage area
57
+ * @param initialValue The initial value that will be used if the key is not found in the storage area
58
+ * @param storageArea The storage area to use
59
+ * @returns a tuple with the current value and a setter function
60
+ */
61
+ useStoredState: <T>(
62
+ key: string,
63
+ initialValue: T,
64
+ storageArea?: Storage,
65
+ ) => [value: T, setValue: (newValue: T) => void]
66
+ }
@@ -4,22 +4,22 @@ global.TextEncoder = TextEncoder
4
4
  global.TextDecoder = TextDecoder as any
5
5
 
6
6
  import { Injector } from '@furystack/inject'
7
- import { usingAsync } from '@furystack/utils'
7
+ import { using } from '@furystack/utils'
8
8
  import { LocationService } from './'
9
9
 
10
10
  describe('LocationService', () => {
11
11
  beforeEach(() => (document.body.innerHTML = '<div id="root"></div>'))
12
12
  afterEach(() => (document.body.innerHTML = ''))
13
13
 
14
- it('Shuld be constructed', async () => {
15
- await usingAsync(new Injector(), async (i) => {
14
+ it('Shuld be constructed', () => {
15
+ using(new Injector(), (i) => {
16
16
  const s = i.getInstance(LocationService)
17
17
  expect(s).toBeInstanceOf(LocationService)
18
18
  })
19
19
  })
20
20
 
21
- it('Shuld update state on events', async () => {
22
- await usingAsync(new Injector(), async (i) => {
21
+ it('Shuld update state on events', () => {
22
+ using(new Injector(), (i) => {
23
23
  const onLocaionChanged = jest.fn()
24
24
  const s = i.getInstance(LocationService)
25
25
  s.onLocationPathChanged.subscribe(onLocaionChanged)
@@ -36,4 +36,64 @@ describe('LocationService', () => {
36
36
  // expect(onLocaionChanged).toBeCalledTimes(4)
37
37
  })
38
38
  })
39
+
40
+ describe('useSearchParam', () => {
41
+ it('Should create observables lazily', () => {
42
+ using(new Injector(), (i) => {
43
+ const service = i.getInstance(LocationService)
44
+ const observables = service.searchParamObservables
45
+
46
+ const testSearchParam = service.useSearchParam('test', null)
47
+ expect(observables.size).toBe(1)
48
+
49
+ const testSearchParam2 = service.useSearchParam('test', null)
50
+ expect(observables.size).toBe(1)
51
+
52
+ expect(testSearchParam).toBe(testSearchParam2)
53
+
54
+ const testSearchParam3 = service.useSearchParam('test2', undefined)
55
+ expect(observables.size).toBe(2)
56
+
57
+ expect(testSearchParam3).not.toBe(testSearchParam2)
58
+ })
59
+ })
60
+
61
+ it('Should return the default value, if not present in the query string', () => {
62
+ using(new Injector(), (i) => {
63
+ const service = i.getInstance(LocationService)
64
+ const testSearchParam = service.useSearchParam('test', { value: 'foo' })
65
+ expect(testSearchParam.getValue()).toEqual({ value: 'foo' })
66
+ })
67
+ })
68
+
69
+ it('Should return the value from the query string', () => {
70
+ using(new Injector(), (i) => {
71
+ const service = i.getInstance(LocationService)
72
+ history.pushState(null, '', '/loc1?test=1')
73
+ const testSearchParam = service.useSearchParam('test', 123)
74
+ expect(testSearchParam.getValue()).toBe(1)
75
+ })
76
+ })
77
+
78
+ it('should update the observable value on push / replace states', () => {
79
+ using(new Injector(), (i) => {
80
+ const service = i.getInstance(LocationService)
81
+ history.pushState(null, '', '/loc1?test=1')
82
+ const testSearchParam = service.useSearchParam('test', 234)
83
+ expect(testSearchParam.getValue()).toBe(1)
84
+ history.replaceState(null, '', '/loc1?test=2')
85
+ expect(testSearchParam.getValue()).toBe(2)
86
+ })
87
+ })
88
+
89
+ it('Should update the URL based on search value change', () => {
90
+ using(new Injector(), (i) => {
91
+ const service = i.getInstance(LocationService)
92
+ history.pushState(null, '', '/loc1?test=2')
93
+ const testSearchParam = service.useSearchParam('test', '')
94
+ testSearchParam.setValue('2')
95
+ expect(location.search).toBe('?test=2')
96
+ })
97
+ })
98
+ })
39
99
  })
@@ -1,6 +1,7 @@
1
1
  import type { Disposable } from '@furystack/utils'
2
2
  import { ObservableValue, Trace } from '@furystack/utils'
3
3
  import { Injectable } from '@furystack/inject'
4
+ import { deserializeQueryString, serializeToQueryString } from '@furystack/rest'
4
5
  @Injectable({ lifetime: 'singleton' })
5
6
  export class LocationService implements Disposable {
6
7
  public dispose() {
@@ -9,6 +10,9 @@ export class LocationService implements Disposable {
9
10
  this.pushStateTracer.dispose()
10
11
  this.replaceStateTracer.dispose()
11
12
  this.onLocationPathChanged.dispose()
13
+ this.onLocationSearchChanged.dispose()
14
+ this.onDeserializedLocationSearchChanged.dispose()
15
+ this.locationDeserializerObserver.dispose()
12
16
  }
13
17
 
14
18
  /**
@@ -24,7 +28,15 @@ export class LocationService implements Disposable {
24
28
  /**
25
29
  * Observable value that will be updated when the location search (e.g. ?search=1) changes
26
30
  */
27
- public onLocationSearchChanged = new ObservableValue(location.search)
31
+ public onLocationSearchChanged = new ObservableValue<string>(location.search)
32
+
33
+ public onDeserializedLocationSearchChanged = new ObservableValue(
34
+ deserializeQueryString(this.onLocationSearchChanged.getValue()),
35
+ )
36
+
37
+ public locationDeserializerObserver = this.onLocationSearchChanged.subscribe((search) => {
38
+ this.onDeserializedLocationSearchChanged.setValue(deserializeQueryString(search))
39
+ })
28
40
 
29
41
  public updateState() {
30
42
  this.onLocationPathChanged.setValue(location.pathname)
@@ -32,6 +44,33 @@ export class LocationService implements Disposable {
32
44
  this.onLocationSearchChanged.setValue(location.search)
33
45
  }
34
46
 
47
+ public readonly searchParamObservables = new Map<string, ObservableValue<any>>()
48
+
49
+ /**
50
+ *
51
+ * @param key The search param key (e.g. ?search=1 -> search)
52
+ * @param defaultValue The default value if not provided
53
+ * @returns An observable with the current value (or default value) of the search param
54
+ */
55
+ public useSearchParam<T>(key: string, defaultValue: T) {
56
+ const actualValue = (this.onDeserializedLocationSearchChanged.getValue()[key] as T) ?? defaultValue
57
+ if (!this.searchParamObservables.has(key)) {
58
+ const newObservable = new ObservableValue(actualValue)
59
+ this.searchParamObservables.set(key, newObservable)
60
+
61
+ newObservable.subscribe((value) => {
62
+ const params = serializeToQueryString({ ...deserializeQueryString(location.search), [key]: value })
63
+ history.pushState({}, '', `${location.pathname}?${params}`)
64
+ })
65
+
66
+ this.onDeserializedLocationSearchChanged.subscribe((search) => {
67
+ const value = (search[key] as T) ?? defaultValue
68
+ this.searchParamObservables.get(key)?.setValue(value as T)
69
+ })
70
+ }
71
+ return this.searchParamObservables.get(key) as ObservableValue<T>
72
+ }
73
+
35
74
  private pushStateTracer: Disposable
36
75
  private replaceStateTracer: Disposable
37
76
 
package/src/shade.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import type { Disposable } from '@furystack/utils'
2
+ import { ObservableValue } from '@furystack/utils'
2
3
  import { Injector } from '@furystack/inject'
3
4
  import type { ChildrenList, RenderOptions } from './models'
4
5
  import { ResourceManager } from './services/resource-manager'
6
+ import { LocationService } from './services'
5
7
 
6
8
  export type ShadeOptions<TProps> = {
7
9
  /**
@@ -95,6 +97,68 @@ export const Shade = <TProps>(o: ShadeOptions<TProps>) => {
95
97
  this.resourceManager.useObservable(key, obesrvable, callback || (() => this.updateComponent()), getLast),
96
98
  useState: (key, initialValue) =>
97
99
  this.resourceManager.useState(key, initialValue, this.updateComponent.bind(this)),
100
+ useSearchState: (key, initialValue) =>
101
+ this.resourceManager.useObservable(
102
+ `useSearchState-${key}`,
103
+ this.injector.getInstance(LocationService).useSearchParam(key, initialValue),
104
+ () => this.updateComponent(),
105
+ ),
106
+
107
+ useStoredState: <T>(key: string, initialValue: T, storageArea = localStorage) => {
108
+ const getFromStorage = () => {
109
+ const value = storageArea?.getItem(key)
110
+ return value ? JSON.parse(value) : initialValue
111
+ }
112
+
113
+ const setToStorage = (value: T) => {
114
+ if (JSON.stringify(value) !== storageArea?.getItem(key)) {
115
+ const newValue = JSON.stringify(value)
116
+ storageArea?.setItem(key, newValue)
117
+ }
118
+ if (JSON.stringify(observable.getValue()) !== JSON.stringify(value)) {
119
+ observable.setValue(value)
120
+ }
121
+ }
122
+
123
+ const observable = this.resourceManager.useDisposable(
124
+ `useStoredState-${key}`,
125
+ () => new ObservableValue(getFromStorage()),
126
+ )
127
+
128
+ const updateFromStorageEvent = (e: StorageEvent) => {
129
+ e.key === key &&
130
+ e.storageArea === storageArea &&
131
+ setToStorage((e.newValue && JSON.parse(e.newValue)) || initialValue)
132
+ }
133
+
134
+ this.resourceManager.useDisposable(`useStoredState-${key}-storage-event`, () => {
135
+ window.addEventListener('storage', updateFromStorageEvent)
136
+ const channelName = `useStoredState-broadcast-channel`
137
+ const messageChannel = new BroadcastChannel(channelName)
138
+ messageChannel.onmessage = (e) => {
139
+ if (e.data.key === key) {
140
+ setToStorage(e.data.value)
141
+ }
142
+ }
143
+ const subscription = observable.subscribe((value) => {
144
+ messageChannel.postMessage({ key, value })
145
+ })
146
+
147
+ return {
148
+ dispose: () => {
149
+ window.removeEventListener('storage', updateFromStorageEvent)
150
+ subscription.dispose()
151
+ messageChannel.close()
152
+ },
153
+ }
154
+ })
155
+
156
+ observable.subscribe(setToStorage)
157
+
158
+ return this.resourceManager.useObservable(`useStoredState-${key}`, observable, () =>
159
+ this.updateComponent(),
160
+ )
161
+ },
98
162
  useDisposable: this.resourceManager.useDisposable.bind(this.resourceManager),
99
163
  }
100
164
 
@@ -6,8 +6,47 @@ export type RenderOptions<TProps> = {
6
6
  injector: Injector;
7
7
  children?: ChildrenList;
8
8
  element: JSX.Element<TProps>;
9
+ /**
10
+ * Creates and disposes a resource after the component has been detached from the DOM
11
+ *
12
+ * @param key The key for caching the disposable resource
13
+ * @param factory A factory method for creating the disposable resource
14
+ * @returns The Disposable instance
15
+ */
9
16
  useDisposable: <T extends Disposable>(key: string, factory: () => T) => T;
10
- useObservable: <T>(key: string, observable: ObservableValue<T>, callback?: (newValue: T) => void, getLast?: boolean) => [value: T, setValue: (newValue: T) => void];
17
+ /**
18
+ *
19
+ * @param key The key for caching the observable value
20
+ * @param observable The observable value to observe
21
+ * @param callback Optional callback for reacting to changes. If no callback provided, the component will re-render on change
22
+ * @param getLast An option to trigger the callback with the initial value
23
+ * @returns tuple with the current value and a setter function
24
+ */
25
+ useObservable: <T>(key: string, observable: ObservableValue<T>, onChange?: (newValue: T) => void, getLast?: boolean) => [value: T, setValue: (newValue: T) => void];
26
+ /**
27
+ * Creates a state object that will trigger a component re-render on change
28
+ *
29
+ * @param key The Key for caching the observable value
30
+ * @param initialValue The initial value for the observable
31
+ * @returns tuple with the current value and a setter function
32
+ */
11
33
  useState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void];
34
+ /**
35
+ * Creates a state object that will use a value from the search string of the current location. Triggers a component re-render on change
36
+ *
37
+ * @param key The Key for caching the observable value
38
+ * @param initialValue The initial value - if the value is not found in the search string
39
+ * @returns a tuple with the current value and a setter function
40
+ */
41
+ useSearchState: <T>(key: string, initialValue: T) => [value: T, setValue: (newValue: T) => void];
42
+ /**
43
+ * Creates a state object that will use a value from the storage area. Triggers a component re-render on change
44
+ *
45
+ * @param key The key in the storage area
46
+ * @param initialValue The initial value that will be used if the key is not found in the storage area
47
+ * @param storageArea The storage area to use
48
+ * @returns a tuple with the current value and a setter function
49
+ */
50
+ useStoredState: <T>(key: string, initialValue: T, storageArea?: Storage) => [value: T, setValue: (newValue: T) => void];
12
51
  };
13
52
  //# sourceMappingURL=render-options.d.ts.map
@@ -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,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,aAAa,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IACzE,aAAa,EAAE,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAChC,OAAO,CAAC,EAAE,OAAO,KACd,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAChD,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;CAC3F,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,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,MAAM,IAAI;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAEzE;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,EACf,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EAC9B,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EAChC,OAAO,CAAC,EAAE,OAAO,KACd,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,CAAA;IAEhD;;;;;;OAMG;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;;;;;;OAMG;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;;;;;;;OAOG;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"}
@@ -14,7 +14,17 @@ export declare class LocationService implements Disposable {
14
14
  * Observable value that will be updated when the location search (e.g. ?search=1) changes
15
15
  */
16
16
  onLocationSearchChanged: ObservableValue<string>;
17
+ onDeserializedLocationSearchChanged: ObservableValue<any>;
18
+ locationDeserializerObserver: import("@furystack/utils").ValueObserver<string>;
17
19
  updateState(): void;
20
+ readonly searchParamObservables: Map<string, ObservableValue<any>>;
21
+ /**
22
+ *
23
+ * @param key The search param key (e.g. ?search=1 -> search)
24
+ * @param defaultValue The default value if not provided
25
+ * @returns An observable with the current value (or default value) of the search param
26
+ */
27
+ useSearchParam<T>(key: string, defaultValue: T): ObservableValue<T>;
18
28
  private pushStateTracer;
19
29
  private replaceStateTracer;
20
30
  constructor();
@@ -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;AAEzD,qBACa,eAAgB,YAAW,UAAU;IACzC,OAAO;IAQd;;OAEG;IACI,qBAAqB,0BAAuD;IAEnF;;OAEG;IACI,qBAAqB,0BAAqC;IAEjE;;OAEG;IACI,uBAAuB,0BAAuC;IAE9D,WAAW;IAMlB,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;;CAoBvC"}
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,uBAEzC;IAEM,4BAA4B,mDAEjC;IAEK,WAAW;IAMlB,SAAgB,sBAAsB,oCAA0C;IAEhF;;;;;OAKG;IACI,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAmBrD,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,kBAAkB,CAAY;;CAoBvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAG3D,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI;IACjC;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAEvE;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAC3B,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,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAA;CAC7D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,kGAgJjB,CAAA"}
1
+ {"version":3,"file":"shade.d.ts","sourceRoot":"","sources":["../src/shade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAI3D,MAAM,MAAM,YAAY,CAAC,MAAM,IAAI;IACjC;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAEvE;;OAEG;IACH,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAC3B,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,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAEnD;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAA;CAC7D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,KAAK,kGA8MjB,CAAA"}