diff --git a/next.config.mjs b/next.config.mjs index 90fd4ff..c1608b0 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -2,15 +2,46 @@ import withPWAInit from '@ducanh2912/next-pwa'; const withPWA = withPWAInit({ - workboxOptions: {}, dest: 'public', - disable: process.env.NEXT_PUBLIC_MODE === 'development', + skipWaiting: true, + workboxOptions: { + runtimeCaching: [ + { + urlPattern: + /^https:\/\/gymmi\.s3\.ap-northeast-2\.amazonaws\.com\/.*\.(png|jpg|jpeg|svg|gif|webp|avif)(\?.*)?$/, + handler: 'CacheFirst', + options: { + cacheName: 'image-cache', + expiration: { + maxEntries: 50, + maxAgeSeconds: 30 * 24 * 60 * 60, // 30일 + }, + cacheableResponse: { + statuses: [0, 200], // 성공적인 응답만 캐시 + }, + matchOptions: { + ignoreSearch: true, // URL 파라미터 무시 + }, + }, + }, + ], + cleanupOutdatedCaches: true, // 오래된 캐시 자동 정리 + }, }); const nextConfig = { // api: { // bodyParser: false, // }, + images: { + formats: ['image/avif', 'image/webp'], + remotePatterns: [ + { + protocol: 'https', + hostname: '**', + }, + ], + }, async rewrites() { return [ { diff --git a/package-lock.json b/package-lock.json index 9e04442..2ee3215 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "react-dom": "^18", "react-hook-form": "^7.51.4", "react-intersection-observer": "^9.10.3", + "sharp": "^0.33.5", "swiper": "^11.1.3", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", @@ -46,6 +47,7 @@ "@types/react-dom": "^18", "eslint": "^8", "eslint-config-next": "14.2.3", + "msw": "^2.7.0", "postcss": "^8", "tailwindcss": "^3.4.1", "typescript": "^5", @@ -1777,6 +1779,37 @@ "node": ">=6.9.0" } }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.7.2" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "node_modules/@ducanh2912/next-pwa": { "version": "10.2.7", "resolved": "https://registry.npmjs.org/@ducanh2912/next-pwa/-/next-pwa-10.2.7.tgz", @@ -2156,6 +2189,16 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2929,6 +2972,465 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.1.tgz", + "integrity": "sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.2", + "@inquirer/type": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz", + "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.9", + "@inquirer/type": "^3.0.2", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz", + "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz", + "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3032,6 +3534,24 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@mswjs/interceptors": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.5.tgz", + "integrity": "sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@next/env": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", @@ -3213,6 +3733,31 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -5059,6 +5604,13 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -5227,11 +5779,18 @@ "@types/send": "*" } }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "optional": true + "devOptional": true }, "node_modules/@types/trusted-types": { "version": "2.0.7", @@ -5587,6 +6146,35 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -6217,6 +6805,16 @@ "node": ">=6" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -6277,6 +6875,19 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6293,6 +6904,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -6330,6 +6951,16 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", @@ -6513,6 +7144,15 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", @@ -7924,6 +8564,16 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/graphql": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/gtoken": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", @@ -8011,6 +8661,13 @@ "node": ">= 0.4" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -8169,6 +8826,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -8367,6 +9030,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9143,6 +9813,74 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/msw": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.0.tgz", + "integrity": "sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.1", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.37.0", + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.26.1", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.32.0.tgz", + "integrity": "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -9474,6 +10212,13 @@ "node": ">= 0.8.0" } }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -9561,6 +10306,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9571,9 +10323,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9822,6 +10575,19 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -9830,6 +10596,13 @@ "node": ">=6" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10147,6 +10920,13 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -10345,9 +11125,10 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -10393,6 +11174,45 @@ "node": ">= 0.4" } }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10440,6 +11260,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -10490,6 +11319,16 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -10513,6 +11352,13 @@ "node": ">=10.0.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11083,6 +11929,32 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", @@ -11364,6 +12236,17 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/use-callback-ref": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", @@ -11857,6 +12740,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zustand": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz", diff --git a/package.json b/package.json index 5422bad..6902308 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "react-dom": "^18", "react-hook-form": "^7.51.4", "react-intersection-observer": "^9.10.3", + "sharp": "^0.33.5", "swiper": "^11.1.3", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", @@ -47,6 +48,7 @@ "@types/react-dom": "^18", "eslint": "^8", "eslint-config-next": "14.2.3", + "msw": "^2.7.0", "postcss": "^8", "tailwindcss": "^3.4.1", "typescript": "^5", diff --git a/public/images/completeTask.png b/public/images/completeTask.png new file mode 100644 index 0000000..b92ba42 Binary files /dev/null and b/public/images/completeTask.png differ diff --git a/public/svgs/blackX.svg b/public/svgs/blackX.svg deleted file mode 100644 index bfaa8e0..0000000 --- a/public/svgs/blackX.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/svgs/completeImage.svg b/public/svgs/completeImage.svg deleted file mode 100644 index cb8ae30..0000000 --- a/public/svgs/completeImage.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/public/svgs/workspace/taskRank.svg b/public/svgs/workspace/taskRank.svg new file mode 100644 index 0000000..01d0494 --- /dev/null +++ b/public/svgs/workspace/taskRank.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/svgs/workspace/workspaceHistory/lastPrize.svg b/public/svgs/workspace/workspaceHistory/lastPrize.svg new file mode 100644 index 0000000..99965b4 --- /dev/null +++ b/public/svgs/workspace/workspaceHistory/lastPrize.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/svgs/workspace/workspaceHistory/onePrize.svg b/public/svgs/workspace/workspaceHistory/onePrize.svg new file mode 100644 index 0000000..cc536e2 --- /dev/null +++ b/public/svgs/workspace/workspaceHistory/onePrize.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/public/svgs/x.svg b/public/svgs/x.svg deleted file mode 100644 index 22b4501..0000000 --- a/public/svgs/x.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/api/workspace.ts b/src/api/workspace.ts index ae493ce..a47b780 100644 --- a/src/api/workspace.ts +++ b/src/api/workspace.ts @@ -10,7 +10,6 @@ type SearchProps = { type JoinWorkspace = { password: string; - task: string; workspaceId: number; }; @@ -52,7 +51,7 @@ const allWorkspaces = async ({ type, keyword = '', page = 0 }: SearchProps) => { type = ''; } const res = await customAxios.get( - `/workspaces?status=${type}&keyword=${keyword}&page=${page}`, + `/workspaces?status=${type}&keyword=${keyword}&page=${page}` ); return res; @@ -63,24 +62,11 @@ const createWorkspace = async (data: any) => { return res; }; -const matchPassword = async ({ workspaceId, password }: PasswordCheck) => { - const res = await customAxios.post( - `/workspaces/${workspaceId}/match-password`, - { password }, - ); - - return res; -}; - -const joinWorkspace = async ({ - password, - task, - workspaceId, -}: JoinWorkspace) => { - const formData = { password, task }; +const joinWorkspace = async ({ password, workspaceId }: JoinWorkspace) => { + const formData = { password }; const res = await customAxios.post( `/workspaces/${workspaceId}/join`, - formData, + formData ); return res; }; @@ -115,7 +101,7 @@ const missionsWorkspace = async (workspaceId: number) => { const missionsRecord = async ({ workspaceId, userId }: MissionRecord) => { const res = await customAxios.get( - `/workspaces/${workspaceId}/workings/${userId}`, + `/workspaces/${workspaceId}/workings/${userId}` ); return res; }; @@ -133,7 +119,7 @@ const userMissions = async (workspaceId: number) => { }; const completeWorkspace = async (workspaceId: number) => { - const res = await customAxios.get(`/workspaces/${workspaceId}/tasks`); + const res = await customAxios.get(`/workspaces/${workspaceId}/result`); return res; }; @@ -148,7 +134,7 @@ const workspaceHistorys = async ({ userId, }: TWorkspaceHistory) => { const res = customAxios.get( - `/workspaces/${workspaceId}/workout-context/${userId}`, + `/workspaces/${workspaceId}/workout-context/${userId}` ); return res; }; @@ -160,7 +146,7 @@ const historyDetails = async ({ workoutHistoryId, }: THistoryDetail) => { const res = customAxios.get( - `/workspaces/${workspaceId}/workout-histories/${userId}/${workoutHistoryId}`, + `/workspaces/${workspaceId}/workout-histories/${userId}/${workoutHistoryId}` ); return res; }; @@ -173,7 +159,6 @@ export { startWorkspace, leaveWorkspace, infoWorkspace, - matchPassword, missionsWorkspace, postMissions, missionsRecord, diff --git a/src/api/workspaceConfirmaion.ts b/src/api/workspaceConfirmaion.ts index eb1bc40..089b805 100644 --- a/src/api/workspaceConfirmaion.ts +++ b/src/api/workspaceConfirmaion.ts @@ -1,5 +1,9 @@ import customAxios from '@/utils/cutstomAxios'; +interface IconfirmationDetailVoteMutationProps { + workspaceId: number; +} + interface IworkoutConfirmationsProps { workspaceId: number; page: number; @@ -38,6 +42,13 @@ const workoutConfirmations = async ({ return res; }; +const confirmationDetailVoteMutationFn = async ({ + workspaceId, +}: IconfirmationDetailVoteMutationProps) => { + const res = customAxios.post(`/workspaces/${workspaceId}/objections`); + return res; +}; + const workoutConfirmaionsDetail = async ({ workspaceId, workoutConfirmationId, @@ -95,6 +106,7 @@ const workoutConfirmationObjectionLists = async ({ export { workoutConfirmations, + confirmationDetailVoteMutationFn, workoutConfirmaionsDetail, workoutObjectionReason, workoutObjections, diff --git a/src/app/(afterLogin)/create-workspace/third/page.tsx b/src/app/(afterLogin)/create-workspace/third/page.tsx index b7f57ae..2cd869c 100644 --- a/src/app/(afterLogin)/create-workspace/third/page.tsx +++ b/src/app/(afterLogin)/create-workspace/third/page.tsx @@ -35,8 +35,6 @@ export default function Page() { task: submitData.task, }; - console.log(data); - const handleFormChange = (e: React.ChangeEvent) => { const id = e.target.id; if (id === 'task') { @@ -52,9 +50,7 @@ export default function Page() { }; const handleSubmit = async () => { - console.log(data); if (task.length < 1) { - setError('테스크를 1자 이상 작성해주세요.'); return; } try { @@ -79,77 +75,82 @@ export default function Page() { return ( <> - -
+ +
-
+
+ {task.length < 1 && ( + + 테스크를 1자 이상 작성해주세요. + + )}
-
+
-
+
-
- {`${tag.length}/10`} +
+ {`${tag.length}/10`}
-
+
-
+
-
- {error !== '' ? ( - {error} - ) : null} -
-
diff --git a/src/app/(afterLogin)/workspace-complete/[workspaceId]/page.tsx b/src/app/(afterLogin)/workspace-complete/[workspaceId]/page.tsx index 53ae3dc..23ac812 100644 --- a/src/app/(afterLogin)/workspace-complete/[workspaceId]/page.tsx +++ b/src/app/(afterLogin)/workspace-complete/[workspaceId]/page.tsx @@ -1,89 +1,83 @@ 'use client'; import Image from 'next/image'; -import completeImage from '@/../public/svgs/completeImage.svg'; -import x from '@/../public/svgs/x.svg'; -import blackX from '@/../public/svgs/blackX.svg'; import { useQuery } from '@tanstack/react-query'; -import { useParams, useRouter } from 'next/navigation'; +import { useRouter } from 'next/navigation'; + +import backArrow from '@/../public/svgs/backArrow.svg'; +import onePrize from '@/../public/svgs/workspace/workspaceHistory/onePrize.svg'; +import lastPrize from '@/../public/svgs/workspace/workspaceHistory/lastPrize.svg'; import { completeWorkspace } from '@/api/workspace'; -import { useState } from 'react'; -import ConfettiButton3 from '../_components/ConfettiButton'; +import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; +import OneLastRank from '../_components/OneLastRank'; +import TaskRankMenber from '../_components/TaskRankMenbers'; +import TaskContent from '../_components/TaskContent'; export default function Page() { const router = useRouter(); - const [open, setOpen] = useState(false); - const { workspaceId } = useParams(); - const { data } = useQuery({ + const workspaceId = useWorkoutIdFromParams(); + const { data: completeWorkspaceInfo } = useQuery({ queryKey: ['complete', workspaceId], - queryFn: () => completeWorkspace(Number(workspaceId)), + queryFn: () => completeWorkspace(workspaceId), }); - const handleOpen = () => { - setOpen((v) => !v); - }; - return ( -
-
router.back()}> - {open ? ( - black-x - ) : ( - x - )} -
-
-

워크스페이스 목표를

-

모두 달성했어요!

-
당첨된 테스크를 확인 후 팀원들과
-
함께 테스크를 수행해보세요
+
+
router.back()}> + backArrow
-
-
- {open ? ( -
- {data?.data.pickedTask.task} -
- ) : ( - complete-card - )} +
+
+ 워크스페이스 목표를 + 모두 달성했어요!
- - 카드를 눌러 테스크를 확인하세요 - -
-
- 미당첨된 테스크 -
- {data?.data.tasks.map((item: any) => { - return ( -
- {item.task} -
- ); - })} + + +
+
+
+ + 최종순위를 확인 후 + + 테스크를 수행해보세요! +
+
+ + +
+
+ 팀별 순위 + +
+
- {open && }
); } diff --git a/src/app/(afterLogin)/workspace-complete/_components/OneLastRank.tsx b/src/app/(afterLogin)/workspace-complete/_components/OneLastRank.tsx new file mode 100644 index 0000000..ca76aaa --- /dev/null +++ b/src/app/(afterLogin)/workspace-complete/_components/OneLastRank.tsx @@ -0,0 +1,36 @@ +import Image from 'next/image'; + +interface OneLastRankProps { + rankPrize: any; + name: string; + contributeScore: number; + rank: number; + height: string; +} + +export default function OneLastRank({ + rankPrize, + name, + contributeScore, + rank, + height, +}: OneLastRankProps) { + return ( +
+
+ RankPrize +
+ {name} + + 총 {contributeScore}점 + +
+
+
+
{rank}
+
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace-complete/_components/TaskContent.tsx b/src/app/(afterLogin)/workspace-complete/_components/TaskContent.tsx new file mode 100644 index 0000000..293cbcf --- /dev/null +++ b/src/app/(afterLogin)/workspace-complete/_components/TaskContent.tsx @@ -0,0 +1,23 @@ +import Image from 'next/image'; + +import completeTask from '@/../public/images/completeTask.png'; + +interface TaskContentProps { + task: string; +} + +export default function TaskContent({ task }: TaskContentProps) { + return ( +
+
+ 그룹 테스크 +
+ {task} +
+
+
+ completeTask +
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace-complete/_components/TaskRankMenbers.tsx b/src/app/(afterLogin)/workspace-complete/_components/TaskRankMenbers.tsx new file mode 100644 index 0000000..9a7f690 --- /dev/null +++ b/src/app/(afterLogin)/workspace-complete/_components/TaskRankMenbers.tsx @@ -0,0 +1,39 @@ +import Image from 'next/image'; + +import taskRank from '@/../public/svgs/workspace/taskRank.svg'; + +interface workerProps { + name: string; + rank: number; + contributeScore: number; +} + +interface TaskRankMenbersProps { + workers: workerProps[]; +} + +export default function TaskRankMenbers({ workers }: TaskRankMenbersProps) { + return ( +
+ {workers.map((worker) => ( +
+
+ taskRank + + {worker.rank} + +
+
+ {worker.name} + + {worker.contributeScore} P + +
+
+ ))} +
+ ); +} diff --git a/src/app/(afterLogin)/workspace-list/_components/AllGroupTabs.tsx b/src/app/(afterLogin)/workspace-list/_components/AllGroupTabs.tsx index 6fdeada..d31522e 100644 --- a/src/app/(afterLogin)/workspace-list/_components/AllGroupTabs.tsx +++ b/src/app/(afterLogin)/workspace-list/_components/AllGroupTabs.tsx @@ -15,12 +15,7 @@ import nextArrow from '@/../public/svgs/nextArrow.svg'; import Image from 'next/image'; import { useEffect, useState } from 'react'; -import { - allWorkspaces, - alreadyIn, - joinWorkspace, - matchPassword, -} from '@/api/workspace'; +import { allWorkspaces, alreadyIn, joinWorkspace } from '@/api/workspace'; import { useInfiniteQuery } from '@tanstack/react-query'; import { workspace } from '@/constants/queryKey'; @@ -34,14 +29,12 @@ export default function AllGroupTabs() { const [search, setSearch] = useState(''); const [tabValue, setTabValue] = useState(workspaceList.complete); const [password, setPassword] = useState(''); - const [task, setTask] = useState(''); const [error, setError] = useState(''); const router = useRouter(); const [isFirstDialogOpen, setIsFirstDialogOpen] = useState(false); - const [isSecondDialogOpen, setIsSecondDialogOpen] = useState(false); const [currentWorkspaceId, setCurrentWorkspaceId] = useState(0); @@ -60,43 +53,22 @@ export default function AllGroupTabs() { }, initialPageParam: 0, getNextPageParam: (lastPage, allPages) => { - // console.log('lastPage:', lastPage); return lastPage?.nextPage || undefined; }, }); - const nextDialog = async (e: any) => { - e.preventDefault(); - try { - const res = await matchPassword({ - workspaceId: currentWorkspaceId, - password, - }); - console.log(res); - - if (res?.data.sameness === true) { - setIsFirstDialogOpen(false); - setIsSecondDialogOpen(true); - } else { - setError('잘못된 비밀번호입니다.'); - } - } catch (error) { - console.error(error); - } - }; - const onSubmit = async (e: any) => { e.preventDefault(); try { //워크스페이스 아이디 받아서 전해주기 const res = await joinWorkspace({ password, - task, workspaceId: currentWorkspaceId, }); - console.log(res); if (res.status === 200) { router.push(`/workspace/${currentWorkspaceId}`); + } else { + setError('잘못된 비밀번호입니다.'); } } catch (error) { if (error instanceof AxiosError) { @@ -116,7 +88,6 @@ export default function AllGroupTabs() { const handleAlreadyIn = async (workspaceId: number) => { const res = await alreadyIn(workspaceId); - console.log(res); if (res.data.isWorker === true) { setIsFirstDialogOpen(false); @@ -130,21 +101,16 @@ export default function AllGroupTabs() { }; const { ref, inView } = useInView({ - //아래 ref div가 보이고 나서 몇픽셀정도가 호출될건가? -> 보이자마자 호출하기에 0으로 설정 threshold: 0, - //아래 ref div가 보이고 나서 몇초후에 이벤트 발생할지 delay: 0, }); useEffect(() => { - //처음엔 false 화면에 안보이면 false임, 보이면 true로 변함 if (inView) { - //데이터 가져오고 있는데 또 가져오지 않기 위해 isFetching까지 !isFetching && hasNextPage && fetchNextPage(); } }, [inView, hasNextPage, fetchNextPage, isFetching]); - //전체적으로 client component 더 분리해보기 (일단 로직 작성 하고 나서 ) return ( <>
@@ -212,7 +178,7 @@ export default function AllGroupTabs() {
-
+ - next + join
- { - setError(''); - setIsSecondDialogOpen(open); - }} - > - - - 테스크를 입력해주세요 - - -
-
- setTask(e.target.value)} - /> -
-
- {error !== '' ? ( - - {error} - - ) : null} -
- -
- - - cancel - - - - -
-
-
-
))}
@@ -361,9 +280,9 @@ export default function AllGroupTabs() { 비밀번호를 입력해주세요 - +
-
+ - next + join
- { - setError(''); - setIsSecondDialogOpen(open); - }} - > - - - 테스크를 입력해주세요 - - -
-
- setTask(e.target.value)} - /> -
-
- {error !== '' ? ( - - {error} - - ) : null} -
- -
- - - cancel - - - - join - -
-
-
-
)}
diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/_components/WorkspaceCompleteModal.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/_components/WorkspaceCompleteModal.tsx new file mode 100644 index 0000000..946856f --- /dev/null +++ b/src/app/(afterLogin)/workspace/[workspaceId]/_components/WorkspaceCompleteModal.tsx @@ -0,0 +1,83 @@ +import Link from 'next/link'; +import { useEffect, useState } from 'react'; + +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogTitle, +} from '@/components/ui/dialog'; + +interface IWorkspaceCompleteModalProps { + workspaceId: number; + status: string; + isObjectionInProgress: boolean; +} + +export default function WorkspaceCompleteModal({ + workspaceId, + status, + isObjectionInProgress, +}: IWorkspaceCompleteModalProps) { + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + if (status === 'COMPLETED') { + setIsOpen(true); + } + }, [status]); + + const handleModalChange = (open: boolean) => { + setIsOpen(open); + }; + + return ( + + + + +
+ {isObjectionInProgress ? ( + + 테스크를 보기 위해서는 +
+ 이의신청을 모두 완료해야해요! +
+ ) : ( + + 워크스페이스 목표를 모두 달성했어요! +
+ 테스크를 확인하러갈까요? +
+ )} +
+
+
+ +
+ {!isObjectionInProgress && ( + + + + )} + + + +
+
+
+
+ ); +} diff --git a/src/app/(afterLogin)/workspace/[workspaceId]/page.tsx b/src/app/(afterLogin)/workspace/[workspaceId]/page.tsx index 951aee6..0fd3aa4 100644 --- a/src/app/(afterLogin)/workspace/[workspaceId]/page.tsx +++ b/src/app/(afterLogin)/workspace/[workspaceId]/page.tsx @@ -21,14 +21,16 @@ import { workspace } from '@/constants/queryKey'; import { imageLoader } from '@/utils/image'; import { useQuery } from '@tanstack/react-query'; -import { useParams, useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; import Image from 'next/image'; -import Link from 'next/link'; import WorkspaceTitle from '@/app/(afterLogin)/workspace/[workspaceId]/_components/WorkspaceTitle'; import WorkspaceGimmi from '@/app/(afterLogin)/workspace/[workspaceId]/_components/WorkspaceGimmi'; import { IWorker } from '@/types/workSpace'; +import ScrollTop from './workspaceConfirmation/_components/ScrollTop'; +import useWorkoutIdFromParams from '@/hooks/workoutHistory/useWorkoutIdFromParams'; +import WorkspaceCompleteModal from './_components/WorkspaceCompleteModal'; type THistoryType = { workspaceId: number; @@ -39,8 +41,7 @@ type THistoryType = { }; export default function Page() { - const { workspaceId } = useParams(); - const workspaceIdNumber = Number(workspaceId); + const workspaceIdNumber = useWorkoutIdFromParams(); const router = useRouter(); @@ -51,8 +52,6 @@ export default function Page() { queryFn: () => infoWorkspace(workspaceIdNumber), }); - const [isOpen, setIsOpen] = useState(false); - let achievementScore = (infoWork?.data.achievementScore / infoWork?.data.goalScore) * 100; @@ -60,16 +59,6 @@ export default function Page() { achievementScore = 100; } - useEffect(() => { - if (infoWork?.data.status === 'COMPLETED') { - setIsOpen(true); - } - }, [infoWork]); - - const handleModalChange = (open: any) => { - setIsOpen(open); - }; - const handleUserId = (user: { userId: number; isMyself: boolean }) => { clickPageMove({ workspaceId: workspaceIdNumber, @@ -116,30 +105,12 @@ export default function Page() { return (
- - - -
- 워크스페이스 목표를 모두 달성했어요!
테스크를 확인하러 - 갈까요? -
-
- -
- -
- cancel -
-
- -
- yes -
- -
-
-
-
+ +
@@ -227,7 +198,7 @@ export default function Page() {