@xyo-network/react-app-settings 2.25.62
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/LICENSE +165 -0
- package/README.md +69 -0
- package/babel.config.json +5 -0
- package/dist/cjs/WebAppNavigationType.d.ts +1 -0
- package/dist/cjs/WebAppNavigationType.js +3 -0
- package/dist/cjs/WebAppNavigationType.js.map +1 -0
- package/dist/cjs/components/Chrome.d.ts +10 -0
- package/dist/cjs/components/Chrome.js +18 -0
- package/dist/cjs/components/Chrome.js.map +1 -0
- package/dist/cjs/components/DarkModeIconButton.d.ts +3 -0
- package/dist/cjs/components/DarkModeIconButton.js +18 -0
- package/dist/cjs/components/DarkModeIconButton.js.map +1 -0
- package/dist/cjs/components/ErrorPage.d.ts +4 -0
- package/dist/cjs/components/ErrorPage.js +11 -0
- package/dist/cjs/components/ErrorPage.js.map +1 -0
- package/dist/cjs/components/NotFoundPage/NotFound.d.ts +4 -0
- package/dist/cjs/components/NotFoundPage/NotFound.js +11 -0
- package/dist/cjs/components/NotFoundPage/NotFound.js.map +1 -0
- package/dist/cjs/components/NotFoundPage/Page.d.ts +5 -0
- package/dist/cjs/components/NotFoundPage/Page.js +15 -0
- package/dist/cjs/components/NotFoundPage/Page.js.map +1 -0
- package/dist/cjs/components/NotFoundPage/index.d.ts +2 -0
- package/dist/cjs/components/NotFoundPage/index.js +6 -0
- package/dist/cjs/components/NotFoundPage/index.js.map +1 -0
- package/dist/cjs/components/Page.d.ts +13 -0
- package/dist/cjs/components/Page.js +27 -0
- package/dist/cjs/components/Page.js.map +1 -0
- package/dist/cjs/components/index.d.ts +1 -0
- package/dist/cjs/components/index.js +5 -0
- package/dist/cjs/components/index.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/Context.d.ts +11 -0
- package/dist/cjs/contexts/AppSettings/Context.js +7 -0
- package/dist/cjs/contexts/AppSettings/Context.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/Provider.d.ts +8 -0
- package/dist/cjs/contexts/AppSettings/Provider.js +34 -0
- package/dist/cjs/contexts/AppSettings/Provider.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/Slug.d.ts +5 -0
- package/dist/cjs/contexts/AppSettings/Slug.js +10 -0
- package/dist/cjs/contexts/AppSettings/Slug.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/Storage.d.ts +11 -0
- package/dist/cjs/contexts/AppSettings/Storage.js +31 -0
- package/dist/cjs/contexts/AppSettings/Storage.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/StorageBase.d.ts +15 -0
- package/dist/cjs/contexts/AppSettings/StorageBase.js +78 -0
- package/dist/cjs/contexts/AppSettings/StorageBase.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/appSettingDefault.d.ts +1 -0
- package/dist/cjs/contexts/AppSettings/appSettingDefault.js +13 -0
- package/dist/cjs/contexts/AppSettings/appSettingDefault.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/index.d.ts +6 -0
- package/dist/cjs/contexts/AppSettings/index.js +10 -0
- package/dist/cjs/contexts/AppSettings/index.js.map +1 -0
- package/dist/cjs/contexts/AppSettings/useAppSettings.d.ts +1 -0
- package/dist/cjs/contexts/AppSettings/useAppSettings.js +10 -0
- package/dist/cjs/contexts/AppSettings/useAppSettings.js.map +1 -0
- package/dist/cjs/contexts/index.d.ts +1 -0
- package/dist/cjs/contexts/index.js +5 -0
- package/dist/cjs/contexts/index.js.map +1 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +7 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/docs.json +7 -0
- package/dist/esm/WebAppNavigationType.d.ts +1 -0
- package/dist/esm/WebAppNavigationType.js +2 -0
- package/dist/esm/WebAppNavigationType.js.map +1 -0
- package/dist/esm/components/Chrome.d.ts +10 -0
- package/dist/esm/components/Chrome.js +12 -0
- package/dist/esm/components/Chrome.js.map +1 -0
- package/dist/esm/components/DarkModeIconButton.d.ts +3 -0
- package/dist/esm/components/DarkModeIconButton.js +13 -0
- package/dist/esm/components/DarkModeIconButton.js.map +1 -0
- package/dist/esm/components/ErrorPage.d.ts +4 -0
- package/dist/esm/components/ErrorPage.js +7 -0
- package/dist/esm/components/ErrorPage.js.map +1 -0
- package/dist/esm/components/NotFoundPage/NotFound.d.ts +4 -0
- package/dist/esm/components/NotFoundPage/NotFound.js +8 -0
- package/dist/esm/components/NotFoundPage/NotFound.js.map +1 -0
- package/dist/esm/components/NotFoundPage/Page.d.ts +5 -0
- package/dist/esm/components/NotFoundPage/Page.js +7 -0
- package/dist/esm/components/NotFoundPage/Page.js.map +1 -0
- package/dist/esm/components/NotFoundPage/index.d.ts +2 -0
- package/dist/esm/components/NotFoundPage/index.js +3 -0
- package/dist/esm/components/NotFoundPage/index.js.map +1 -0
- package/dist/esm/components/Page.d.ts +13 -0
- package/dist/esm/components/Page.js +21 -0
- package/dist/esm/components/Page.js.map +1 -0
- package/dist/esm/components/index.d.ts +1 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/components/index.js.map +1 -0
- package/dist/esm/contexts/AppSettings/Context.d.ts +11 -0
- package/dist/esm/contexts/AppSettings/Context.js +4 -0
- package/dist/esm/contexts/AppSettings/Context.js.map +1 -0
- package/dist/esm/contexts/AppSettings/Provider.d.ts +8 -0
- package/dist/esm/contexts/AppSettings/Provider.js +31 -0
- package/dist/esm/contexts/AppSettings/Provider.js.map +1 -0
- package/dist/esm/contexts/AppSettings/Slug.d.ts +5 -0
- package/dist/esm/contexts/AppSettings/Slug.js +7 -0
- package/dist/esm/contexts/AppSettings/Slug.js.map +1 -0
- package/dist/esm/contexts/AppSettings/Storage.d.ts +11 -0
- package/dist/esm/contexts/AppSettings/Storage.js +27 -0
- package/dist/esm/contexts/AppSettings/Storage.js.map +1 -0
- package/dist/esm/contexts/AppSettings/StorageBase.d.ts +15 -0
- package/dist/esm/contexts/AppSettings/StorageBase.js +73 -0
- package/dist/esm/contexts/AppSettings/StorageBase.js.map +1 -0
- package/dist/esm/contexts/AppSettings/appSettingDefault.d.ts +1 -0
- package/dist/esm/contexts/AppSettings/appSettingDefault.js +9 -0
- package/dist/esm/contexts/AppSettings/appSettingDefault.js.map +1 -0
- package/dist/esm/contexts/AppSettings/index.d.ts +6 -0
- package/dist/esm/contexts/AppSettings/index.js +7 -0
- package/dist/esm/contexts/AppSettings/index.js.map +1 -0
- package/dist/esm/contexts/AppSettings/useAppSettings.d.ts +1 -0
- package/dist/esm/contexts/AppSettings/useAppSettings.js +6 -0
- package/dist/esm/contexts/AppSettings/useAppSettings.js.map +1 -0
- package/dist/esm/contexts/index.d.ts +1 -0
- package/dist/esm/contexts/index.js +2 -0
- package/dist/esm/contexts/index.js.map +1 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +87 -0
- package/src/WebAppNavigationType.ts +1 -0
- package/src/components/DarkModeIconButton.tsx +19 -0
- package/src/components/index.ts +1 -0
- package/src/contexts/AppSettings/Context.ts +15 -0
- package/src/contexts/AppSettings/Provider.tsx +49 -0
- package/src/contexts/AppSettings/Slug.ts +5 -0
- package/src/contexts/AppSettings/Storage.ts +34 -0
- package/src/contexts/AppSettings/StorageBase.ts +85 -0
- package/src/contexts/AppSettings/appSettingDefault.ts +9 -0
- package/src/contexts/AppSettings/index.ts +6 -0
- package/src/contexts/AppSettings/useAppSettings.ts +7 -0
- package/src/contexts/index.ts +1 -0
- package/src/index.ts +3 -0
- package/typedoc.json +18 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/sdk-js';
|
|
2
|
+
import { assertDefinedEx } from '@xyo-network/react-shared';
|
|
3
|
+
export class AppSettingsStorageBase {
|
|
4
|
+
constructor(prefix = 'AppSettings', defaults) {
|
|
5
|
+
this.prefix = prefix;
|
|
6
|
+
this.defaults = defaults ?? {};
|
|
7
|
+
}
|
|
8
|
+
getBoolean(name) {
|
|
9
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`);
|
|
10
|
+
if (!storedValue) {
|
|
11
|
+
assertEx(typeof this.defaults[name] === 'boolean', 'Default value is not boolean');
|
|
12
|
+
const defaultValue = this.defaults[name];
|
|
13
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`);
|
|
14
|
+
return defaultValue;
|
|
15
|
+
}
|
|
16
|
+
return storedValue !== 'false';
|
|
17
|
+
}
|
|
18
|
+
setBoolean(name, value) {
|
|
19
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value));
|
|
20
|
+
}
|
|
21
|
+
setNumber(name, value) {
|
|
22
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value));
|
|
23
|
+
}
|
|
24
|
+
getNumber(name) {
|
|
25
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`);
|
|
26
|
+
if (!storedValue) {
|
|
27
|
+
assertEx(typeof this.defaults[name] === 'boolean', 'Default value is not boolean');
|
|
28
|
+
const defaultValue = this.defaults[name];
|
|
29
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`);
|
|
30
|
+
return defaultValue;
|
|
31
|
+
}
|
|
32
|
+
return parseFloat(storedValue);
|
|
33
|
+
}
|
|
34
|
+
getString(name) {
|
|
35
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`);
|
|
36
|
+
if (!storedValue) {
|
|
37
|
+
assertDefinedEx(typeof this.defaults[name] === 'string', 'Default value is not string');
|
|
38
|
+
const defaultValue = this.defaults[name];
|
|
39
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`);
|
|
40
|
+
return defaultValue;
|
|
41
|
+
}
|
|
42
|
+
return storedValue;
|
|
43
|
+
}
|
|
44
|
+
setString(name, value) {
|
|
45
|
+
localStorage.setItem(`${this.prefix}|${name}`, value);
|
|
46
|
+
}
|
|
47
|
+
getStringArray(name) {
|
|
48
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)?.split(',');
|
|
49
|
+
if (!storedValue) {
|
|
50
|
+
assertDefinedEx(Array.isArray(this.defaults[name]), 'Default value is not array');
|
|
51
|
+
const defaultValue = this.defaults[name];
|
|
52
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`);
|
|
53
|
+
return defaultValue;
|
|
54
|
+
}
|
|
55
|
+
return storedValue;
|
|
56
|
+
}
|
|
57
|
+
setStringArray(name, value) {
|
|
58
|
+
localStorage.setItem(`${this.prefix}|${name}`, value.join(','));
|
|
59
|
+
}
|
|
60
|
+
getObject(name) {
|
|
61
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`);
|
|
62
|
+
const parsedStoredValue = storedValue ? JSON.parse(storedValue) : null;
|
|
63
|
+
if (!parsedStoredValue) {
|
|
64
|
+
assertEx(typeof this.defaults[name] === 'object', 'Default value is not object');
|
|
65
|
+
return assertEx(this.defaults[name], `Missing Default for ${name}`);
|
|
66
|
+
}
|
|
67
|
+
return parsedStoredValue;
|
|
68
|
+
}
|
|
69
|
+
setObject(name, value) {
|
|
70
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=StorageBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageBase.js","sourceRoot":"","sources":["../../../../src/contexts/AppSettings/StorageBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const appSettingDefault: () => Record<string, unknown>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AppSettingSlug } from './Slug';
|
|
2
|
+
export const appSettingDefault = () => {
|
|
3
|
+
return {
|
|
4
|
+
[AppSettingSlug.DarkMode]: false,
|
|
5
|
+
[AppSettingSlug.Developer]: false,
|
|
6
|
+
[AppSettingSlug.NavigationType]: 'menu',
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=appSettingDefault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appSettingDefault.js","sourceRoot":"","sources":["../../../../src/contexts/AppSettings/appSettingDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAA4B,EAAE;IAC7D,OAAO;QACL,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,KAAK;QAChC,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK;QACjC,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM;KACxC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/contexts/AppSettings/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,QAAQ,CAAA;AACtB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useAppSettings: () => import("./Context").AppSettingsContextProps;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAppSettings.js","sourceRoot":"","sources":["../../../../src/contexts/AppSettings/useAppSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,OAAO,UAAU,CAAC,kBAAkB,CAAC,CAAA;AACvC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AppSettings';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contexts/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,wBAAwB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xyo-network/react-app-settings",
|
|
3
|
+
"author": {
|
|
4
|
+
"email": "support@xyo.network",
|
|
5
|
+
"name": "XYO Development Team",
|
|
6
|
+
"url": "https://xyo.network"
|
|
7
|
+
},
|
|
8
|
+
"bugs": {
|
|
9
|
+
"email": "support@xyo.network",
|
|
10
|
+
"url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js/issues"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@emotion/react": "^11.9.3",
|
|
14
|
+
"@emotion/styled": "^11.9.3",
|
|
15
|
+
"@mui/material": "^5.8.4",
|
|
16
|
+
"@xylabs/react-button": "^2.12.25",
|
|
17
|
+
"@xylabs/react-flexbox": "^2.12.25",
|
|
18
|
+
"@xylabs/react-pixel": "^2.12.25",
|
|
19
|
+
"@xylabs/react-shared": "^2.12.25",
|
|
20
|
+
"@xyo-network/react-shared": "^2.25.63",
|
|
21
|
+
"react": "^18.2.0",
|
|
22
|
+
"react-dom": "^18.2.0",
|
|
23
|
+
"react-helmet": "^6.1.0",
|
|
24
|
+
"react-router-dom": "^6.3.0",
|
|
25
|
+
"tslib": "^2.4.0"
|
|
26
|
+
},
|
|
27
|
+
"description": "Common React library for all XYO projects that use React",
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@babel/core": "^7.18.5",
|
|
30
|
+
"@babel/preset-env": "^7.18.2",
|
|
31
|
+
"@storybook/react": "^6.5.9",
|
|
32
|
+
"@types/react-helmet": "^6.1.5",
|
|
33
|
+
"@xylabs/react-common": "^2.12.25",
|
|
34
|
+
"@xylabs/tsconfig": "^1.0.13"
|
|
35
|
+
},
|
|
36
|
+
"browser": "dist/esm/index.js",
|
|
37
|
+
"docs": "dist/docs.json",
|
|
38
|
+
"exports": {
|
|
39
|
+
".": {
|
|
40
|
+
"node": {
|
|
41
|
+
"import": "./dist/esm/index.js",
|
|
42
|
+
"require": "./dist/cjs/index.js"
|
|
43
|
+
},
|
|
44
|
+
"browser": {
|
|
45
|
+
"import": "./dist/esm/index.js",
|
|
46
|
+
"require": "./dist/cjs/index.js"
|
|
47
|
+
},
|
|
48
|
+
"default": "./dist/esm/index.js"
|
|
49
|
+
},
|
|
50
|
+
"./dist/docs.json": {
|
|
51
|
+
"default": "./dist/docs.json"
|
|
52
|
+
},
|
|
53
|
+
"./package.json": "./package.json"
|
|
54
|
+
},
|
|
55
|
+
"main": "dist/cjs/index.js",
|
|
56
|
+
"module": "dist/esm/index.js",
|
|
57
|
+
"homepage": "https://xyo.network",
|
|
58
|
+
"keywords": [
|
|
59
|
+
"xyo",
|
|
60
|
+
"utility",
|
|
61
|
+
"typescript",
|
|
62
|
+
"react"
|
|
63
|
+
],
|
|
64
|
+
"license": "LGPL-3.0",
|
|
65
|
+
"resolutions": {
|
|
66
|
+
"@storybook/react/webpack": "^5",
|
|
67
|
+
"bn.js": "^5.2.0",
|
|
68
|
+
"react": "^18.1.0",
|
|
69
|
+
"react-dom": "^18.1.0",
|
|
70
|
+
"webpack": "^5"
|
|
71
|
+
},
|
|
72
|
+
"publishConfig": {
|
|
73
|
+
"access": "public"
|
|
74
|
+
},
|
|
75
|
+
"repository": {
|
|
76
|
+
"type": "git",
|
|
77
|
+
"url": "https://github.com/XYOracleNetwork/sdk-xyo-react-js.git"
|
|
78
|
+
},
|
|
79
|
+
"scripts": {
|
|
80
|
+
"lint-pkg": "npmPkgJsonLint .",
|
|
81
|
+
"license": "yarn license-checker --exclude \"MIT, ISC, Apache-2.0, BSD, BSD-2-Clause, CC-BY-4.0, Unlicense, CC-BY-3.0, CC0-1.0\""
|
|
82
|
+
},
|
|
83
|
+
"sideEffects": false,
|
|
84
|
+
"types": "dist/esm/index.d.ts",
|
|
85
|
+
"version": "2.25.62",
|
|
86
|
+
"packageManager": "yarn@3.1.1"
|
|
87
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type WebAppNavigationType = 'menu' | 'sidebar'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import DarkModeRoundedIcon from '@mui/icons-material/DarkModeRounded'
|
|
2
|
+
import LightModeRoundedIcon from '@mui/icons-material/LightModeRounded'
|
|
3
|
+
import { IconButton, IconButtonProps } from '@mui/material'
|
|
4
|
+
|
|
5
|
+
import { useAppSettings } from '../contexts'
|
|
6
|
+
|
|
7
|
+
export const DarkModeIconButton: React.FC<IconButtonProps> = (props) => {
|
|
8
|
+
const { darkMode, enableDarkMode } = useAppSettings()
|
|
9
|
+
|
|
10
|
+
const handleDarkModeChange = () => {
|
|
11
|
+
enableDarkMode?.(!darkMode)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<IconButton onClick={handleDarkModeChange} {...props}>
|
|
16
|
+
{darkMode ? <DarkModeRoundedIcon /> : <LightModeRoundedIcon />}
|
|
17
|
+
</IconButton>
|
|
18
|
+
)
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './DarkModeIconButton'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createContext } from 'react'
|
|
2
|
+
|
|
3
|
+
import { WebAppNavigationType } from '../../WebAppNavigationType'
|
|
4
|
+
import { appSettingDefault } from './appSettingDefault'
|
|
5
|
+
|
|
6
|
+
export interface AppSettingsContextProps {
|
|
7
|
+
darkMode?: boolean
|
|
8
|
+
developerMode?: boolean
|
|
9
|
+
enableDarkMode?: (value: boolean) => void
|
|
10
|
+
enableDeveloperMode?: (value: boolean) => void
|
|
11
|
+
changeNavigationType?: (value: WebAppNavigationType) => void
|
|
12
|
+
navigationType?: WebAppNavigationType
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const AppSettingsContext = createContext<AppSettingsContextProps>(appSettingDefault())
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WithChildren } from '@xylabs/react-shared'
|
|
2
|
+
import { ProviderProps, useState } from 'react'
|
|
3
|
+
|
|
4
|
+
import { WebAppNavigationType } from '../../WebAppNavigationType'
|
|
5
|
+
import { AppSettingsContext, AppSettingsContextProps } from './Context'
|
|
6
|
+
import { AppSettingsStorage } from './Storage'
|
|
7
|
+
|
|
8
|
+
export interface AppSettingsProviderProps<T extends AppSettingsContextProps = AppSettingsContextProps> extends ProviderProps<T> {
|
|
9
|
+
storage?: AppSettingsStorage
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const AppSettingsProvider: React.FC<WithChildren<AppSettingsProviderProps>> = ({ storage = new AppSettingsStorage(), value, children, ...props }) => {
|
|
13
|
+
const [developerMode, setDeveloperMode] = useState(storage.developerMode)
|
|
14
|
+
const [darkMode, setDarkMode] = useState(storage.darkMode)
|
|
15
|
+
const [navigationType, setNaviagtionType] = useState(storage.navigationType)
|
|
16
|
+
|
|
17
|
+
const enableDeveloperMode = (value: boolean) => {
|
|
18
|
+
storage.developerMode = value
|
|
19
|
+
setDeveloperMode(storage.developerMode)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const enableDarkMode = (value: boolean) => {
|
|
23
|
+
storage.darkMode = value
|
|
24
|
+
setDarkMode(storage.darkMode)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const changeNavigationType = (value: WebAppNavigationType) => {
|
|
28
|
+
storage.navigationType = value
|
|
29
|
+
setNaviagtionType(value)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<AppSettingsContext.Provider
|
|
34
|
+
value={{
|
|
35
|
+
changeNavigationType,
|
|
36
|
+
darkMode,
|
|
37
|
+
developerMode,
|
|
38
|
+
enableDarkMode,
|
|
39
|
+
enableDeveloperMode,
|
|
40
|
+
navigationType,
|
|
41
|
+
|
|
42
|
+
...value,
|
|
43
|
+
}}
|
|
44
|
+
{...props}
|
|
45
|
+
>
|
|
46
|
+
{children}
|
|
47
|
+
</AppSettingsContext.Provider>
|
|
48
|
+
)
|
|
49
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { WebAppNavigationType } from '../../WebAppNavigationType'
|
|
2
|
+
import { appSettingDefault } from './appSettingDefault'
|
|
3
|
+
import { AppSettingSlug } from './Slug'
|
|
4
|
+
import { AppSettingsStorageBase } from './StorageBase'
|
|
5
|
+
|
|
6
|
+
export class AppSettingsStorage extends AppSettingsStorageBase {
|
|
7
|
+
constructor(prefix = 'AppSettings', defaults?: Record<string, unknown>) {
|
|
8
|
+
super(prefix, { ...appSettingDefault(), ...defaults })
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
get darkMode() {
|
|
12
|
+
return this.getBoolean(AppSettingSlug.DarkMode)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
set darkMode(value: boolean) {
|
|
16
|
+
this.setBoolean(AppSettingSlug.DarkMode, value)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
get developerMode() {
|
|
20
|
+
return this.getBoolean(AppSettingSlug.Developer)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
set developerMode(value: boolean) {
|
|
24
|
+
this.setBoolean(AppSettingSlug.Developer, value)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
get navigationType() {
|
|
28
|
+
return this.getString(AppSettingSlug.NavigationType) as WebAppNavigationType
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
set navigationType(value: WebAppNavigationType) {
|
|
32
|
+
this.setString(AppSettingSlug.NavigationType, value)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { assertEx } from '@xylabs/sdk-js'
|
|
2
|
+
import { assertDefinedEx } from '@xyo-network/react-shared'
|
|
3
|
+
|
|
4
|
+
export class AppSettingsStorageBase {
|
|
5
|
+
private prefix: string
|
|
6
|
+
private defaults: Record<string, unknown>
|
|
7
|
+
constructor(prefix = 'AppSettings', defaults?: Record<string, unknown>) {
|
|
8
|
+
this.prefix = prefix
|
|
9
|
+
this.defaults = defaults ?? {}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public getBoolean(name: string): boolean {
|
|
13
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)
|
|
14
|
+
if (!storedValue) {
|
|
15
|
+
assertEx(typeof this.defaults[name] === 'boolean', 'Default value is not boolean')
|
|
16
|
+
const defaultValue = this.defaults[name] as boolean
|
|
17
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`)
|
|
18
|
+
return defaultValue
|
|
19
|
+
}
|
|
20
|
+
return storedValue !== 'false'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public setBoolean(name: string, value: boolean) {
|
|
24
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public setNumber(name: string, value: number) {
|
|
28
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value))
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public getNumber(name: string): number {
|
|
32
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)
|
|
33
|
+
if (!storedValue) {
|
|
34
|
+
assertEx(typeof this.defaults[name] === 'boolean', 'Default value is not boolean')
|
|
35
|
+
const defaultValue = this.defaults[name] as number
|
|
36
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`)
|
|
37
|
+
return defaultValue
|
|
38
|
+
}
|
|
39
|
+
return parseFloat(storedValue)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public getString(name: string) {
|
|
43
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)
|
|
44
|
+
if (!storedValue) {
|
|
45
|
+
assertDefinedEx(typeof this.defaults[name] === 'string', 'Default value is not string')
|
|
46
|
+
const defaultValue = this.defaults[name] as string
|
|
47
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`)
|
|
48
|
+
return defaultValue
|
|
49
|
+
}
|
|
50
|
+
return storedValue
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public setString(name: string, value: string) {
|
|
54
|
+
localStorage.setItem(`${this.prefix}|${name}`, value)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public getStringArray(name: string) {
|
|
58
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)?.split(',')
|
|
59
|
+
if (!storedValue) {
|
|
60
|
+
assertDefinedEx(Array.isArray(this.defaults[name]), 'Default value is not array')
|
|
61
|
+
const defaultValue = this.defaults[name] as string[]
|
|
62
|
+
assertEx(defaultValue !== undefined, `Missing Default for ${name}`)
|
|
63
|
+
return defaultValue
|
|
64
|
+
}
|
|
65
|
+
return storedValue
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public setStringArray(name: string, value: string[]) {
|
|
69
|
+
localStorage.setItem(`${this.prefix}|${name}`, value.join(','))
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public getObject<T>(name: string): T {
|
|
73
|
+
const storedValue = localStorage.getItem(`${this.prefix}|${name}`)
|
|
74
|
+
const parsedStoredValue = storedValue ? JSON.parse(storedValue) : null
|
|
75
|
+
if (!parsedStoredValue) {
|
|
76
|
+
assertEx(typeof this.defaults[name] === 'object', 'Default value is not object')
|
|
77
|
+
return assertEx(this.defaults[name] as T, `Missing Default for ${name}`)
|
|
78
|
+
}
|
|
79
|
+
return parsedStoredValue as T
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public setObject<T>(name: string, value: T) {
|
|
83
|
+
localStorage.setItem(`${this.prefix}|${name}`, JSON.stringify(value))
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './AppSettings'
|
package/src/index.ts
ADDED
package/typedoc.json
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://typedoc.org/schema.json",
|
|
3
|
+
"entryPoints": [
|
|
4
|
+
"./src/index.ts"
|
|
5
|
+
],
|
|
6
|
+
"excludeExternals": true,
|
|
7
|
+
"excludeInternal": true,
|
|
8
|
+
"excludePrivate": true,
|
|
9
|
+
"excludeProtected": true,
|
|
10
|
+
"intentionallyNotExported": [
|
|
11
|
+
"AuthDispatch",
|
|
12
|
+
"AuthServiceId",
|
|
13
|
+
"AuthState",
|
|
14
|
+
"LoginForm"
|
|
15
|
+
],
|
|
16
|
+
"json": "./dist/docs.json",
|
|
17
|
+
"tsconfig": "./tsconfig.json"
|
|
18
|
+
}
|