@neovici/cosmoz-omnitable 11.0.1 → 11.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.
@@ -0,0 +1,13 @@
1
+ import { createContext, useContext, useMemo } from 'haunted';
2
+ import local from './local';
3
+
4
+ export const DriverContext = createContext(local),
5
+ useDriver = () => {
6
+ const driver = useContext(DriverContext);
7
+ return useMemo(() => driver(), [driver]);
8
+ },
9
+ registerProvider = () =>
10
+ customElements.define(
11
+ 'omnitable-settings-driver-provider',
12
+ DriverContext.Provider
13
+ );
@@ -0,0 +1,3 @@
1
+ export * from './context';
2
+ export { default as local } from './local';
3
+ export { default as remote } from './remote';
@@ -0,0 +1,29 @@
1
+ export default ({ prefix = 'omnitable-' } = {}) => {
2
+ const read = async (settingsId) => {
3
+ if (!settingsId) {
4
+ return;
5
+ }
6
+ try {
7
+ return JSON.parse(localStorage.getItem(prefix + settingsId));
8
+ } catch (e) {
9
+ // eslint-disable-next-line no-console
10
+ console.error(e);
11
+ }
12
+ };
13
+ return {
14
+ write: async (settingsId, settings) => {
15
+ const key = prefix + settingsId;
16
+ try {
17
+ if (settings) {
18
+ localStorage.setItem(key, JSON.stringify(settings));
19
+ } else {
20
+ localStorage.removeItem(key);
21
+ }
22
+ } catch (e) {
23
+ // eslint-disable-next-line no-console
24
+ console.error(e);
25
+ }
26
+ },
27
+ read,
28
+ };
29
+ };
@@ -0,0 +1,22 @@
1
+ export default ({ prefix = '', get$, post$ } = {}) => {
2
+ const read = async (settingsId) => {
3
+ try {
4
+ return await get$(prefix + settingsId);
5
+ } catch (e) {
6
+ // eslint-disable-next-line no-console
7
+ console.error(e);
8
+ }
9
+ };
10
+ return {
11
+ write: async (settingsId, settings) => {
12
+ const key = prefix + settingsId;
13
+ try {
14
+ await post$(key, settings);
15
+ } catch (e) {
16
+ // eslint-disable-next-line no-console
17
+ console.error(e);
18
+ }
19
+ },
20
+ read,
21
+ };
22
+ };
@@ -1,62 +1,44 @@
1
- import { useCallback, useMemo, useState } from 'haunted';
1
+ import { useCallback, useEffect, useState } from 'haunted';
2
2
  import { normalizeStore } from './normalize';
3
+ import { useDriver } from './drivers';
3
4
 
4
- const storagePrefix = 'omnitable-',
5
- read = (settingsId) => {
6
- if (!settingsId) {
7
- return [];
8
- }
9
- try {
10
- return JSON.parse(localStorage.getItem(storagePrefix + settingsId)) ?? [];
11
- } catch (e) {
12
- return [];
13
- }
14
- };
15
5
  // eslint-disable-next-line max-lines-per-function
16
6
  export default (settingsId, settings, setSettings, onReset) => {
17
- const [counter, setCounter] = useState(0),
18
- savedSettings = useMemo(() => read(settingsId), [settingsId, counter]);
7
+ const [savedSettings, setSavedSettings] = useState(),
8
+ { read, write } = useDriver();
9
+
10
+ useEffect(async () => {
11
+ if (!settingsId) {
12
+ return;
13
+ }
14
+ setSavedSettings(await read(settingsId));
15
+ }, [settingsId, read]);
19
16
 
20
17
  return {
21
18
  settingsId,
22
19
  savedSettings,
23
20
 
24
- onSave: useCallback(() => {
21
+ onSave: useCallback(async () => {
25
22
  if (!settingsId) {
26
23
  return;
27
24
  }
28
-
29
- try {
30
- const current = read(settingsId);
31
- localStorage.setItem(
32
- storagePrefix + settingsId,
33
- JSON.stringify(normalizeStore(settings, current))
34
- );
35
- setSettings();
36
- setCounter((counter) => counter + 1);
37
- } catch (e) {
38
- // eslint-disable-next-line no-console
39
- console.error(e);
40
- }
41
- }, [settings]),
25
+ const newSettings = normalizeStore(settings, savedSettings);
26
+ await write(settingsId, newSettings);
27
+ setSettings();
28
+ setSavedSettings(newSettings);
29
+ }, [settings, savedSettings]),
42
30
 
43
31
  onReset: useCallback(
44
- (e) => {
32
+ async (e) => {
45
33
  setSettings();
46
-
47
34
  if (e.shiftKey) {
48
- try {
49
- localStorage.removeItem(storagePrefix + settingsId);
50
- setCounter((counter) => counter + 1);
51
- } catch (err) {
52
- // ignore error
53
- }
35
+ await write(settingsId);
36
+ setSavedSettings();
54
37
  }
55
38
  onReset?.();
56
39
  },
57
40
  [onReset]
58
41
  ),
59
-
60
42
  hasChanges: settings != null,
61
43
  };
62
44
  };
@@ -33,9 +33,9 @@ export default ({ settingsId, initial: ini, ...thru }) => {
33
33
  ),
34
34
  normalizedColumns = useMemo(
35
35
  () =>
36
- normalizedSettings.columns.map((s) =>
37
- columns.find((c) => c.name === s.name)
38
- ),
36
+ normalizedSettings.columns
37
+ .map((s) => columns.find((c) => c.name === s.name))
38
+ .filter(Boolean),
39
39
  [columns, ...normalizedSettings.columns.map((s) => s.name)]
40
40
  );
41
41
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neovici/cosmoz-omnitable",
3
- "version": "11.0.1",
3
+ "version": "11.1.1",
4
4
  "description": "[![Build Status](https://travis-ci.org/Neovici/cosmoz-omnitable.svg?branch=master)](https://travis-ci.org/Neovici/cosmoz-omnitable)",
5
5
  "keywords": [
6
6
  "web-components"