diff --git a/package.json b/package.json index 9240fca..6992870 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "eslint": "^8.57.0", "prettier": "^3.2.5", "sass": "^1.71.1", - "typescript": "^5.3.3" + "typescript": "^5.4.2" }, "resolutions": { "formidable": "^3.2.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2f87a5..de120e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,11 +21,14 @@ specifier: ^1.71.1 version: 1.71.1 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 qwilight-fe: dependencies: + '@tanstack/react-query': + specifier: ^5.25.0 + version: 5.25.0(react@18.2.0) axios: specifier: ^1.6.7 version: 1.6.7 @@ -45,8 +48,8 @@ specifier: ^3.21.2 version: 3.21.2 i18next: - specifier: ^23.10.0 - version: 23.10.0 + specifier: ^23.10.1 + version: 23.10.1 mobx: specifier: ^6.12.0 version: 6.12.0 @@ -66,14 +69,14 @@ specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-i18next: - specifier: ^14.0.5 - version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.1.0 + version: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) react-router-dom: - specifier: ^6.22.2 - version: 6.22.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.22.3 + version: 6.22.3(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: ^5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.4.2) react-spinners: specifier: ^0.13.8 version: 0.13.8(react-dom@18.2.0)(react@18.2.0) @@ -87,8 +90,8 @@ specifier: ^1.1.3 version: 1.1.3 sweetalert2: - specifier: ^11.10.5 - version: 11.10.5 + specifier: ^11.10.6 + version: 11.10.6 taehui-ts: specifier: workspace:^ version: link:../taehui-ts @@ -103,14 +106,14 @@ specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.11.24 - version: 20.11.24 + specifier: ^20.11.25 + version: 20.11.25 '@types/react': - specifier: ^18.2.61 - version: 18.2.61 + specifier: ^18.2.64 + version: 18.2.64 '@types/react-dom': - specifier: ^18.2.19 - version: 18.2.19 + specifier: ^18.2.21 + version: 18.2.21 '@types/react-router-dom': specifier: ^5.3.3 version: 5.3.3 @@ -118,8 +121,8 @@ specifier: ^1.1.4 version: 1.1.4 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 taehui-fe: dependencies: @@ -139,8 +142,8 @@ specifier: ^3.0.9 version: 3.0.9 i18next: - specifier: ^23.10.0 - version: 23.10.0 + specifier: ^23.10.1 + version: 23.10.1 mobx: specifier: ^6.12.0 version: 6.12.0 @@ -151,8 +154,8 @@ specifier: ^18.2.0 version: 18.2.0 react-content-loader: - specifier: ^6.2.1 - version: 6.2.1(react@18.2.0) + specifier: ^7.0.0 + version: 7.0.0(react@18.2.0) react-contexify: specifier: ^6.0.0 version: 6.0.0(react-dom@18.2.0)(react@18.2.0) @@ -160,20 +163,20 @@ specifier: ^18.2.0 version: 18.2.0(react@18.2.0) react-i18next: - specifier: ^14.0.5 - version: 14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.1.0 + version: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) react-infinite-scroll-component: specifier: ^6.1.0 version: 6.1.0(react@18.2.0) react-router-dom: - specifier: ^6.22.2 - version: 6.22.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.22.3 + version: 6.22.3(react-dom@18.2.0)(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.3.3) + version: 5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.4.2) react-textarea-autosize: specifier: ^8.5.3 - version: 8.5.3(@types/react@18.2.61)(react@18.2.0) + version: 8.5.3(@types/react@18.2.64)(react@18.2.0) react-toastify: specifier: ^10.0.4 version: 10.0.4(react-dom@18.2.0)(react@18.2.0) @@ -184,8 +187,8 @@ specifier: ^1.1.3 version: 1.1.3 sweetalert2: - specifier: ^11.10.5 - version: 11.10.5 + specifier: ^11.10.6 + version: 11.10.6 taehui-ts: specifier: workspace:^ version: link:../taehui-ts @@ -200,14 +203,14 @@ specifier: ^29.5.12 version: 29.5.12 '@types/node': - specifier: ^20.11.24 - version: 20.11.24 + specifier: ^20.11.25 + version: 20.11.25 '@types/react': - specifier: ^18.2.61 - version: 18.2.61 + specifier: ^18.2.64 + version: 18.2.64 '@types/react-dom': - specifier: ^18.2.19 - version: 18.2.19 + specifier: ^18.2.21 + version: 18.2.21 '@types/showdown': specifier: ^2.0.6 version: 2.0.6 @@ -218,35 +221,35 @@ specifier: ^2.0.6 version: 2.0.6(@types/express@4.17.17) typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.2 + version: 5.4.2 taehui-ts: devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3) + version: 11.1.6(rollup@4.12.1)(tslib@2.6.2)(typescript@5.4.2) '@types/qs': specifier: ^6.9.12 version: 6.9.12 '@types/react': - specifier: ^18.2.61 - version: 18.2.61 + specifier: ^18.2.64 + version: 18.2.64 dayjs: specifier: ^1.11.10 version: 1.11.10 qs: - specifier: ^6.11.2 - version: 6.11.2 + specifier: ^6.12.0 + version: 6.12.0 react: specifier: ^18.2.0 version: 18.2.0 react-router-dom: - specifier: ^6.22.2 - version: 6.22.2(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.22.3 + version: 6.22.3(react-dom@18.2.0)(react@18.2.0) rollup: - specifier: ^4.12.0 - version: 4.12.0 + specifier: ^4.12.1 + version: 4.12.1 tslib: specifier: ^2.6.2 version: 2.6.2 @@ -284,11 +287,11 @@ specifier: ^9.0.1 version: 9.0.1 winston: - specifier: ^3.11.0 - version: 3.11.0 + specifier: ^3.12.0 + version: 3.12.0 winston-daily-rotate-file: specifier: ^5.0.0 - version: 5.0.0(winston@3.11.0) + version: 5.0.0(winston@3.12.0) devDependencies: '@types/koa': specifier: ^2.15.0 @@ -2307,7 +2310,7 @@ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -2319,7 +2322,7 @@ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -2340,7 +2343,7 @@ '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -2377,7 +2380,7 @@ dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 jest-mock: 27.5.1 dev: false @@ -2394,7 +2397,7 @@ dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 20.11.24 + '@types/node': 20.11.25 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -2423,7 +2426,7 @@ '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -2531,7 +2534,7 @@ dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 '@types/yargs': 16.0.5 chalk: 4.1.2 dev: false @@ -2543,7 +2546,7 @@ '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: false @@ -2555,7 +2558,7 @@ '@jest/schemas': 29.6.0 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 '@types/yargs': 17.0.24 chalk: 4.1.2 dev: true @@ -2682,8 +2685,8 @@ resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} dev: false - /@remix-run/router@1.15.2: - resolution: {integrity: sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q==} + /@remix-run/router@1.15.3: + resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==} engines: {node: '>=14.0.0'} /@rollup/plugin-babel@5.3.1(@babel/core@7.22.9)(rollup@2.79.1): @@ -2728,7 +2731,7 @@ rollup: 2.79.1 dev: false - /@rollup/plugin-typescript@11.1.6(rollup@4.12.0)(tslib@2.6.2)(typescript@5.3.3): + /@rollup/plugin-typescript@11.1.6(rollup@4.12.1)(tslib@2.6.2)(typescript@5.4.2): resolution: {integrity: sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2741,11 +2744,11 @@ tslib: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.0) + '@rollup/pluginutils': 5.1.0(rollup@4.12.1) resolve: 1.22.2 - rollup: 4.12.0 + rollup: 4.12.1 tslib: 2.6.2 - typescript: 5.3.3 + typescript: 5.4.2 dev: true /@rollup/pluginutils@3.1.0(rollup@2.79.1): @@ -2760,7 +2763,7 @@ rollup: 2.79.1 dev: false - /@rollup/pluginutils@5.1.0(rollup@4.12.0): + /@rollup/pluginutils@5.1.0(rollup@4.12.1): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -2772,107 +2775,107 @@ '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.12.0 + rollup: 4.12.1 dev: true - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + /@rollup/rollup-android-arm-eabi@4.12.1: + resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + /@rollup/rollup-android-arm64@4.12.1: + resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + /@rollup/rollup-darwin-arm64@4.12.1: + resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + /@rollup/rollup-darwin-x64@4.12.1: + resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + /@rollup/rollup-linux-arm-gnueabihf@4.12.1: + resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + /@rollup/rollup-linux-arm64-gnu@4.12.1: + resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + /@rollup/rollup-linux-arm64-musl@4.12.1: + resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + /@rollup/rollup-linux-riscv64-gnu@4.12.1: + resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + /@rollup/rollup-linux-x64-gnu@4.12.1: + resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + /@rollup/rollup-linux-x64-musl@4.12.1: + resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + /@rollup/rollup-win32-arm64-msvc@4.12.1: + resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + /@rollup/rollup-win32-ia32-msvc@4.12.1: + resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + /@rollup/rollup-win32-x64-msvc@4.12.1: + resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} cpu: [x64] os: [win32] requiresBuild: true @@ -3047,7 +3050,7 @@ /@types/accepts@1.3.5: resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} @@ -3082,18 +3085,18 @@ resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/co-body@6.1.0: resolution: {integrity: sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 '@types/qs': 6.9.12 dev: false @@ -3101,13 +3104,13 @@ resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} dependencies: '@types/express-serve-static-core': 4.17.35 - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/content-disposition@0.5.5: resolution: {integrity: sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==} @@ -3118,7 +3121,7 @@ '@types/connect': 3.4.35 '@types/express': 4.17.17 '@types/keygrip': 1.0.2 - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/crypto-js@4.2.2: resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} @@ -3158,7 +3161,7 @@ /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 '@types/qs': 6.9.12 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -3174,7 +3177,7 @@ /@types/formidable@2.0.6: resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/geojson@7946.0.10: @@ -3184,7 +3187,7 @@ /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/history@4.7.11: @@ -3204,7 +3207,7 @@ /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} @@ -3258,7 +3261,7 @@ '@types/http-errors': 2.0.1 '@types/keygrip': 1.0.2 '@types/koa-compose': 3.2.5 - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/mime@1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} @@ -3270,8 +3273,8 @@ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@20.11.24: - resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} + /@types/node@20.11.25: + resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} dependencies: undici-types: 5.26.5 @@ -3296,17 +3299,17 @@ /@types/range-parser@1.2.4: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - /@types/react-dom@18.2.19: - resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} + /@types/react-dom@18.2.21: + resolution: {integrity: sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==} dependencies: - '@types/react': 18.2.61 + '@types/react': 18.2.64 dev: true /@types/react-router-dom@5.3.3: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.61 + '@types/react': 18.2.64 '@types/react-router': 5.1.20 dev: true @@ -3314,11 +3317,11 @@ resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.61 + '@types/react': 18.2.64 dev: true - /@types/react@18.2.61: - resolution: {integrity: sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==} + /@types/react@18.2.64: + resolution: {integrity: sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==} dependencies: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 @@ -3327,7 +3330,7 @@ /@types/resolve@1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/retry@0.12.0: @@ -3345,7 +3348,7 @@ resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/serve-index@1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} @@ -3358,7 +3361,7 @@ dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 /@types/showdown@2.0.6: resolution: {integrity: sha512-pTvD/0CIeqe4x23+YJWlX2gArHa8G0J0Oh6GKaVXV7TAeickpkkZiNOgFcFcmLQ5lB/K0qBJL1FtRYltBfbGCQ==} @@ -3367,7 +3370,7 @@ /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/sprintf-js@1.1.4: @@ -3391,7 +3394,7 @@ /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /@types/yargs-parser@21.0.0: @@ -3408,7 +3411,7 @@ dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3420,36 +3423,36 @@ optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: false - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3461,10 +3464,10 @@ dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - typescript: 5.3.3 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false @@ -3477,7 +3480,7 @@ '@typescript-eslint/visitor-keys': 5.62.0 dev: false - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3487,12 +3490,12 @@ typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4(supports-color@5.5.0) eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false @@ -3502,7 +3505,7 @@ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3517,13 +3520,13 @@ globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3534,7 +3537,7 @@ '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.5.4 @@ -4314,6 +4317,17 @@ dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.1 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -4464,7 +4478,7 @@ resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} dependencies: inflation: 2.0.0 - qs: 6.11.2 + qs: 6.12.0 raw-body: 2.5.2 type-is: 1.6.18 dev: false @@ -5027,6 +5041,14 @@ execa: 5.1.1 dev: false + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -5387,6 +5409,16 @@ resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: false + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + /es-module-lexer@1.3.0: resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} dev: false @@ -5478,7 +5510,7 @@ source-map: 0.6.1 dev: false - /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): resolution: {integrity: sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -5491,19 +5523,19 @@ '@babel/core': 7.22.9 '@babel/eslint-parser': 7.22.9(@babel/core@7.22.9)(eslint@8.57.0) '@rushstack/eslint-patch': 1.3.2 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) babel-preset-react-app: 10.0.1 confusing-browser-globals: 1.0.11 eslint: 8.57.0 eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint@8.57.0) - eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.3.3) + eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.57.0) eslint-plugin-react: 7.32.2(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.3.3) - typescript: 5.3.3 + eslint-plugin-testing-library: 5.11.0(eslint@8.57.0)(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - '@babel/plugin-syntax-flow' - '@babel/plugin-transform-react-jsx' @@ -5544,7 +5576,7 @@ eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.7 @@ -5577,7 +5609,7 @@ '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 @@ -5600,7 +5632,7 @@ - supports-color dev: false - /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.3.3): + /eslint-plugin-jest@25.7.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2): resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -5613,8 +5645,8 @@ jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 jest: 27.5.1 transitivePeerDependencies: @@ -5680,13 +5712,13 @@ string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-testing-library@5.11.0(eslint@8.57.0)(typescript@5.3.3): + /eslint-plugin-testing-library@5.11.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} peerDependencies: eslint: ^7.5.0 || ^8.0.0 dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -5874,7 +5906,7 @@ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.6.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 jest-get-type: 29.4.3 jest-matcher-utils: 29.6.1 jest-message-util: 29.6.1 @@ -6077,7 +6109,7 @@ is-callable: 1.2.7 dev: false - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.3.3)(webpack@5.88.1): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@5.88.1): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -6105,7 +6137,7 @@ schema-utils: 2.7.0 semver: 7.5.4 tapable: 1.1.3 - typescript: 5.3.3 + typescript: 5.4.2 webpack: 5.88.1 dev: false @@ -6185,6 +6217,9 @@ /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /function.prototype.name@1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} @@ -6215,6 +6250,17 @@ has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 + dev: false + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.1 /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -6328,8 +6374,7 @@ /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 - dev: false + get-intrinsic: 1.2.4 /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -6370,6 +6415,11 @@ get-intrinsic: 1.2.1 dev: false + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} @@ -6391,6 +6441,12 @@ dependencies: function-bind: 1.1.1 + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -6589,8 +6645,8 @@ engines: {node: '>=10.17.0'} dev: false - /i18next@23.10.0: - resolution: {integrity: sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==} + /i18next@23.10.1: + resolution: {integrity: sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==} dependencies: '@babel/runtime': 7.23.9 dev: false @@ -6982,7 +7038,7 @@ '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -7117,7 +7173,7 @@ '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -7135,7 +7191,7 @@ '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 jest-mock: 27.5.1 jest-util: 27.5.1 dev: false @@ -7156,7 +7212,7 @@ dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.6 - '@types/node': 20.11.24 + '@types/node': 20.11.25 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -7178,7 +7234,7 @@ '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -7273,7 +7329,7 @@ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 dev: false /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): @@ -7334,7 +7390,7 @@ '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -7391,7 +7447,7 @@ resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 graceful-fs: 4.2.11 dev: false @@ -7430,7 +7486,7 @@ engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -7442,7 +7498,7 @@ engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: '@jest/types': 28.1.3 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -7454,7 +7510,7 @@ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -7495,7 +7551,7 @@ dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 20.11.24 + '@types/node': 20.11.25 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -7508,7 +7564,7 @@ dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 20.11.24 + '@types/node': 20.11.25 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -7520,7 +7576,7 @@ resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 merge-stream: 2.0.0 supports-color: 7.2.0 dev: false @@ -7529,7 +7585,7 @@ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -7538,7 +7594,7 @@ resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - '@types/node': 20.11.24 + '@types/node': 20.11.25 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -8237,6 +8293,10 @@ /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -9403,11 +9463,11 @@ side-channel: 1.0.4 dev: false - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -9465,8 +9525,8 @@ whatwg-fetch: 3.6.2 dev: false - /react-content-loader@6.2.1(react@18.2.0): - resolution: {integrity: sha512-6ONbFX+Hi3SHuP66JB8CPvJn372pj+qwltJV0J8z/8MFrq98I1cbFdZuhDWeQXu3CFxiiDTXJn7DFxx2ZvrO7g==} + /react-content-loader@7.0.0(react@18.2.0): + resolution: {integrity: sha512-xaBwpO7eiJyEc4ndym+g6wcruV9W2y3DKqbw4U48QFBsv0IeAVZO+aCUb8GptlDLWM8n5zi2HcFSGlj5r+53Tg==} engines: {node: '>=10'} peerDependencies: react: '>=16.0.0' @@ -9485,7 +9545,7 @@ react-dom: 18.2.0(react@18.2.0) dev: false - /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.3.3)(webpack@5.88.1): + /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.4.2)(webpack@5.88.1): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -9504,7 +9564,7 @@ escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.3.3)(webpack@5.88.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.4.2)(webpack@5.88.1) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -9519,7 +9579,7 @@ shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 5.3.3 + typescript: 5.4.2 webpack: 5.88.1 transitivePeerDependencies: - eslint @@ -9555,8 +9615,8 @@ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} dev: false - /react-i18next@14.0.5(i18next@23.10.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==} + /react-i18next@14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -9570,7 +9630,7 @@ dependencies: '@babel/runtime': 7.23.9 html-parse-stringify: 3.0.1 - i18next: 23.10.0 + i18next: 23.10.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -9614,28 +9674,28 @@ engines: {node: '>=0.10.0'} dev: false - /react-router-dom@6.22.2(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ==} + /react-router-dom@6.22.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.15.2 + '@remix-run/router': 1.15.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-router: 6.22.2(react@18.2.0) + react-router: 6.22.3(react@18.2.0) - /react-router@6.22.2(react@18.2.0): - resolution: {integrity: sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw==} + /react-router@6.22.3(react@18.2.0): + resolution: {integrity: sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - '@remix-run/router': 1.15.2 + '@remix-run/router': 1.15.3 react: 18.2.0 - /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.3.3): + /react-scripts@5.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(react@18.2.0)(sass@1.71.1)(typescript@5.4.2): resolution: {integrity: sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==} engines: {node: '>=14.0.0'} hasBin: true @@ -9663,7 +9723,7 @@ dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.0 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@5.3.3) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.23.3)(@babel/plugin-transform-react-jsx@7.23.4)(eslint@8.57.0)(jest@27.5.1)(typescript@5.4.2) eslint-webpack-plugin: 3.2.0(eslint@8.57.0)(webpack@5.88.1) file-loader: 6.2.0(webpack@5.88.1) fs-extra: 10.1.0 @@ -9681,7 +9741,7 @@ prompts: 2.4.2 react: 18.2.0 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.3.3)(webpack@5.88.1) + react-dev-utils: 12.0.1(eslint@8.57.0)(typescript@5.4.2)(webpack@5.88.1) react-refresh: 0.11.0 resolve: 1.22.2 resolve-url-loader: 4.0.0 @@ -9691,7 +9751,7 @@ style-loader: 3.3.3(webpack@5.88.1) tailwindcss: 3.3.3 terser-webpack-plugin: 5.3.9(webpack@5.88.1) - typescript: 5.3.3 + typescript: 5.4.2 webpack: 5.88.1 webpack-dev-server: 4.15.1(webpack@5.88.1) webpack-manifest-plugin: 4.1.1(webpack@5.88.1) @@ -9742,7 +9802,7 @@ react-dom: 18.2.0(react@18.2.0) dev: false - /react-textarea-autosize@8.5.3(@types/react@18.2.61)(react@18.2.0): + /react-textarea-autosize@8.5.3(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==} engines: {node: '>=10'} peerDependencies: @@ -9751,7 +9811,7 @@ '@babel/runtime': 7.22.6 react: 18.2.0 use-composed-ref: 1.3.0(react@18.2.0) - use-latest: 1.2.1(@types/react@18.2.61)(react@18.2.0) + use-latest: 1.2.1(@types/react@18.2.64)(react@18.2.0) transitivePeerDependencies: - '@types/react' dev: false @@ -10019,26 +10079,26 @@ fsevents: 2.3.3 dev: false - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + /rollup@4.12.1: + resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 + '@rollup/rollup-android-arm-eabi': 4.12.1 + '@rollup/rollup-android-arm64': 4.12.1 + '@rollup/rollup-darwin-arm64': 4.12.1 + '@rollup/rollup-darwin-x64': 4.12.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 + '@rollup/rollup-linux-arm64-gnu': 4.12.1 + '@rollup/rollup-linux-arm64-musl': 4.12.1 + '@rollup/rollup-linux-riscv64-gnu': 4.12.1 + '@rollup/rollup-linux-x64-gnu': 4.12.1 + '@rollup/rollup-linux-x64-musl': 4.12.1 + '@rollup/rollup-win32-arm64-msvc': 4.12.1 + '@rollup/rollup-win32-ia32-msvc': 4.12.1 + '@rollup/rollup-win32-x64-msvc': 4.12.1 fsevents: 2.3.3 dev: true @@ -10262,6 +10322,17 @@ - supports-color dev: false + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} dev: false @@ -10289,6 +10360,16 @@ call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 + dev: false + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -10671,8 +10752,8 @@ stable: 0.1.8 dev: false - /sweetalert2@11.10.5: - resolution: {integrity: sha512-q9eE3EKhMcpIDU/Xcz7z5lk8axCGkgxwK47gXGrrfncnBJWxHPPHnBVAjfsVXcTt8Yi8U6HNEcBRSu+qGeyFdA==} + /sweetalert2@11.10.6: + resolution: {integrity: sha512-CINZPLZXZRSZqSOE7H7j1F7X8e8O1kLOiXPmtJn1DYxvXsKBr3d16d90+IcwTTs7dJww20h8r8QIxIwsLGX+6A==} dev: false /symbol-tree@3.2.4: @@ -10909,14 +10990,14 @@ engines: {node: '>=0.6.x'} dev: false - /tsutils@3.21.0(typescript@5.3.3): + /tsutils@3.21.0(typescript@5.4.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.3.3 + typescript: 5.4.2 dev: false /type-check@0.4.0: @@ -10996,8 +11077,8 @@ is-typedarray: 1.0.0 dev: false - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true @@ -11106,7 +11187,7 @@ react: 18.2.0 dev: false - /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.61)(react@18.2.0): + /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} peerDependencies: '@types/react': '*' @@ -11115,11 +11196,11 @@ '@types/react': optional: true dependencies: - '@types/react': 18.2.61 + '@types/react': 18.2.64 react: 18.2.0 dev: false - /use-latest@1.2.1(@types/react@18.2.61)(react@18.2.0): + /use-latest@1.2.1(@types/react@18.2.64)(react@18.2.0): resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} peerDependencies: '@types/react': '*' @@ -11128,9 +11209,9 @@ '@types/react': optional: true dependencies: - '@types/react': 18.2.61 + '@types/react': 18.2.64 react: 18.2.0 - use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.61)(react@18.2.0) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.64)(react@18.2.0) dev: false /use-sync-external-store@1.2.0(react@18.2.0): @@ -11463,7 +11544,7 @@ dependencies: isexe: 2.0.0 - /winston-daily-rotate-file@5.0.0(winston@3.11.0): + /winston-daily-rotate-file@5.0.0(winston@3.12.0): resolution: {integrity: sha512-JDjiXXkM5qvwY06733vf09I2wnMXpZEhxEVOSPenZMii+g7pcDcTBt2MRugnoi8BwVSuCT2jfRXBUy+n1Zz/Yw==} engines: {node: '>=8'} peerDependencies: @@ -11472,19 +11553,10 @@ file-stream-rotator: 0.6.1 object-hash: 3.0.0 triple-beam: 1.4.1 - winston: 3.11.0 + winston: 3.12.0 winston-transport: 4.7.0 dev: false - /winston-transport@4.5.0: - resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} - engines: {node: '>= 6.4.0'} - dependencies: - logform: 2.5.1 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - dev: false - /winston-transport@4.7.0: resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} engines: {node: '>= 12.0.0'} @@ -11494,8 +11566,8 @@ triple-beam: 1.4.1 dev: false - /winston@3.11.0: - resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} + /winston@3.12.0: + resolution: {integrity: sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w==} engines: {node: '>= 12.0.0'} dependencies: '@colors/colors': 1.6.0 @@ -11508,7 +11580,7 @@ safe-stable-stringify: 2.4.3 stack-trace: 0.0.10 triple-beam: 1.4.1 - winston-transport: 4.5.0 + winston-transport: 4.7.0 dev: false /workbox-background-sync@6.6.0: diff --git a/qwilight-fe/package.json b/qwilight-fe/package.json index 0af120a..15e42d1 100644 --- a/qwilight-fe/package.json +++ b/qwilight-fe/package.json @@ -3,39 +3,40 @@ "version": "1.0.0", "private": true, "dependencies": { + "@tanstack/react-query": "^5.25.0", "axios": "^1.6.7", "bootstrap": "^5.3.3", "chart.js": "^4.4.2", "crypto-js": "^4.2.0", "dompurify": "^3.0.9", "google-protobuf": "^3.21.2", - "i18next": "^23.10.0", + "i18next": "^23.10.1", "mobx": "^6.12.0", "mobx-react-lite": "^4.0.5", "react": "^18.2.0", "react-contexify": "^6.0.0", "react-device-detect": "^2.2.3", "react-dom": "^18.2.0", - "react-i18next": "^14.0.5", - "react-router-dom": "^6.22.2", + "react-i18next": "^14.1.0", + "react-router-dom": "^6.22.3", "react-scripts": "^5.0.1", "react-spinners": "^0.13.8", "react-toastify": "^10.0.4", "reactstrap": "^9.2.2", "sprintf-js": "^1.1.3", - "sweetalert2": "^11.10.5", + "sweetalert2": "^11.10.6", "taehui-ts": "workspace:^" }, "devDependencies": { "@types/crypto-js": "^4.2.2", "@types/dompurify": "^3.0.5", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "@types/react": "^18.2.61", - "@types/react-dom": "^18.2.19", + "@types/node": "^20.11.25", + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", "@types/react-router-dom": "^5.3.3", "@types/sprintf-js": "^1.1.4", - "typescript": "^5.3.3" + "typescript": "^5.4.2" }, "scripts": { "start": "react-scripts start", diff --git a/qwilight-fe/src/Www.ts b/qwilight-fe/src/Www.ts index 6146375..9831eeb 100644 --- a/qwilight-fe/src/Www.ts +++ b/qwilight-fe/src/Www.ts @@ -8,6 +8,10 @@ validateStatus: (status) => status < 500, }); +export const wwwAXIOSNew = axios.create({ + baseURL: wwwAPI, +}); + wwwAXIOS.interceptors.response.use((value) => { switch (value.status) { case 401: diff --git a/qwilight-fe/src/index.tsx b/qwilight-fe/src/index.tsx index deaa1b0..0e1fc56 100644 --- a/qwilight-fe/src/index.tsx +++ b/qwilight-fe/src/index.tsx @@ -1,6 +1,7 @@ import { createRoot } from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import { initReactI18next } from "react-i18next"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import i18n from "i18next"; import { getLanguage } from "taehui-ts/language"; @@ -21,14 +22,18 @@ const language = getLanguage(); await i18n.changeLanguage(language); + const queryClient = new QueryClient(); + const root = document.getElementById("root"); if (root) { createRoot(root).render( - - - - - , + + + + + + + , ); } })(); diff --git a/qwilight-fe/src/note/NoteItem.tsx b/qwilight-fe/src/note/NoteItem.tsx index 95aaf4d..b8205f0 100644 --- a/qwilight-fe/src/note/NoteItem.tsx +++ b/qwilight-fe/src/note/NoteItem.tsx @@ -1,11 +1,9 @@ import { useState } from "react"; -import { runInAction } from "mobx"; import { observer } from "mobx-react-lite"; import { Col, Collapse, ListGroupItem, Row, Spinner } from "reactstrap"; import { sprintf } from "sprintf-js"; import { useTranslation } from "react-i18next"; import { Item, Menu, useContextMenu } from "react-contexify"; -import { getLanguage } from "taehui-ts/language"; import Swal from "sweetalert2"; import w0 from "src/assets/w0.png"; @@ -17,10 +15,10 @@ import w7 from "src/assets/w7.png"; import CommentItems from "src/note/CommentItems"; -import { CommentAPIComment, GetCommentAPI, NoteAPINote } from "src/wwwAPI"; +import { NoteAPINote } from "src/wwwAPI"; import { wwwAXIOS } from "src/Www"; import { formatText, getGenreText } from "src/Utility"; -import { useSiteStore } from "src/Stores"; +import useGetComment from "./useGetComment"; const ws = [w0, w1, w2, "", w4, w5, w6, w7]; @@ -39,47 +37,24 @@ wantAvatarName, handled, }: NoteAPINote & { handled?: number }) => { - const { siteAvatarID } = useSiteStore(); const [isCommentOpened, setCommentOpened] = useState(false); - const [isLoading, setLoading] = useState(false); - const [comments, setComments] = useState([]); - const [commentPlace, setCommentPlace] = useState(-1); - const [totalComments, setTotalComments] = useState(0); const { t } = useTranslation(); const { show: viewToilInput } = useContextMenu({ id: `toil-${noteID}`, }); + const { + data: { comments, commentPlace, totalComments }, + isFetched: isCommentLoaded, + } = useGetComment(noteID, isCommentOpened); + return ( { - if (isCommentOpened) { - setCommentOpened(false); - } else { - setLoading(true); - const { status, data } = await wwwAXIOS.get( - "/comment", - { - params: { - noteID, - avatarID: siteAvatarID, - language: getLanguage(), - }, - }, - ); - if (status === 200) { - runInAction(() => { - setComments(data.comments); - setCommentPlace(data.commentPlace); - setTotalComments(data.totalComments); - setCommentOpened(true); - setLoading(false); - }); - } - } + setCommentOpened((prevState) => !prevState); }} onContextMenu={(event) => { event.preventDefault(); @@ -94,7 +69,9 @@ {levelText}{" "} {title}{" "} - {isLoading && } + {isCommentOpened && !isCommentLoaded && ( + + )}
{fittedText && ( {fittedText} diff --git a/qwilight-fe/src/note/NoteItems.tsx b/qwilight-fe/src/note/NoteItems.tsx index 2d11c09..be7a1e7 100644 --- a/qwilight-fe/src/note/NoteItems.tsx +++ b/qwilight-fe/src/note/NoteItems.tsx @@ -5,20 +5,52 @@ import { useNoteStore } from "src/Stores"; import NoteItem from "src/note/NoteItem"; import { NoteLoading } from "src/Loading"; +import useGetNote from "./useGetNote"; export default observer(() => { - const { notes, wantAvatar, viewUnit, isLoading } = useNoteStore(); + const { wantAvatar, viewUnit } = useNoteStore(); + + const { + data: { notes }, + isFetched: isNoteLoaded, + } = useGetNote(); const line = useWindowArea().windowLength < 992 ? 1 : 2; return ( {[...Array(line).keys()].map((i) => { - if (isLoading) { + if (isNoteLoaded) { return ( - + {notes + .slice((viewUnit / line) * i, (viewUnit / line) * (i + 1)) + .map( + ({ + noteID, + artist, + title, + genre, + levelText, + level, + highestCount, + totalCount, + }) => ( + + ), + )} ); @@ -27,33 +59,7 @@ return ( - {notes - .slice((viewUnit / line) * i, (viewUnit / line) * (i + 1)) - .map( - ({ - noteID, - artist, - title, - genre, - levelText, - level, - highestCount, - totalCount, - }) => ( - - ), - )} + ); diff --git a/qwilight-fe/src/note/NoteView.tsx b/qwilight-fe/src/note/NoteView.tsx index 314def5..f1809d6 100644 --- a/qwilight-fe/src/note/NoteView.tsx +++ b/qwilight-fe/src/note/NoteView.tsx @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next"; import { Button, Col, Input, Row } from "reactstrap"; import { sprintf } from "sprintf-js"; -import { useIntParam, useWant } from "taehui-ts/fe-utility"; +import { useWant, useIntParam } from "taehui-ts/fe-utility"; import { useNoteStore } from "src/Stores"; import NoteItems from "src/note/NoteItems"; @@ -11,36 +11,51 @@ import SrcInput from "src/note/SrcInput"; import PositionInput from "src/note/PositionInput"; import { formatText } from "src/Utility"; +import useGetNote from "src/note/useGetNote"; export default observer(() => { const { - totalCount, - highestCount, + lastWant, + setLastWant, + lastSrc, + setLastSrc, + input, setInput, lastPage, - isLoading, - getNote, - input, - pageUnit, + setLastPage, viewUnit, } = useNoteStore(); - const { t } = useTranslation(); + const { want, setWant } = useWant("/qwilight/note"); const { param: page, setParam: setPage } = useIntParam("page", 1); - const { param: fit } = useIntParam("fit", 0); const { param: src } = useIntParam("src", 0); - const { want, setWant } = useWant("/qwilight/note"); + const { t } = useTranslation(); + + const { + data: { highestCount, totalCount, noteCount }, + isFetched: isNoteLoaded, + } = useGetNote(); + + useEffect(() => { + if ((want !== lastWant || src !== lastSrc) && page > 1) { + setPage(1); + } + setLastWant(want); + setLastSrc(src); + }, [lastSrc, lastWant, page, setLastSrc, setLastWant, setPage, src, want]); + + useEffect(() => { + if (isNoteLoaded) { + setLastPage(Math.max(1, Math.ceil(noteCount / viewUnit))); + } + }, [isNoteLoaded, noteCount, setLastPage, viewUnit]); useEffect(() => { setInput(want); }, [setInput, want]); - useEffect(() => { - getNote(want, page, fit, src, setPage); - }, [getNote, fit, src, want, pageUnit, page, viewUnit, setPage]); - const onWant = () => { setWant(input); }; @@ -98,7 +113,7 @@ )} - {!isLoading && ( + {isNoteLoaded && ( diff --git a/qwilight-fe/src/note/setNoteStore.ts b/qwilight-fe/src/note/setNoteStore.ts index ede8a94..daa1398 100644 --- a/qwilight-fe/src/note/setNoteStore.ts +++ b/qwilight-fe/src/note/setNoteStore.ts @@ -1,69 +1,31 @@ -import { runInAction } from "mobx"; -import { getMillis } from "taehui-ts/date"; - -import { GetNoteAPI, NoteAPINote } from "src/wwwAPI"; -import { wwwAXIOS } from "src/Www"; - export default function setNoteStore() { - let lastMillis = getMillis(); - let lastWant = ""; - let lastSrc = 0; - return { - totalCount: 0, - highestCount: 0, + lastWant: "", + lastSrc: 0, wantAvatar: "", - notes: [] as NoteAPINote[], input: "", lastPage: 1, pageUnit: 10, viewUnit: 20, - isLoading: false, + + setLastWant(lastWant: string) { + this.lastWant = lastWant; + }, + + setLastSrc(lastSrc: number) { + this.lastSrc = lastSrc; + }, setInput(input: string) { this.input = input; }, - async getNote( - want: string, - page: number, - fit: number, - src: number, - setPage: (page: number) => void, - ) { - this.wantAvatar = src === 1 ? want : ""; - if ((want !== lastWant || src !== lastSrc) && page > 1) { - setPage(1); - } else { - const millis = getMillis(); - lastMillis = millis; - this.isLoading = true; - const { status, data } = await wwwAXIOS.get("/note", { - params: { - fit, - src, - want, - page, - viewUnit: this.viewUnit, - }, - }); - if (millis >= lastMillis) { - if (status === 200) { - runInAction(() => { - this.totalCount = data.totalCount; - this.highestCount = data.highestCount; - this.lastPage = Math.max( - 1, - Math.ceil(data.noteCount / this.viewUnit), - ); - this.notes = data.notes; - this.isLoading = false; - }); - } - } - } - lastWant = want; - lastSrc = src; + setWantAvatar(wantAvatar: string) { + this.wantAvatar = wantAvatar; + }, + + setLastPage(lastPage: number) { + this.lastPage = lastPage; }, }; } diff --git a/qwilight-fe/src/note/useGetComment.ts b/qwilight-fe/src/note/useGetComment.ts new file mode 100644 index 0000000..70f195a --- /dev/null +++ b/qwilight-fe/src/note/useGetComment.ts @@ -0,0 +1,35 @@ +import { useQuery } from "@tanstack/react-query"; +import { getLanguage } from "taehui-ts/language"; + +import { useSiteStore } from "src/Stores"; +import { wwwAXIOSNew } from "src/Www"; +import { GetCommentAPI } from "src/wwwAPI"; + +export default function useGetComment( + noteID: string, + isCommentOpened: boolean, +) { + const { siteAvatarID } = useSiteStore(); + + const language = getLanguage(); + return useQuery({ + enabled: isCommentOpened, + queryKey: ["comment", noteID, siteAvatarID, language], + queryFn: async () => { + const { data } = await wwwAXIOSNew.get("/comment", { + params: { + noteID, + avatarID: siteAvatarID, + language, + }, + }); + + return data; + }, + initialData: { + comments: [], + commentPlace: -1, + totalComments: 0, + }, + }); +} diff --git a/qwilight-fe/src/note/useGetNote.ts b/qwilight-fe/src/note/useGetNote.ts new file mode 100644 index 0000000..922b5ce --- /dev/null +++ b/qwilight-fe/src/note/useGetNote.ts @@ -0,0 +1,45 @@ +import { useQuery } from "@tanstack/react-query"; +import { useIntParam, useWant } from "taehui-ts/fe-utility"; + +import { wwwAXIOSNew } from "src/Www"; +import { GetNoteAPI } from "src/wwwAPI"; +import { useNoteStore } from "src/Stores"; +import { useLocation } from "react-router-dom"; + +export default function useGetNote() { + const { viewUnit, setWantAvatar } = useNoteStore(); + + const { param: page } = useIntParam("page", 1); + const { param: fit } = useIntParam("fit", 0); + const { param: src } = useIntParam("src", 0); + + const { want } = useWant("/qwilight/note"); + + const { pathname } = useLocation(); + + return useQuery({ + enabled: pathname.startsWith("/qwilight/note"), + queryKey: ["note", fit, src, want, page, viewUnit], + queryFn: async () => { + setWantAvatar(src === 1 ? want : ""); + + const { data } = await wwwAXIOSNew.get("/note", { + params: { + fit, + src, + want, + page, + viewUnit, + }, + }); + + return data; + }, + initialData: { + totalCount: 0, + highestCount: 0, + noteCount: 0, + notes: [], + }, + }); +} diff --git a/qwilight-fe/src/qwilight/QwilightView.tsx b/qwilight-fe/src/qwilight/QwilightView.tsx index f35db6a..1191cd1 100644 --- a/qwilight-fe/src/qwilight/QwilightView.tsx +++ b/qwilight-fe/src/qwilight/QwilightView.tsx @@ -9,9 +9,9 @@ useAvatarStore, useEtcStore, useHOFStore, - useNoteStore, useSiteStore, } from "src/Stores"; +import useGetNote from "src/note/useGetNote"; import SignInWindow from "src/site/SignInWindow"; import useSiteComponent from "src/site/useSiteComponent"; import { @@ -33,7 +33,7 @@ const EtcView = lazy(() => import("src/etc/EtcView")); export default observer(() => { - const { isLoading: isNoteLoading } = useNoteStore(); + const { isFetched: isNoteLoaded } = useGetNote(); const { isLoading: isSiteViewLoading } = useSiteStore(); const { isLoading: isAvatarViewLoading } = useAvatarStore(); const { isLoading: isHOFViewLoading } = useHOFStore(); @@ -54,7 +54,11 @@ : "secondary"; const getColorIfEquals = (isLoading: boolean, route: string) => - isLoading ? "warning" : pathname === route ? "primary" : "secondary"; + isLoading + ? "warning" + : pathname.startsWith(route) + ? "primary" + : "secondary"; const onPlatform = () => { window.open("https://taehui.ddns.net/qwilight/platform"); @@ -77,7 +81,7 @@ diff --git a/qwilight-fe/src/wwwAPI.d.ts b/qwilight-fe/src/wwwAPI.d.ts index 631c210..ee424c9 100644 --- a/qwilight-fe/src/wwwAPI.d.ts +++ b/qwilight-fe/src/wwwAPI.d.ts @@ -8,7 +8,6 @@ highestCount: number; noteCount: number; notes: NoteAPINote[]; - viewUnit: number; }; export type NoteAPINote = { diff --git a/taehui-fe/package.json b/taehui-fe/package.json index c5d38f2..8958699 100644 --- a/taehui-fe/package.json +++ b/taehui-fe/package.json @@ -8,35 +8,35 @@ "bootstrap": "^5.3.3", "crypto-js": "^4.2.0", "dompurify": "^3.0.9", - "i18next": "^23.10.0", + "i18next": "^23.10.1", "mobx": "^6.12.0", "mobx-react-lite": "^4.0.5", "react": "^18.2.0", - "react-content-loader": "^6.2.1", + "react-content-loader": "^7.0.0", "react-contexify": "^6.0.0", "react-dom": "^18.2.0", - "react-i18next": "^14.0.5", + "react-i18next": "^14.1.0", "react-infinite-scroll-component": "^6.1.0", - "react-router-dom": "^6.22.2", + "react-router-dom": "^6.22.3", "react-scripts": "5.0.1", "react-textarea-autosize": "^8.5.3", "react-toastify": "^10.0.4", "reactstrap": "^9.2.2", "sprintf-js": "^1.1.3", - "sweetalert2": "^11.10.5", + "sweetalert2": "^11.10.6", "taehui-ts": "workspace:^" }, "devDependencies": { "@types/crypto-js": "^4.2.2", "@types/dompurify": "^3.0.5", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "@types/react": "^18.2.61", - "@types/react-dom": "^18.2.19", + "@types/node": "^20.11.25", + "@types/react": "^18.2.64", + "@types/react-dom": "^18.2.21", "@types/showdown": "^2.0.6", "@types/sprintf-js": "^1.1.4", "http-proxy-middleware": "^2.0.6", - "typescript": "^5.3.3" + "typescript": "^5.4.2" }, "scripts": { "start": "react-scripts start", diff --git a/taehui-fe/src/forum/CommentView.tsx b/taehui-fe/src/forum/CommentView.tsx index ae8b4b9..6880360 100644 --- a/taehui-fe/src/forum/CommentView.tsx +++ b/taehui-fe/src/forum/CommentView.tsx @@ -24,7 +24,7 @@ type CommentViewParams = { essayID: string }; const { essayID } = useParams() as CommentViewParams; - const { data: comments } = useGetComment(essayID); + const { data: comment } = useGetComment(essayID); const commentComponents = useMemo(() => { const commentComponents: ReactNode[] = []; @@ -53,12 +53,12 @@ comments.forEach(setCommentComponents(level + 1)); }; - comments.forEach((comment) => { + comment.forEach((comment) => { setCommentComponents(0)(comment); }); return commentComponents; - }, [comments]); + }, [comment]); return ( <> diff --git a/taehui-fe/src/forum/EssayView.tsx b/taehui-fe/src/forum/EssayView.tsx index e6d926d..79fddb8 100644 --- a/taehui-fe/src/forum/EssayView.tsx +++ b/taehui-fe/src/forum/EssayView.tsx @@ -18,8 +18,7 @@ const EssayView = observer(() => { const { t } = useTranslation(); - const { forumTitle, title, text, setForumTitle, setTitle, setText } = - useForumStore(); + const { title, text, setTitle, setText } = useForumStore(); const { taehuiAvatarID, totem, isTaehui } = useAvatarStore(); type EssayViewParams = { forumID: string; essayID: string }; @@ -27,15 +26,14 @@ const to = useTo(); - const { data: essay, isPending: isPendingEssay } = useGetEssay(essayID); + const { data: essay, isFetched: isEssayLoaded } = useGetEssay(essayID); useEffect(() => { - if (essay) { - setForumTitle(essay.forumTitle); + if (isEssayLoaded) { setTitle(essay.title); setText(essay.text); } - }, [essay, setForumTitle, setText, setTitle]); + }, [essay, isEssayLoaded, setText, setTitle]); const onWipeEssay = async () => { if ( @@ -64,7 +62,7 @@ to(`/forum/${forumID}`); }; - if (isPendingEssay || !essay) { + if (!isEssayLoaded) { return ; } @@ -103,7 +101,7 @@
{ const { taehuiLevel } = useAvatarStore(); - const { forumTitle, viewUnit, level, setForumTitle, setLastPage, setLevel } = - useForumStore(); - const [isLoading, setLoading] = useState(true); - const [essays, setEssays] = useState([]); + const { viewUnit, setLastPage } = useForumStore(); const { t } = useTranslation(); - const { forumID } = useParams<{ forumID: string }>(); + type ForumViewParams = { + forumID: string; + }; + const { forumID } = useParams() as ForumViewParams; const { param: page } = useIntParam("page", 1); const to = useTo(); - useEffect(() => { - (async () => { - const { data, status } = await wwwAXIOS.get( - `/forum/${forumID}`, - { - params: { - page, - viewUnit, - language: getLanguage(), - }, - }, - ); - if (status === 200) { - runInAction(() => { - setForumTitle(data.title); - setEssays(data.essays); - setLastPage(Math.ceil(data.essayCount / viewUnit)); - setLevel(data.level); - setLoading(false); - }); - } - })(); - }, [forumID, page, setForumTitle, setLastPage, setLevel, viewUnit]); + const { + data: { title, essays, essayCount, level }, + isFetched: isForumLoaded, + } = useGetForum(forumID, page, viewUnit); - if (isLoading) { - return ; - } + useEffect(() => { + if (isForumLoaded) { + setLastPage(Math.ceil(essayCount / viewUnit)); + } + }, [essayCount, isForumLoaded, setLastPage, viewUnit]); return ( <> @@ -68,15 +48,19 @@ - {forumTitle} + {title} - {essays.map((essay) => ( - - ))} + {isForumLoaded ? ( + essays.map((essay) => ( + + )) + ) : ( + + )}
diff --git a/taehui-fe/src/forum/PostEssayView.tsx b/taehui-fe/src/forum/PostEssayView.tsx index 47d0fa3..29f60df 100644 --- a/taehui-fe/src/forum/PostEssayView.tsx +++ b/taehui-fe/src/forum/PostEssayView.tsx @@ -23,20 +23,22 @@ import TextView from "src/forum/TextView"; import AutoEssayTitleView from "src/forum//AutoEssayTitleView"; import { AutoEssayViewLoading } from "src/Loading"; -import useGetAutoEssays from "src/forum/useGetAutoEssays"; -import usePostAutoEssays from "src/forum/usePostAutoEssays"; -import usePutAutoEssays from "src/forum/usePutAutoEssays"; +import useGetAutoEssay from "src/forum/useGetAutoEssay"; +import usePostAutoEssay from "src/forum/usePostAutoEssay"; +import usePutAutoEssay from "src/forum/usePutAutoEssay"; import withTotem from "src/withTotem"; +import useGetForum from "src/forum/useGetForum"; +import { useIntParam } from "taehui-ts/fe-utility"; const PostEssayView = observer(({ mode }: { mode: "w" | "m" }) => { const { isTitleTextFilled, - forumTitle, title, text, setTitle, setText, autoEssayID, + viewUnit, } = useForumStore(); const { titleViewHeight, avatarViewHeight } = useTaehuiStore(); const { totem, taehuiAvatarID, taehuiAvatarName } = useAvatarStore(); @@ -55,11 +57,13 @@ const { forumID, essayID } = useParams() as PostEssayViewParams; - const { isPending: isPendingAutoEssays, data: autoEssays } = - useGetAutoEssays(forumID); + const { isFetched: isAutoEssayLoaded, data: autoEssay } = useGetAutoEssay( + forumID, + isAutoEssayOpened, + ); - const { mutate: postAutoEssays } = usePostAutoEssays(forumID, title, text); - const { mutate: putAutoEssays } = usePutAutoEssays(forumID, title, text); + const { mutate: postAutoEssay } = usePostAutoEssay(forumID, title, text); + const { mutate: putAutoEssay } = usePutAutoEssay(forumID, title, text); const editView = useRef(null); const textView = useRef(null); @@ -69,6 +73,12 @@ const to = useTo(); + const { param: page } = useIntParam("page", 1); + + const { + data: { title: forumTitle }, + } = useGetForum(forumID, page, viewUnit); + const setTag = (tag: string) => { const { current } = textView; if (current) { @@ -128,9 +138,9 @@ const postAutoEssaysID = setInterval(async () => { if (isTitleTextFilled) { if (autoEssayID === undefined) { - postAutoEssays(); + postAutoEssay(); } else { - putAutoEssays(); + putAutoEssay(); } } }, 60000); @@ -138,7 +148,7 @@ return () => { clearInterval(postAutoEssaysID); }; - }, [autoEssayID, isTitleTextFilled, postAutoEssays, putAutoEssays]); + }, [autoEssayID, isTitleTextFilled, postAutoEssay, putAutoEssay]); useLayoutEffect(() => { if (!isEdit) { @@ -259,17 +269,17 @@ - {isPendingAutoEssays ? ( - - ) : ( + {isAutoEssayLoaded ? ( - {autoEssays.map((autoEssay) => ( + {autoEssay.map((autoEssay) => ( ))} + ) : ( + )} diff --git a/taehui-fe/src/forum/setForumStore.ts b/taehui-fe/src/forum/setForumStore.ts index a29d10c..9e0aee1 100644 --- a/taehui-fe/src/forum/setForumStore.ts +++ b/taehui-fe/src/forum/setForumStore.ts @@ -1,6 +1,5 @@ export default function setForumStore() { return { - forumTitle: "", title: "", text: "", autoEssayID: undefined as number | undefined, @@ -10,10 +9,6 @@ viewUnit: 10, level: 0, - setForumTitle(forumTitle: string) { - this.forumTitle = forumTitle; - }, - setTitle(title: string) { this.title = title; }, diff --git a/taehui-fe/src/forum/useGetAutoEssay.ts b/taehui-fe/src/forum/useGetAutoEssay.ts new file mode 100644 index 0000000..ec70592 --- /dev/null +++ b/taehui-fe/src/forum/useGetAutoEssay.ts @@ -0,0 +1,30 @@ +import { useQuery } from "@tanstack/react-query"; +import { wwwAXIOSNew } from "src/Www"; +import { GetAutoEssayAPI } from "src/wwwAPI"; +import { getMillis } from "taehui-ts/date"; +import { useAvatarStore } from "src/Stores"; + +export default function useGetAutoEssay( + forumID: string, + isAutoEssayOpened: boolean, +) { + const { totem } = useAvatarStore(); + + return useQuery({ + enabled: isAutoEssayOpened, + queryKey: ["autoEssay", forumID, totem], + queryFn: async () => { + const { data } = await wwwAXIOSNew.get( + `/autoEssay/${forumID}`, + { + headers: { + millis: getMillis(), + totem, + }, + }, + ); + return data; + }, + initialData: [], + }); +} diff --git a/taehui-fe/src/forum/useGetAutoEssays.ts b/taehui-fe/src/forum/useGetAutoEssays.ts deleted file mode 100644 index cbdae63..0000000 --- a/taehui-fe/src/forum/useGetAutoEssays.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; -import { wwwAXIOSNew } from "src/Www"; -import { GetAutoEssayAPI } from "src/wwwAPI"; -import { getMillis } from "taehui-ts/date"; -import { useAvatarStore } from "src/Stores"; - -export default function useGetAutoEssays(forumID: string) { - const { totem } = useAvatarStore(); - - return useQuery({ - queryKey: ["autoEssays", forumID, totem], - queryFn: async () => { - const { data } = await wwwAXIOSNew.get( - `/autoEssay/${forumID}`, - { - headers: { - millis: getMillis(), - totem, - }, - }, - ); - return data; - }, - initialData: [], - }); -} diff --git a/taehui-fe/src/forum/useGetEssay.ts b/taehui-fe/src/forum/useGetEssay.ts index 14e150c..7200345 100644 --- a/taehui-fe/src/forum/useGetEssay.ts +++ b/taehui-fe/src/forum/useGetEssay.ts @@ -1,10 +1,20 @@ import { useQuery } from "@tanstack/react-query"; import { wwwAXIOSNew } from "src/Www"; -import { GetEssayAPI } from "src/wwwAPI"; +import { EssayAPIEssay, GetEssayAPI } from "src/wwwAPI"; import { getLanguage } from "taehui-ts/language"; export default function useGetEssay(essayID: string) { - return useQuery({ + return useQuery<{ + forumTitle: string; + title: string; + text: string; + date: string; + avatarID: string; + avatarName: string; + hitCount: number; + essayBefore: EssayAPIEssay | undefined; + essayLater: EssayAPIEssay | undefined; + }>({ queryKey: ["essay", essayID], queryFn: async () => { const { data } = await wwwAXIOSNew.get(`/essay/${essayID}`, { @@ -12,5 +22,16 @@ }); return data; }, + initialData: { + forumTitle: "", + title: "", + text: "", + date: "", + avatarID: "", + avatarName: "", + hitCount: 0, + essayBefore: undefined, + essayLater: undefined, + }, }); } diff --git a/taehui-fe/src/forum/useGetForum.ts b/taehui-fe/src/forum/useGetForum.ts new file mode 100644 index 0000000..58370c7 --- /dev/null +++ b/taehui-fe/src/forum/useGetForum.ts @@ -0,0 +1,33 @@ +import { useQuery } from "@tanstack/react-query"; +import { wwwAXIOSNew } from "src/Www"; +import { GetForumAPI } from "src/wwwAPI"; +import { getLanguage } from "taehui-ts/language"; + +export default function useGetForum( + forumID: string, + page: number, + viewUnit: number, +) { + const language = getLanguage(); + + return useQuery({ + queryKey: ["forum", forumID, page, viewUnit], + queryFn: async () => { + const { data } = await wwwAXIOSNew.get(`/forum/${forumID}`, { + params: { + page, + viewUnit, + language, + }, + }); + return data; + }, + initialData: { + title: "", + text: "", + essays: [], + essayCount: 0, + level: 0, + }, + }); +} diff --git a/taehui-fe/src/forum/usePostAutoEssay.ts b/taehui-fe/src/forum/usePostAutoEssay.ts new file mode 100644 index 0000000..1f9bd64 --- /dev/null +++ b/taehui-fe/src/forum/usePostAutoEssay.ts @@ -0,0 +1,47 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { wwwAXIOSNew } from "src/Www"; +import { getMillis } from "taehui-ts/date"; +import { useAvatarStore, useForumStore } from "src/Stores"; +import { toast } from "react-toastify"; +import { useTranslation } from "react-i18next"; + +export default function usePostAutoEssay( + forumID: string | undefined, + title: string, + text: string, +) { + const { t } = useTranslation(); + + const { setAutoEssayID } = useForumStore(); + + const { totem } = useAvatarStore(); + + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async () => { + const { + data: { autoEssayID }, + } = await wwwAXIOSNew.post( + `/autoEssay/${forumID}`, + { + title, + text, + }, + { + headers: { + millis: getMillis(), + totem, + }, + }, + ); + + return autoEssayID; + }, + onSuccess: async (data) => { + toast.success(t("postedAutoEssay")); + setAutoEssayID(data); + await queryClient.invalidateQueries({ queryKey: ["autoEssay"] }); + }, + }); +} diff --git a/taehui-fe/src/forum/usePostAutoEssays.ts b/taehui-fe/src/forum/usePostAutoEssays.ts deleted file mode 100644 index 5ab4327..0000000 --- a/taehui-fe/src/forum/usePostAutoEssays.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { wwwAXIOSNew } from "src/Www"; -import { getMillis } from "taehui-ts/date"; -import { useAvatarStore, useForumStore } from "src/Stores"; -import { toast } from "react-toastify"; -import { useTranslation } from "react-i18next"; - -export default function usePostAutoEssays( - forumID: string | undefined, - title: string, - text: string, -) { - const { t } = useTranslation(); - - const { setAutoEssayID } = useForumStore(); - - const { totem } = useAvatarStore(); - - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async () => { - const { - data: { autoEssayID }, - } = await wwwAXIOSNew.post( - `/autoEssay/${forumID}`, - { - title, - text, - }, - { - headers: { - millis: getMillis(), - totem, - }, - }, - ); - - return autoEssayID; - }, - onSuccess: async (data) => { - toast.success(t("postedAutoEssay")); - setAutoEssayID(data); - await queryClient.invalidateQueries({ queryKey: ["autoEssays"] }); - }, - }); -} diff --git a/taehui-fe/src/forum/usePutAutoEssay.ts b/taehui-fe/src/forum/usePutAutoEssay.ts new file mode 100644 index 0000000..7ad0091 --- /dev/null +++ b/taehui-fe/src/forum/usePutAutoEssay.ts @@ -0,0 +1,42 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { wwwAXIOSNew } from "src/Www"; +import { getMillis } from "taehui-ts/date"; +import { useAvatarStore, useForumStore } from "src/Stores"; +import { toast } from "react-toastify"; +import { useTranslation } from "react-i18next"; + +export default function usePutAutoEssay( + forumID: string | undefined, + title: string, + text: string, +) { + const { t } = useTranslation(); + + const { autoEssayID } = useForumStore(); + + const { totem } = useAvatarStore(); + + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: async () => { + await wwwAXIOSNew.put( + `/autoEssay/${autoEssayID}`, + { + title, + text, + }, + { + headers: { + millis: getMillis(), + totem, + }, + }, + ); + }, + onSuccess: async () => { + toast.success(t("postedAutoEssay")); + await queryClient.invalidateQueries({ queryKey: ["autoEssay"] }); + }, + }); +} diff --git a/taehui-fe/src/forum/usePutAutoEssays.ts b/taehui-fe/src/forum/usePutAutoEssays.ts deleted file mode 100644 index b86195f..0000000 --- a/taehui-fe/src/forum/usePutAutoEssays.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { wwwAXIOSNew } from "src/Www"; -import { getMillis } from "taehui-ts/date"; -import { useAvatarStore, useForumStore } from "src/Stores"; -import { toast } from "react-toastify"; -import { useTranslation } from "react-i18next"; - -export default function usePutAutoEssays( - forumID: string | undefined, - title: string, - text: string, -) { - const { t } = useTranslation(); - - const { autoEssayID } = useForumStore(); - - const { totem } = useAvatarStore(); - - const queryClient = useQueryClient(); - - return useMutation({ - mutationFn: async () => { - await wwwAXIOSNew.put( - `/autoEssay/${autoEssayID}`, - { - title, - text, - }, - { - headers: { - millis: getMillis(), - totem, - }, - }, - ); - }, - onSuccess: async () => { - toast.success(t("postedAutoEssay")); - await queryClient.invalidateQueries({ queryKey: ["autoEssays"] }); - }, - }); -} diff --git a/taehui-fe/src/forum/useWipeAutoEssay.ts b/taehui-fe/src/forum/useWipeAutoEssay.ts index be0e0b6..907ae0d 100644 --- a/taehui-fe/src/forum/useWipeAutoEssay.ts +++ b/taehui-fe/src/forum/useWipeAutoEssay.ts @@ -18,7 +18,7 @@ }, onSuccess: async () => { setAutoEssayID(undefined); - await queryClient.invalidateQueries({ queryKey: ["autoEssays"] }); + await queryClient.invalidateQueries({ queryKey: ["autoEssay"] }); }, }); } diff --git a/taehui-fe/src/forums/ForumsView.tsx b/taehui-fe/src/forums/ForumsView.tsx index 24973e7..9059232 100644 --- a/taehui-fe/src/forums/ForumsView.tsx +++ b/taehui-fe/src/forums/ForumsView.tsx @@ -12,9 +12,9 @@ type ForumsViewParams = { forumGroup: string }; const { forumGroup } = useParams() as ForumsViewParams; - const { data: forums, isPending: isPendingForums } = useGetForums(forumGroup); + const { data: forums, isFetched: isForumsLoaded } = useGetForums(forumGroup); - if (isPendingForums) { + if (!isForumsLoaded) { return ; } diff --git a/taehui-ts/package.json b/taehui-ts/package.json index 0efaee4..abd8763 100644 --- a/taehui-ts/package.json +++ b/taehui-ts/package.json @@ -23,12 +23,12 @@ "devDependencies": { "@rollup/plugin-typescript": "^11.1.6", "@types/qs": "^6.9.12", - "@types/react": "^18.2.61", + "@types/react": "^18.2.64", "dayjs": "^1.11.10", - "qs": "^6.11.2", + "qs": "^6.12.0", "react": "^18.2.0", - "react-router-dom": "^6.22.2", - "rollup": "^4.12.0", + "react-router-dom": "^6.22.3", + "rollup": "^4.12.1", "tslib": "^2.6.2" }, "peerDependencies": { diff --git a/taehui-www/package.json b/taehui-www/package.json index 88b8f00..2bf6369 100644 --- a/taehui-www/package.json +++ b/taehui-www/package.json @@ -13,7 +13,7 @@ "mariadb": "^3.2.3", "taehui-ts": "workspace:^", "uuid": "^9.0.1", - "winston": "^3.11.0", + "winston": "^3.12.0", "winston-daily-rotate-file": "^5.0.0" }, "devDependencies": {