perf: app show hide toggle

This commit is contained in:
molvqingtai 2024-09-27 05:09:44 +08:00
parent f36ae70146
commit ca1ea11dcb
16 changed files with 315 additions and 276 deletions

View file

@ -58,16 +58,16 @@
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.0",
"@resreq/event-hub": "^1.6.0",
"@resreq/timer": "^1.1.5",
"@resreq/timer": "^1.1.6",
"@rtco/client": "^0.2.17",
"@tailwindcss/typography": "^0.5.15",
"@webext-core/proxy-service": "^1.2.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
"framer-motion": "^11.5.6",
"framer-motion": "^11.7.0",
"idb-keyval": "^6.2.1",
"lucide-react": "^0.445.0",
"lucide-react": "^0.446.0",
"nanoid": "^5.0.7",
"next-themes": "^0.3.0",
"react": "^18.3.1",
@ -96,9 +96,9 @@
"@eslint-react/eslint-plugin": "^1.14.2",
"@eslint/js": "^9.11.1",
"@types/eslint": "^9.6.1",
"@types/eslint-plugin-tailwindcss": "^3.17.0",
"@types/eslint__js": "^8.42.3",
"@types/node": "^22.6.1",
"@types/eslint-plugin-tailwindcss": "^3.17.0",
"@types/node": "^22.7.2",
"@types/react": "^18.3.9",
"@types/react-dom": "^18.3.0",
"@types/webextension-polyfill": "^0.12.1",
@ -112,7 +112,7 @@
"eslint-plugin-tailwindcss": "^3.17.4",
"globals": "^15.9.0",
"husky": "^9.1.6",
"jiti": "^1.21.6",
"jiti": "^2.0.0",
"lint-staged": "^15.2.10",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.47",

View file

@ -51,8 +51,8 @@ importers:
specifier: ^1.6.0
version: 1.6.0
'@resreq/timer':
specifier: ^1.1.5
version: 1.1.5
specifier: ^1.1.6
version: 1.1.6
'@rtco/client':
specifier: ^0.2.17
version: 0.2.17
@ -72,14 +72,14 @@ importers:
specifier: ^4.1.0
version: 4.1.0
framer-motion:
specifier: ^11.5.6
version: 11.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
specifier: ^11.7.0
version: 11.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
idb-keyval:
specifier: ^6.2.1
version: 6.2.1
lucide-react:
specifier: ^0.445.0
version: 0.445.0(react@18.3.1)
specifier: ^0.446.0
version: 0.446.0(react@18.3.1)
nanoid:
specifier: ^5.0.7
version: 5.0.7
@ -146,13 +146,13 @@ importers:
devDependencies:
'@commitlint/cli':
specifier: ^19.5.0
version: 19.5.0(@types/node@22.6.1)(typescript@5.6.2)
version: 19.5.0(@types/node@22.7.2)(typescript@5.6.2)
'@commitlint/config-conventional':
specifier: ^19.5.0
version: 19.5.0
'@eslint-react/eslint-plugin':
specifier: ^1.14.2
version: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
version: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint/js':
specifier: ^9.11.1
version: 9.11.1
@ -166,8 +166,8 @@ importers:
specifier: ^8.42.3
version: 8.42.3
'@types/node':
specifier: ^22.6.1
version: 22.6.1
specifier: ^22.7.2
version: 22.7.2
'@types/react':
specifier: ^18.3.9
version: 18.3.9
@ -179,10 +179,10 @@ importers:
version: 0.12.1
'@typescript-eslint/parser':
specifier: ^8.7.0
version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
version: 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@vitejs/plugin-react':
specifier: ^4.3.1
version: 4.3.1(vite@5.4.5(@types/node@22.6.1))
version: 4.3.1(vite@5.4.5(@types/node@22.7.2))
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.47)
@ -191,13 +191,13 @@ importers:
version: 7.0.3
eslint:
specifier: ^9.11.1
version: 9.11.1(jiti@1.21.6)
version: 9.11.1(jiti@2.0.0)
eslint-config-prettier:
specifier: ^9.1.0
version: 9.1.0(eslint@9.11.1(jiti@1.21.6))
version: 9.1.0(eslint@9.11.1(jiti@2.0.0))
eslint-plugin-prettier:
specifier: ^5.2.1
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(prettier@3.3.3)
version: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@2.0.0)))(eslint@9.11.1(jiti@2.0.0))(prettier@3.3.3)
eslint-plugin-tailwindcss:
specifier: ^3.17.4
version: 3.17.4(tailwindcss@3.4.13)
@ -208,8 +208,8 @@ importers:
specifier: ^9.1.6
version: 9.1.6
jiti:
specifier: ^1.21.6
version: 1.21.6
specifier: ^2.0.0
version: 2.0.0
lint-staged:
specifier: ^15.2.10
version: 15.2.10
@ -236,13 +236,13 @@ importers:
version: 5.6.2
typescript-eslint:
specifier: ^8.7.0
version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
version: 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
webext-bridge:
specifier: ^6.0.1
version: 6.0.1
wxt:
specifier: ^0.19.10
version: 0.19.10(@types/node@22.6.1)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4)
version: 0.19.10(@types/node@22.7.2)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4)
packages:
@ -1677,8 +1677,8 @@ packages:
'@resreq/event-hub@1.6.0':
resolution: {integrity: sha512-SEzPuAc2bQdMV9cKrBIjW3EvntpU8NcBxdgdEo9yLKAeRfvdM4oM/sG8pFPRZOpYwOytaJqWGqwjc+RSRFFTvQ==}
'@resreq/timer@1.1.5':
resolution: {integrity: sha512-QZrY3+1nbDd3e15muzFGRxJAaKYYJ9xC5+E/cm/B3cEXQbD8pjy/lilsMOaOpvligpUE1jXxiSZzuvH334fq5w==}
'@resreq/timer@1.1.6':
resolution: {integrity: sha512-D8aLPVuRz9ShraIHPU4v9hSWS7HhEDDm4ww9PkqwGRFMvlR3BQ/34UX0Do77PNdpqgJFp4eiRH02gHiV31/3Rw==}
'@rollup/pluginutils@5.1.0':
resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
@ -1902,8 +1902,8 @@ packages:
'@types/murmurhash3js-revisited@3.0.3':
resolution: {integrity: sha512-QvlqvYtGBYIDeO8dFdY4djkRubcrc+yTJtBc7n8VZPlJDUS/00A+PssbvERM8f9bYRmcaSEHPZgZojeQj7kzAA==}
'@types/node@22.6.1':
resolution: {integrity: sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==}
'@types/node@22.7.2':
resolution: {integrity: sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==}
'@types/phoenix@1.6.5':
resolution: {integrity: sha512-xegpDuR+z0UqG9fwHqNoy3rI7JDlvaPh2TY47Fl80oq6g+hXT+c/LEuE43X48clZ6lOfANl5WrPur9fYO1RJ/w==}
@ -3244,8 +3244,8 @@ packages:
fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
framer-motion@11.5.6:
resolution: {integrity: sha512-JMwUpAxv/DWgul9vPgX0ElKn0G66sUc6O9tOXsYwn3zxwvhxFljSXC0XT2QCzuTYBshwC8nyDAa1SYcV0Ldbhw==}
framer-motion@11.7.0:
resolution: {integrity: sha512-m+1E3mMzDIQ5DsVghMvXyC+jSkZSm5RHBLA2gHa/LczcXwW6JbQK4Uz48LsuCTGV8bZFVUezcauHj3M33tY/5w==}
peerDependencies:
'@emotion/is-prop-valid': '*'
react: ^18.0.0
@ -3925,6 +3925,10 @@ packages:
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
hasBin: true
jiti@2.0.0:
resolution: {integrity: sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==}
hasBin: true
js-cookie@2.2.1:
resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
@ -4122,8 +4126,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
lucide-react@0.445.0:
resolution: {integrity: sha512-YrLf3aAHvmd4dZ8ot+mMdNFrFpJD7YRwQ2pUcBhgqbmxtrMP4xDzIorcj+8y+6kpuXBF4JB0NOCTUWIYetJjgA==}
lucide-react@0.446.0:
resolution: {integrity: sha512-BU7gy8MfBMqvEdDPH79VhOXSEgyG8TSPOKWaExWGCQVqnGH7wGgDngPbofu+KdtVjPQBWbEmnfMTq90CTiiDRg==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc
@ -6322,11 +6326,11 @@ snapshots:
dependencies:
'@chainsafe/is-ip': 2.0.2
'@commitlint/cli@19.5.0(@types/node@22.6.1)(typescript@5.6.2)':
'@commitlint/cli@19.5.0(@types/node@22.7.2)(typescript@5.6.2)':
dependencies:
'@commitlint/format': 19.5.0
'@commitlint/lint': 19.5.0
'@commitlint/load': 19.5.0(@types/node@22.6.1)(typescript@5.6.2)
'@commitlint/load': 19.5.0(@types/node@22.7.2)(typescript@5.6.2)
'@commitlint/read': 19.5.0
'@commitlint/types': 19.5.0
tinyexec: 0.3.0
@ -6373,7 +6377,7 @@ snapshots:
'@commitlint/rules': 19.5.0
'@commitlint/types': 19.5.0
'@commitlint/load@19.5.0(@types/node@22.6.1)(typescript@5.6.2)':
'@commitlint/load@19.5.0(@types/node@22.7.2)(typescript@5.6.2)':
dependencies:
'@commitlint/config-validator': 19.5.0
'@commitlint/execute-rule': 19.5.0
@ -6381,7 +6385,7 @@ snapshots:
'@commitlint/types': 19.5.0
chalk: 5.3.0
cosmiconfig: 9.0.0(typescript@5.6.2)
cosmiconfig-typescript-loader: 5.0.0(@types/node@22.6.1)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2)
cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.2)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2)
lodash.isplainobject: 4.0.6
lodash.merge: 4.6.2
lodash.uniq: 4.5.0
@ -6589,20 +6593,20 @@ snapshots:
'@esbuild/win32-x64@0.23.1':
optional: true
'@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@1.21.6))':
'@eslint-community/eslint-utils@4.4.0(eslint@9.11.1(jiti@2.0.0))':
dependencies:
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.11.1': {}
'@eslint-react/ast@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/ast@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
birecord: 0.1.1
string-ts: 2.2.0
ts-pattern: 5.3.1
@ -6611,18 +6615,18 @@ snapshots:
- supports-color
- typescript
'@eslint-react/core@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/core@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
birecord: 0.1.1
short-unique-id: 5.2.0
ts-pattern: 5.3.1
@ -6631,46 +6635,46 @@ snapshots:
- supports-color
- typescript
'@eslint-react/eslint-plugin@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/eslint-plugin@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
eslint-plugin-react-debug: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint-plugin-react-dom: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint-plugin-react-hooks-extra: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint-plugin-react-naming-convention: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint-plugin-react-web-api: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint-plugin-react-x: 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
eslint-plugin-react-debug: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint-plugin-react-dom: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint-plugin-react-hooks-extra: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint-plugin-react-naming-convention: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint-plugin-react-web-api: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint-plugin-react-x: 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
- supports-color
'@eslint-react/jsx@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/jsx@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
ts-pattern: 5.3.1
transitivePeerDependencies:
- eslint
- supports-color
- typescript
'@eslint-react/shared@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/shared@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/tools': 1.14.2
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
picomatch: 4.0.2
transitivePeerDependencies:
- eslint
@ -6679,24 +6683,24 @@ snapshots:
'@eslint-react/tools@1.14.2': {}
'@eslint-react/types@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/types@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/tools': 1.14.2
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
transitivePeerDependencies:
- eslint
- supports-color
- typescript
'@eslint-react/var@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@eslint-react/var@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
ts-pattern: 5.3.1
transitivePeerDependencies:
- eslint
@ -7079,7 +7083,7 @@ snapshots:
'@grpc/grpc-js@1.9.15':
dependencies:
'@grpc/proto-loader': 0.7.13
'@types/node': 22.6.1
'@types/node': 22.7.2
'@grpc/proto-loader@0.7.13':
dependencies:
@ -7848,7 +7852,7 @@ snapshots:
'@resreq/event-hub@1.6.0': {}
'@resreq/timer@1.1.5':
'@resreq/timer@1.1.6':
dependencies:
'@resreq/event-hub': 1.6.0
@ -8025,7 +8029,7 @@ snapshots:
'@types/conventional-commits-parser@5.0.0':
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
'@types/debug@4.1.12':
dependencies:
@ -8033,7 +8037,7 @@ snapshots:
'@types/dns-packet@5.6.5':
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
'@types/eslint-plugin-tailwindcss@3.17.0':
dependencies:
@ -8084,7 +8088,7 @@ snapshots:
'@types/murmurhash3js-revisited@3.0.3': {}
'@types/node@22.6.1':
'@types/node@22.7.2':
dependencies:
undici-types: 6.19.8
@ -8103,7 +8107,7 @@ snapshots:
'@types/readable-stream@4.0.15':
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
safe-buffer: 5.1.2
'@types/unist@2.0.11': {}
@ -8118,22 +8122,22 @@ snapshots:
'@types/ws@8.5.12':
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
'@types/yauzl@2.10.3':
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
optional: true
'@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 8.7.0
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
@ -8143,14 +8147,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 8.7.0
debug: 4.3.7
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
@ -8166,10 +8170,10 @@ snapshots:
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/visitor-keys': 8.7.0
'@typescript-eslint/type-utils@8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/type-utils@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies:
@ -8178,10 +8182,10 @@ snapshots:
- eslint
- supports-color
'@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/type-utils@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
debug: 4.3.7
ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies:
@ -8224,24 +8228,24 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/utils@8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.0.0))
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
transitivePeerDependencies:
- supports-color
- typescript
'@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)':
'@typescript-eslint/utils@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.0.0))
'@typescript-eslint/scope-manager': 8.7.0
'@typescript-eslint/types': 8.7.0
'@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
transitivePeerDependencies:
- supports-color
- typescript
@ -8258,14 +8262,14 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@22.6.1))':
'@vitejs/plugin-react@4.3.1(vite@5.4.5(@types/node@22.7.2))':
dependencies:
'@babel/core': 7.25.2
'@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 5.4.5(@types/node@22.6.1)
vite: 5.4.5(@types/node@22.7.2)
transitivePeerDependencies:
- supports-color
@ -8762,7 +8766,7 @@ snapshots:
chrome-launcher@1.1.0:
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 2.0.1
@ -8922,9 +8926,9 @@ snapshots:
core-util-is@1.0.3: {}
cosmiconfig-typescript-loader@5.0.0(@types/node@22.6.1)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2):
cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.2)(cosmiconfig@9.0.0(typescript@5.6.2))(typescript@5.6.2):
dependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
cosmiconfig: 9.0.0(typescript@5.6.2)
jiti: 1.21.6
typescript: 5.6.2
@ -9338,34 +9342,34 @@ snapshots:
escape-string-regexp@5.0.0: {}
eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@1.21.6)):
eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@2.0.0)):
dependencies:
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))(prettier@3.3.3):
eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@9.11.1(jiti@2.0.0)))(eslint@9.11.1(jiti@2.0.0))(prettier@3.3.3):
dependencies:
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
prettier: 3.3.3
prettier-linter-helpers: 1.0.0
synckit: 0.9.1
optionalDependencies:
'@types/eslint': 9.6.1
eslint-config-prettier: 9.1.0(eslint@9.11.1(jiti@1.21.6))
eslint-config-prettier: 9.1.0(eslint@9.11.1(jiti@2.0.0))
eslint-plugin-react-debug@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-debug@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
string-ts: 2.2.0
ts-pattern: 5.3.1
optionalDependencies:
@ -9373,99 +9377,99 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-react-dom@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-dom@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
ts-pattern: 5.3.1
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
- supports-color
eslint-plugin-react-hooks-extra@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-hooks-extra@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
ts-pattern: 5.3.1
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
- supports-color
eslint-plugin-react-naming-convention@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-naming-convention@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
ts-pattern: 5.3.1
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
- supports-color
eslint-plugin-react-web-api@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-web-api@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
birecord: 0.1.1
eslint: 9.11.1(jiti@1.21.6)
eslint: 9.11.1(jiti@2.0.0)
ts-pattern: 5.3.1
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
- supports-color
eslint-plugin-react-x@1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
eslint-plugin-react-x@1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/ast': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/core': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/jsx': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/shared': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/tools': 1.14.2
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@eslint-react/types': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@eslint-react/var': 1.14.2(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 8.6.0
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/types': 8.6.0
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
is-immutable-type: 5.0.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
is-immutable-type: 5.0.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
ts-pattern: 5.3.1
optionalDependencies:
typescript: 5.6.2
@ -9487,9 +9491,9 @@ snapshots:
eslint-visitor-keys@4.0.0: {}
eslint@9.11.1(jiti@1.21.6):
eslint@9.11.1(jiti@2.0.0):
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@1.21.6))
'@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1(jiti@2.0.0))
'@eslint-community/regexpp': 4.11.1
'@eslint/config-array': 0.18.0
'@eslint/core': 0.6.0
@ -9527,7 +9531,7 @@ snapshots:
strip-ansi: 6.0.1
text-table: 0.2.0
optionalDependencies:
jiti: 1.21.6
jiti: 2.0.0
transitivePeerDependencies:
- supports-color
@ -9762,7 +9766,7 @@ snapshots:
fraction.js@4.3.7: {}
framer-motion@11.5.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
framer-motion@11.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
tslib: 2.7.0
optionalDependencies:
@ -10196,10 +10200,10 @@ snapshots:
is-hexadecimal@2.0.1: {}
is-immutable-type@5.0.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
is-immutable-type@5.0.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
eslint: 9.11.1(jiti@1.21.6)
'@typescript-eslint/type-utils': 8.6.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
eslint: 9.11.1(jiti@2.0.0)
ts-api-utils: 1.3.0(typescript@5.6.2)
ts-declaration-location: 1.0.4(typescript@5.6.2)
typescript: 5.6.2
@ -10417,6 +10421,8 @@ snapshots:
jiti@1.21.6: {}
jiti@2.0.0: {}
js-cookie@2.2.1: {}
js-sdsl@4.3.0: {}
@ -10660,7 +10666,7 @@ snapshots:
dependencies:
yallist: 3.1.1
lucide-react@0.445.0(react@18.3.1):
lucide-react@0.446.0(react@18.3.1):
dependencies:
react: 18.3.1
@ -11643,7 +11649,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/node': 22.6.1
'@types/node': 22.7.2
long: 5.2.3
protons-runtime@5.5.0:
@ -12557,11 +12563,11 @@ snapshots:
typedarray@0.0.6: {}
typescript-eslint@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2):
typescript-eslint@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2):
dependencies:
'@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2))(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
'@typescript-eslint/eslint-plugin': 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2))(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
'@typescript-eslint/utils': 8.7.0(eslint@9.11.1(jiti@2.0.0))(typescript@5.6.2)
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
@ -12791,12 +12797,12 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
vite-node@2.1.1(@types/node@22.6.1):
vite-node@2.1.1(@types/node@22.7.2):
dependencies:
cac: 6.7.14
debug: 4.3.7
pathe: 1.1.2
vite: 5.4.5(@types/node@22.6.1)
vite: 5.4.5(@types/node@22.7.2)
transitivePeerDependencies:
- '@types/node'
- less
@ -12808,13 +12814,13 @@ snapshots:
- supports-color
- terser
vite@5.4.5(@types/node@22.6.1):
vite@5.4.5(@types/node@22.7.2):
dependencies:
esbuild: 0.21.5
postcss: 8.4.47
rollup: 4.21.3
optionalDependencies:
'@types/node': 22.6.1
'@types/node': 22.7.2
fsevents: 2.3.3
watchpack@2.4.1:
@ -12997,7 +13003,7 @@ snapshots:
bufferutil: 4.0.8
utf-8-validate: 6.0.4
wxt@0.19.10(@types/node@22.6.1)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4):
wxt@0.19.10(@types/node@22.7.2)(bufferutil@4.0.8)(rollup@4.21.3)(utf-8-validate@6.0.4):
dependencies:
'@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.21.3)
'@types/chrome': 0.0.269
@ -13041,8 +13047,8 @@ snapshots:
publish-browser-extension: 2.2.1
scule: 1.3.0
unimport: 3.12.0(rollup@4.21.3)
vite: 5.4.5(@types/node@22.6.1)
vite-node: 2.1.1(@types/node@22.6.1)
vite: 5.4.5(@types/node@22.7.2)
vite-node: 2.1.1(@types/node@22.7.2)
web-ext-run: 0.2.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)
webextension-polyfill: 0.12.0
transitivePeerDependencies:

View file

@ -7,9 +7,11 @@ import { useRemeshDomain, useRemeshQuery, useRemeshSend } from 'remesh-react'
import RoomDomain from '@/domain/Room'
import UserInfoDomain from '@/domain/UserInfo'
import Setup from '@/app/content/views/Setup'
import MessageListDomain from '@/domain/MessageList'
import { useEffect } from 'react'
import MessageListDomain, { MessageType } from '@/domain/MessageList'
import { useEffect, useState } from 'react'
import { Toaster } from 'sonner'
import { indexDBStorage } from '@/domain/impls/Storage'
import { APP_OPEN_STATUS_STORAGE_KEY } from '@/constants/config'
export default function App() {
const send = useRemeshSend()
@ -33,16 +35,33 @@ export default function App() {
}
}, [userInfoSetFinished, messageListLoadFinished])
const [appOpen, setAppOpen] = useState(false)
const handleToggleApp = async () => {
const value = !appOpen
setAppOpen(value)
await indexDBStorage.setItem<boolean>(APP_OPEN_STATUS_STORAGE_KEY, value)
}
const getAppOpenStatus = async () => {
const value = await indexDBStorage.getItem<boolean>(APP_OPEN_STATUS_STORAGE_KEY)
setAppOpen(!!value)
}
useEffect(() => {
getAppOpenStatus()
}, [])
return (
<>
<AppContainer>
<AppContainer open={appOpen}>
<Header />
<Main />
<Footer />
{notUserInfo && <Setup />}
<Toaster richColors offset="70px" visibleToasts={1} duration={5000} position="top-center"></Toaster>
</AppContainer>
<AppButton></AppButton>
<AppButton onClick={handleToggleApp}></AppButton>
</>
)
}

View file

@ -10,7 +10,7 @@ export interface EmojiButtonProps {
onSelect?: (value: string) => void
}
const emojiGroups = chunk(EMOJI_LIST, 8)
const emojiGroups = chunk([...EMOJI_LIST], 8)
// BUG: https://github.com/radix-ui/primitives/pull/2433
// BUG https://github.com/radix-ui/primitives/issues/1666

View file

@ -1,4 +1,4 @@
import { FC, useRef, type ReactElement } from 'react'
import { FC, forwardRef, useRef, useState, type ReactElement } from 'react'
import { type MessageItemProps } from './MessageItem'
import { type PromptItemProps } from './PromptItem'
@ -9,14 +9,15 @@ export interface MessageListProps {
children?: Array<ReactElement<MessageItemProps | PromptItemProps>>
}
const MessageList: FC<MessageListProps> = ({ children }) => {
const scrollParentRef = useRef<HTMLDivElement>(null)
const [scrollParentRef, setScrollParentRef] = useState<HTMLDivElement | null>(null)
return (
<ScrollArea ref={scrollParentRef}>
<ScrollArea ref={setScrollParentRef}>
<Virtuoso
followOutput={(isAtBottom: boolean) => (isAtBottom ? 'smooth' : 'auto')}
initialTopMostItemIndex={{ index: 'LAST', align: 'end' }}
data={children}
customScrollParent={scrollParentRef.current!}
customScrollParent={scrollParentRef!}
itemContent={(_: any, item: ReactElement<MessageItemProps | PromptItemProps>) => item}
/>
</ScrollArea>

View file

@ -35,11 +35,11 @@ export default defineContentScript({
const root = createRoot(app)
root.render(
<React.StrictMode>
<RemeshRoot store={store}>
<App />
</RemeshRoot>
</React.StrictMode>
// <React.StrictMode>
<RemeshRoot store={store}>
<App />
</RemeshRoot>
// </React.StrictMode>
)
return root
},

View file

@ -1,4 +1,4 @@
import { type ReactNode, type FC, useState, type MouseEvent, useRef } from 'react'
import { type ReactNode, type FC, useState, type MouseEvent, useRef, useEffect } from 'react'
import { SettingsIcon, MoonIcon, SunIcon } from 'lucide-react'
import { motion, AnimatePresence } from 'framer-motion'
@ -12,9 +12,10 @@ import { checkSystemDarkMode, cn } from '@/utils'
export interface AppButtonProps {
children?: ReactNode
onClick?: (e: MouseEvent<HTMLButtonElement>) => void
}
const AppButton: FC<AppButtonProps> = ({ children }) => {
const AppButton: FC<AppButtonProps> = ({ children, onClick }) => {
const send = useRemeshSend()
const userInfoDomain = useRemeshDomain(UserInfoDomain())
const userInfo = useRemeshQuery(userInfoDomain.query.UserInfoQuery())
@ -22,19 +23,17 @@ const AppButton: FC<AppButtonProps> = ({ children }) => {
const isDarkMode =
userInfo?.themeMode === 'dark' ? true : userInfo?.themeMode === 'light' ? false : checkSystemDarkMode()
const [open, setOpen] = useState(false)
const [menuOpen, setMenuOpen] = useState(false)
const menuRef = useRef<HTMLDivElement>(null)
useClickAway(menuRef, () => {
setOpen(false)
setMenuOpen(false)
}, ['click'])
const handleToggleApp = () => {}
const handleToggleMenu = (e: MouseEvent<HTMLButtonElement>) => {
e.preventDefault()
setOpen(!open)
setMenuOpen(!menuOpen)
}
const handleSwitchTheme = () => {
@ -52,7 +51,7 @@ const AppButton: FC<AppButtonProps> = ({ children }) => {
return (
<div ref={menuRef} className="fixed bottom-5 right-5 z-infinity grid select-none justify-center gap-y-3">
<AnimatePresence>
{open && (
{menuOpen && (
<motion.div
className="grid gap-y-3"
initial="hidden"
@ -121,7 +120,7 @@ const AppButton: FC<AppButtonProps> = ({ children }) => {
)}
</AnimatePresence>
<Button
onClick={handleToggleApp}
onClick={onClick}
onContextMenu={handleToggleMenu}
className="relative z-10 size-10 rounded-full p-0 text-xs shadow"
>

View file

@ -1,11 +1,13 @@
import { type ReactNode, type FC } from 'react'
import useResizable from '@/hooks/useResizable'
import { motion, AnimatePresence } from 'framer-motion'
export interface AppContainerProps {
children?: ReactNode
open?: boolean
}
const AppContainer: FC<AppContainerProps> = ({ children }) => {
const AppContainer: FC<AppContainerProps> = ({ children, open }) => {
const { size, ref } = useResizable({
initSize: Math.max(375, window.innerWidth / 6),
maxSize: Math.max(750, window.innerWidth / 3),
@ -14,18 +16,26 @@ const AppContainer: FC<AppContainerProps> = ({ children }) => {
})
return (
<div
style={{
width: `${size}px`
}}
className="fixed bottom-10 right-10 z-infinity box-border grid h-full max-h-[1200px] grid-flow-col grid-rows-[auto_1fr_auto] rounded-xl bg-slate-50 font-sans shadow-2xl"
>
{children}
<div
ref={ref}
className="absolute inset-y-3 -left-0.5 z-20 w-1 cursor-ew-resize rounded-xl bg-slate-100 opacity-0 shadow transition-opacity duration-200 ease-in hover:opacity-100"
></div>
</div>
<AnimatePresence>
{open && (
<motion.div
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: 10 }}
transition={{ duration: 0.3 }}
style={{
width: `${size}px`
}}
className="fixed bottom-10 right-10 z-infinity box-border grid h-full max-h-[1200px] grid-flow-col grid-rows-[auto_1fr_auto] rounded-xl bg-slate-50 font-sans shadow-2xl"
>
{children}
<div
ref={ref}
className="absolute inset-y-3 -left-0.5 z-20 w-1 cursor-ew-resize rounded-xl bg-slate-100 opacity-0 shadow transition-opacity duration-200 ease-in hover:opacity-100"
></div>
</motion.div>
)}
</AnimatePresence>
)
}

View file

@ -12,6 +12,7 @@ import ExampleImage from '@/assets/images/example.jpg'
import PulsatingButton from '@/components/magicui/pulsating-button'
import BlurFade from '@/components/magicui/blur-fade'
import WordPullUp from '@/components/magicui/word-pull-up'
import { motion } from 'framer-motion'
const mockTextList = [
`你問我支持不支持,我說我支持`,
@ -32,6 +33,8 @@ const mockTextList = [
`![ExampleImage](${ExampleImage})`
]
let printTextList = [...mockTextList]
const generateUserInfo = async (): Promise<UserInfo> => {
return {
id: nanoid(),
@ -46,7 +49,7 @@ const generateMessage = async (userInfo: UserInfo): Promise<Message> => {
const { name: username, avatar: userAvatar, id: userId } = userInfo
return {
id: nanoid(),
body: mockTextList.shift()!,
body: printTextList.shift()!,
date: Date.now(),
type: MessageType.Normal,
userId,
@ -79,17 +82,18 @@ const Setup: FC = () => {
}
useEffect(() => {
printTextList.length === 0 && (printTextList = [...mockTextList])
const timer = new Timer(
async () => {
await createMessage(await refreshUserInfo())
},
{ delay: 2000, immediate: true, limit: mockTextList.length }
{ delay: 2000, immediate: true, limit: printTextList.length }
)
timer.start()
return () => {
timer.stop()
send(messageListDomain.command.ClearListCommand())
printTextList.length === 0 && send(messageListDomain.command.ClearListCommand())
}
}, [])
@ -104,13 +108,16 @@ const Setup: FC = () => {
</AvatarFallback>
</Avatar>
</BlurFade>
<div className="flex">
<div className="text-2xl font-bold text-primary">@</div>
<WordPullUp
<div className="flex" key={userInfo?.name}>
<motion.div
className="text-2xl font-bold text-primary"
key={userInfo?.name}
words={`${userInfo?.name || ''}`}
/>
initial={{ x: -10, opacity: 0 }} // 初始向左位移 10 像素
animate={{ x: 0, opacity: 1 }} // 动画结束时回到原位
transition={{ duration: 0.5 }} // 过渡效果持续时间
>
@
</motion.div>
<WordPullUp className="text-2xl font-bold text-primary" words={`${userInfo?.name || ''.padEnd(10, ' ')}`} />
</div>
<PulsatingButton onClick={handleSetup}>Start chatting</PulsatingButton>
</div>

View file

@ -1,7 +1,5 @@
// https://www.webfx.com/tools/emoji-cheat-sheet/
import { Message } from '@/domain/MessageList'
export const EMOJI_LIST = [
'😀',
'😃',
@ -165,7 +163,7 @@ export const EMOJI_LIST = [
'🙏',
'✍',
'💅'
]
] as const
// https://night-tailwindcss.vercel.app/docs/breakpoints
export const BREAKPOINTS = {
@ -189,6 +187,11 @@ export const MESSAGE_MAX_LENGTH = 500 as const
export const STORAGE_NAME = 'WEB_CHAT' as const
export const MESSAGE_LIST_STORAGE_KEY = 'WEB_CHAT_MESSAGE_LIST' as const
export const USER_INFO_STORAGE_KEY = 'WEB_CHAT_USER_INFO' as const
export const APP_OPEN_STATUS_STORAGE_KEY = 'WEB_CHAT_APP_OPEN_STATUS' as const
/**
* In chrome storage.sync, each key-value pair supports a maximum storage of 8kb
* Image is encoded as base64, and the size is increased by about 33%.

View file

@ -3,6 +3,7 @@ import { ListModule } from 'remesh/modules/list'
import { IndexDBStorageExtern } from '@/domain/externs/Storage'
import StorageEffect from '@/domain/modules/StorageEffect'
import StatusModule from './modules/Status'
import { MESSAGE_LIST_STORAGE_KEY } from '@/constants/config'
export enum MessageType {
Normal = 'normal',
@ -33,15 +34,13 @@ export interface PromptMessage extends MessageUser {
export type Message = NormalMessage | PromptMessage
export const STORAGE_KEY = `MESSAGE_LIST`
const MessageListDomain = Remesh.domain({
name: 'MessageListDomain',
impl: (domain) => {
const storageEffect = new StorageEffect({
domain,
extern: IndexDBStorageExtern,
key: STORAGE_KEY
key: MESSAGE_LIST_STORAGE_KEY
})
const MessageListModule = ListModule<Message>(domain, {
@ -145,11 +144,9 @@ const MessageListDomain = Remesh.domain({
storageEffect
.set(SyncToStorageEvent)
.get<Message[]>((value) => [
SyncToStateCommand(value ?? []),
MessageListLoadStatusModule.command.SetFinishedCommand()
])
.watch<Message[]>((value) => SyncToStateCommand(value ?? []))
.get<
Message[]
>((value) => [SyncToStateCommand(value ?? []), MessageListLoadStatusModule.command.SetFinishedCommand()])
return {
query: {

View file

@ -2,6 +2,7 @@ import { Remesh } from 'remesh'
import { BrowserSyncStorageExtern } from '@/domain/externs/Storage'
import StorageEffect from '@/domain/modules/StorageEffect'
import StatusModule from './modules/Status'
import { USER_INFO_STORAGE_KEY } from '@/constants/config'
export interface UserInfo {
id: string
@ -11,15 +12,13 @@ export interface UserInfo {
themeMode: 'system' | 'light' | 'dark'
}
export const STORAGE_KEY = 'USER_INFO'
const UserInfoDomain = Remesh.domain({
name: 'UserInfoDomain',
impl: (domain) => {
const storageEffect = new StorageEffect({
domain,
extern: BrowserSyncStorageExtern,
key: STORAGE_KEY
key: USER_INFO_STORAGE_KEY
})
const UserInfoState = domain.state<UserInfo | null>({

View file

@ -48,8 +48,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
const [send] = this.room.makeAction('MESSAGE')
send(message as DataPayload, id)
@ -67,8 +66,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
const [, on] = this.room.makeAction('MESSAGE')
on((message) => callback(message as T))
@ -85,9 +83,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
throw error
this.emit('error', new Error('Room not joined'))
} else {
this.room.onPeerJoin((peerId) => {
callback(peerId)
@ -106,8 +102,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.onPeerLeave((peerId) => callback(peerId))
}
@ -122,8 +117,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.leave()
this.room = undefined

View file

@ -47,8 +47,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.send(JSON.stringify(message), id)
}
@ -63,8 +62,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.on('message', (message) => callback(JSON.parse(message) as T))
}
@ -79,8 +77,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.on('join', (id) => callback(id))
}
@ -95,8 +92,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.on('leave', (id) => callback(id))
}
@ -111,8 +107,7 @@ class PeerRoom extends EventHub {
if (!this.room) {
this.once('action', () => {
if (!this.room) {
const error = new Error('Room not joined')
this.emit('error', error)
this.emit('error', new Error('Room not joined'))
} else {
this.room.leave()
this.room = undefined

View file

@ -4,11 +4,11 @@ import { IndexDBStorageExtern, BrowserSyncStorageExtern } from '@/domain/externs
import { STORAGE_NAME } from '@/constants/config'
import { webExtensionDriver } from '@/utils/webExtensionDriver'
const indexDBStorage = createStorage({
export const indexDBStorage = createStorage({
driver: indexedDbDriver({ base: `${STORAGE_NAME}:` })
})
const browserSyncStorage = createStorage({
export const browserSyncStorage = createStorage({
driver: webExtensionDriver({ storageArea: 'sync' })
})

View file

@ -1,5 +1,5 @@
import { type RemeshEvent, type RemeshAction, type RemeshDomainContext, type RemeshExtern } from 'remesh'
import { from, fromEventPattern, map, merge, switchMap, tap } from 'rxjs'
import { defer, from, fromEventPattern, map, Observable, switchMap } from 'rxjs'
import { type Promisable } from 'type-fest'
export type StorageValue = null | string | number | boolean | object
@ -60,11 +60,20 @@ export default class StorageEffect {
this.domain.effect({
name: 'WatchStorageToStateEffect',
impl: () => {
return fromEventPattern(this.storage.watch, this.storage.unwatch).pipe(
switchMap(() => {
return from(this.storage.get<T>(this.key)).pipe(map((value) => callback(value)))
})
)
return defer(() => {
let unwatch: Unwatch
return new Observable<void>((observer) => {
this.storage
.watch(() => observer.next())
.then((_unwatch) => {
unwatch = _unwatch
})
return () => unwatch?.()
}).pipe(
switchMap(() => from(this.storage.get<T | null>(this.key))),
map(callback)
)
})
}
})
return this