diff --git a/packages/client/package-lock.json b/packages/client/package-lock.json index 1c3e718..47d9a00 100644 --- a/packages/client/package-lock.json +++ b/packages/client/package-lock.json @@ -36,6 +36,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^14.0.1", + "react-media-recorder": "^1.7.2", "react-router-dom": "^6.12.1", "styled-components": "^5.3.10" }, @@ -75,6 +76,7 @@ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.14.0.tgz", "integrity": "sha512-0YQKKRIxiMlIou+SekQqdCo0ZTHxOcES+K8vKB53cIDpwABNR0P0yRzPgsbgcj3zRJniD93S/ontsnZsCLZrxQ==", "license": "MIT", + "peer": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -178,6 +180,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -2193,6 +2196,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2236,6 +2240,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2856,7 +2861,6 @@ "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.8.tgz", "integrity": "sha512-CVnHcS4iRJPqtIDc411+UmFldk0ShSK3OB+D0bKD8Ck5Vro6dbK5+APZpkuWpbfdL359DIQUnAaMLE+zs/PVyA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/installations": "0.6.9", @@ -2873,7 +2877,6 @@ "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.14.tgz", "integrity": "sha512-unRVY6SvRqfNFIAA/kwl4vK+lvQAL2HVcgu9zTrUtTyYDmtIt/lOuHJynBMYEgLnKm39YKBDhtqdapP2e++ASw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/analytics": "0.10.8", "@firebase/analytics-types": "0.8.2", @@ -2890,7 +2893,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -2901,7 +2903,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -2910,15 +2911,13 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz", "integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/analytics/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -2929,7 +2928,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -2939,7 +2937,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -2949,6 +2946,7 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.7.tgz", "integrity": "sha512-o3ZfnOx0AWBD5n/36p2zPoB0rDDxQP8H/A60zDLvvfRLtW8b3LfCyV97GKpJaAVV1JMMl/BC89EDzMyzxFZxTw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@firebase/component": "0.7.0", "@firebase/logger": "0.5.0", @@ -2965,7 +2963,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.8.tgz", "integrity": "sha512-O49RGF1xj7k6BuhxGpHmqOW5hqBIAEbt2q6POW0lIywx7emYtzPDeQI+ryQpC4zbKX646SoVZ711TN1DBLNSOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -2981,7 +2978,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.15.tgz", "integrity": "sha512-zFIvIFFNqDXpOT2huorz9cwf56VT3oJYRFjSFYdSbGYEJYEaXjLJbfC79lx/zjx4Fh+yuN8pry3TtvwaevrGbg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app-check": "0.8.8", "@firebase/app-check-types": "0.5.2", @@ -2999,7 +2995,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3010,7 +3005,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3020,7 +3014,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3029,22 +3022,19 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz", "integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/app-check-types": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz", "integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/app-check/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3055,7 +3045,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3065,7 +3054,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3089,7 +3077,6 @@ "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz", "integrity": "sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -3103,7 +3090,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3114,7 +3100,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3124,7 +3109,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3165,7 +3149,6 @@ "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.14.tgz", "integrity": "sha512-2eczCSqBl1KUPJacZlFpQayvpilg3dxXLy9cSMTKtQMTQSmondUtPI47P3ikH3bQAXhzKLOE+qVxJ3/IRtu9pw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/auth": "1.7.9", "@firebase/auth-types": "0.12.2", @@ -3183,7 +3166,6 @@ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.9.tgz", "integrity": "sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -3206,7 +3188,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3217,7 +3198,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3227,7 +3207,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3236,15 +3215,13 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz", "integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/auth-types": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz", "integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -3268,7 +3245,6 @@ "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.1.0.tgz", "integrity": "sha512-vSe5s8dY13ilhLnfY0eYRmQsdTbH7PUFZtBbqU6JVX/j8Qp9A6G5gG6//ulbX9/1JFOF1IWNOne9c8S/DOCJaQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/auth-interop-types": "0.2.3", "@firebase/component": "0.6.9", @@ -3285,7 +3261,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3296,7 +3271,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3306,7 +3280,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3316,7 +3289,6 @@ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.8.tgz", "integrity": "sha512-dzXALZeBI1U5TXt6619cv0+tgEhJiwlUtQ55WNZY7vGAjv7Q1QioV969iYwt1AQQ0ovHnEW0YW9TiBfefLvErg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app-check-interop-types": "0.3.2", "@firebase/auth-interop-types": "0.2.3", @@ -3332,7 +3304,6 @@ "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.8.tgz", "integrity": "sha512-OpeWZoPE3sGIRPBKYnW9wLad25RaWbGyk7fFQe4xnJQKRzlynWeFBSRRAoLE2Old01WXwskUiucNqUUVlFsceg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/database": "1.0.8", @@ -3347,7 +3318,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3358,7 +3328,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3368,7 +3337,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3378,7 +3346,6 @@ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.5.tgz", "integrity": "sha512-fTlqCNwFYyq/C6W7AJ5OCuq5CeZuBEsEwptnVxlNPkWCo5cTTyukzAHRSO/jaQcItz33FfYrrFk1SJofcu2AaQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app-types": "0.9.2", "@firebase/util": "1.10.0" @@ -3389,7 +3356,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3399,7 +3365,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3410,7 +3375,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3420,7 +3384,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3430,7 +3393,6 @@ "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.3.tgz", "integrity": "sha512-NwVU+JPZ/3bhvNSJMCSzfcBZZg8SUGyzZ2T0EW3/bkUeefCyzMISSt/TTIfEHc8cdyXGlMqfGe3/62u9s74UEg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -3453,7 +3415,6 @@ "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.38.tgz", "integrity": "sha512-GoS0bIMMkjpLni6StSwRJarpu2+S5m346Na7gr9YZ/BZ/W3/8iHGNr9PxC+f0rNZXqS4fGRn88pICjrZEgbkqQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/firestore": "4.7.3", @@ -3470,7 +3431,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3481,7 +3441,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3491,7 +3450,6 @@ "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz", "integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -3502,7 +3460,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3513,7 +3470,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3523,7 +3479,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3533,7 +3488,6 @@ "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.8.tgz", "integrity": "sha512-Lo2rTPDn96naFIlSZKVd1yvRRqqqwiJk7cf9TZhUerwnPKgBzXy+aHE22ry+6EjCaQusUoNai6mU6p+G8QZT1g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app-check-interop-types": "0.3.2", "@firebase/auth-interop-types": "0.2.3", @@ -3552,7 +3506,6 @@ "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.14.tgz", "integrity": "sha512-dZ0PKOKQFnOlMfcim39XzaXonSuPPAVuzpqA4ONTIdyaJK/OnBaIEVs/+BH4faa1a2tLeR+Jy15PKqDRQoNIJw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/functions": "0.11.8", @@ -3569,7 +3522,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3580,7 +3532,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3589,15 +3540,13 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz", "integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/functions/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3608,7 +3557,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3618,7 +3566,6 @@ "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.9.tgz", "integrity": "sha512-hlT7AwCiKghOX3XizLxXOsTFiFCQnp/oj86zp1UxwDGmyzsyoxtX+UIZyVyH/oBF5+XtblFG9KZzZQ/h+dpy+Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/util": "1.10.0", @@ -3634,7 +3581,6 @@ "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.9.tgz", "integrity": "sha512-2lfdc6kPXR7WaL4FCQSQUhXcPbI7ol3wF+vkgtU25r77OxPf8F/VmswQ7sgIkBBWtymn5ZF20TIKtnOj9rjb6w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/installations": "0.6.9", @@ -3651,7 +3597,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3662,7 +3607,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3672,7 +3616,6 @@ "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz", "integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@firebase/app-types": "0.x" } @@ -3682,7 +3625,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3693,7 +3635,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3715,7 +3656,6 @@ "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.12.tgz", "integrity": "sha512-6q0pbzYBJhZEtUoQx7hnPhZvAbuMNuBXKQXOx2YlWhSrlv9N1m0ZzlNpBbu/ItTzrwNKTibdYzUyaaxdWLg+4w==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/installations": "0.6.9", @@ -3733,7 +3673,6 @@ "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.12.tgz", "integrity": "sha512-pKsiUVZrbmRgdImYqhBNZlkKJbqjlPkVdQRZGRbkTyX4OSGKR0F/oJeCt1a8jEg5UnBp4fdVwSWSp4DuCovvEQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/messaging": "0.12.12", @@ -3749,7 +3688,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3760,7 +3698,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3769,15 +3706,13 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz", "integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/messaging/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3788,7 +3723,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3798,7 +3732,6 @@ "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.9.tgz", "integrity": "sha512-PnVaak5sqfz5ivhua+HserxTJHtCar/7zM0flCX6NkzBNzJzyzlH4Hs94h2Il0LQB99roBqoE5QT1JqWqcLJHQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/installations": "0.6.9", @@ -3815,7 +3748,6 @@ "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.9.tgz", "integrity": "sha512-dNl95IUnpsu3fAfYBZDCVhXNkASE0uo4HYaEPd2/PKscfTvsgqFAOxfAXzBEDOnynDWiaGUnb5M1O00JQ+3FXA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -3833,7 +3765,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3844,7 +3775,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3854,7 +3784,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3863,15 +3792,13 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz", "integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/performance/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3882,7 +3809,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3892,7 +3818,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3902,7 +3827,6 @@ "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.9.tgz", "integrity": "sha512-EO1NLCWSPMHdDSRGwZ73kxEEcTopAxX1naqLJFNApp4hO8WfKfmEpmjxmP5TrrnypjIf2tUkYaKsfbEA7+AMmA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/installations": "0.6.9", @@ -3919,7 +3843,6 @@ "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.9.tgz", "integrity": "sha512-AxzGpWfWFYejH2twxfdOJt5Cfh/ATHONegTd/a0p5flEzsD5JsxXgfkFToop+mypEL3gNwawxrxlZddmDoNxyA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -3937,7 +3860,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3948,7 +3870,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3958,7 +3879,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3967,15 +3887,13 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz", "integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@firebase/remote-config/node_modules/@firebase/component": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -3986,7 +3904,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -3996,7 +3913,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -4006,7 +3922,6 @@ "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.2.tgz", "integrity": "sha512-fxuJnHshbhVwuJ4FuISLu+/76Aby2sh+44ztjF2ppoe0TELIDxPW6/r1KGlWYt//AD0IodDYYA8ZTN89q8YqUw==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/util": "1.10.0", @@ -4022,7 +3937,6 @@ "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.12.tgz", "integrity": "sha512-hA4VWKyGU5bWOll+uwzzhEMMYGu9PlKQc1w4DWxB3aIErWYzonrZjF0icqNQZbwKNIdh8SHjZlFeB2w6OSsjfg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/storage": "0.13.2", @@ -4039,7 +3953,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -4050,7 +3963,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -4060,7 +3972,6 @@ "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz", "integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { "@firebase/app-types": "0.x", "@firebase/util": "1.x" @@ -4071,7 +3982,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -4082,7 +3992,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -4093,6 +4002,7 @@ "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -4105,7 +4015,6 @@ "resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.4.tgz", "integrity": "sha512-EBSqyu9eg8frQlVU9/HjKtHN7odqbh9MtAcVz3WwHj4gLCLOoN9F/o+oxlq3CxvFrd3CNTZwu6d2mZtVlEInng==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/app-check-interop-types": "0.3.2", "@firebase/component": "0.6.9", @@ -4126,7 +4035,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -4137,7 +4045,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -4147,7 +4054,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -4156,8 +4062,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz", "integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/@floating-ui/core": { "version": "1.7.3", @@ -6083,7 +5988,6 @@ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" @@ -6097,7 +6001,6 @@ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -6512,6 +6415,7 @@ "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6610,6 +6514,7 @@ "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.2.0.tgz", "integrity": "sha512-Ub5aRawZqD/3Ndph/9h1ItCQhS7wr4jM+G+6CIQ2GHjcNo9N6MbpLjEMb3e/FFYfgGi0bxuO1v9xgoC2hOz41Q==", "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.3", "ajv": "^8.6.1", @@ -6643,6 +6548,7 @@ "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.2.0.tgz", "integrity": "sha512-k9oub73ONPHjpqRhlW9bRwqbXNNae5UW2U5LzOqRoRuYsRmX8ySQA6NINYbKnh+qfzr8uG+lIyS8wHSf2Y7zzA==", "license": "MIT", + "peer": true, "dependencies": { "lodash": "^4.17.21" }, @@ -6909,6 +6815,7 @@ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.18.0.tgz", "integrity": "sha512-1s0vEZj5XFXDMmz3Arl/R7IncFqJ+WQ95LDp1roHWGDE2oCO3IS4/hmiOv1/8SD9r6B7tv9GLiqVZYHo+6PkTg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9" }, @@ -6935,6 +6842,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/core-downloads-tracker": "^5.18.0", @@ -7040,6 +6948,7 @@ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", @@ -7175,6 +7084,7 @@ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.20.2.tgz", "integrity": "sha512-x1jLg8R+WhvkmUETRfX2wC+xJreMii78EXKLl6r3G+ggcAZlPyt0myID1Amf6hvJb9CtR7CgUo8BwR+1Vx9Ggw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.2", "@mui/base": "^5.0.0-beta.22", @@ -7328,36 +7238,31 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -7367,36 +7272,31 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@radix-ui/number": { "version": "1.0.1", @@ -11071,6 +10971,7 @@ "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -11412,6 +11313,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz", "integrity": "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -11472,6 +11374,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -11483,6 +11386,7 @@ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^18.0.0" } @@ -11657,6 +11561,7 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -12243,6 +12148,7 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -12309,6 +12215,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -12561,6 +12468,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/automation-events": { + "version": "7.1.15", + "resolved": "https://registry.npmjs.org/automation-events/-/automation-events-7.1.15.tgz", + "integrity": "sha512-NsHJlve3twcgs8IyP4iEYph7Fzpnh6klN7G5LahwvypakBjFbsiGHJxrqTmeHKREdu/Tx6oZboqNI0tD4MnFlA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -13016,6 +12936,18 @@ "node": "10.* || >= 12.*" } }, + "node_modules/broker-factory": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", + "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, "node_modules/browser-assert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", @@ -13051,6 +12983,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -13632,6 +13565,21 @@ "dev": true, "license": "MIT" }, + "node_modules/compilerr": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/compilerr/-/compilerr-10.0.2.tgz", + "integrity": "sha512-CFwUXxJ9OuWsSvnLSbefxi+GLsZ0YnuJh40ry5QdmZ1FWK59OG+QB8XSj6t7Kq+/c5DSS7en+cML6GlzHKH58A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "dashify": "^2.0.0", + "indefinite-article": "0.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.15.4" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -13986,6 +13934,15 @@ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, + "node_modules/dashify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz", + "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -14007,7 +13964,8 @@ "version": "1.10.7", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/de-indent": { "version": "1.0.2", @@ -14749,6 +14707,7 @@ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "hasInstallScript": true, "license": "MIT", + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -14869,6 +14828,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -15268,6 +15228,56 @@ "dev": true, "license": "MIT" }, + "node_modules/extendable-media-recorder": { + "version": "6.6.10", + "resolved": "https://registry.npmjs.org/extendable-media-recorder/-/extendable-media-recorder-6.6.10.tgz", + "integrity": "sha512-gnSmLqDFq40ZdbGfuarnMLNqYPLCPpPr0p21V+g67wG4Pv2oCc/ga8sfsZrEM5GywEi7FcpyRm3z99JWZ/0aPw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.9", + "media-encoder-host": "^8.0.76", + "multi-buffer-data-view": "^3.0.20", + "recorder-audio-worklet": "^5.1.26", + "standardized-audio-context": "^25.3.29", + "subscribable-things": "^2.1.6", + "tslib": "^2.4.0" + } + }, + "node_modules/extendable-media-recorder-wav-encoder": { + "version": "7.0.136", + "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder/-/extendable-media-recorder-wav-encoder-7.0.136.tgz", + "integrity": "sha512-K4ZcMSbsTlI7gv92K+UY+czvk37PIPSWLqp5NF3pNDF9S6iffCbNJnl+k1zce02P6tmOAf+ZlzVRRjxSXNEoog==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "extendable-media-recorder-wav-encoder-broker": "^7.0.125", + "extendable-media-recorder-wav-encoder-worker": "^8.0.121", + "tslib": "^2.8.1" + } + }, + "node_modules/extendable-media-recorder-wav-encoder-broker": { + "version": "7.0.125", + "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder-broker/-/extendable-media-recorder-wav-encoder-broker-7.0.125.tgz", + "integrity": "sha512-HVmznJvyG+eFZJRYLd9h3OF0oNNIGEmEHAP4IQ0Y5gwxJcmrFhVmGB4hLi1GT/jNM8aSoCxIePVkCX+5tuGvpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "broker-factory": "^3.1.13", + "extendable-media-recorder-wav-encoder-worker": "^8.0.121", + "tslib": "^2.8.1" + } + }, + "node_modules/extendable-media-recorder-wav-encoder-worker": { + "version": "8.0.121", + "resolved": "https://registry.npmjs.org/extendable-media-recorder-wav-encoder-worker/-/extendable-media-recorder-wav-encoder-worker-8.0.121.tgz", + "integrity": "sha512-UBBgWkyE9fpCLDdrWdTZM56FkImAljpUuxr6+y9W6LHvY7XWhkZP+yO5uZUUquS5IpsBlY2uKOWpKwiLdo3FOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, "node_modules/extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -15357,6 +15367,19 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-unique-numbers": { + "version": "9.0.26", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", + "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -15388,7 +15411,6 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "license": "Apache-2.0", - "peer": true, "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -15732,7 +15754,6 @@ "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.14.1.tgz", "integrity": "sha512-0KZxU+Ela9rUCULqFsUUOYYkjh7OM1EWdIfG6///MtXd0t2/uUIf0iNV5i0KariMhRQ5jve/OY985nrAXFaZeQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/analytics": "0.10.8", "@firebase/analytics-compat": "0.2.14", @@ -15783,7 +15804,6 @@ "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.9.tgz", "integrity": "sha512-yLD5095kVgDw965jepMyUrIgDklD6qH/BZNHeKOgvu7pchOKNjVM+zQoOVYJIKWMWOWBq8IRNVU6NXzBbozaJg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/component": "0.6.9", "@firebase/logger": "0.4.2", @@ -15806,7 +15826,6 @@ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.9.tgz", "integrity": "sha512-gm8EUEJE/fEac86AvHn8Z/QW8BvR56TBw3hMW0O838J/1mThYQXAIQBgUv75EqlCZfdawpWLrKt1uXvp9ciK3Q==", "license": "Apache-2.0", - "peer": true, "dependencies": { "@firebase/util": "1.10.0", "tslib": "^2.1.0" @@ -15817,7 +15836,6 @@ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz", "integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -15827,7 +15845,6 @@ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz", "integrity": "sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -16479,6 +16496,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -16570,6 +16588,7 @@ "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.1.0" }, @@ -16586,6 +16605,7 @@ "integrity": "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==", "devOptional": true, "license": "MIT", + "peer": true, "engines": { "node": ">=20" }, @@ -16912,8 +16932,7 @@ "version": "0.5.10", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "7.0.2", @@ -16988,6 +17007,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.2" } @@ -17603,6 +17623,12 @@ "node": ">=0.8.19" } }, + "node_modules/indefinite-article": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/indefinite-article/-/indefinite-article-0.0.2.tgz", + "integrity": "sha512-Au/2XzRkvxq2J6w5uvSSbBKPZ5kzINx5F2wb0SF8xpRL8BP9Lav81TnRbfPp6p+SYjYxwaaLn4EUwI3/MmYKSw==", + "license": "MIT" + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -18870,8 +18896,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -18966,8 +18991,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -19157,6 +19181,43 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/media-encoder-host": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/media-encoder-host/-/media-encoder-host-8.1.0.tgz", + "integrity": "sha512-VwX3ex48ltl+K1ObGEq3IcZp/XqpNTWemd9brC9ovo89rYmCRKTZAp1FCyfAY86RdvSMrUs26lbo45DIDVyERg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4", + "media-encoder-host-broker": "^7.1.0", + "media-encoder-host-worker": "^9.2.0", + "tslib": "^2.6.2" + } + }, + "node_modules/media-encoder-host-broker": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/media-encoder-host-broker/-/media-encoder-host-broker-7.1.0.tgz", + "integrity": "sha512-Emu3f45Wbf6AoRJxfvZ8e5nh8fRVviBfkABgYNvVUsVBgJ7+l137gn324g/JmNVQhhVQ89fjmGT1kHIJ9JG5Nw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4", + "broker-factory": "^3.0.97", + "fast-unique-numbers": "^9.0.4", + "media-encoder-host-worker": "^9.2.0", + "tslib": "^2.6.2" + } + }, + "node_modules/media-encoder-host-worker": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/media-encoder-host-worker/-/media-encoder-host-worker-9.2.0.tgz", + "integrity": "sha512-LrJJgNBDZH2y1PYBLaiYQw9uFU5i3yPvDkDxdko+L3Z4qzhKq9+4eYxKDqlwO4EdOlaiggvMpkgZl3roOniz2A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.4", + "extendable-media-recorder-wav-encoder-broker": "^7.0.100", + "tslib": "^2.6.2", + "worker-factory": "^7.0.24" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -19425,6 +19486,19 @@ "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", "license": "MIT" }, + "node_modules/multi-buffer-data-view": { + "version": "3.0.24", + "resolved": "https://registry.npmjs.org/multi-buffer-data-view/-/multi-buffer-data-view-3.0.24.tgz", + "integrity": "sha512-jm7Ycplx37ExXyQmqhwl7zfQmAj81y5LLzVx0XyWea4omP9W/xJhLEHs/5b+WojGyYSRt8BHiXZVcYzu68Ma0Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.6", + "tslib": "^2.4.1" + }, + "engines": { + "node": ">=12.20.1" + } + }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -20485,7 +20559,6 @@ "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", "hasInstallScript": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -20779,6 +20852,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -20841,6 +20915,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -20900,6 +20975,16 @@ "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==", "license": "MIT" }, + "node_modules/react-media-recorder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/react-media-recorder/-/react-media-recorder-1.7.2.tgz", + "integrity": "sha512-qNn9VUe/bScN3IXWGbSgULbCnYvfamj8RDzjWa5jAtA8M8l9tKg3GujcCgwx2rLCq4rLw+k048LK8i3oPDx4hQ==", + "license": "MIT", + "dependencies": { + "extendable-media-recorder": "^6.6.5", + "extendable-media-recorder-wav-encoder": "^7.0.68" + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -21182,6 +21267,57 @@ "node": ">=0.10.0" } }, + "node_modules/recorder-audio-worklet": { + "version": "5.1.39", + "resolved": "https://registry.npmjs.org/recorder-audio-worklet/-/recorder-audio-worklet-5.1.39.tgz", + "integrity": "sha512-w/RazoBwZnkFnEPRsJYNThOHznLQC98/IzWRrutpJQVvCcL0nbLsVSLDaRrnrqVpRUI11VgiXRh30HaHiSdVhQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "broker-factory": "^3.0.75", + "fast-unique-numbers": "^7.0.2", + "recorder-audio-worklet-processor": "^4.2.21", + "standardized-audio-context": "^25.3.41", + "subscribable-things": "^2.1.14", + "tslib": "^2.5.0", + "worker-factory": "^6.0.76" + } + }, + "node_modules/recorder-audio-worklet-processor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/recorder-audio-worklet-processor/-/recorder-audio-worklet-processor-4.2.21.tgz", + "integrity": "sha512-oiiS2sp6eMxkvjt13yetSYUJvnAxBZk60mIxz0Vf/2lDWa/4svCyMLHIDzYKbHahkISd0UYyqLS9dI7xDlUOCA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "tslib": "^2.5.0" + } + }, + "node_modules/recorder-audio-worklet/node_modules/fast-unique-numbers": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-7.0.2.tgz", + "integrity": "sha512-xnqpsnu889bHbq5cbDMwCJ2BPf6kjFPMu+RHfqKvisRxeEbTOVxY5aW/ZNsZ/r8OlwatxmjdFEVQog2xAhLkvg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.15.4" + } + }, + "node_modules/recorder-audio-worklet/node_modules/worker-factory": { + "version": "6.0.76", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-6.0.76.tgz", + "integrity": "sha512-W1iBNPmE9p0asU4aFmYJYCnMxhkvk4qlKc660GlHxWgmflY64NxxTbmKqipu4K5p9LiKKPjqXfcQme6153BZEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "compilerr": "^10.0.2", + "fast-unique-numbers": "^7.0.2", + "tslib": "^2.5.0" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -21527,6 +21663,7 @@ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -21592,6 +21729,12 @@ "tslib": "^2.1.0" } }, + "node_modules/rxjs-interop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rxjs-interop/-/rxjs-interop-2.0.0.tgz", + "integrity": "sha512-ASEq9atUw7lualXB+knvgtvwkCEvGWV2gDD/8qnASzBkzEARZck9JAyxmY8OS6Nc1pCPEgDTKNcx+YqqYfzArw==", + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -22100,6 +22243,17 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/standardized-audio-context": { + "version": "25.3.77", + "resolved": "https://registry.npmjs.org/standardized-audio-context/-/standardized-audio-context-25.3.77.tgz", + "integrity": "sha512-Ki9zNz6pKcC5Pi+QPjPyVsD9GwJIJWgryji0XL9cAJXMGyn+dPOf6Qik1AHei0+UNVcc4BOCa0hWLBzlwqsW/A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.6", + "automation-events": "^7.0.9", + "tslib": "^2.7.0" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -22358,6 +22512,17 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, + "node_modules/subscribable-things": { + "version": "2.1.57", + "resolved": "https://registry.npmjs.org/subscribable-things/-/subscribable-things-2.1.57.tgz", + "integrity": "sha512-Ebcu2SJUntGnfJlTKc5jIGcDbuev4Ys2bRstzl5DUyzjWTZV9ymONZ0x8kEiN8NtnDlVuFe40EB8t3XvH8SWkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "rxjs-interop": "^2.0.0", + "tslib": "^2.8.1" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22975,6 +23140,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23060,7 +23226,6 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", "integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.17" } @@ -23600,6 +23765,7 @@ "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.18.10", "postcss": "^8.4.27", @@ -24215,7 +24381,6 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -24230,7 +24395,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=0.8.0" } @@ -24383,6 +24547,17 @@ "dev": true, "license": "MIT" }, + "node_modules/worker-factory": { + "version": "7.0.48", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", + "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -24451,6 +24626,7 @@ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, diff --git a/packages/client/package.json b/packages/client/package.json index 9b6e22f..3c527c4 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -44,6 +44,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^14.0.1", + "react-media-recorder": "^1.7.2", "react-router-dom": "^6.12.1", "styled-components": "^5.3.10" }, diff --git a/packages/client/src/components/tag/videorecord/VideoRecordField.component.tsx b/packages/client/src/components/tag/videorecord/VideoRecordField.component.tsx index cb1a88b..b95c5be 100644 --- a/packages/client/src/components/tag/videorecord/VideoRecordField.component.tsx +++ b/packages/client/src/components/tag/videorecord/VideoRecordField.component.tsx @@ -4,7 +4,7 @@ import { Accordion, AccordionDetails, AccordionSummary, Typography, Stack, Butto import { withJsonFormsControlProps } from '@jsonforms/react'; import { StatusProcessCircles } from './StatusCircles.component'; import { VideoRecordInterface } from './VideoRecordInterface.component'; -import { useEffect, useState, useRef } from 'react'; +import { useEffect, useState, useCallback, FC } from 'react'; import { useApolloClient } from '@apollo/client'; import { SaveVideoFieldDocument, @@ -16,42 +16,21 @@ import axios from 'axios'; import { useTranslation } from 'react-i18next'; const VideoRecordField: React.FC = (props) => { - const [maxVideos, setMaxVideos] = useState(0); - const [minimumVideos, setMinimumVideos] = useState(0); const [validVideos, setValidVideos] = useState([]); const [activeIndex, setActiveIndex] = useState(0); - const [blobs, setBlobs] = useState<(Blob | null)[]>([]); + const [blobs, setBlobs] = useState<{ blobURL: string | null; blob: Blob | null }[]>([]); const [recording, setRecording] = useState(false); const [videoFragmentID, setVideoFragmentID] = useState([]); - const stateRef = useRef<{ - validVideos: boolean[]; - blobs: (Blob | null)[]; - activeIndex: number; - videoFragmentID: string[]; - }>(); - stateRef.current = { validVideos, blobs, activeIndex, videoFragmentID }; const client = useApolloClient(); const { tag } = useTag(); - const { t } = useTranslation(); - const recordingRef = useRef(recording); - recordingRef.current = recording; - - const resetState = () => { - if (!props.uischema.options?.minimumRequired) { - console.error('Minimum number of videos required not specified'); - return; - } - const minimumVideos = props.uischema.options.minimumRequired; - let maxVideos = minimumVideos; - if (props.uischema.options?.maximumOptional) { - maxVideos = props.uischema.options.maximumOptional; - } + // Get the max and min number of videos to record + const minimumVideos = props.uischema.options!.minimumRequired; + const maxVideos = props.uischema.options!.maximumOptional ? props.uischema.options!.maximumOptional : minimumVideos; + const resetState = () => { setValidVideos(Array.from({ length: maxVideos }, (_, _i) => false)); - setMinimumVideos(minimumVideos); - setMaxVideos(maxVideos); - setBlobs(Array.from({ length: maxVideos }, (_, _i) => null)); + setBlobs(Array.from({ length: maxVideos }, (_, _i) => ({ blobURL: null, blob: null }))); setActiveIndex(0); }; @@ -67,91 +46,104 @@ const VideoRecordField: React.FC = (props) => { }, [props.data]); /** Handles saving the video fragment to the database and updating the JSON Forms representation of the data */ - const saveVideoFragment = async (blob: Blob) => { - // Save the video fragment - const result = await client.mutate({ - mutation: SaveVideoFieldDocument, - variables: { - tag: tag!._id, - field: props.path, - index: stateRef.current!.activeIndex + const saveVideoFragmentNew = useCallback( + async (blob: Blob) => { + // Save the video fragment + const result = await client.mutate({ + mutation: SaveVideoFieldDocument, + variables: { + tag: tag!._id, + field: props.path, + index: activeIndex + } + }); + + if (!result.data?.saveVideoField) { + console.error('Failed to save video fragment'); + return; } - }); - if (!result.data?.saveVideoField) { - console.error('Failed to save video fragment'); - return; - } + // Upload the video to the provided URL + await axios.put(result.data.saveVideoField.uploadURL, blob, { + headers: { + 'Content-Type': 'video/webm' + } + }); + + // Update the JSON Forms representation of the data to be the ID of the video fragment + + // If the index is longer than the current videoFragmentID array, then add the new ID to the end + if (activeIndex >= videoFragmentID.length) { + const updatedVideoFragmentID = [...videoFragmentID, result.data!.saveVideoField._id]; + setVideoFragmentID(updatedVideoFragmentID); + props.handleChange(props.path, updatedVideoFragmentID); + } else { + const updatedVideoFragmentID = videoFragmentID.map((id, index) => { + if (index === activeIndex) { + return result.data!.saveVideoField._id; + } + return id; + }); + setVideoFragmentID(updatedVideoFragmentID); + props.handleChange(props.path, updatedVideoFragmentID); + } - // Upload the video to the provided URL - await axios.put(result.data.saveVideoField.uploadURL, blob, { - headers: { - 'Content-Type': 'video/webm' + // Automatic progression + if (activeIndex !== undefined && activeIndex != validVideos.length - 1) { + setActiveIndex(activeIndex + 1); } - }); - - // Update the JSON Forms representation of the data to be the ID of the video fragment - - // If the index is longer than the current videoFragmentID array, then add the new ID to the end - if (stateRef.current!.activeIndex >= stateRef.current!.videoFragmentID.length) { - const updatedVideoFragmentID = [...stateRef.current!.videoFragmentID, result.data!.saveVideoField._id]; - setVideoFragmentID(updatedVideoFragmentID); - props.handleChange(props.path, updatedVideoFragmentID); - } else { - const updatedVideoFragmentID = stateRef.current!.videoFragmentID.map((id, index) => { - if (index === stateRef.current!.activeIndex) { - return result.data!.saveVideoField._id; + }, + [activeIndex, videoFragmentID] + ); + + /** Store the blob and check if the video needs to be saved */ + const handleVideoRecord = useCallback( + (blobURL: string, blob: Blob) => { + // Make a new list of blobs with the recorded one added in + const updatedBlobs = blobs.map((existing, index) => { + // If the index is the active index, then this is where the new recording should be "saved" + if (index === activeIndex) { + return { blobURL, blob }; } - return id; + + // Otherwise keep the current video + return existing; }); - setVideoFragmentID(updatedVideoFragmentID); - props.handleChange(props.path, updatedVideoFragmentID); - } - // Automatic progression - const activeIndex = stateRef.current?.activeIndex; - if (activeIndex !== undefined && activeIndex != validVideos.length - 1) { - setActiveIndex(activeIndex + 1); - } - }; + const updateValidVideos = validVideos.map((valid, index) => { + // If the blob is null, then we don't have a proper recorded video yet + if (index === activeIndex) { + return blob !== null; + } + return valid; + }); - /** Store the blob and check if the video needs to be saved */ - const handleVideoRecord = (video: Blob | null) => { - const updatedBlobs = stateRef.current!.blobs.map((blob, index) => { - if (index === stateRef.current!.activeIndex) { - return video; - } - return blob; - }); - const updateValidVideos = stateRef.current!.validVideos.map((valid, index) => { - if (index === stateRef.current!.activeIndex) { - return video !== null; + if (blob !== null) { + saveVideoFragmentNew(blob); } - return valid; - }); - - if (video !== null) { - saveVideoFragment(video); - } - setBlobs(updatedBlobs); - setValidVideos(updateValidVideos); - }; + setBlobs(updatedBlobs); + setValidVideos(updateValidVideos); + }, + [blobs, validVideos, activeIndex] + ); - // Support for using the space key to progress - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key == ' ') { - // Toggle the recording state - setRecording(!recordingRef.current); - } - }; + const toggleRecording = useCallback( + (e: KeyboardEvent) => { + if (e.key == 'r') { + // Toggle the recording state + setRecording(!recording); + } + }, + [recording] + ); useEffect(() => { // Listen for spaces - document.addEventListener('keydown', handleKeyDown); + document.addEventListener('keydown', toggleRecording); return () => { - document.removeEventListener('keydown', handleKeyDown); + document.removeEventListener('keydown', toggleRecording); }; - }, []); + }, [recording, setRecording]); return ( @@ -161,9 +153,7 @@ const VideoRecordField: React.FC = (props) => { - - {t('tag.videoRequiredOptional', { minimum: minimumVideos, max: maxVideos })} - + {}} activeIndex={activeIndex} /> @@ -174,7 +164,7 @@ const VideoRecordField: React.FC = (props) => { handleVideoRecord(blob)} + handleVideoRecordCompletion={handleVideoRecord} recording={recording} /> @@ -187,15 +177,43 @@ const VideoRecordField: React.FC = (props) => { - + setRecording(!recording)} /> ); }; +interface RecordButtonProps { + recording: boolean; + toggleRecording: () => void; +} + +const RecordButton: FC = ({ recording, toggleRecording }) => { + const { t } = useTranslation(); + + return ( + + ); +}; + +interface VideoCountRequirementsProps { + max: number; + min: number; +} + +const VideoCountRequirements: FC = ({ max, min }) => { + const { t } = useTranslation(); + + if (!min) { + console.error('Minimum number of videos not found'); + } + + return {t('tag.videoRequiredOptional', { minimum: min, max: max })}; +}; + export const videoFieldTester: RankedTester = rankWith(10, (uischema, _schema, _rootSchema) => { return uischema.options != undefined && uischema.options && uischema.options.customType === 'video'; }); diff --git a/packages/client/src/components/tag/videorecord/VideoRecordInterface.component.tsx b/packages/client/src/components/tag/videorecord/VideoRecordInterface.component.tsx index 26a4a6f..4589fea 100644 --- a/packages/client/src/components/tag/videorecord/VideoRecordInterface.component.tsx +++ b/packages/client/src/components/tag/videorecord/VideoRecordInterface.component.tsx @@ -1,90 +1,60 @@ -import { useEffect, useRef, useState, useCallback } from 'react'; +import { useEffect, useRef } from 'react'; +import { useReactMediaRecorder } from 'react-media-recorder'; + +const mimeType = 'video/webm; codecs=vp9'; export interface VideoRecordInterfaceProps { - activeBlob: Blob | null; - recordVideo: (blob: Blob | null) => void; + activeBlob: { blobURL: string | null; blob: Blob | null }; + handleVideoRecordCompletion: (blobURL: string, blob: Blob) => void; recording: boolean; } -export const VideoRecordInterface: React.FC = (props) => { - const videoRef = useRef(null); - const [mediaRecorder, setMediaRecorder] = useState(null); - const [blobs, setBlobs] = useState([]); - const stateRef = useRef<{ blobs: Blob[] }>(); - stateRef.current = { blobs }; - - // On data available, store the blob - const handleOnDataAvailable = useCallback( - (event: BlobEvent) => { - const newBlobs = [...stateRef.current!.blobs, event.data]; - setBlobs(newBlobs); - - // If the recording is complete, send the blob to the parent - if (!props.recording) { - props.recordVideo(new Blob(newBlobs, { type: 'video/webm' })); - } +export const VideoRecordInterface: React.FC = ({ + recording, + handleVideoRecordCompletion, + activeBlob +}) => { + const videoPreviewRef = useRef(null); + const recorder = useReactMediaRecorder({ + video: true, + audio: false, + mediaRecorderOptions: { + mimeType }, - [setBlobs, blobs] - ); - - const startRecording = async () => { - // Clear the blobs - setBlobs([]); - - // Create the media recorder - // TODO: In the future have audio be an option - const stream: MediaStream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false }); - - // Setup the preview - videoRef.current!.srcObject = stream; - videoRef.current!.play(); - - // Set the encoding - const options = { mimeType: 'video/webm; codecs=vp9' }; - - // Create the media recorder - let mediaRecorder = new MediaRecorder(stream, options); - - mediaRecorder.ondataavailable = handleOnDataAvailable; - - // Start recording - mediaRecorder.start(); - setMediaRecorder(mediaRecorder); - }; - - const stopRecording = () => { - if (mediaRecorder) { - mediaRecorder.stop(); + onStop: (blobURL, blob) => handleVideoRecordCompletion(blobURL, blob), + blobPropertyBag: { + type: mimeType } - }; + }); - // Handle changes to the recording status + // Handles switching between live preview and video playback useEffect(() => { - if (props.recording) { - startRecording(); - } else { - stopRecording(); + // If in recording mode, show the user the preview + if (videoPreviewRef.current && recorder.previewStream && recorder.status == 'recording') { + videoPreviewRef.current.srcObject = recorder.previewStream; + } + // Otherwise, show the user the recording video + else if (videoPreviewRef.current && recorder.mediaBlobUrl) { + videoPreviewRef.current.src = activeBlob.blobURL || ''; + videoPreviewRef.current.srcObject = null; } - }, [props.recording]); + }, [recorder.status, recorder.previewStream, recorder.mediaBlobUrl]); - // Control the display based on if an active blob is present + // Handle toggling between recording and not recording useEffect(() => { - // If there is no active blob, show the video preview - if (!props.activeBlob) { - videoRef.current!.style.display = 'block'; - videoRef.current!.src = ''; - return; + if (recording) { + recorder.startRecording(); + } else { + recorder.stopRecording(); } + }, [recording]); - // Otherwise show the recording blobl - const blobUrl = URL.createObjectURL(props.activeBlob); - videoRef.current!.srcObject = null; - videoRef.current!.src = blobUrl; - }, [props.activeBlob]); + // Handle switching between previews from other videos + useEffect(() => {}, [activeBlob]); return ( <> -