diff --git a/CHANGELOG.md b/CHANGELOG.md index 294ea2c4..6349318b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - gui: Show a loading spinner and prevent repeated clicks while a TonieCard background download is in progress - gui: Fixed TAF track downloads in the TonieInformationModal to use the correct linked/source TAF for Content and Tonies views, including uncached Tonies, and keep track selections across re-renders, screen size changes and audio player updates - gui: TeddyStudio: Reworked label printing to generate a browser-independent PDF instead of relying on CSS print layouts, including PDF preview and download functionality [https://github.com/toniebox-reverse-engineering/teddycloud_web/issues/286](https://github.com/toniebox-reverse-engineering/teddycloud_web/issues/286) +- gui: adapted outdated hint to new release candidate tags ### Commits diff --git a/package-lock.json b/package-lock.json index cc658f43..400c2c96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,24 +16,24 @@ "@types/node": "^26.6.5", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "@types/w3c-web-serial": "^1.0.8", + "@types/w3c-web-serial": "^1.0.9", "@vitejs/plugin-react": "^6.1.2", - "antd": "^6.6.6", + "antd": "^6.6.7", "formik": "^2.4.9", - "i18next": "^26.5.3", - "i18next-browser-languagedetector": "^8.2.1", - "i18next-http-backend": "^4.0.4", + "i18next": "^26.5.10", + "i18next-browser-languagedetector": "^8.2.2", + "i18next-http-backend": "^4.0.5", "jszip": "^3.10.2", "react": "^19.3.1", "react-dom": "^19.3.1", - "react-i18next": "^17.1.0", + "react-i18next": "^17.1.8", "react-markdown": "^10.1.0", "react-minimal-pie-chart": "^9.1.2", "react-router-dom": "^7.18.4", "react-syntax-highlighter": "^16.1.2", "styled-components": "^6.6.0", "typescript": "^7.0.2", - "vite": "^8.3.4", + "vite": "^8.3.5", "vite-plugin-svgr": "^5.2.0", "yup": "^1.7.1" }, @@ -1089,9 +1089,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.152.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", - "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/oxc-project" @@ -1786,9 +1786,9 @@ } }, "node_modules/@rc-component/util": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.13.0.tgz", - "integrity": "sha512-IXf2zBfZrbQGT+G8LxnoICDBGnMHIPIiq5HCRn3EDfKUx28x1rnbZBj46ULJf4sM8ImTG1SepqfNBdxZziqQ4w==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.14.0.tgz", + "integrity": "sha512-qFpkGBCiyN3NNAU+FOnZdcdz7A/rXCg3JdQk+bujUKAExZgRqzf2yy1f4YN63Lwctic5FcK9rgjQ6aWbykqwEw==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", @@ -1834,9 +1834,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.12.tgz", - "integrity": "sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", "cpu": [ "arm" ], @@ -1850,9 +1850,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.12.tgz", - "integrity": "sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", "cpu": [ "arm64" ], @@ -1866,9 +1866,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.12.tgz", - "integrity": "sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", "cpu": [ "arm64" ], @@ -1882,9 +1882,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.12.tgz", - "integrity": "sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", "cpu": [ "x64" ], @@ -1898,9 +1898,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.12.tgz", - "integrity": "sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", "cpu": [ "x64" ], @@ -1914,9 +1914,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.12.tgz", - "integrity": "sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", "cpu": [ "arm" ], @@ -1930,12 +1930,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.12.tgz", - "integrity": "sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1946,12 +1949,15 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.12.tgz", - "integrity": "sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -1962,12 +1968,15 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.12.tgz", - "integrity": "sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1978,12 +1987,15 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.12.tgz", - "integrity": "sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -1994,12 +2006,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.12.tgz", - "integrity": "sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2010,12 +2025,15 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.12.tgz", - "integrity": "sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2026,9 +2044,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.12.tgz", - "integrity": "sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", "cpu": [ "arm64" ], @@ -2042,9 +2060,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.12.tgz", - "integrity": "sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", "cpu": [ "arm64" ], @@ -2058,9 +2076,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.12.tgz", - "integrity": "sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", "cpu": [ "x64" ], @@ -3171,9 +3189,9 @@ "license": "MIT" }, "node_modules/@types/w3c-web-serial": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/w3c-web-serial/-/w3c-web-serial-1.0.8.tgz", - "integrity": "sha512-QQOT+bxQJhRGXoZDZGLs3ksLud1dMNnMiSQtBA0w8KXvLpXX4oM4TZb6J0GgJ8UbCaHo5s9/4VQT8uXy9JER2A==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/w3c-web-serial/-/w3c-web-serial-1.0.9.tgz", + "integrity": "sha512-IVPnnhE1IC3Za0j+ykQDMvRwe3m92hcDIAJjUA4aZW+7f+osL48SDS+02Xsqj5dHluXOCsEA9HS10isX4O59EA==", "license": "MIT" }, "node_modules/@types/yargs": { @@ -3620,9 +3638,9 @@ } }, "node_modules/antd": { - "version": "6.6.6", - "resolved": "https://registry.npmjs.org/antd/-/antd-6.6.6.tgz", - "integrity": "sha512-+x4M755a6kyZyxkN2vpfm3HbYkyytPBPSncXHKPHU2ZPs3Z1ctrWwWApe/4ek4O0eUGKNFCpb461yficetktYQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/antd/-/antd-6.6.7.tgz", + "integrity": "sha512-6D9oSAot26LIHYmR0ZyquOZY4WIcgRurZ/9//1GEJoo/vWvKV3E1PJPmB3orGkRlmGxArX3vSJFxQfRKr5qHZA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^8.0.1", @@ -3668,7 +3686,7 @@ "@rc-component/tree-select": "~1.16.1", "@rc-component/trigger": "^3.10.1", "@rc-component/upload": "~1.1.1", - "@rc-component/util": "^1.13.0", + "@rc-component/util": "^1.14.0", "clsx": "^2.1.1", "dayjs": "^1.11.11", "scroll-into-view-if-needed": "^3.1.0", @@ -4592,9 +4610,9 @@ } }, "node_modules/i18next": { - "version": "26.5.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.5.3.tgz", - "integrity": "sha512-6pRwOwJ6lBCBB66fqNZaSoUmvsALHMord7FL6GsDhubT1CrPabTMEJIqddm0nn2YEbKofdI/3VAtGrQPuztY1Q==", + "version": "26.5.10", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.5.10.tgz", + "integrity": "sha512-YS4EiLQhhk0wGThm4Zy+BL2c9rBNIK+kAbksi4l/B+D6kVRQLIFZgu2b/MU2LibJJHwWNTYoOYR52T+jfV8kPQ==", "funding": [ { "type": "individual", @@ -4620,18 +4638,18 @@ } }, "node_modules/i18next-browser-languagedetector": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz", - "integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.2.tgz", + "integrity": "sha512-99PKPDVeLj7s4nDJAz+z664/6IWEb2EyssTsknyzc1MY+mmtAXpx3BP862MrKLGRtmSJnlUioPuOE22F+RR+ng==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2" + "@babel/runtime": "^7.29.2" } }, "node_modules/i18next-http-backend": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.4.tgz", - "integrity": "sha512-nG9OQKvUsPiTVUBg1rCGmvmWhzxC9GOxVbGdTYyejHVMSUjutt1hiBNVSzhB/ZE7keL9Xkb880kUfhDovV5T5g==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.5.tgz", + "integrity": "sha512-0uXq24ZAVFwbA0MGija0AZYBcs8iA+wbC//UiDyZwPC3/wZfyD20LgGxvjMOqf9o3/pDJ05ZLIlB4U3+AdA9AQ==", "license": "MIT", "engines": { "node": ">=18" @@ -6458,9 +6476,9 @@ "license": "MIT" }, "node_modules/react-i18next": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.1.0.tgz", - "integrity": "sha512-4VouOnTDyvhvqXx6WZ+s3/cgSiaLutILdYkO3P1Ms+4qcKR7At+JP4Vi7IeHkVLyVV+DmN1l23Pn73UcwSGGPA==", + "version": "17.1.8", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.1.8.tgz", + "integrity": "sha512-vGH+Tbhqbv5LdN9KvC9GEmQ6ATxJAjyxPEK0zSCSRlkeDqCPNxVtEOvDNRAz+51HTxc6QPwhnHaFD7ICu6pD1A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.7", @@ -6686,12 +6704,12 @@ } }, "node_modules/rolldown": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.12.tgz", - "integrity": "sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.152.0", + "@oxc-project/types": "=0.155.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -6701,21 +6719,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.12", - "@rolldown/binding-android-arm64": "1.2.12", - "@rolldown/binding-darwin-arm64": "1.2.12", - "@rolldown/binding-darwin-x64": "1.2.12", - "@rolldown/binding-freebsd-x64": "1.2.12", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.12", - "@rolldown/binding-linux-arm64-gnu": "1.2.12", - "@rolldown/binding-linux-arm64-musl": "1.2.12", - "@rolldown/binding-linux-ppc64-gnu": "1.2.12", - "@rolldown/binding-linux-s390x-gnu": "1.2.12", - "@rolldown/binding-linux-x64-gnu": "1.2.12", - "@rolldown/binding-linux-x64-musl": "1.2.12", - "@rolldown/binding-openharmony-arm64": "1.2.12", - "@rolldown/binding-win32-arm64-msvc": "1.2.12", - "@rolldown/binding-win32-x64-msvc": "1.2.12" + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" } }, "node_modules/rxjs": { @@ -7420,15 +7438,15 @@ } }, "node_modules/vite": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", - "integrity": "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", - "postcss": "^8.5.29", - "rolldown": "~1.2.12", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", "tinyglobby": "^0.2.17" }, "bin": { @@ -7445,7 +7463,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.7.1", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", diff --git a/package.json b/package.json index 2a1d9568..b4945f9b 100644 --- a/package.json +++ b/package.json @@ -12,24 +12,24 @@ "@types/node": "^26.6.5", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", - "@types/w3c-web-serial": "^1.0.8", + "@types/w3c-web-serial": "^1.0.9", "@vitejs/plugin-react": "^6.1.2", - "antd": "^6.6.6", + "antd": "^6.6.7", "formik": "^2.4.9", - "i18next": "^26.5.3", - "i18next-browser-languagedetector": "^8.2.1", - "i18next-http-backend": "^4.0.4", + "i18next": "^26.5.10", + "i18next-browser-languagedetector": "^8.2.2", + "i18next-http-backend": "^4.0.5", "jszip": "^3.10.2", "react": "^19.3.1", "react-dom": "^19.3.1", - "react-i18next": "^17.1.0", + "react-i18next": "^17.1.8", "react-markdown": "^10.1.0", "react-minimal-pie-chart": "^9.1.2", "react-router-dom": "^7.18.4", "react-syntax-highlighter": "^16.1.2", "styled-components": "^6.6.0", "typescript": "^7.0.2", - "vite": "^8.3.4", + "vite": "^8.3.5", "vite-plugin-svgr": "^5.2.0", "yup": "^1.7.1" }, diff --git a/public/translations/de.json b/public/translations/de.json index 717b200b..5241aad5 100644 --- a/public/translations/de.json +++ b/public/translations/de.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "Es ist eine neue Version verfügbar!", "newVersionDetailsAvailable": "Du verwendest nicht die neueste TeddyCloud-Version. Bitte aktualisiere, um alle Vorteile der neuesten Veröffentlichung zu erhalten!", "newVersionDetailsAvailableDevelop": "Du verwendest nicht die neueste TeddyCloud-Develop-Version. Bitte aktualisiere, um alle Vorteile der neuesten Develop-Version zu erhalten!", + "newVersionDetailsAvailableReleaseCandidate": "Du verwendest nicht die neueste TeddyCloud-Release-Kandidaten-Version. Bitte aktualisiere, um alle Vorteile der neuesten Release-Kandidaten-Version zu erhalten!", "newVersionShort": "Update verfügbar", "openNewVersionInGithub": "Neueste Version auf GitHub öffnen" }, diff --git a/public/translations/en.json b/public/translations/en.json index a1229b78..2878a250 100644 --- a/public/translations/en.json +++ b/public/translations/en.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "There is a new version available!", "newVersionDetailsAvailable": "You are not using the latest TeddyCloud version. Please update to get all benefits of the latest release!", "newVersionDetailsAvailableDevelop": "You are not using the latest TeddyCloud develop version. Please update to get all benefits of the latest develop version!", + "newVersionDetailsAvailableReleaseCandidate": "You are not using the latest TeddyCloud release candidate version. Please update to take full advantage of the latest release candidate!", "newVersionShort": "Update available", "openNewVersionInGithub": "Open the latest version on GitHub" }, diff --git a/public/translations/es.json b/public/translations/es.json index 668c7146..b64fd85f 100644 --- a/public/translations/es.json +++ b/public/translations/es.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "¡Hay una nueva versión disponible!", "newVersionDetailsAvailable": "No estás usando la versión más reciente de TeddyCloud. Actualiza para obtener todos los beneficios de la última versión.", "newVersionDetailsAvailableDevelop": "No estás usando la versión más reciente de la versión develop de TeddyCloud. Actualiza para obtener todos los beneficios de la última versión develop.", + "newVersionDetailsAvailableReleaseCandidate": "No estás utilizando la última versión candidata de TeddyCloud. ¡Actualiza para aprovechar todas las ventajas de la última versión candidata!", "newVersionShort": "Actualización disponible", "openNewVersionInGithub": "Abrir la última versión en GitHub" }, diff --git a/public/translations/fr.json b/public/translations/fr.json index 9db89572..03798f1d 100644 --- a/public/translations/fr.json +++ b/public/translations/fr.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "Une nouvelle version est disponible !", "newVersionDetailsAvailable": "Tu n'utilises pas la dernière version de TeddyCloud. Mets à jour pour profiter de tous les avantages de la dernière version !", "newVersionDetailsAvailableDevelop": "Tu n'utilises pas la dernière version develop de TeddyCloud. Mets à jour pour profiter de tous les avantages de la dernière version develop !", + "newVersionDetailsAvailableReleaseCandidate": "Vous n'utilisez pas la dernière version candidate de TeddyCloud. Veuillez effectuer la mise à jour pour profiter pleinement des avantages de cette dernière version candidate !", "newVersionShort": "Mise à jour disponible", "openNewVersionInGithub": "Ouvrir la dernière version sur GitHub" }, diff --git a/public/translations/it.json b/public/translations/it.json index 78b2fbd0..37869dfb 100644 --- a/public/translations/it.json +++ b/public/translations/it.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "È disponibile una nuova versione!", "newVersionDetailsAvailable": "Non stai utilizzando l'ultima versione di TeddyCloud. Aggiorna per usufruire di tutti i vantaggi dell'ultima release!", "newVersionDetailsAvailableDevelop": "Non stai utilizzando l'ultima versione di sviluppo di TeddyCloud. Aggiorna per usufruire di tutti i vantaggi dell'ultima versione di sviluppo!", + "newVersionDetailsAvailableReleaseCandidate": "Non stai utilizzando l'ultima versione candidata al rilascio di TeddyCloud. Aggiorna per sfruttare tutti i vantaggi dell'ultima versione candidata!", "newVersionShort": "Aggiornamento disponibile", "openNewVersionInGithub": "Apri l'ultima versione su GitHub" }, diff --git a/public/translations/pl.json b/public/translations/pl.json index 35794a23..7104c4a7 100644 --- a/public/translations/pl.json +++ b/public/translations/pl.json @@ -1163,6 +1163,7 @@ "newVersionAvailable": "Dostępna jest nowa wersja!", "newVersionDetailsAvailable": "Nie korzystasz z najnowszej wersji TeddyCloud. Zaktualizuj, aby uzyskać wszystkie korzyści najnowszego wydania!", "newVersionDetailsAvailableDevelop": "Nie korzystasz z najnowszej wersji rozwojowej TeddyCloud. Zaktualizuj, aby uzyskać wszystkie korzyści najnowszej wersji rozwojowej!", + "newVersionDetailsAvailableReleaseCandidate": "Nie korzystasz z najnowszej wersji kandydującej do wydania TeddyCloud. Zaktualizuj ją, aby móc korzystać ze wszystkich zalet najnowszej wersji kandydującej!", "newVersionShort": "Dostępna aktualizacja", "openNewVersionInGithub": "Otwórz najnowszą wersję na GitHubie" }, diff --git a/src/components/common/footer/StyledFooter.tsx b/src/components/common/footer/StyledFooter.tsx index c22f0750..b48f56d6 100644 --- a/src/components/common/footer/StyledFooter.tsx +++ b/src/components/common/footer/StyledFooter.tsx @@ -54,6 +54,8 @@ export const StyledFooter = () => { latestDevelopSHA, newVersionAvailable, isDevelopVersion, + isReleaseCandidateVersion, + latestReleaseCandidateTag, } = useTeddyCloudVersion(); const [isAudioPlayerVisible, setIsAudioPlayerVisible] = useState(false); @@ -85,9 +87,11 @@ export const StyledFooter = () => { { - { const { t } = useTranslation(); - const { version, versionShort, isDevelopVersion, commitGitSha } = useTeddyCloudVersion(); + const { + version, + versionShort, + isDevelopVersion, + commitGitSha, + isReleaseCandidateVersion, + latestReleaseCandidateTag, + } = useTeddyCloudVersion(); const features = t("home.features.features", { returnObjects: true, @@ -28,9 +35,11 @@ export const Features = () => { {t("home.build")}:{" "} { const { t } = useTranslation(); const navigate = useNavigate(); - const { newVersionAvailable, isDevelopVersion, latestDevelopSHA, latestReleaseVersion } = - useTeddyCloudVersion(); + const { + newVersionAvailable, + isDevelopVersion, + isReleaseCandidateVersion, + latestReleaseCandidateTag, + latestDevelopSHA, + latestReleaseVersion, + } = useTeddyCloudVersion(); const { tonies, @@ -76,16 +82,20 @@ export const Home = () => { description={ <> - {isDevelopVersion - ? t("teddycloud.newVersionDetailsAvailableDevelop") - : t("teddycloud.newVersionDetailsAvailable")}{" "} + {isReleaseCandidateVersion + ? t("teddycloud.newVersionDetailsAvailableReleaseCandidate") + : isDevelopVersion + ? t("teddycloud.newVersionDetailsAvailableDevelop") + : t("teddycloud.newVersionDetailsAvailable")}{" "} { + const match = ref.match(/^refs\/tags\/rc_v(\d+)\.(\d+)\.(\d+)(?:-(?:rc)?(\d+))?$/); + + return match + ? [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4] ?? 0)] + : null; +}; + export const useTeddyCloudVersion = () => { const [version, setVersion] = useState(""); const [versionShort, setVersionShort] = useState(""); @@ -12,7 +31,10 @@ export const useTeddyCloudVersion = () => { const [newVersionAvailable, setNewVersionAvailable] = useState(false); const [isDevelopVersion, setIsDevelopVersion] = useState(false); + const [isReleaseCandidateVersion, setIsReleaseCandidateVersion] = useState(false); + const [latestDevelopSHA, setLatestDevelopSHA] = useState(""); + const [latestReleaseCandidateTag, setLatestReleaseCandidateTag] = useState(""); const [latestReleaseVersion, setLatestReleaseVersion] = useState(""); useEffect(() => { @@ -42,17 +64,55 @@ export const useTeddyCloudVersion = () => { return; } - const develop = versionShort.endsWith("X.X.X"); + const develop = versionShort.endsWith("X.X.X") && !versionShort.includes("rc"); + const releaseCandidate = versionShort.includes("rc"); + setIsDevelopVersion(develop); + setIsReleaseCandidateVersion(releaseCandidate); - const endpoint = develop - ? "/reverseGeneric/teddycloud_develop" - : "/reverseGeneric/teddycloud_release"; + const endpoint = releaseCandidate + ? "/reverseGeneric/teddycloud_release_candidate" + : develop + ? "/reverseGeneric/teddycloud_develop" + : "/reverseGeneric/teddycloud_release"; api.apiGetTeddyCloudApiRaw(endpoint) .then((response) => response.json()) .then((versionInfo) => { - if (develop) { + if (releaseCandidate) { + const refs = versionInfo as GitHubRef[]; + + const candidates = refs + .map((ref) => ({ + ...ref, + version: parseRcVersion(ref.ref), + })) + .filter((ref) => ref.version !== null && ref.object.type === "commit"); + + candidates.sort((a, b) => { + const va = a.version!; + const vb = b.version!; + + for (let i = 0; i < 4; i++) { + if (va[i] !== vb[i]) { + return vb[i] - va[i]; + } + } + + return 0; + }); + + const latestSHA = candidates[0]?.object.sha; + + if (!latestSHA) { + return; + } + + setLatestReleaseCandidateTag(candidates[0].ref.replace("refs/tags/", "")); + setNewVersionAvailable( + !commitGitSha.includes("unknown") && commitGitSha !== latestSHA, + ); + } else if (develop) { const latestDevelopSHA = versionInfo.sha; setNewVersionAvailable( !commitGitSha.includes("unknown") && commitGitSha !== latestDevelopSHA, @@ -75,8 +135,10 @@ export const useTeddyCloudVersion = () => { commitGitShaShort, commitGitSha, latestDevelopSHA, + latestReleaseCandidateTag, latestReleaseVersion, newVersionAvailable, isDevelopVersion, + isReleaseCandidateVersion, }; };