[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

fix: Implement unicorn eslint rules and fix them

FoxxMD (Jul 15, 2026, 6:31 PM UTC) 76ef9940 c3cb3cf3

+497 -89
+23 -1
eslint.config.js
··· 13 13 import arrow from 'eslint-plugin-prefer-arrow-functions'; 14 14 import hooks from 'eslint-plugin-react-hooks'; 15 15 import mochaPlugin from 'eslint-plugin-mocha'; 16 + import unicorn from 'eslint-plugin-unicorn'; 16 17 17 18 const defaultRules = { 18 19 'no-useless-catch': 'off', ··· 70 71 plugins: { 71 72 "prefer-arrow-functions": arrow, 72 73 js, 73 - 'unused-imports': unusedImports 74 + 'unused-imports': unusedImports, 75 + unicorn, 74 76 }, 75 77 rules: { 76 78 ...defaultRules, ··· 104 106 // "import/consistent-type-specifier-style": [ 105 107 // "error", "prefer-top-level-if-only-type-imports" 106 108 // ] 109 + "unicorn/prefer-then-catch": "error", 110 + "unicorn/consistent-destructuring": "warn", 111 + "unicorn/consistent-function-scoping": "warn", 112 + "unicorn/consistent-optional-chaining": "error", 113 + "unicorn/no-array-callback-reference": "warn", 114 + "unicorn/no-accidental-bitwise-operator": "warn", 115 + "no-obj-calls": "error", 116 + "unicorn/new-for-builtins": "error", 117 + "unicorn/no-impossible-length-comparison": "error", 118 + "unicorn/no-duplicate-loops": "warn", 119 + "unicorn/no-duplicate-logical-operands": "warn", 120 + "unicorn/no-declarations-before-early-exit": "warn", 121 + "unicorn/prefer-negative-index": "warn", 122 + "unicorn/prefer-import-meta-properties": "error", 123 + "unicorn/prefer-array-from-async": "warn", 124 + "unicorn/prefer-array-flat-map": "warn", 125 + "unicorn/no-useless-else": "warn", 126 + "unicorn/no-unused-array-method-return": "error", 127 + //"unicorn/no-unreadable-object-destructuring": "warn", 128 + "unicorn/prefer-object-destructuring-defaults": "warn" 107 129 }, 108 130 extends: [ 109 131 tsEslint.configs.recommended,
+409 -22
package-lock.json
··· 175 175 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 176 176 "eslint-plugin-react-hooks": "^7.1.1", 177 177 "eslint-plugin-storybook": "^10.3.6", 178 + "eslint-plugin-unicorn": "^72.0.0", 178 179 "eslint-plugin-unused-imports": "^4.4.1", 179 180 "git-cliff": "^2.12.0", 180 181 "globals": "^17.7.0", ··· 1503 1504 "license": "Apache-2.0", 1504 1505 "dependencies": { 1505 1506 "@types/json-schema": "^7.0.15" 1507 + }, 1508 + "engines": { 1509 + "node": "^20.19.0 || ^22.13.0 || >=24" 1510 + } 1511 + }, 1512 + "node_modules/@eslint/css-tree": { 1513 + "version": "4.0.4", 1514 + "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-4.0.4.tgz", 1515 + "integrity": "sha512-nxMparyhqVWQvadx9x8dIfubfIPOE+X2b2waua8fzdnM9vdp9rgVtwEZlG0TmCwEUz/d/f40fzvO/eqBwdxz0A==", 1516 + "dev": true, 1517 + "license": "MIT", 1518 + "dependencies": { 1519 + "mdn-data": "2.28.1", 1520 + "source-map-js": "^1.2.1" 1506 1521 }, 1507 1522 "engines": { 1508 1523 "node": "^20.19.0 || ^22.13.0 || >=24" ··· 8134 8149 } 8135 8150 }, 8136 8151 "node_modules/baseline-browser-mapping": { 8137 - "version": "2.10.33", 8138 - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.33.tgz", 8139 - "integrity": "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==", 8152 + "version": "2.10.43", 8153 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", 8154 + "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", 8140 8155 "dev": true, 8141 8156 "license": "Apache-2.0", 8142 8157 "bin": { ··· 8240 8255 "license": "ISC" 8241 8256 }, 8242 8257 "node_modules/browserslist": { 8243 - "version": "4.28.2", 8244 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", 8245 - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", 8258 + "version": "4.28.6", 8259 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", 8260 + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", 8246 8261 "dev": true, 8247 8262 "funding": [ 8248 8263 { ··· 8260 8275 ], 8261 8276 "license": "MIT", 8262 8277 "dependencies": { 8263 - "baseline-browser-mapping": "^2.10.12", 8264 - "caniuse-lite": "^1.0.30001782", 8265 - "electron-to-chromium": "^1.5.328", 8266 - "node-releases": "^2.0.36", 8278 + "baseline-browser-mapping": "^2.10.42", 8279 + "caniuse-lite": "^1.0.30001803", 8280 + "electron-to-chromium": "^1.5.389", 8281 + "node-releases": "^2.0.51", 8267 8282 "update-browserslist-db": "^1.2.3" 8268 8283 }, 8269 8284 "bin": { ··· 8309 8324 "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 8310 8325 "license": "MIT" 8311 8326 }, 8327 + "node_modules/builtin-modules": { 8328 + "version": "5.3.0", 8329 + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.3.0.tgz", 8330 + "integrity": "sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==", 8331 + "dev": true, 8332 + "license": "MIT", 8333 + "engines": { 8334 + "node": ">=18.20" 8335 + }, 8336 + "funding": { 8337 + "url": "https://github.com/sponsors/sindresorhus" 8338 + } 8339 + }, 8312 8340 "node_modules/bundle-name": { 8313 8341 "version": "4.1.0", 8314 8342 "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", ··· 8494 8522 } 8495 8523 }, 8496 8524 "node_modules/caniuse-lite": { 8497 - "version": "1.0.30001793", 8498 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", 8499 - "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", 8525 + "version": "1.0.30001805", 8526 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001805.tgz", 8527 + "integrity": "sha512-52noaS3DubycKSXaU30TwPGIp+POyQSUVa5jBEq3vkRkY0kjyb3LQgvhU6WGyCcyXqVLWO0Cw0Q6BSdD0kUfVA==", 8500 8528 "dev": true, 8501 8529 "funding": [ 8502 8530 { ··· 8600 8628 "funding": { 8601 8629 "url": "https://github.com/chalk/chalk?sponsor=1" 8602 8630 } 8631 + }, 8632 + "node_modules/change-case": { 8633 + "version": "5.4.4", 8634 + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", 8635 + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", 8636 + "dev": true, 8637 + "license": "MIT" 8603 8638 }, 8604 8639 "node_modules/character-entities-html4": { 8605 8640 "version": "2.1.0", ··· 8921 8956 "node": ">= 0.6" 8922 8957 } 8923 8958 }, 8959 + "node_modules/convert-hrtime": { 8960 + "version": "5.0.0", 8961 + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", 8962 + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", 8963 + "dev": true, 8964 + "license": "MIT", 8965 + "engines": { 8966 + "node": ">=12" 8967 + }, 8968 + "funding": { 8969 + "url": "https://github.com/sponsors/sindresorhus" 8970 + } 8971 + }, 8924 8972 "node_modules/convert-source-map": { 8925 8973 "version": "1.9.0", 8926 8974 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", ··· 8951 8999 "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", 8952 9000 "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", 8953 9001 "license": "MIT" 9002 + }, 9003 + "node_modules/core-js-compat": { 9004 + "version": "3.49.0", 9005 + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", 9006 + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", 9007 + "dev": true, 9008 + "license": "MIT", 9009 + "dependencies": { 9010 + "browserslist": "^4.28.1" 9011 + }, 9012 + "funding": { 9013 + "type": "opencollective", 9014 + "url": "https://opencollective.com/core-js" 9015 + } 8954 9016 }, 8955 9017 "node_modules/cors": { 8956 9018 "version": "2.8.6", ··· 9270 9332 "engines": { 9271 9333 "node": ">= 0.8", 9272 9334 "npm": "1.2.8000 || >= 1.4.16" 9335 + } 9336 + }, 9337 + "node_modules/detect-indent": { 9338 + "version": "7.0.2", 9339 + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", 9340 + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", 9341 + "dev": true, 9342 + "license": "MIT", 9343 + "engines": { 9344 + "node": ">=12.20" 9345 + }, 9346 + "funding": { 9347 + "url": "https://github.com/sponsors/sindresorhus" 9273 9348 } 9274 9349 }, 9275 9350 "node_modules/detect-libc": { ··· 10147 10222 "license": "MIT" 10148 10223 }, 10149 10224 "node_modules/electron-to-chromium": { 10150 - "version": "1.5.366", 10151 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.366.tgz", 10152 - "integrity": "sha512-OlRuhb688YTCzzU3gXPLn6nGyd+F+53INE1qaKKlu6kETErE8FYsyDh0XqXEU+uBRn0MpCzz2vfNwORhkap8qg==", 10225 + "version": "1.5.392", 10226 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.392.tgz", 10227 + "integrity": "sha512-1yQq3VQCZRwsnYc67Oc+1fge6Lwtn0hzi6zmEVkB61Zx21kTbwJAW4dFLadl5Rc1tKhG/kSpYXnfiAhu0f0a1g==", 10153 10228 "dev": true, 10154 10229 "license": "ISC" 10155 10230 }, ··· 10202 10277 "node": ">=10.13.0" 10203 10278 } 10204 10279 }, 10280 + "node_modules/entities": { 10281 + "version": "4.5.0", 10282 + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 10283 + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 10284 + "dev": true, 10285 + "license": "BSD-2-Clause", 10286 + "engines": { 10287 + "node": ">=0.12" 10288 + }, 10289 + "funding": { 10290 + "url": "https://github.com/fb55/entities?sponsor=1" 10291 + } 10292 + }, 10205 10293 "node_modules/error-ex": { 10206 10294 "version": "1.3.4", 10207 10295 "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", ··· 10897 10985 "typescript": ">=4.8.4" 10898 10986 } 10899 10987 }, 10988 + "node_modules/eslint-plugin-unicorn": { 10989 + "version": "72.0.0", 10990 + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-72.0.0.tgz", 10991 + "integrity": "sha512-hqO6ksoOHO+ZhdseTuKRVQbx9U7PRO/cv8qAR1mctwzdVO2hYud8uS9luAhp43RJgziYgHAph8eHyipT8GL0ng==", 10992 + "dev": true, 10993 + "license": "MIT", 10994 + "dependencies": { 10995 + "@eslint-community/eslint-utils": "^4.9.1", 10996 + "@eslint/css-tree": "^4.0.4", 10997 + "browserslist": "^4.28.4", 10998 + "change-case": "^5.4.4", 10999 + "ci-info": "^4.4.0", 11000 + "core-js-compat": "^3.49.0", 11001 + "detect-indent": "^7.0.2", 11002 + "entities": "^4.5.0", 11003 + "find-up-simple": "^1.0.1", 11004 + "globals": "^17.7.0", 11005 + "indent-string": "^5.0.0", 11006 + "is-builtin-module": "^5.0.0", 11007 + "is-identifier": "^1.1.0", 11008 + "pluralize": "^8.0.0", 11009 + "quote-js-string": "^0.1.0", 11010 + "regjsparser": "^0.13.2", 11011 + "reserved-identifiers": "^1.2.0", 11012 + "semver": "^7.8.5", 11013 + "strip-indent": "^4.1.1", 11014 + "yaml": "^2.9.0" 11015 + }, 11016 + "engines": { 11017 + "node": ">=22" 11018 + }, 11019 + "funding": { 11020 + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" 11021 + }, 11022 + "peerDependencies": { 11023 + "eslint": ">=10.4" 11024 + } 11025 + }, 11026 + "node_modules/eslint-plugin-unicorn/node_modules/ci-info": { 11027 + "version": "4.4.0", 11028 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", 11029 + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", 11030 + "dev": true, 11031 + "funding": [ 11032 + { 11033 + "type": "github", 11034 + "url": "https://github.com/sponsors/sibiraj-s" 11035 + } 11036 + ], 11037 + "license": "MIT", 11038 + "engines": { 11039 + "node": ">=8" 11040 + } 11041 + }, 11042 + "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { 11043 + "version": "5.0.0", 11044 + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", 11045 + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", 11046 + "dev": true, 11047 + "license": "MIT", 11048 + "engines": { 11049 + "node": ">=12" 11050 + }, 11051 + "funding": { 11052 + "url": "https://github.com/sponsors/sindresorhus" 11053 + } 11054 + }, 10900 11055 "node_modules/eslint-plugin-unused-imports": { 10901 11056 "version": "4.4.1", 10902 11057 "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz", ··· 11531 11686 "url": "https://github.com/sponsors/sindresorhus" 11532 11687 } 11533 11688 }, 11689 + "node_modules/find-up-simple": { 11690 + "version": "1.0.1", 11691 + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", 11692 + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", 11693 + "dev": true, 11694 + "license": "MIT", 11695 + "engines": { 11696 + "node": ">=18" 11697 + }, 11698 + "funding": { 11699 + "url": "https://github.com/sponsors/sindresorhus" 11700 + } 11701 + }, 11534 11702 "node_modules/find-yarn-workspace-root": { 11535 11703 "version": "2.0.0", 11536 11704 "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", ··· 11741 11909 "license": "MIT", 11742 11910 "funding": { 11743 11911 "url": "https://github.com/sponsors/ljharb" 11912 + } 11913 + }, 11914 + "node_modules/function-timeout": { 11915 + "version": "1.0.2", 11916 + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", 11917 + "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", 11918 + "dev": true, 11919 + "license": "MIT", 11920 + "engines": { 11921 + "node": ">=18" 11922 + }, 11923 + "funding": { 11924 + "url": "https://github.com/sponsors/sindresorhus" 11744 11925 } 11745 11926 }, 11746 11927 "node_modules/gaxios": { ··· 12558 12739 "url": "https://opencollective.com/express" 12559 12740 } 12560 12741 }, 12742 + "node_modules/identifier-regex": { 12743 + "version": "1.1.0", 12744 + "resolved": "https://registry.npmjs.org/identifier-regex/-/identifier-regex-1.1.0.tgz", 12745 + "integrity": "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==", 12746 + "dev": true, 12747 + "license": "MIT", 12748 + "dependencies": { 12749 + "reserved-identifiers": "^1.0.0" 12750 + }, 12751 + "engines": { 12752 + "node": ">=18" 12753 + }, 12754 + "funding": { 12755 + "url": "https://github.com/sponsors/sindresorhus" 12756 + } 12757 + }, 12561 12758 "node_modules/ieee754": { 12562 12759 "version": "1.2.1", 12563 12760 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", ··· 12708 12905 "node": ">=8" 12709 12906 } 12710 12907 }, 12908 + "node_modules/is-builtin-module": { 12909 + "version": "5.0.0", 12910 + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", 12911 + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", 12912 + "dev": true, 12913 + "license": "MIT", 12914 + "dependencies": { 12915 + "builtin-modules": "^5.0.0" 12916 + }, 12917 + "engines": { 12918 + "node": ">=18.20" 12919 + }, 12920 + "funding": { 12921 + "url": "https://github.com/sponsors/sindresorhus" 12922 + } 12923 + }, 12711 12924 "node_modules/is-bun-module": { 12712 12925 "version": "2.0.0", 12713 12926 "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", ··· 12789 13002 }, 12790 13003 "engines": { 12791 13004 "node": ">=0.10.0" 13005 + } 13006 + }, 13007 + "node_modules/is-identifier": { 13008 + "version": "1.1.0", 13009 + "resolved": "https://registry.npmjs.org/is-identifier/-/is-identifier-1.1.0.tgz", 13010 + "integrity": "sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==", 13011 + "dev": true, 13012 + "license": "MIT", 13013 + "dependencies": { 13014 + "identifier-regex": "^1.1.0", 13015 + "super-regex": "^1.1.0" 13016 + }, 13017 + "engines": { 13018 + "node": ">=18" 13019 + }, 13020 + "funding": { 13021 + "url": "https://github.com/sponsors/sindresorhus" 12792 13022 } 12793 13023 }, 12794 13024 "node_modules/is-inside-container": { ··· 13875 14105 "@jridgewell/sourcemap-codec": "^1.5.5" 13876 14106 } 13877 14107 }, 14108 + "node_modules/make-asynchronous": { 14109 + "version": "1.1.0", 14110 + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", 14111 + "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", 14112 + "dev": true, 14113 + "license": "MIT", 14114 + "dependencies": { 14115 + "p-event": "^6.0.0", 14116 + "type-fest": "^4.6.0", 14117 + "web-worker": "^1.5.0" 14118 + }, 14119 + "engines": { 14120 + "node": ">=18" 14121 + }, 14122 + "funding": { 14123 + "url": "https://github.com/sponsors/sindresorhus" 14124 + } 14125 + }, 14126 + "node_modules/make-asynchronous/node_modules/p-event": { 14127 + "version": "6.0.1", 14128 + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", 14129 + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", 14130 + "dev": true, 14131 + "license": "MIT", 14132 + "dependencies": { 14133 + "p-timeout": "^6.1.2" 14134 + }, 14135 + "engines": { 14136 + "node": ">=16.17" 14137 + }, 14138 + "funding": { 14139 + "url": "https://github.com/sponsors/sindresorhus" 14140 + } 14141 + }, 14142 + "node_modules/make-asynchronous/node_modules/p-timeout": { 14143 + "version": "6.1.4", 14144 + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", 14145 + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", 14146 + "dev": true, 14147 + "license": "MIT", 14148 + "engines": { 14149 + "node": ">=14.16" 14150 + }, 14151 + "funding": { 14152 + "url": "https://github.com/sponsors/sindresorhus" 14153 + } 14154 + }, 14155 + "node_modules/make-asynchronous/node_modules/type-fest": { 14156 + "version": "4.41.0", 14157 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", 14158 + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", 14159 + "dev": true, 14160 + "license": "(MIT OR CC0-1.0)", 14161 + "engines": { 14162 + "node": ">=16" 14163 + }, 14164 + "funding": { 14165 + "url": "https://github.com/sponsors/sindresorhus" 14166 + } 14167 + }, 13878 14168 "node_modules/math-intrinsics": { 13879 14169 "version": "1.1.0", 13880 14170 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ··· 13905 14195 "url": "https://opencollective.com/unified" 13906 14196 } 13907 14197 }, 14198 + "node_modules/mdn-data": { 14199 + "version": "2.28.1", 14200 + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.28.1.tgz", 14201 + "integrity": "sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==", 14202 + "dev": true, 14203 + "license": "CC0-1.0" 14204 + }, 13908 14205 "node_modules/media-typer": { 13909 14206 "version": "1.1.0", 13910 14207 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", ··· 14680 14977 } 14681 14978 }, 14682 14979 "node_modules/node-releases": { 14683 - "version": "2.0.47", 14684 - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", 14685 - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", 14980 + "version": "2.0.51", 14981 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", 14982 + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", 14686 14983 "dev": true, 14687 14984 "license": "MIT", 14688 14985 "engines": { ··· 15569 15866 "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 15570 15867 } 15571 15868 }, 15869 + "node_modules/pluralize": { 15870 + "version": "8.0.0", 15871 + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", 15872 + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", 15873 + "dev": true, 15874 + "license": "MIT", 15875 + "engines": { 15876 + "node": ">=4" 15877 + } 15878 + }, 15572 15879 "node_modules/postcss": { 15573 15880 "version": "8.5.15", 15574 15881 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", ··· 15882 16189 "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", 15883 16190 "license": "MIT" 15884 16191 }, 16192 + "node_modules/quote-js-string": { 16193 + "version": "0.1.0", 16194 + "resolved": "https://registry.npmjs.org/quote-js-string/-/quote-js-string-0.1.0.tgz", 16195 + "integrity": "sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==", 16196 + "dev": true, 16197 + "license": "MIT", 16198 + "engines": { 16199 + "node": ">=22" 16200 + }, 16201 + "funding": { 16202 + "url": "https://github.com/sindresorhus/quote-js-string?sponsor=1" 16203 + } 16204 + }, 15885 16205 "node_modules/random-bytes": { 15886 16206 "version": "1.0.0", 15887 16207 "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", ··· 16315 16635 "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", 16316 16636 "license": "MIT" 16317 16637 }, 16638 + "node_modules/regjsparser": { 16639 + "version": "0.13.2", 16640 + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", 16641 + "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", 16642 + "dev": true, 16643 + "license": "BSD-2-Clause", 16644 + "dependencies": { 16645 + "jsesc": "~3.1.0" 16646 + }, 16647 + "bin": { 16648 + "regjsparser": "bin/parser" 16649 + } 16650 + }, 16318 16651 "node_modules/require-directory": { 16319 16652 "version": "2.1.1", 16320 16653 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", ··· 16341 16674 "dev": true, 16342 16675 "license": "MIT" 16343 16676 }, 16677 + "node_modules/reserved-identifiers": { 16678 + "version": "1.2.0", 16679 + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", 16680 + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", 16681 + "dev": true, 16682 + "license": "MIT", 16683 + "engines": { 16684 + "node": ">=18" 16685 + }, 16686 + "funding": { 16687 + "url": "https://github.com/sponsors/sindresorhus" 16688 + } 16689 + }, 16344 16690 "node_modules/resolve": { 16345 16691 "version": "1.22.12", 16346 16692 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", ··· 16657 17003 "license": "BSD-3-Clause" 16658 17004 }, 16659 17005 "node_modules/semver": { 16660 - "version": "7.8.1", 16661 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", 16662 - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", 17006 + "version": "7.8.5", 17007 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", 17008 + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", 16663 17009 "license": "ISC", 16664 17010 "bin": { 16665 17011 "semver": "bin/semver.js" ··· 17939 18285 "dev": true, 17940 18286 "license": "MIT" 17941 18287 }, 18288 + "node_modules/super-regex": { 18289 + "version": "1.1.0", 18290 + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", 18291 + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", 18292 + "dev": true, 18293 + "license": "MIT", 18294 + "dependencies": { 18295 + "function-timeout": "^1.0.1", 18296 + "make-asynchronous": "^1.0.1", 18297 + "time-span": "^5.1.0" 18298 + }, 18299 + "engines": { 18300 + "node": ">=18" 18301 + }, 18302 + "funding": { 18303 + "url": "https://github.com/sponsors/sindresorhus" 18304 + } 18305 + }, 17942 18306 "node_modules/superagent": { 17943 18307 "version": "8.1.2", 17944 18308 "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", ··· 18057 18421 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 18058 18422 "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 18059 18423 "license": "MIT" 18424 + }, 18425 + "node_modules/time-span": { 18426 + "version": "5.1.0", 18427 + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", 18428 + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", 18429 + "dev": true, 18430 + "license": "MIT", 18431 + "dependencies": { 18432 + "convert-hrtime": "^5.0.0" 18433 + }, 18434 + "engines": { 18435 + "node": ">=12" 18436 + }, 18437 + "funding": { 18438 + "url": "https://github.com/sponsors/sindresorhus" 18439 + } 18060 18440 }, 18061 18441 "node_modules/tiny-invariant": { 18062 18442 "version": "1.3.3", ··· 19356 19736 "dependencies": { 19357 19737 "phin": "^3.6.1" 19358 19738 } 19739 + }, 19740 + "node_modules/web-worker": { 19741 + "version": "1.5.0", 19742 + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", 19743 + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", 19744 + "dev": true, 19745 + "license": "Apache-2.0" 19359 19746 }, 19360 19747 "node_modules/webidl-conversions": { 19361 19748 "version": "3.0.1",
+1
package.json
··· 215 215 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 216 216 "eslint-plugin-react-hooks": "^7.1.1", 217 217 "eslint-plugin-storybook": "^10.3.6", 218 + "eslint-plugin-unicorn": "^72.0.0", 218 219 "eslint-plugin-unused-imports": "^4.4.1", 219 220 "git-cliff": "^2.12.0", 220 221 "globals": "^17.7.0",
+11 -11
src/backend/scrobblers/AbstractScrobbleClient.ts
··· 1011 1011 } = {}, 1012 1012 } = this.config; 1013 1013 1014 - // can't have negative retries! 1015 - const maxRetries = Math.max(0, maxRequestRetries); 1016 - 1017 1014 if(this.scrobbling === true) { 1018 1015 this.logger.warn(`Already scrobble processing! Processing needs to be stopped before it can be started`); 1019 1016 return; 1020 1017 } 1018 + 1019 + // can't have negative retries! 1020 + const maxRetries = Math.max(0, maxRequestRetries); 1021 1021 1022 1022 while (this.scrobbleRetries <= maxRetries) { 1023 1023 try { ··· 1030 1030 this.logger.warn('Stopping scrobble processing due to client no longer usable.'); 1031 1031 await this.notify({title: `Processing Error`, message: `Encountered error while scrobble processing and client is no longer usable, stopping processing!. | Error: ${e.message}`, priority: 'error'}); 1032 1032 throw e; 1033 - } else if (this.authGated()) { 1033 + } 1034 + if (this.authGated()) { 1034 1035 this.logger.warn('Stopping scrobble processing due to client no longer being authenticated.'); 1035 1036 await this.notify({title: ` Processing Error`, message: `Encountered error while scrobble processing and client is no longer authenticated, stopping processing!. | Error: ${e.message}`, priority: 'error'}); 1036 1037 throw e; 1037 - } else if (this.scrobbleRetries < maxRetries) { 1038 + } 1039 + if (this.scrobbleRetries < maxRetries) { 1038 1040 const delayFor = pollingBackoff(this.scrobbleRetries + 1, retryMultiplier); 1039 1041 this.logger.info(`Scrobble processing retries (${this.scrobbleRetries}) less than max processing retries (${maxRetries}), restarting processing after ${delayFor} second delay...`); 1040 1042 await this.notify({title: `Processing Retry`, message: `Encountered error while polling but retries (${this.scrobbleRetries}) are less than max poll retries (${maxRetries}), restarting processing after ${delayFor} second delay. | Error: ${e.message}`, priority: 'warn'}); ··· 1294 1296 if (processable === 0) { 1295 1297 this.deadLogger.verbose(queueStatus); 1296 1298 return; 1297 - } else { 1298 - this.setStatus(`Processing ${processable} Dead Plays`); 1299 1299 } 1300 + this.setStatus(`Processing ${processable} Dead Plays`); 1300 1301 this.logger.info(queueStatus); 1301 1302 if(!this.upstreamRefresh.refreshEnabled) { 1302 1303 this.deadLogger.verbose('Scrobble refresh is DISABLED. All dead scrobbles will likely always be scrobbled (nothing to check duplicates against).'); ··· 1456 1457 // return; 1457 1458 // } 1458 1459 const deadQueueState = deadScrobble.queueStates.find(x => x.queueName === CLIENT_DEAD_QUEUE && x.queueStatus !== 'completed'); 1459 - const isQueued = deadQueueState.queueStatus === 'queued'; 1460 1460 if(deadQueueState === undefined) { 1461 1461 throw new Error(`Play ${deadScrobble.uid} is not currently queued in dead letter.`); 1462 1462 } 1463 + const isQueued = deadQueueState.queueStatus === 'queued'; 1463 1464 //this.deadLetterScrobbles.splice(index, 1); 1464 1465 this.deadLetterGauge.labels(this.getPrometheusLabels()).dec(); 1465 1466 const queueUpdate: Partial<QueueStateNew> = { ··· 1723 1724 if(npUpdateTopReason === 'previous update data matches current') { 1724 1725 if(thresholds.maxMet) { 1725 1726 return [true, `previous matches current update --AND-- ${thresholds.maxReason}`]; 1726 - } else { 1727 - return [false, `previous matches current update --BUT-- ${thresholds.maxReason}`]; 1728 1727 } 1728 + return [false, `previous matches current update --BUT-- ${thresholds.maxReason}`]; 1729 1729 } 1730 1730 1731 1731 return [false, npUpdateTopReason]; ··· 1749 1749 if (!thresholds.minMet) { 1750 1750 return [false, `${npUpdateTopReason} and ${validStatusReason} --BUT-- ${thresholds.minReason}`]; 1751 1751 } 1752 - else if ( 1752 + if ( 1753 1753 // status hasn't changed 1754 1754 this.nowPlayingLastPlay.status?.calculated === sourcePlayerData.status?.calculated 1755 1755 // and both plays are defined and have not changed
+11 -11
src/backend/utils/FSUtils.ts
··· 51 51 } catch (accessError: any) { 52 52 if (accessError.code === 'EACCES') { 53 53 // also can't access directory :( 54 - throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application does not have permission to write to the parent directory`); 55 - } else { 56 - throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application is unable to access the parent directory due to a system error`, { cause: accessError }); 54 + throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application does not have permission to write to the parent directory`,{cause: accessError}); 57 55 } 56 + 57 + throw new Error(`No ${isDir ? 'directory' : 'file'} exists at ${location} and application is unable to access the parent directory due to a system error`, { cause: accessError }); 58 58 } 59 - } else if (code === 'EACCES') { 60 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`); 61 - } else { 62 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, { cause: err }); 63 59 } 60 + if (code === 'EACCES') { 61 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`,{cause: err}); 62 + } 63 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, { cause: err }); 64 64 } 65 65 }; 66 66 ··· 74 74 const { code } = err; 75 75 if (code === 'ENOENT') { 76 76 return false; 77 - } else if (code === 'EACCES') { 78 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`); 79 - } else { 80 - throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, { cause: err }); 81 77 } 78 + if (code === 'EACCES') { 79 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application does not have permission to write to it.`, {cause: err}); 80 + } 81 + throw new Error(`${isDir ? 'Directory' : 'File'} exists at ${location} but application is unable to access it due to a system error`, { cause: err }); 82 82 } 83 83 };
+2 -3
src/client/components/ActivityDetail.tsx
··· 150 150 export const ActivityErrorSummary = (props: {activity: ActivityDetailProps['activity']}) => { 151 151 const { 152 152 activity: { 153 - queueStates = [], 154 153 play: { 155 154 lifecycle = [], 156 155 scrobble, 157 156 } = {}, 158 157 error, 159 - } 158 + } = {} 160 159 } = props; 161 160 if(error !== undefined && error !== null) { 162 161 return <ErrorAlert error={error} />; ··· 381 380 </Collapsible.Indicator> 382 381 <ActivitySummaryFetchable activityUid={activity.uid} {...props}/> 383 382 </Collapsible.Trigger> 384 - <ActivityStateActionsFetchable activity={activity} componentId={props.componentId} componentType={props.componentType} uid={props.activity.uid}/> 383 + <ActivityStateActionsFetchable activity={activity} componentId={props.componentId} componentType={props.componentType} uid={activity.uid}/> 385 384 </HStack> 386 385 <Collapsible.Content borderTopColor="gray.border" 387 386 style={{
+32 -33
src/client/components/ActivityTimeline.tsx
··· 474 474 475 475 if(!a.dt.isSame(b.dt)) { 476 476 return a.dt.isBefore(b.dt) ? -1 : 1; 477 - } else { 478 - // if they are the same timestamp then we need to determine the likely logical order 477 + } 478 + // if they are the same timestamp then we need to determine the likely logical order 479 479 480 - // queue created always occurs before other actions as the play is queued first, then processed 481 - if(b.id.includes('queue-created')) { 482 - return 1; 483 - } 484 - if(a.id.includes('queue-created')) { 485 - return -1; 486 - } 487 - 488 - // transform steps always occur before scrobble actions 489 - if(a.id.includes('scrobble') && b.id === 'transform-steps') { 490 - return 1; 491 - } 492 - if(b.id.includes('scrobble') && a.id === 'transform-steps') { 493 - return -1; 494 - } 480 + // queue created always occurs before other actions as the play is queued first, then processed 481 + if(b.id.includes('queue-created')) { 482 + return 1; 483 + } 484 + if(a.id.includes('queue-created')) { 485 + return -1; 486 + } 487 + 488 + // transform steps always occur before scrobble actions 489 + if(a.id.includes('scrobble') && b.id === 'transform-steps') { 490 + return 1; 491 + } 492 + if(b.id.includes('scrobble') && a.id === 'transform-steps') { 493 + return -1; 494 + } 495 495 496 - // dupe matching always occurs before scrobbling 497 - if(b.id === 'scrobble-match' && a.id === 'scrobble-response') { 498 - return 1; 499 - } 500 - if(a.id === 'scrobble-match' && b.id === 'scrobble-response') { 501 - return -1; 502 - } 496 + // dupe matching always occurs before scrobbling 497 + if(b.id === 'scrobble-match' && a.id === 'scrobble-response') { 498 + return 1; 499 + } 500 + if(a.id === 'scrobble-match' && b.id === 'scrobble-response') { 501 + return -1; 502 + } 503 503 504 - // queue updated (finished) always occurs last 505 - if(a.id.includes('queue-updated')) { 506 - return 1; 507 - } 508 - if(b.id.includes('queue-updated')) { 509 - return -1; 510 - } 504 + // queue updated (finished) always occurs last 505 + if(a.id.includes('queue-updated')) { 506 + return 1; 507 + } 508 + if(b.id.includes('queue-updated')) { 509 + return -1; 511 510 } 512 511 513 512 // nothing else matched, keep order ··· 518 517 console.log(f); 519 518 520 519 521 - const timelineElements: React.JSX.Element[] = timelineItems.map((x) => { 520 + const timelineElements: React.JSX.Element[] = timelineItems.flatMap((x) => { 522 521 const timelineKey = `${x.id}-${x.dt.unix()}`; 523 522 switch(x.id) { 524 523 case 'new': ··· 547 546 } 548 547 } 549 548 return undefined; 550 - }).flat(); 549 + }); 551 550 552 551 return ( 553 552 <MSErrorBoundary>
+6 -6
src/client/components/msComponent/MSComponentDetailed.tsx
··· 176 176 <Flex direction="row" wrap="wrap" style={{whiteSpace: 'break-spaces'}} truncate rowGap="4"> 177 177 <Wrap width="100%" ref={target}> 178 178 <Box marginEnd="auto" truncate> 179 - <MSComponentName data={props.data}/> 180 - <MSComponentType data={props.data}/> 179 + <MSComponentName data={data}/> 180 + <MSComponentType data={data}/> 181 181 </Box> 182 182 <Stack alignItems={isWrapped ? 'flex-start' : 'flex-end'}> 183 - <ComponentStateBadgeActionable size="lg" maxWidth="fit-content" data={props.data} /> 184 - <HStack style={{whiteSpace: 'break-spaces'}}>{sleepingRender}{props.data.status}</HStack> 183 + <ComponentStateBadgeActionable size="lg" maxWidth="fit-content" data={data} /> 184 + <HStack style={{whiteSpace: 'break-spaces'}}>{sleepingRender}{data.status}</HStack> 185 185 </Stack> 186 186 </Wrap> 187 187 <Flex justifyContent="flex-end" rowGap="6" flexDirection="row-reverse" wrap="wrap"> ··· 189 189 </Flex> 190 190 {error !== undefined && error !== null ? <ErrorAlert error={error}/> : undefined} 191 191 {warning !== undefined && warning !== null ? <ErrorAlert error={warning} status="warning"/> : undefined} 192 - <MSErrorBoundary>{props.live ? <PlayersContainerFetchable nowPlaying={isSource ? undefined : true} data={props.data}/> : <PlayersContainer nowPlaying={isSource ? undefined : true} data={props.data} live={props.live}/>}</MSErrorBoundary> 193 - <MSErrorBoundary><ListContainerFilterable render="virtDynamic" componentType={props.data.mode} componentId={props.data.id}/></MSErrorBoundary> 192 + <MSErrorBoundary>{props.live ? <PlayersContainerFetchable nowPlaying={isSource ? undefined : true} data={data}/> : <PlayersContainer nowPlaying={isSource ? undefined : true} data={data} live={props.live}/>}</MSErrorBoundary> 193 + <MSErrorBoundary><ListContainerFilterable render="virtDynamic" componentType={data.mode} componentId={data.id}/></MSErrorBoundary> 194 194 </Flex> 195 195 </MSErrorBoundary> 196 196 )
+2 -2
src/client/components/playActivity/ActivityList.tsx
··· 115 115 const queryClient = useQueryClient(); 116 116 const client = useSSEContext<MsSseEvent>(); 117 117 useSSEAnyEvent(client, (payload) => { 118 - if ('componentId' in (payload.data as object) && (payload.data as Record<string, any>).componentId === props.componentId) { 118 + if ('componentId' in (payload.data as object) && (payload.data as Record<string, any>).componentId === componentId) { 119 119 switch (payload.type) { 120 120 case 'playInsert': 121 121 { ··· 285 285 return ( 286 286 <Stack width="100%" gap="4"> 287 287 <Heading size="3xl" width="100%">{componentType === 'source' ? 'Plays' : 'Scrobbles'}<ListRefereshButton size="md" componentId={props.componentId} filters={filters}/></Heading> 288 - <ListFilters componentType={props.componentType} filters={filters} onChange={setFilter}/> 288 + <ListFilters componentType={componentType} filters={filters} onChange={setFilter}/> 289 289 <ListContainerFetchable {...props} filters={filters} /> 290 290 </Stack> 291 291 )