From 96790204ccb176dd966be8b940402bda532a1adc Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Sat, 11 Jul 2026 18:40:48 +0900 Subject: [PATCH 01/28] feat: login page --- package-lock.json | 134 +++++++++-- package.json | 1 + src/api/authApi.js | 93 ++++++++ src/assets/back.svg | 3 + src/assets/caution.svg | 3 + src/assets/check.svg | 3 + src/assets/email.svg | 11 + src/assets/eye.svg | 3 + src/assets/join.svg | 3 + src/assets/lock.svg | 3 + src/assets/logo.png | Bin 0 -> 537736 bytes src/assets/pwlock.svg | 3 + src/components/common/Input.tsx | 4 +- src/components/layout/RootLayout.tsx | 17 +- src/pages/login/login.jsx | 291 +++++++++++++++++++++++ src/pages/login/login.module.css | 340 +++++++++++++++++++++++++++ src/routes/router.tsx | 4 + src/store/tokenStorage.js | 56 +++++ 18 files changed, 943 insertions(+), 29 deletions(-) create mode 100644 src/api/authApi.js create mode 100644 src/assets/back.svg create mode 100644 src/assets/caution.svg create mode 100644 src/assets/check.svg create mode 100644 src/assets/email.svg create mode 100644 src/assets/eye.svg create mode 100644 src/assets/join.svg create mode 100644 src/assets/lock.svg create mode 100644 src/assets/logo.png create mode 100644 src/assets/pwlock.svg create mode 100644 src/pages/login/login.jsx create mode 100644 src/pages/login/login.module.css create mode 100644 src/store/tokenStorage.js diff --git a/package-lock.json b/package-lock.json index 9dee337..4b31aaa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0", + "tailwind-merge": "^3.6.0", "zustand": "^5.0.14" }, "devDependencies": { @@ -46,6 +47,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -63,6 +89,7 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -82,6 +109,7 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -95,6 +123,7 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -105,6 +134,7 @@ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", @@ -120,6 +150,7 @@ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/core": "^1.2.1" }, @@ -133,6 +164,7 @@ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -146,6 +178,7 @@ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } @@ -156,6 +189,7 @@ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" @@ -170,6 +204,7 @@ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@humanfs/types": "^0.15.0" }, @@ -183,6 +218,7 @@ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", @@ -198,6 +234,7 @@ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18.0" } @@ -208,6 +245,7 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=12.22" }, @@ -222,6 +260,7 @@ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.18" }, @@ -996,21 +1035,24 @@ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/node": { "version": "24.13.2", @@ -1018,7 +1060,6 @@ "integrity": "sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -1029,7 +1070,6 @@ "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -1090,6 +1130,7 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1112,6 +1153,7 @@ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1267,6 +1309,7 @@ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "18 || 20 || >=22" } @@ -1303,6 +1346,7 @@ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "balanced-match": "^4.0.2" }, @@ -1343,7 +1387,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -1514,6 +1557,7 @@ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1565,7 +1609,8 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -1702,6 +1747,7 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, @@ -1775,7 +1821,6 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -1823,6 +1868,7 @@ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", @@ -1842,6 +1888,7 @@ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, @@ -1855,6 +1902,7 @@ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", @@ -1873,6 +1921,7 @@ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -1886,6 +1935,7 @@ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -1899,6 +1949,7 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -1909,6 +1960,7 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -1925,7 +1977,8 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-diff": { "version": "1.3.0", @@ -1969,14 +2022,16 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fastq": { "version": "1.20.1", @@ -2012,6 +2067,7 @@ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -2038,6 +2094,7 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2055,6 +2112,7 @@ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -2068,7 +2126,8 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/follow-redirects": { "version": "1.16.0", @@ -2293,6 +2352,7 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 4" } @@ -2303,6 +2363,7 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.8.19" } @@ -2390,7 +2451,8 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/jiti": { "version": "1.21.7", @@ -2398,7 +2460,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -2408,21 +2469,24 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/keyv": { "version": "4.5.4", @@ -2430,6 +2494,7 @@ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -2440,6 +2505,7 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2777,6 +2843,7 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -2946,6 +3013,7 @@ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", + "peer": true, "dependencies": { "brace-expansion": "^5.0.5" }, @@ -2998,7 +3066,8 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/node-releases": { "version": "2.0.50", @@ -3062,6 +3131,7 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3129,6 +3199,7 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -3145,6 +3216,7 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -3161,6 +3233,7 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -3171,6 +3244,7 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -3242,7 +3316,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -3392,6 +3465,7 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -3402,7 +3476,6 @@ "integrity": "sha512-ppiDo2CSwexck1eyZUwJHg/N3nf1+6IRCv7W/VJ5vaLnVCmB7+3CdRfMwoCHBBX6xTrREDTksZ4OZl5SSf4zXA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -3441,6 +3514,7 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -3471,7 +3545,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -3481,7 +3554,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -3696,6 +3768,7 @@ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3709,6 +3782,7 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -3848,6 +3922,16 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -3970,6 +4054,7 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -4035,6 +4120,7 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -4052,7 +4138,6 @@ "integrity": "sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -4131,6 +4216,7 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4147,6 +4233,7 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4192,6 +4279,7 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 50c40d5..ba29833 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0", + "tailwind-merge": "^3.6.0", "zustand": "^5.0.14" }, "devDependencies": { diff --git a/src/api/authApi.js b/src/api/authApi.js new file mode 100644 index 0000000..56b66d6 --- /dev/null +++ b/src/api/authApi.js @@ -0,0 +1,93 @@ +/** + * Mock 인증 API + * 실제 백엔드가 준비되면 이 파일의 함수 내부만 fetch 호출로 교체하면 됩니다. + * + * POST /auth/login + * body: { email: string, password: string } + * 200 OK -> { accessToken, refreshToken, expiresIn } + * 400 Bad Request -> 비밀번호 불일치 / 존재하지 않는 계정 + * 403 Forbidden -> 정지된 계정 + */ + +// 테스트용 mock 계정 +const MOCK_USERS = [ + { + email: "vortexjml@sookmyung.ac.kr", + password: "abc123!@", + status: "active", + }, + { + email: "suspended@sookmyung.ac.kr", + password: "abc123!@", + status: "suspended", // 정지된 계정 테스트용 + }, +]; + +const NETWORK_DELAY_MS = 700; + +function generateMockToken(prefix) { + const random = Math.random().toString(36).slice(2, 12); + return `${prefix}.${random}.${Date.now()}`; +} + +export class ApiError extends Error { + constructor(status, message) { + super(message); + this.status = status; + } +} + +/** + * 이메일/비밀번호 로그인 + * @param {{ email: string, password: string }} payload + * @returns {Promise<{ accessToken: string, refreshToken: string, expiresIn: number }>} + */ +export function loginRequest({ email, password }) { + return new Promise((resolve, reject) => { + setTimeout(() => { + const user = MOCK_USERS.find((u) => u.email === email); + + if (!user) { + reject(new ApiError(400, "이메일 또는 비밀번호가 올바르지 않습니다.")); + return; + } + + if (user.status === "suspended") { + reject(new ApiError(403, "정지된 계정입니다. 고객센터로 문의해주세요.")); + return; + } + + if (user.password !== password) { + reject(new ApiError(400, "비밀번호가 일치하지 않습니다.")); + return; + } + + resolve({ + accessToken: generateMockToken("access"), + refreshToken: generateMockToken("refresh"), + // 데모/테스트 편의를 위해 30초로 설정 (실서비스는 30분 등으로 조정) + expiresIn: 30, + }); + }, NETWORK_DELAY_MS); + }); +} + +/** + * Refresh Token으로 Access Token 재발급 + * @param {string} refreshToken + */ +export function refreshTokenRequest(refreshToken) { + return new Promise((resolve, reject) => { + setTimeout(() => { + if (!refreshToken) { + reject(new ApiError(401, "Refresh Token이 없습니다. 다시 로그인해주세요.")); + return; + } + resolve({ + accessToken: generateMockToken("access"), + refreshToken, + expiresIn: 30, + }); + }, 400); + }); +} diff --git a/src/assets/back.svg b/src/assets/back.svg new file mode 100644 index 0000000..e79e89c --- /dev/null +++ b/src/assets/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/caution.svg b/src/assets/caution.svg new file mode 100644 index 0000000..a40a0c7 --- /dev/null +++ b/src/assets/caution.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/check.svg b/src/assets/check.svg new file mode 100644 index 0000000..987707f --- /dev/null +++ b/src/assets/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/email.svg b/src/assets/email.svg new file mode 100644 index 0000000..a83027b --- /dev/null +++ b/src/assets/email.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/eye.svg b/src/assets/eye.svg new file mode 100644 index 0000000..c80a01c --- /dev/null +++ b/src/assets/eye.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/join.svg b/src/assets/join.svg new file mode 100644 index 0000000..be760db --- /dev/null +++ b/src/assets/join.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/lock.svg b/src/assets/lock.svg new file mode 100644 index 0000000..a5208c7 --- /dev/null +++ b/src/assets/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b553ab13ce64e86330522a617f4e5a400b263a GIT binary patch literal 537736 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
}~*<|HnE=}K+dpN?Dx``>7VK{TDv9u5Qn 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%0DemG#aoNi_M1M6K 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 z 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 W`mnAm9Ze!rFH9R@< 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 k`uE=bns0dcy0?Fb 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�d`*!>TzX|G=kdN5!h3dOInS(X4!b(P_aql0hP=rd z_Og!|1nB^AGoMYwhrtQ8_1-IH8|VEp(a!Uz?>3pbbs|8A2MGF8xg>-#o)|iRjZnv4MqLAWsB5&X z*sS}aw6$?&8W^oUgSJ&SW65o#8D-4Zqa2~k2w#Lvw+fp;dEk;5tTvP3Vw1%`=^iO$ zO}SkgYu*QnO;TC+Oxw2iqW{u`2m-JQdv$wKJ>tfTa@RI`n5WyhUVZ++j)u@e`GM`$Xs^pVBiE_lSYe72L7sjbl9yKxE~AfTeXXbDMTHXw8Xr9x=1_r3kbhrEE)6lTqyr zBE}&IKCzu|uky%PA^RvKJO)5Z<_#@5|1^R$7~l1`Qj1MovRi+wAbXge`1F)~x(4x#)+or8*!`bjCJ zq3RK$%5j_EtCQv*r?9o;i3?kl#--2;iCs&m$N46@rY~xeReQ))n)_`$Nu1ywYdP$; zwyKqiHevJ{C7(z7-7x(0ZWF&l=nUm>^py9JGb7~o5IFdjsCQOVNA3w|Jn11YAvvQY zHU>~MW!X@#a7PoZNtjCo@V;P_Ls)e4paF(hHVhpl`ya@CFb0!jKn@6FvP1ub z(%2l-1p|#vsH3r&9smHDZGgy%joc~@JN4KTeJv(uETEcy;}>Zq5wWPgf4 zW>}iEd2R|*>Etg%=$fF@awsEh+h?9$NsC~4@4?+tzZj4=Ih9^eozp12?mE2~1V)i; zD$O30p6U_^`I}>Pr4qi-6&k0@Xo11SKLCUME54PH;Qf@WW(TR4;|MCEh3& z$QmmpQN<~q3e!i3xU8v#ZsB#ImA6OLXU>IulX)o!AiZ~fFGnyI0Ey0a%+=@& zb`l5+1XojD!9e*F1`2OUauHe074~!-;X5dmrCQ*924s&?YbCV}L#jrXp;~-C3g5@6 z$D4dC_fX;`QWertdFUgD5%;)f2KUSP%Gzvg&C;EUG(jXQ=8k}Y(8U9*Xcb4p^JMTcV8-LOatINh7whf+BFb6%4Z$Z zY8(LM!`0)Ev8i%EvF~Tcy&7i}yHXeA@!sf?#Ve{-P}0z>NVGj0TA@W_n4jDdy<&~{I9 zyb)zqpMm6~5h_|2EWZ+3;~XQ|ZDPrqNbR?NjriK0XN%us11EzjKV=PJ#uWxa%KWt) z!lKA=2+>qXOr%4uWbzTP#zc_3NOTYPWr0xZ7!{b7&zC0*vJWcRPRm7T2J$nCh#|+X zg^+;V$20`fuS4|!IuQ3*E|!b+)zxmkwmLt1cJqNV58VCs)k8<$^zQHZ#`~^&`>g~p zrk}-~Fk!;EFkHVTO!xxf1+V+Sr8}n|e$|o7ul|ljw|Zpf%$dauOw`HG<`Mu9x|*n1 zQfUtWglb8t$waYk>5(Yrl%*{olFrmTHAR@#jd{u4syg;k>9@vo5ny^oMq|L=jsFNzqW0_*9nIASTIwWMV4878imb)wi_HRBNRD@qn2GC zdY+}CFT7@MrUfWlXLff1sH_{&IlYI)u_Fp7{PXd|4MQ;)(|XPJY#oW%0_PsC+D`A2 zsbJK7*X~(k5qZ!0-epcz3A+e+#1|u}T=azbPy`y9lw;2k8MiyqwDc#b2qzJe zIsnKw^Mq)Rkpwvb?ay$OSL7~NCe-jt)YoBDlsxIe{UWS1KK*?iV#5%CP z(;X=FtUHWYDMYIw_gBedYeInC(R_6sY&7$gBnAq-LY8lWO5a6W2KDH=$+n; zIcLOw?YQ=5(M)KZc&q2LfDd*#9X5FowbW;G89- zexTyLk|^n+GPcXu^>r)hI0o0K`!;{S}56YZ8WvXqvbpWT$*!I-CKbO5)cj+-Xpd4oEgEQTtjc*&d$~0=u zjcfw|G-+kHcNNC4vK2Lv^W;iTH&SCyoB&BB-D)-xt^g28;i>$HU56(#g7zTO+8{_W zlU0)1b9%kuMQ2VTO-uBF%9Q4fE>?Sq%zjC)bdC;cV@wnu%i3}6*aFNyZg^p%B<@Bl zt_*tF(Wdj|Fri}%2x}#|*P^`S_;bk|(-;}3f2RU<%;`g}{IFneh>XlR^`eF|0#BQr zLcri5eT{8zFWUYq(D^?O3guD*Al|haiw>=f`<0zeeUf4}>X=`pN67lsVC6RAy=2=c zgye6md>#yMh1dZ^fyBZ+80p}|V4g9E7W37Wm2Urm?&R$s`%m+=weNfH_dox3Abz6V zT1=Sm<&Nk7^!u*Da`U_PU2x&It*jls;Oyq9CGRd7gs#&ClVo4+>~H-s1b`27Usp`wve$~1Q0OfBfHp;Cp4CB@Xv3`rs zx=tytX`6~|9}=2Sn3}yUF&X*B4E5RqX$r^OC%qImax6guOjYZXfItHqB3}YZWrH;e zUi(Hg02dRN&1X(!VGe%Y)YUifXf<3kS~C|^eWWj8%t<5tVJNB_m`hD+G(_XN-QRK_ z_R5`jK&ifXWskY-_aeqLK=wa!z7sRrrD~y>r$Pf57E8;oF-fi3*b}Btg~v<-&^Rmy z524XFmp$g8rvepVDc0`NMkEB*pYjts4DJCCGpJk6XKOQ>ug|tN@4J2H`2BC#cm9<( z-tryKI;+|yJWBE6H~-GsnTH?z`-hHR@IzahJDaole2oay0YE3?4EoCqHeX|u$-WV_ zxB_rN0_pf0AAt^=mw8_$8lMPB7OVb<&AiwM(TdY`v#7LZ@339Rlh82kIzgn9D%%GM0FyT3k?1o6X`By*60*<0 zkS{i+ALPZG6nm+q{j@v_kHO-7-}fu~_7l3b`xi-+%ta&po@fjpgq4_Kdp~5LrSH z-(R2@n7VBvC!?~LO5Hy#WE*RG$7n2hi_KRX=%&oZBU6!_z_}Aj@n3{3*^mlUnJFU3 zn?_<=WX+D&Rg@qHc$FOZG&qgs@q2}@n#-GCh_flTbnG)U~yYX5n9$S zOp!_Sq6a9+Gb;j!gFH8gJ%HJ1>u(;XcXz1?igR48+o7?@F`+t5m+yD1|?KNLN{e930k4s#4!-wdm>z~2b{``k$TMvBhPcph6 z+JD7W-@3cA3qHHKJx4bOf%MH#faH0t&%-i78Tseiy{z?i&B(h>{^={3%XOd1>q1%c zDO>;`mArN*79i`3(b`q1)(QEYC-XyuvJHtTKU!=*%p+}-&q#X72ml!Di?8x?m<+X< zbZ0ZAuZ1D~B6~-Ovg(a|ptMzzqiLJF-Wc*ixw}*)M<}IX)a|~Wd%s{rXH=eu3cp(5 zl&+?n!TY$;$3YQzV}*=I2chKA5r@b^U+QR6Sws##=%-{ivO*Ctdep$#m1>z7fFI|03`Ct@BkBV}56UbY3V3)@P8wlw91O{5xFvghxG|{lov}MF+3`6L0Q!PCc=sISBIexH2{YCi&Ap zAjn=S12fhgKnIQ#rJjmJX?=u@|I`eKby0?G8k?wU^ZF)gLN?9`N|((_nV}_73(d@))8u^ z5EehKHJ2fkd)s&k1sgx~=No7GCjZ0!u0kdC zCc!N~#qN;sD@Yozl=NdqJXPOOaC!;#EQh~w<8gv-@{o#<%$+QW3b9U6)m=fcfMW^H zadYL}tW7u~&AwGlGolC&6BdG-Z(O-G0*mJFjNyEN{aHT4?}PjxeQGsjE*_`d{=f8} z^nrz9b1tdy{?Q1MZA~u-!!f}Qg2ib8 zF5%}Z!Pe}KqaIR$&j_23T=$-v%F;h1^hEIJOmnMO^fn#lmr8 zPD`yf3HguZO-4StdBP?Vao?K~y5Invq1ITuQih>P5UOPu>dgC}zUyEhsVE4msAi#S zq_wr=8vzs>Ni6vo^+=J3kS^~UfRo96lA+v zv$*>f{A;*!!1zZpKYi6tO6maJF=OViZ4(layLbkf5~sy08AEf)?3gzRs%XBTJL=%< zt>5vud(Vi4Aw)onXXF4KcCWGT<+xPxtF$6X?%gr;`KC#i%1n^9TC(~w& zmfa2tpQ*hNuIr%sGxjR{xYp%-Itj%1GZAmhy}p2A(V_bu$$DYWCiyc*JP>eS|G;cp z1YMsbsKZQEtCABc$$96J?%=S+rOye$2UVp{NG(czCrUG_4I$z%-Q;t@m;m83l?TQ}8JS9BTp!4EyA-wo@Y zU{fjX89^#<#dXGZ8GCtG8qRyUR>_ngQZ^I*$g_L|br4q6vN*@|0g#`oLr%#8so(t3 ziU$&CwZGefAeR2l@oM!L%cxku+Py_v-Lj9-tpv;Zs*#gG)W1dB%{aBR^ziF!g`Q)L z2>Tp<2z+b~OKN<+x&x2yDiQzFU2F|3Tk{zG!9&@)K_V^YeBAs{e4Q4!F=+%h3Kzz= zgAY#iX|7Ea4ngB_XMS&NLzo`(8(JP-{RuT$WKE&SJEPpR5D?AT2_i<9c1v2wTuRP} zOe)t7kvt3pOb%|!l_fm{8H6QCdIke6cexrcHA^l*q|i<|ROjvO$rb-(OwzZjJod&U2;_iy;G{|lay-I)dP#t?W(M!il-^etBX05QNOfP>PlZtpDRg* zd+oDfReUM-{D%MteEY>!lK=AW;iWx`*c$4OVhvvYN#HgIkJLQZq?E#mo^d#1{H!uK zbS!(GL@@5mv03^dq@9R)Qg@b~o(f+2FOWnXgnNAsOa=JvzY9O@#)i&=Td6a}+0>0EjMZ;$N0I90 z8;oEVt|u}572i!`XXpM%lH-o4O(g0$(mRty!E{lcP#@F;1sk6_D&rQi!M6i#82>q7 z>Y|dA7M6@`EYT2ODIn^mTD|W!i3+o)6;BHH0KUrYOYWS?taKgZj0`?=KChx%va@y3JRMC7RsvUIRvZ@S; z4Z93R82;ny6`R4iVHv+Nqih%WMiJ2}oar6Ag(1Ld(N-@ zH6O_)s9o_ih@orP4L_ApFR9V&1B~;^wAo>P4 zWg8E$x47XtI9!PC{j$gv97jZ^*Z+BkfVJ`7kMrgK*3h;d9Xb~lay_=TfY;Ix+y7|~ z?LCJ$r;34KP5{gN6rb%IPK9x4#O-r7Yh&y&Ggj?5F|2Wy$%yME`Wqg+)8>MBk zaU#gJAR`H8_}C8b1qe$08!7CI@kWWficzU8#*-#vE* zdf%x}$4-hV?oP?+%r9-iKdL3FL)pfHB?k9gbI7JWzl%YD=_elt@_(S(djtE5C{7 za3$X}#n)K+u7%2 zVKe)vAko;=F}}q^c|1T>-eV!BiyP&Ly1EUfP^FrPCBSfNn+&kc5wOnK_iYV{2XEUAMQqXyqd|KO=`?>SvPiv& zH}f_98||@UK*&31U7qoapFkwi*;-ygW(K0zmPw1;Mo%*VE1m#2on|l9V&l#A@^c3y zw5v$_&HQ?af8vSRIE0*D+A^s`IgXgk~S)b zEvzg!!nGhJPlW@m?u>)0k)Y={r1Yz0wRhHSz~CPa?|v>^%WXw}cl@UyP2RXU-+?x{ zu1ivcvaRUfjeg2^N+f-9b}}6glTtfv!<&eDuZ6a`Bo1EBp$ArxyTp40deN@{2;_=A z8h;;D9>x4s=4A|bxm=Z&{8!WkzJ2yaDKT{dkUw^yMCn2r@ougzV)Q=6skp&;z~T2a zfw(w?eIuPI)^m@q>Kx0fgg0+tokEAnP5C{K!@E#v?I82Nx6j@!a?8Nu9)mT{r$Hr> zuD6WG4exhOTpB^Ji3Y-F=hu!O6v2d&6J6k~m2Ywm7kZPfIV=yVS8k4*Z+RxQKLIA^F)&94< z$AKob9+1QQq5~BCl#!MkRSWWml@}=-Uxqa$dgzXm%r$C6kecD6`*C)5>VqLvoax4; zUQ6M^D$9L1%>Z8mMJ9i>V!O?9VGMPX50^Rgr~?y{)T$OW6!q~XbTAvG!CkEjAv<&)H*f!$nIsYswRO*l(X*-=#90=42{)Lu4itUK)vWUZ~K^dzDg;-*=9j z@BB_i9z7(aNW(Slt%!RD= zzbW{W%)I&z3x_^aWFMt%sjP&uE%aa*OBgI$*Szo`$>dupr_xpZJFi@oL@zG~6!trD z;2f#nlPrK;L_yFUIp;EST3y}o#((+)b}H+QmJm&~uq4xAOi z-@9+uT9ecEI;BDCbEENoJay6tchm?>eFX+X5NjYGZ=I&dVi%SPG9no7ql~yld1dB% zG;x^1xKs-bN9Wm%{DtHQX^saGWWodXON|l>1or{Rv{QV_B@QdT+(JGi;&t+dburXQ zKr41!*s*FvyrxnF!$qL^s1Mn#bXA*g);Efi#xl&C=(?YygjCW+X<2_g#p}o(_nsO< z$$f0kp%v^Mwm6G?G5z_b(jJW8`^p@$W@l)jo`JJ>=_)dp%5KeV*#cA%Dvn2prSGpT zFyY)eilb3Uy-Fy*1NT!u5rRZNW)=gr#Y~xL7yN=T_DtDgl3BRoBlLs|RJg~aT52Tk z!GCkra3b<#xS8-lRAZC(z3Ofq3Vh+)xwbe6Pmu^eoK%~*cLP6zHQsJI4Zw>^wXy%9 z@%?d2!(i-=>i5p{$FO8)Dani1k=}bzZ}aks)=~Aj9ou9$|1*dX9BZV}K)y7%((0qg zwDO?M8u<-Ik6bqS_--R}nb#vZq68V;Q8olZW_SPftzFf5elSrGCC({5dI2sWb*9=8 z?RXJwhSw-^3OllZ#%HlL;V%S0^PY}79)jzXn4z?TGM}3`0a$+xPzt$K8V?d)^^Of% znK`_pAkN;~>wBVnSbpx*ICjO_{048`k8jUeXss|V10vD6pi{I@mSB+v zocc5Lc%0ZuM^PG?XHzI6(ZKbg34DZ9oX{l7hNyZh!;R@U*kn}&R>%RK^AbjCkUF|v z3R(HAXwlDTcupb0l%yQqBgLhv2>O4-Bp}AlLBWyKueqo^pR7<2*(9kO>9fnMmVX)< zAR|t)l%oa=VTJ9*~x)03@*KFncUoQo6f@VC9;)1VgTuhRwaxG zb#UKBzHJ9oL(68I7bKxa-}jwbL5zXS^(=xodKSwhRvs~l!{ENF;}t9+Ak%2U*^FDn zhhswkKp9qNL33OqYAkX}7pSCd&Gj%NOBU*iN$O|u--boUqM9Z>zMIP)@dj#e*3J-eCBy3Ie~bM z&*O;d>Ya_H-@RY{zPtCjZUt*>Ue#Ozr(^+b4|b#lnFh~MyB|R#Jo+~+I*->6Q?-A2 zP=$Qkz1%uY{^GAcr(>)yG(x+qJ4T7u)fx>?L2=|xn|@=6{i!}e4$m&E7PJv_g3=O} zLA+wpEhTm<*9N60dFHFZ#44pA^YL<~=G%=t@9Ldrngwmil(Z=4Iz4lNm&HG@w)}o0 z%lfv@zwb~@p0=p*MCL$_ZC{u6&8T)o&UcX zv1uOj6pHI zF9T21Z~`lbxh=p?5sqgii!Q#bB}bV69se_poZ)X8t@@GQK1PaVL{;WI)j)zZuOb7; z43bRNlS-F*7o!fQ3{CT^U{YaSygssdLp0MTc4;3}yp7yC;9(i%OE)f+D6fpp!ul7I zWrXjMSxIKvk)8&CKFpTWrOla;2d5aGdyj$@M=^i5Kv$K%-5ak^wu-$BFk_!gbbvVc z`Co-=kq~B>A8IZ1y;9q1tQJ`+{jS1!2v92XSD`DL;UkNwjWA#VNn|m-->Ay!5RD_j zN*H}vZEq|zv0ohZ63>z-o%9_b!4yLzzn6Pb<3o#oS}y5MI|}6098te-3a*ak_Z<^L zu+}xsGpMPVI^5{FuUX@JZ-2G#1%c@|-7i~UOv&QHbmhOwuiaTCw9n4&dYrNWdtL2c zRuKt(+TdBFHXd9|VH(EuOo+WO^O0& z205}6c!bImKP zX`|eVdKqoqV71wUfoQ2i-DrUQ#Y>(r@R)ro6t#&D*v?q~^^{y=yqz6>b*yBVyWO%O z|F5%_4HK1|gm4{9Uv3eSOqPE=$-)fwXDKfB zPwRZ(&w`GBhOCO}3;a4-rmoyBTR{UU14(biiEERM&ryqLHGkcvas=P6vU5E~PWvex zeoxyN{PIf4zB&lE_ze7fgn?u20jr;ErZpcrbp|zI9?2lj#3P_xdO{)NoGpoCi$1-V zRkMT<2>^v!xoTp6>yZt31jJM^Y_yhqY%I!ZaL~`nq5tF?E>?#`E~<3*02_x_$FX7d z=tzG~T|@e13nEv41f2;$)p> z?t7p$R1&?JGT8}w!E}!hUt%Ub&3F7ga*K}2g+2br z*+ngq%$Q5&9BD@~Cd5FgsE#eRRk#Q2>1Y`r)Sg$sDox&qo_MpRrrdw7=bt97x;VB6^$pY@=J;Q;+)vf6y8*6vXsVhKp~mL(!O7 z#LMg#n~sTf`6unK2hqe!ur&xn|A0XTWW*JnO=A(WVzDU*Li4HMAjp!O?HIi^6-Sl} z%h6d=syMPKq>Js=y9M%c6Y|0VY1N)5G*JM3diiTLO>aXJnjD^&YSz2ElFrNugU0` zI?;+D@uxOABVr!KuPsCG%7|!68^Q>soSbn(UwWIz^)Bb1d9)LsV z&4bfl30x;uUV69||--Rm9ZUQGk*P4G;m^ z^3Wu3FzqLYnaujve5rqV0*9VXAY!S6500kF>6i@LLXJ_9G3mut_+aH}TF7q7!2ESj z#Mpn>aTzf2(oFt6Gqpl8m1gdVzfY4807z}Qus+T0Baw45D0Z7eQ|Aqe znM;LDB|T&DsFVP?TsI&xz^>k@9T%lq5^;i-V0 z&3xtXszHH0AC7MZMBf*gevYG z{%-OoobG|j@}9KznWrdXbGc+K}&EQ^goa!S31Qcyr5*nKX zj4ne{_1v8T6K5nCTA5UkXI{45CKcsuFF`YD;*A~VTT}Z?WJG?Z)$r=$8b$ssi3#JU zg!z6`#W|KC&piu#)1FzLPx)we!oNOabKS?(J}(7&Z*8V3I>2w6!c)PnuFY8xf&r%P zYYSRUZqFsBFYx}jSh%al@k)uQ#obez1rIud9Rq_M9?XRMHjdt+xa4k9yviQH74GQ9 zGC%{_9+UM`9+NU0!UMR?Og0uzr4){66rAiCR!61rZWva(O9P*jK)chZHkZjnK>_FL z_#^SFaJv^iU^hSKilW~Aeasz;r+j@Lp2n{G1OaDlK)BtsRc9Z1RZvwcmcW{FY}|idGNp zZ!7etL`4{0O?B4c@isZ|Iv*hfVqsDK4%&nFXB8VOt^%?8qg~a7ea_Q-`Lxer=~U;< z*ymYxt@q)bd-H#r$UT@^-z}^bUZv0O+nTl)R%XxDEe8kY&K`?jOD7HvE;sv&i_i@R z%}he|=A!}VHnCH;5|ytI-vlu%y^NBHhFVZt)zUo5Woy#yLs-=1)FGDoY)c>thV3QH z!AUK4wD;X>)D1J5yVsuBD#$V@ETVEo)ytcC>S^=(9`L0c^uWH%6d+QkQ*Jjmh@`^l znUG#z{rL%@LmRfjz|Y#f^%RPm0Q>-xB=no9S;qD0Wb7Kr6x<&Q5x-^^5eTrk$Be1+|RdXrH}E}Y<`cI(Wuu0 z^Mj+#c-kDBSLwSyhX?aFMoNKkwKD9{DoM$!%I{lb8nn&XV zyd)SJg)}@z!4zGavTeuKZ?apO)OEPDIKgxtHBFO#QWsU{oDuMrlDu$UcM$!Mq?9x9 zZ-3EvV4r`lE~e{ep)lE(fXjQNx|c;&AT~4FH`hk7^6fc-#!>(0p;WuaWx9v=BSCmm zn4h9bnAsSSRC|lr(=X9LmG0f1iMie&svL(~@wE4dG+6Nh`0OlTM5RB6LQ~DTEwAjM z{)gtfpAg*4C;7Co*M*n93nPfJamBjT=Wy`6l;r7*mE^0_HOl4lrb8DRpae}qDGhwp zBi46-g?e-%A1TL?z=tK)Rle)1*eX5mgRQf$>Aj8Y;In%@>6@k+%C&8X{cIh%3>L0J zZx?s7#X$%FmCqDYpzXe2$v80BEmrrje*G61(lq!Dwu=irJ_OTdwDniIE*~5&7E#}}Uxre9 zE!(?cm{Q~+IUSeSF~R`GE@V1|YsnOOv637{@GZ?YVO2iUk_ZiNZLkI!O?iB=@Wrr* zpMEJnAgep$ebT(gA8%Gm-x^+U%)}=L639*0)WuJTWFLzDd~@}Yt*@R8OkNWanQdRn znF12H7hBORywzd*QFm)&Q<;%munn`v=}&D)2+p!&dUSMGyzlqA$lh#th!HH?@NRc$ z&^kpL)yOo9vfyEvq5xzR+{_`U7H63G&aXZiCziMxPQr)?TN|Qv78l=Tk^>e~qZpEEO8HS>lWc{m&hXx8bO>8B{QKjNVC_VAbb*HHB zy%T(@Duej4a1eV3gNMZp40PxL7Y28;`f>KW5Y2h!XF#=d$3fsC8{&gugA;t&Yq#K9 zy%1ywajlPqDVB*}e?P?>dr3zXyvQ!wtcPSrM&A*->N9= zLSR}MT%F9)@1nNl0{>4@}!CHFOa|k@zk*>D!j8KHPtx-~ztA~;q3S;#8$!t~+~z@2W$C0HpI-91_0K^HyIwNX~go$Pa9_L0*_I#ENtQWW$8-he}+G z;tE9&#A|;>J(C<{93jgd3Hh{I3mKKQsn+beNN|t#Y8=m~&(bf>D9Z!$wJvnMLQnW3u__SZ^dV4}Xwz||0vKj*~i>oZuFEo+vmkwxsmuQ;0)NGG}oaT(qRaM5Y{J`CwwNI@jSBLjLG=taIf?t33 z2v|MV?Cz#Cgur_52efIWjmLCh*Zu|Hvuca!thS)kY4;lLcy5l%#x{LZQ2+`v$MLLfW36vy2^x;6 z@rlTAfbjvi4#bh7MEmq<*&g>SY&yg$UKBgZ_i#jHQHDpo_G)0sRCaWSWoy@}&E~$8 z=+X%=$HmMbHbDifOeJ@99y$J4w?)@i_a$VNq@Ia@;R-tQ8f@iNDCLIZ+W&SL9fNH$ zt`a^21$}28ll}?}k2!2?_91?;x4B&=Ze?`s-wo{VO>h5UW2VbC1lepm z@-ZO$C-jY?Ez{p8YeH?Ge|_BFPi||y|HS@V9mi@_%7I98BMU{D%U{RPbhiim{Gm^s zlG@!6C}Yi)Nru@?g*MVqLICv+doX$KFbrge$rs`G3;p*h#~XIl_VNC z#bRbtz%I-0L6*u3Fz)q45vv5wNih-Sk1@lqy!1no!O_=*3=|5NAF?N)N;jL>E*P4) zG96y|Q;+`9$lOu))3r0BV?Lz)1dHM4qN{)+rvoZ|dlZTK;}e_X zrLU)V@O-*B<|Xv*u%y2DIrR$Me$Ksr_;2o^l>R6=2Fu<3Cva&=e;@eE=U(A;EL>E& zwcu@2v+`$*c|qo(T9WceqQ;TxpE?<)N+2hNIvW~r6%mj>$hJob=3yl?B^Rdz$*eNX zXP8pY8wMrSuw;FSP~uM0Wwa^dgcs=qseN5qlQ(LMh2VxSl$oK1B8U)u@FsJLMz+W)jr{u&!T#hK1MNG)clIFqCVRHzPZB1|Cp^8=Ejn zv!0{hqRBWAg>?_kV(LKQV0Al7RCseaXI8Yo8$QRWShF5v1v0j#KbnyKwI!b>vQTNRWyZn0zxDOIcl$%#ri{4IHh6u|;^ zPRnm)A|uI;kMWW#H-;wnRf#s?yJ3uXoECkn(TyJ1pnUSw-_|4Vh*mP>RRG*%=KHNW zW~+t^7Ipt9Xl*8IKJzxhS$_J(J1$P2$MwaEwGLIrpMC|j>0k7=-+s+yPoFqim&_^U z4JCJ3bet%VuC0T{#bH>e`giI2*Y~0)%8@EyTkQ>nLjWY1i|Q`0e;f7op0C5B*XL!~ zA=l?=GxzK7SuA^xBlnN7lgohb;5J%5rUMe}u0S_}tnrbYZT274 z%0@PdTErPp7Z{SVw;;_=PRq)-P=+9uBCD!veX`BE-=FE8g26o&sy0HKCs@ZutyZI= z1`pkb`oS!r;L?)oh8M?xuenS}B4eExXmT6=Ez4*+l=a>rwC?q!VJPZn*Zp>!xiT?w z)DX|tDsQ2(*u(T=Zo&$qV+pZ)&ZEVZcqiSN0%8{|D`>a7I_;T4F&0BT`wbIEgy_4) zMQI~X0SH`Hg0MiMOgKcw1cR(m_}4$KAgHFt+Cin^SkLp^I-AGJ7;ecQI8m61w-|~a zuX?U$tNEfw=2-G+W$*uR5dd@~9<8C3-%u8^&-B5zdmoOH=e@0& z+seZsy-(_pOpXdT+f>q+09W>pa58Pm}Y}G zKna!FJfR{=9f#GDwttY1yl9`WQ8ITnaXfk$r%0v%7!s?MNQWKC-TwI2tP#Y5eLMMa zVU7Cl*`5nWDZRI8KekljCq!;PG-c1_rK{t~2KQqOS+|OUF z9%r1>+0~>^Jp-xwA9LsD)y*5#8!+sFn!WuZ(2zyQ8&k~TEqJg&tmzW(EdisJs46sa z-#83k4alq&3aMb}2`xN03UK06H9~~A>F;i2L{G#ps4uWWsc=Hbnz(QRerH%d8)Xw~ zB0u|yP{b|k8e<7lp`R?StJ}(9vW~SO?Ck%-f%R~1rhSyBj|@8eJ{S#K0)2*tCB356DF|tWwLjNgw6!Gte`b`!S5~=iO$U(uT4ktYTCjHy+Lj&2_7l4NbNcqQ;kO z)aP@|9nsow? zy|LK22u+R8cCV~nyNvkn!QdYk7~Fi9-aziS!jjp-HuG@jVqS!ndqo=IALPfzKT9I3am#6WKWEUHeyPtU@Y($}I5$kPUn#DXQmd z0-6dwior>a4^hW3d7v7NAw(VeGkI^Ob48wDDWLy2RS93#9z74tFv?>CYCjoEir075 zAT76SC|-O8Xpd1FNaVaj4OP^DN3DqZuEQQWDQRz>IL}Pmdi3J;rbxJdGw(dj_g{mu zHj(VzkDX_G;Li!)@b4Cgh!m}%pt5FRHUJv#v_zNzyw3Oc~AXh9?Zx-B;+ zjDIFJfeo2n(0SK-QR8nV`;=T;m>!(sF2s;HL&6Wbg!@@)rI5z2p zOAX1)lT+}8+MI=yY@HziAQEXSp^2}&C(9A|45fxoM9EfJcFRPGeDmL@AJW5Xw`R<( z0$^#M^DU3Mr(Go%Ge-dxn+;m%an1<&TBss3ed5F;r1=Eu&{eM3f8h$GXMU3bz=28k0Pc%6O5(?6^Bc4$@?B+WVcwSC-tRS`a2?c zTLmnpye@UlAl#i|lCeis1FGr7#e;z<T(=b0l5qQjf+5`OG}yT1x}Te2 z15*=_V(F=!o!M}2um+A0n@tG448Ic1L|RyDk&B=#FYBfla15%gEz(6=IQ1mvWQ5x) zYaJ!QtslP6dgVEycS!S`e$88l0=*V7K5~MBMm=Zjgw(C>7HEm%OekHqKvBLfsf-& zk^kH6Lg0^ZtoebC$@&U|HK~qvmg&xEEA&*Z^uA_qcAk4C?0Iszad-YXl12#brGI1Z zJ=c0|CB9^zlL~n+aQhmy>*lojm{(qcea*wt(!(IWjMW2@U}PiAhSZNM%8{aYRbp7C zt|rHDDR6bPa=X%DlNBqI$J?_dwvdL60NYIsu~o?gD-}=GLquC7c9jU#GEn!lP4e`+ z4Pj<@m}$u^$xGHaBCeAp@G)a%gF<-EqWykSVWG|us$VrqW>lR@jYhxIIbQKePW$6e zJS2>ei#|wLeA%#aJGvXM2B}hZdh63R0)jcjjh9vu8sW#J{jNB72||TUf{&BA1iy?B z=5fQ1DGobh0_@`eCnPrC9|~ZwI7pn^d+VV`H)i3ke8xh#;7l%FwMNovr;Zp2Umf2* zOnTez`+S6ZKL1Q?-PUOMZqQ@pvhBqGzjd$oIasdvW8?xj^$~dVIk*~s+hf$;ENF1X zl)`B^Mmz==iQf^rD#!9^Iyx@$K(rxM8-33e54)z%0>zSfR5SClb`BIO=n}ImL3ynE zr6!QzuqN~u>U_5v+bFhE7BCz#Q2IQ`cFzGyO8}nEBD?E51~`=zuzfsI#L;SpVSFyj z?(b1`(g#|;T`<6b*QO(n10{Vm$&GPs+sFnqs5Jo!&{frAc_Zf{2 zE_^FN@{TD!rG^SXQsz8}DQ zt9oG%I>1}VT<P^7jCEqy>{dJ%%)tw#vX~${qy*ezYWmzjVMw zTeAa!M}vnT;n0oj=)fZ^JH4(ofiWk5%_%`HLeSrC{?{f)o z>fz8_Tb(5EV+krl()Cm94S&uk|5L1Z!`1#X*isp0yXodIKjk4n>e6h#19RD9e+O^H zxTwd9D`qhv|DHR0ZdBD?!Gm5@3$qKa_saou<2|Xb0>l)ZSwmd9rO8{mHX_bYyT08i44EnF(NMB~A zx^vriz!Znio6i5V#o*LFJa|^%gahd}ud@q0(yqG((!QSCo|?6l!KsS^xQ?7QN-?Et zf9MORDJ7;ow@Y2%@6-DX1uRkhW$%C@jbPzkd<-MVHwRk0PBmGrM_JHS`q5GYl=bYH zN3p+mCb5hvAoxP$1_E8!NzY1uURRt#MGBSZ?8fz| zLe3Gceo;M67`~cg#T*5;m(%8oScPh5d2kjWVDz(^PMx+B5kFci+dWf7r#Xv~Xt0pTGtG@Kv5(xv>+0D`~cEbanC zoh7fg2*V8Titm%=7I+0bSCx8(At+aa^gw=J>Q69=*v)tFORuxz+51JlqWn_(ss5#Gw0K;fGSs@z2Pm}}N>bV8AqJA>C z;wry{n!5CNa=>#xKN3h|ZjrI7kJ{+9-K4Rc??@Ypi2>$9_r43K~7a(-FtY^S!pyM?;Y_`zxDReGXljO+_JT43sB%8{1& z93lL;3!-3nmb{i?GEJByZ5(4b;K084@h~0kcAhS?VfgEEPw9ikvUd<1T-MX$2yMZu zv;n+n%>6y^fyDA!?B06_B2|?Hb7lIkcU#{U`~N+9Kd_SYyxm-C+7mrjc=WC>3p(Ql z9VE=K2l5;ABM^(aOGCQwN-6;8LFlpZxh28zut-_`hxjXRWXnBtOx=iD4^>s;QEOUk zYwV;h_7P>CD`nvkUgX@2reC0nnTh4{u zYioe|?PR|Xwt`Ts^Q7pq%s>CuW728t!0Ix=q|AJ1i<}eZU0B+6iBgOF=-ftrsM59L zT@G^NwWuR(>JrTu6ePH}ow+X8hZSR7>X07Y0I|^K>Pr5D^E&YT-uRxBRJ?moYRfEB zTT!x4Wf9-7LW4Z~Wxj+!y4E4=^l}#rf#mcFTK05&j>5J~+xs5&EBW3i!hxlH6X0#` z(I!>|xOTx;YP6s_n0Zao`BakIc4DKkxaj+9@5ZLbtlh)d=kZKki3=2N4(*4(j$wMW z^uEavBcr&wKXD9Xmc=>w%s6$NRJ+-tZ?ainJ%^YN+DfD_lETceEj3LK*c|&pmDC{d956&NQ)Mv6kK0zo4}?UWQDeCdU;-x>?cqE;7Sbawzi3~=XbEDrgY8hTJo;V+DNb;?jZt6)?&&c%)C-7H!uv@=$ z+f^v{vq)Mu@v2x$au1|7q_;z9YrHAzvF~|wE=`V#vLj~ zQ}=r>%C+QUV~krSp-{tLd6fQ%?~~C#?6-dX#XZGH1+& zfW^yvW_p+mn59qK)Q^BZLiMfUpQ&pOrJOxP+ z8;;NsBW7%<{tySMyaa@M6jH1?S1RFuVNYT`QV=MAyp`6aW_s;V0W-}b=_=5$DtTv< zE3h{I=6W9DbqZF^D0S@n-mynBRy|?D=JI=`!f`nEh(e?vaS~`Mg2-#4ifjN(!^4y~ zP4~dRmFk2LqoiM_wk&bmROua!V;;i&M!m6R8p)d24|>%Mj0Wc^R#@BZB3sIru*4(x z@x)v34xB4oC|WySNRaOUB8F^%>Fq~37L5z{;-U489xo4xxzF7O>%LFBzAu}kzdtOT zLH}{9elz9iEr9{2zq@9I3_uCtJ}MJ3YLGv2B*fy+y<;t70Kjn7x!?#_+5 zu8lbz1nhx;i#Ji?33UfUSdo;H@l2k0R(NJZG%A@@HYx<8_?uilqtqtznk13ucMO>X z+pdUy@rVS`$eJim8v5j*{oH5MaO}$OavzNb+qmN2EN6JA@hc;zFk2SqOpx1#Z6(qW z?(^fwokZt!=9a&|+m3oVd0CC`{2xi@7+y#Jb>S1UvCYP|(b$b`+h$|iPLsywiET7? z(%81&^Zeg$^L6H$ncv=P?{%-ngxf}<)GAc7!9H|Asi5+Y%lNf~B~EyG&2oDQp2xYI zqW$dY-O}rMkv}nwmLqjI!E`qWT-(u)V00+qPC`_pAu7!0Q(UzjxWBDqtahb|Ar0=W z7ZnWD#hWTWtsxot?)5CCTO5mArdO+am7DmhC~Rk) zN`00jyHV+lZ1fa-A!=A~Rrn-vyzw+)rl{B2?y&7^=H_=-$S3%jZ+`cpc-ix>A%5fb z_J2bAwPzpb0ChWAo~r!pK#O)B5`5e8m0+5zBi1XgLfA%xF|Zl)knqmcKs5Fsb*#8vmZ);AMJPeUBQ z%X1R%Y+Mq6ya*)c5R6y#YWc+&tm3I5B;wGv+n7qqg*P;trnVUHsg2TQa``daDG06!hUpct{)%LuT)`awmGs_hd7?Rh0C8oAvLjFKkVY0rhgQ@gaJFvXpi&6+k4CI zC^&1Z#0smFI}#qFU%6QLXkCRtaZeupxBAM3=CbvBXd8nL)`*j1iG&`@0ebf5s|`jw z%n%f!)|m@r%Ra=R4k*tQ46EV-xYd@ZI)Z!XFhO>pp3y;hW&%W%AL5pZV}GC?_N(ja zKix@w%Ne-&P_K+pt!3HYKpfrJkSe1Hf~U@lE@QKzUnD5syt;di;_@4^_;pGNUH_Oq zo~5v^vX`lUYJ;+|T}KyyBpI543jz^M3Rt$V8fXbY>f3MoyrJuntdC&Xwd}Rxo zeEVOcS|8S40UGU?h1qPs_CZ)&_MG8A5%Ruw{pV>)&+$9Pac^l&Bb>@?_e#&}aLsa) zvKAIr7$Bk{3rc_pIY<_!VEJ8F+&C$9V}Tf&(}>lJPBBu3SF%DH9u%QjqZLl6-(L+c zKQ290AsU#)ob4akqFuK?o8%3>i}EXrSsj$Utz?BKSs5k}xLL$`HN(je*H+ty&n}B) zLxw0c`HC~^S$MF5CRB*-7)KN#prszMZ7pX9cRDNXJ@rZutbj{6U1iQz7@8Pm zSKjJUOc=cSWBbF)?65~lO z0%z$FT%;)F)6#6BP}U4AP~^2$1b5I-pAmSKzHqTFbhd#Tzvvq>}L^W$s_3mJZXK8 zX6vOqwBTvt&i6*ywdNpM+IbRSeOa=hjG@!J0s^1NSZ&DA+2yEt&;zzMx~BRDlXU*Q ziQfben6s$HQOi-kL>-~lkF2D%crdD>B1aBf)?J}X7^iPd=8_)VOip36z8TxoEv~7b z_>k{CFKU~hGzdRv03JI+-B`%iPCiJ7D(;kL{^JU($L5Vcec%eBF|-|Zn`Bj2Paamn zINpAC2sON2clETngHDb&(8y5DzByS+r0eA?@k-nW$uR@xv_z1e?y$GhyP;qLhi5a*w7LDF#o90!tsB4<2 zT#T=AuErO%+P8wf53?vo>nV26xPe0quoF|hrV;C)EEJX1Q&xPu)@zaYsXe3WYI7)tOtEio} z&Nt*^*BSA&gyMLi-k((HRn*3YO`8YsXLCm2y&U;#qZ_1^-L83IZ@5i7%urwaua>P3 zt3Lou6`1&RpB}eY15Pj3dmctXsF}nMY`s@Ci#VYbI|qBFNZw0cvQf4#qy+NteYz@X z8ELny!HWJQyE#ZHBued|xoj)!7S&cNj>VcE$QBY?~62jC4 z`!+?PM06EN!^A&YXw7(Po_`=I(^c>3BM(uUqba=AF&g%ZG(B4LaO?hvEb=-RmwZmb zt5>_|w$bu3Ul!v4*JNR*%pK+;CiNCr+F*Rk*mPbGeA|PqrPVVY9sO|dSP<7 zTpzPdt|U6IZD^hMs+y3r3MO3Bo`Q#REZI_;Q8~(eJe%XzVp${75V{og~0L>{tyrV z>farS2jxeBk-Z;DZ)P(je{H{pZ4Y`ya@xPxTJ5$yo@V~5E52@Rw%;~Pq(Mnl@w}ba z4__B^)yc^30ZUAs_YU?1UB^~BrHV#Q?mlpro=YeBsAggQblYG1$RbC-y1})BrX@}A zZbM`oQPX7g!&!ZijRWCsB+7acAyzun-J3bPV=fEdbj##j^(>JKe8~0(d#=T4`>D4J zR5Fc&_KSAGE`FVwJ}@jtG$Y59UBHU2v(dUODh(i;eILNedd24CfWdE8{RIFFwxTr? z5iohd3_^3)2$Itg&=U7*Eg{Q)!KGO8`qgnnP4)bAciSo=evC1WnLVB+zGP}qUN_1r zY%t|VAi()PLwW`e`?r;=E7zy*cz|j}r)YyIP3|tPy?Jr<^z#E`DD@-e^MA6~0%eOP zeKq+XzjxUC1NT2b6?!D9~FXiJ~!E)Z$lQu-B+REGd=&_xEO(l znHJMI{nLk;lx-$Oaj+!cUENVy!@o%CTwnsx_V_~Ac_pxpL}BGK7i zmQV25du*Obr~U|oN`Iz@u9grebmVsGTc*ob6gEGA51i@j!!8STh278QHtUs zeK5iy4*EbrU}Y^m0Y%<9U4K&-dDLJ>kjm(X0W7t}*4_%Qa7hK2^;FZh3{o-Bb>O9i zdBsHd?immvjOktK*usI|U1wlpD#L;M)v#yCqs;=!(na{nA8{bb8?B{!~4`)Gg=8ZG=qnIUONh=euD_94Z?-%s(tknLa)`^(Cf=W@C82_{i)kz zugK1Z08}3t4rG&``oQ_puuftc2LAE z{M>4bnBmGRs10%@hIG9ge7_e^Mx~6Xs>WRyWxdY<*NU6WZg3CH{Yjl2X+}d$Y6TKcD zttkDD$#~TNyICRvc8RoG=f)pjld?!kDzut98Xp$hHh;2aViV+z6{WBDB}>40XW&Cn z1;$6;2}4+%l(XYyCU(chltq*K^*`I7)S*b2%eT?PkNlUT|0bda-A6w89`TlWpw}&g ziMY7L3p5f%)_?zF(DQE)B#^s<39NkjAm zPrI`V#Dl9oTSff}o3?t>0Hn{YuD1Lz){sN(ryM`f_EhTYa{51AcRjfpi{ae0{ zr$I`{hB2$`iLf|;hwCY7O;sqIQ9Yn)6c7=_-J9`)R9*OctzltiJju=W>MF8BhOcE| z&@hl0e}16&=BL-6rDirI#W-!|O`Mqh;bwM(&R9~~!r!nM`!5t{14IoH?rx|W!@XIL z($92gi0t9q5E@X!-+^@)KCClud6_t%wA9tp*WueizY+hda|n-4lZ#&yUk^S#SHO7@ z%l|eUaG1P5-k7#|z0TX4$+7)Lf5$oW$iVjHNzAL|T(0=B6H(rM*Q z|2S+iyQKHd`+kV%?W}QhXa&r-&|6|}3J9kVTeiewX1kl(xc-1d@kb){Ls`R#@f?tC zm&7HTcU{g{BKXv&CdQHF)zN$o%_kgXho-0&4Gre>sler_nUR*#_(7zvpEF#gQS@e)tSZ~hkW z1FnMzrI&!Gy^_rcO>a2)oqk4+1TR34f`?34HB>*qi3$xC@zTYc`e!*)^kz5t@LIRM zpuu|lkhA;iiiP0Av^~&m?=@88^R>g^AtzaS74&#`Ksm`hZjN_5K0WnU>iTYd=y~`2 zm)J1wig}_v=OCN7!Yj6agqFV~mqIM32Fcy@k-FUXY!%!Kj3y38M6rf6bg48<@ZOd@ zo5n)X9o(*2hKpaLAx+z6X4NX{*tmC-$4hknr_zsiYgNY65Gf8y+M2{VcTjfk%5wGP zbg^f3&73%-|9Bf4Q_LuYVChz&7!tS0qk)kg1du2b+VZCzNo=}M$eO>YkF@B@ojFo9 zjWj*Sc9t??Q)ke#ZDcR*V4Ss|j}?NJs+DLtz6=>+P6*?Or#~G-<`SS5;!;&zjhYn! zrTGJtt|ZK`e#rWdHa4ItY)`m#qH?`d5M-3i6>vI_#h0x0of+?r4ZpxP{9h?M@$CW+ z6qvFH&*XLHK*;ZQmCK|j^mPo{;CG)|rdQ0(U~1)jBhpi3FGZ4@d`z}aN?qZCfEE7S zZ>FHl8n&rXCH5aH6j3I`l!B9cQPs-Jq-S{iCG@Y(oA!u4HZW+)g$Yb|<()Gs)_`CA`edK1eDjD)T50>oc?%M7^S!7cH{%RFTN6#JTf+ePPY z%I~Xl4OYMs&fy}MPAZ&HA$;3#WiU#MIaydf6<=nf#sXa~^9UJF{FK-J3Yja-J>(dP zgqzcr(JM92WW4g8epy$UhQopDvBshsy#v+e1Z~{A;rG-mQP~o>zAM=15v|g6xCEXA zlk%1`?pbepdne~TE}BFz=CjV`0d_FCt{76|`$;zQEIWb>5Nv*M>Eunw>ku>w*j(G0 z`26tcKEl63F8N6^nwjHc66>Zs|o{ob-{ZVH~>Sr%gZL~(NG&nkkzfIoIvXs4|y zciAzwJ2ZQ!AqqA|83sR~7bv0q%HV5dVxRJ- zJ#?S&xc!{>In&@Se_qoOwU7nyCBYbtbdr7=zM?KO&T@yq%}VMrMa}_5J0XlrRv@__ z0f>lr+tj;+)#UTs%30!a^u8O6Y<%)P)oY~eG1}{|6!e_%;J1-2rjmQU?Ul8E{=2p` z@Z|Tf+L*m;@QP{hV8NViQ0Mnj^t zYJ&r!kxFaHAH>XQq9vr^tS9IWXQIvGj2#_5k@(I+)~j~$kE=M}7Qf~+r1eh*Ou&@z zv~o<00lF3qCw@&ZyGD*h2gAWji*3vFf9?xpq=0VMYR&U|hzWe}({R`_(;N^)J1fGkSmDJCF=M_8szOEMVN@ghKo+>W|woi(cfqSHko^ zx$zbs)YL72lDO!xWIY+9TKJI=d6 zT`mAxu+7q3;#s6l05uQtGv0(M z)Uh9b$w=RCuLV*?eGN(ezKY1u%TE$Vt6Eo8UH{zYmstEsRA#~a51CKT{n*Bi2w4$s z$2t2V5}VWt6>$*dsd|GAnYMlKpVQllg4Xg;B!@7n%~A=!m7(wD6vs;f70D-Bn*r;C z>?Q9h2#LEf`|6+bys??T;e9+EP~ULX8PIsu87=rSedW8voO@!Y^VMAIh@V%H1Q zBjKib`M=KsD4{Kj&h+G^}+=Kt_XM@Dy{}; zC-_Cw^G+2F2k19B3VVQ@ww0Z6pWR#M87GKaEOJE-7AkZbR%U6$;Hu!kqkc9<_%qw@ z&~d^{p6!W)#pp5}!CZfCZEZMa3CRSw;s0-6ApaTj{PJ@i0z}c$xq7Xs6-dSd4I+*D z(>ZS8K{T>GqW_LOhaBKn<4oSnQLSdzE#2p2OuL()3&F?qCE9`$SGLEi{A3LT7=<)C z1T`EBSW*hwaB_)DFoTFcq)L+?caqR555J?S)*hVQq-U6CC%3_HM(VF~tqHQ^H@0UBN|`f1))Xd?7r$aNP&ffg>_t?1Ln*;A!|p+i;X$ zmdn$SWhBja(!})NZv+bkbVCFVu!V5ILy&M(Ga96rH?%p8MT@%J_FoHjn04-^mOeJ= z0M<4bKoL@>E-OJn zRn=9F_dmMUX@Y>o;YG!_rDnf3#uWj7q1TIQC^whCz6xS4zdoT2g~wa^Uu0TGZZ9ee zYnmZPceT=`0oPqas<<6BJ;8dV!fPw-dVWwQ3E;RzxjakWsH59SY)xJ$fj7FaQg$Zc zs9H-c`?Y@t^yQzfgS;^`D{PFs2upJ8yan+F$;5Z98wJ8r=NY3?f%NZBa0MyN7d}k#%*M zYzHc^U*ZT0S~X3GEr>gZfC&T5c;n@|e7miB0m5G5Y(aVa2?GKYP{; z8|3tnW95{MB&xKky-2@B{`Fs@`|HXCFuXp*B3nqXUZbY8O{hyoB6+;QYGz=*N8Sm+ z8u@$KTFhlD*BJ*V`mRMNmc4-~I=w@oAkkTlESzJ+E~8u+l8*Q)C~zq7&p}_KXo9Qs z1=^VEam&{|{Q3Q*;E6n-jn`-5@sJ8Pxz7*z9yEqPaBcKjt|q)Zgh4iWd%hqRa67sH zk>d7?vel7u1C~KVy2F}^%>Np=k#9tO)jVPX@1pJq_N^ zqiUUg@Duad6M21`L6}#5^$`bA&Gx0xt||%_b>ukOKP=7{sy+k|oYKL--|GpY^`ghdlLC^) zD|BV3*Y7!!T#~^ywESXw#A%l!rhSQR@Y{1QycdiHcLoB+)y+x}#!?4iJhhM&oFgXd zBXSltOz}t%r!P5Jevj3PJ5*Y{@0jaCZNZaRvNEoXwp)XB9wgY~f1$dp3Hw!ZX^1Uw13(=~o=cax|4UN7r^ zoQMB^^n`D{6KJN<)Zq8JQ#mc@x^2LBRUvd^SBXskboM$WJjFli&-z*+AB+nY>~F8vahEwc#FgbUUP;TOE_}<`0z34kYR8yD@J4FRe0Sjqn?Nnl z+>>g?001W$W;-}?(HUb-T=gvJH&l!?eFt)is+&3EO*3Y@Vbbe3%N$?P{%GP`Fl3N{ z3qqH61QXRHj@xW$vgY>-)m1a*Z%9UNe%pt^0oQz2y63jrZCCHn0dE2z$@ygF-+v1` zPO;{0AX!FqSk~cLsnz9lXQGv;^N8u9WB=4)z3n-w_7p37g~theV#s-RN+a@MKK=F$ zE3FJrw?BPbm?I3c%M#9>%9$l}0Vc6TE}w;!r2!^Ppn3XJIDzKiW*9cfLA7L0#X1(M z8tHlskWlK+A(7MXCf%xA2)Q32~Bc&)i-%BH6w`rD?g9<5VUw|GT26vk z*peM43({(^#C=RI6jObH{r2ao?FaK~HQR{d_S2Y$$?8}C@Q|YCc8C7U;{5h<)_>&% z;xcGycunx(pV~Syafkih^^U`~#|g(5jN4uFrV6sj)A=eTI?L2yh`ofNE8q$8)Rv7@ z?@pRloC_>M0B*cB)({d1jBGx;6=oxp<@0lt@&&zVZ8$w3)+v7O@Y5eLo=1ns}F` ztPZBrg!9=KO14q+EsP$5CptDi$F!@=Mw2`p`*pCvc#9QlWlp@J#I+>D6M`&&{|=xo;PFq-$@la**6UOb2B2JnF}>A0EgZfyYapzbG*) zz2nfTX!Tv!^h;%E+8)Xne7#hZq{%IAmNqx+o48;{XXbaqB8rqoM&Alegv;EaNfFCM zQ1ATUWZNM%={*b#9f`s`=_FS@6$z3Tf5Ws;eYr441%-g%$Fa4JcHl) z?OAlq{u|RrVR!F*q}vO*&g5rZfD+X}U5eUFR<&JKzSp%NeQOK09v9Uqudx!$JxQ2Q z;JBhNy;;-~(t1iX#Tb}!5#@=ooVrHNGtEuX@K1tbH{$|<3{a+TT8NUteOn3r8bwxN zX7mPi5`M7ajFm0Ky24l}mJjGpUj~^VXgwb3KfiQlCwk#$>emmTzN9P1MjX^J!xP`l ztb!j6Rql+HdpQhbf!z&<{C&T`9IlEt0Y<*Py#EVB_ZGDX^PXAL*Ois7@tcx?3_a#c zHjTSu%$uobM7X=OJnrE^!PKpJtLk6ZlnQCV(~Y!l*^%~hiNv4AydTkWns_lz;8io@ z_Yw1DqviUSKo~Zc?cXE6mL4yzEWf-~cwhb=wOsb>8O+;0q(2&X4oPl#eaw3#wfqkY zm9$6c@R=VDik!J099rEAaQiY-e4PMo1G~RWuO_bu`c)WQ-uo?2Nq@%iMeN7^G$1qa zvQ_`7v#ipcdKcB122Op(0x`P1>k))i9#lIr>b*W#c|WPT)*VV>X*~ zAuUqYPcY1Oo-I60iSyT0$tUvXD~T~3`A@^QF15`GVI}BXT4v{YFmp-$gSEI{wq38? z;niYI4zQRkWOuDxm|}!~*}U&#%w}RJ&Hq#Bf(A709dZS|o<;&J>b+hKY;_%9YP*l# zdR`i}HbF1abS!qy2?&1U|C}czZi64Ncg$h%(v0AG)?pE6@^){I{0FqQ<)$Y|@}iVD zrLnEx3+_S>E_QNWe)c2HMjzH4>=a*a2q64(BF9vH))yx<$Q>I~3r^G@lS-?)$js{A zK;F`HQsOw(ef3+=`PBoe$X@m~-t_Ua$fANcaynmjzYA1TV~KYT>?h?NkJ=9Ihe z?nze(%ab5UdivJ-^E1U-gL2@PZ6f@VNFWq|u^WIfgRleM%wfi4g%@pX74yar{acu% zxWoc{C>H24?ra}=9&tdhj|m&ZLNM^EUib2L{Pi_w3E8m4p<3u;RWZQwZpGs3Bq+M( zdFJZn6WjND%Kut7$bzbx{}$UQJa4kUM!Z1ow1C&g$IKq5S@iseBhG2QtLqb(tG=bf zB{YDCo+NuVs_?7btm|Ll@eXTy6%me;^bKh?VoZ>&SVW^qh%$|yb`T*ghW43a4e=mh zAQjtwbdf$mT@z0g5qyTV7&(rl54n z%C=rc1-NrA%*i7S$vGkKC zg8`Jz{2n(RO;fE@Wu{FqJt$#?z3t1rNSaW=Q00|b1F!kHuKiYDApvddQ`%W}x(8|& z)<-<@iOBe<+0PF33rAgvc1^d+`^=Efnxj5F6&zp;s%_9SD(tOO)5w<~h~N=28}6g? z`h6BSJ*{}8KY9v)3u)V#?@~GXNZj_vjX_rJ`P;$69nyy%WTJx6k$bXT@is7;yHI4pJ;1iGkNNAFJ{?0*#SFztZJG>;=h< zPkY;S0n{#pw-Vbpx>3cuXB_L=B!~vzeF=a1K@KX~Oz3#nOMm=i*(rUHRXyO4o{p$s zhs(5$3ObdZ(dJ#riaW2Dc`6`GF(pS!PSQ^0V(vu9K`S)tfTL;Yyfm+^k_=TRBLItC zneo`-GjlYM(Uni67SQ;~1dDMxN=b>$tko5c2$1{PDl#7Emi3&7cqG8?Bt!2l{~LPp zg-G;`5U-P2`(J>Ufaqh?Ktg6TcJsOJ8l(P?=YPVo2#~MIm-g8|z8(YgK?b&&T{ox~s+0}RA3Z6Y4 zbw}&EH|7z8>T0)SeJqIT%!j3R*iAG@wcuES_=OUx{!8Wo+Ag3xs*Ga4;vsc*0Q-Q- z2t0Mz7L4pX9*CV^#}G!~HM##dCr8we>%3|<0*z87V0h2UnJI2qY~`}><68%8+9!VC zWV3|9gBWoC{`JDqu99i%2=YQ>dDG*#*ARsXxCb?3zA*Lmb+P%9%y8sI{CIWe{-kBz z<$}Et9SYe8rAxv1PeD3G{O2HL$*7a=BeIOL0xeB83FUZ=%t5}CvU@5eYC@H>T7|KO zsx&aE!DI)#080i#8Vs_n7ChqOSKC|eN6!4_RWfm&#~B+$W|~;k#M8h;=A}n~5A+A4 z-*o0lRPqhhntOfM)5fw;eUHbrkB!Cj#|hQv>P#mJ8ye~d^GmOTzx&zsa0yq--Aiq* z_t2&gmzDwF?>j&GN90*|zglH5Woex7&3}7$d%Y<3Ti_&Dt2(4>7nE)peykYXx z+yLo#?n7wrBt(G2ZLcf)~X$n5bzaYFc%v2;rX z0EwM1(swu@OZiFzG7cw4{jaF&9f=aSo8XvwhTg=ex}27Cp|G*&x|JwyMO2QH4Zeyk>Ee>68%98J<5#va2HQCb3rPV;(8!AuSm+ z#2o~?xv}9+-n9kd0ssu~s&7OlkfiiY9D{U*LR{Zo0{b>dS{3`5&CLck9yeJr#0^hS z{+8rnQk5^8Jw;ENbuWlpT9!5U{t~4GC(*C`>mK5?fa#)MR?$-3F0&&+-rCTx+Zj{m zadF$~(0zUJWz*F1;zMU)|8X1owl%I8Kt}eeh_i7Qc`URI6L1s>iX`pc`!{^xvFP@& zU9;`=@ombkZP^;#}n#=y>Bt;OENl#7g)cNenP z6m3Qoe3qi4DfjTh7w8B}%EOyRSR9^3DvzqtM0JR47RG5s&%UohgC)s=2xzk83p82> zkTALjHc3g90)I-rHH%?Le(FSSM&-tfRfW^|D^=#wDyO}_p5RwaTt$~_UQGK zkyCI{F+Pfspb)R`bym0w{Np8zA8FR%3989_9yps3;_&$#3$O_=INRW2^nGS{_bCv& zC*RqM7iyoIK~^B%YP(-DSN&R^*XX?5nzb}*+}s}Wb(k6OF;I&wlb!i-K_f@Nw;*B6 z*OFZo){~QVIkU5sb2U2jffFd4xRnVIf0xpc`YFNu{LGuO*A?qyrP`FuUq$eiCb-0v z6D}(1&zGQ7E55$mcW6GU?_L{0h-e3dM`BRA8Rgw|XLi>?l%a4M)LzK$JWfXLq^o6*Lo?j!ZiK|7i_FoB&%b*ds| zt_f5G>BQSvBdW4&1Rcg}N&zf?!&03qWP^&nm3xiMasPob!>@|aq`J*uw>_LS0m%M_ z3v1Ra3#He?j2sGIS(*Ba7)vQ#MILV@E6;4!Z1$@N8Q6(}S(}?8lwTw?1U2=BU6{Y) z{paqQuy;;S&Wq&51N*>B4%^>DRMLfZure`j4j&?_mPRro007SYyuyVl(%D;7wCnR+ z6I^K{$H`e)qc7f}Nib>f+)v!x@%A-xzi<(-R+aC$(}&zsf{clRIvXI`Nsd0d9q1Eq z)_8WYGhH3sb#}Eld#|Ce@$#CVcH_$0;f48WxI8e>(e9*REj&mR^GC~XLjuPax4~;x zNfUBkL-a6GYYQ(*rLF{gj)I>0`^EvMj6yQi_<%X$8SdmS6N9vMhF<16+w2l1rh$LC zVLQFfmNJ#W&p3ug^#|oJ^_^wZ%k*5HtG67UV-@j4rGYCzPeJ;v+S3g7$7< zf}wXU(^XPZzTk@6MDk_L60`O&VLu{6EqUp&r2)*(Qeq@2xY$~CFa;>WU80z43{6Qg z!#1U~t^VM17j^+hm5ThZ4`1#F`|{N`4w`2TzZ?1GvjY=T3`7G=fKJcx z4@XsIV(*;if9vvAB0aGXqK&lW@(2Ey*#3|)a>Du!1ky~A9Q?C!HD&ZIj=jlF4Opm? z0F1oH%=KM!oBsSa%1@^Z=Olfjw4#uXl(x=x?r>@nK_rMsDCQYthe8K9s?xu(tJy8k zmZy5KbVKjLH~Csyvab08LV3oM4h7xQJb@e=~ zqDODq)asvKbbCBZW(Kf!?={z+AzNJgEdM2*_I6SzvCoMLmO8Ngg&~ynot|-b(31Hl z1T-7XH}qESpy*@<3=wHL>|(g)kWi5u!)o14jN35fxQLNp`F_u|N&pI%)i~$=fHQ(5 z14*mo#1iJg2)~oZ*k?(nS5meNYq`(Rp}BVf$9XQzZMrz&NtE4RFry#}9DCJo?(i(5 z4y9NLSVCsEjs#JJ&}mk(Nws~BB1wFx@t<>0vIRS`UT||)VnE?!6eNrbqBMuGaKe~n zg@RxW+doKY2nnh+`<$5H8ZFu<3_gaj^SRsHAGYO}mWeZMw{Dxm{U0vg-?YW< zO%C3#{AZhexE#(N9lBdKw?AqXx^Ex899>Tzb+BOGjvreJqX+cWFlw;46R+{uErR30 zjh`M|EA`u%kcX}v!?6lhpv1koB!Q^dp{C_T^;K!g(Xq`1DytvSt->1O}zwn`JX+%LITgEAeg6p3vB8K^MTW*(MX}i@VS@WZDt-4N) ze_#8c^MTRG|2*AVto*Wn*kAqf==9#*9q1X3)hQyTI3j-DaP4-vNQL35>Gbe(*}LMf zxb(g9+`At)c7XZ#M0zi}_{oE*5zS2n&;{Wb?FEI~!b2W(7>N$nK$yafnKTEP1BM$| zxSO4wfrC}UqK%x*soWbSwt-{qa_ zGJbiR1)LUFFKA;jP=u#puHxzs+;Zw~;;Hh~a4kWNA zs%D3kh~W`mcP?zurn~QpC?!(Kqy0!IX?B@{`-Nj^JBRa1;-w-N^j;H2vaBU{Ng4rl zm=wtTg%p>WH9S?AK+^**w7|N861_Z@f{>wUZ|xzKzMeP_Uu?Tjz%wGCO0ds>N7B%A zzOd6QvifAA!MGH6`(*sLW)EW#Ox8|m=o%bu98nV6msH<2k{|KMcz(cJ`rXKPY&R@5 zqKoP4C*7cpt%OoJ1AArUT0VeY_oEqD677s0_Il&?`8gxM)>T;x`de>Z_`Xfhd2}BB z*sETjVOWD|4<__sUMr7sAybZy;C8!#whJCkbb{30XbJxv2|w2<7PQ0nM6vM&v-cxo zBIO`#FJ%E5D>@={m~2q_Pkf2|4$n-%c>-1UC#^XG4S->KpuU9Wh%t=^3wy{{U1F99 zuD*P_B!`z^;(~ht^_ArrxA=UBBZ^dfbz)P&sNOa5z?y}KSVb|zLp$$pt7?65=gBML zp*8S8wku2kkpWzE&8U6j>z)oy(@Y$uIwyzk^Bh`QCFvbqPKZjgr|EffTqS*@$g>!r zx`<$`SDwH2K-hHFlo_*Wy4Q4P`R{Gj*L@FId#UGjV-T;wCA3*(&%Z9WT&w?lot@5v zfcg;#>T!L|UAp}aIQ;9sh;Ze<-m24kUfp=LbxsapG|w-4AM9WjepNJdWT2OlJ#KN* zj8Jv3&?Ho0xYAqsuhBk}<#z}tGY+O|C<3-tCOJH;%@eeIUy(61diqhjHy59&Jl+U3*8e>uEb zOdg{ewxQ}~)nE7i?3cW>a_JKjyI-#NT?duWg?CRv?X26tSDApikHf7A7=`ZL%O0Iv z?#9Jw-Zp#U=v^)vD9MQQpSMF|i(WUzC%QF*))l}``2mx)u{_cNmw&`@q zPiavtTo^pR-QkMhxuy-*Pm;wEW76*>R=v<@GxEk^A7~2VH2vV)_44XuA0Ffe12E_~ zHl+p|&jAnH2dp+Q7``|yCsUOFOoyxlAcNmLkGN-8^zT`SV(O zYe}C*Hw&~}uPCb(f)8e@X#Kr?CmkYCNf?Az79VN-XuEa|h4h*y8o?kp%QmhMogLGa zphkH_{lJ@p1(bz**A`W@M4p*8b*ss@P8%M*F1}2cl;%6XEr0nf%6$!Z`kkE!J?DQ; zyQuSmbRzFBp|9WTYXh6(B?g*eSNQ4&p8) z(rl+Iap-j%;^1fcwI|Z|!X8CL^epE}t*urx0 zjUheZn?az9FUXzXn&>d+|0}GUAd*Yc#P!;y*>%;iczFV9NKgW;*3vTm=CRfOTzl=R zO7v}uc9}?D;GYDmKHpAObuxG7`}+a@_WK;M`tQTU+0$3_`Q%o=L}cN}h;FVpVy%c{ zpUd};cm<1PgU(WiqgJ)u?d6=#gJ8N+gU|6ey^N=<_EA8*|-wBl-fsBO>83I&0O zFj_a551b72<`%rZj@B;g@A)6Mrhd;X`oZO_<72koD=L#O7)E&6oNuCo4S&BEWJt=` zXQvt&RPl&+mB))H*v1iz{~HZ~qcL=PyrLwu`(ZvpDrV3=!ScN&fQKR&O>(K{5iV*6g?Liaopkf+4||* zwchbq@o4zeyf=1CT%E)7ly`FotOoKny{#Wxgm>$>>XSOEk=HmE!CUMF9g@l<#LdGd z!xZxq6|-AMVp#ofR?@`#(Lb8H`-A5odNQg3COdp-ls{}J_}?*=MvB!1^`H7i9Q<`$ zh4jIuf$uhgaf@jq0QNsT-|aI+?=mWZUGDlVSI-hiZ+S<_!BwO!h?;S&D!BJf%zTVR zWTE@N0!`Mmrq!G`>ZU!7UDRVyX%utZ_MP{#NJ6n(Qpm&^d5@kQtW*Z_c%E-cvTLl^XZfSlTT2a|9)#}cNQ9c>EmLsASxyVE_j`t zzpA~_c{}XyetkK%bQsX+zMflqX2vVZC%HYvvc7)R{G_c$j(SwlXSjbMh-+^cTz0GX zdt{>zFzDkEfg%pXW^KdQHcUdoY*8$#C*`TX;* zp=(EVQ4yOZw+f`9x93+X=MD!Mir zA5JT{TT^g>zQ+~3t|E{d8{4Is47wM)f#12r$s7D}?+9p7nhrFdZT7I5l|TG`oY}qQ z>no19IOjR>_gg|X1Brs7W4%Ydt7vd<5yj2g5d-;(yq@xZd#%U!`{cl@^pOt$?bRGFMp!7nqRgqL(?`_gM_)LWuF=NCJkWiPLWr?J`UdJI>NE;53xX4 z`@ug@Q`g^vOpcVXnae|ZU+BgK0I@3?b$KyosUejDmSz(J+n--pT+GWgOA<#}?|m-( zeOqu#G@KS7qh%02mh$^vnSpXJZ3UzP>Qtix{^b)|4SQzv8$E?{^XQ)5wYutY4PVE+ zBv`nMva2k@R#4#=2en!Rh86zwCZ}M*mDX=B3%3vempI1E%i!w^Dk078ZwHLlk+L)% zbIPa@IjskD@1OGP?&y4tn6A<~ROVTl+q;T<_4Dz&-`qOv!9%sFst*!fDXEO2*v2E6 z|5Dwq6>(?MW>3Qsz%|W*03?dj`i+gC-tYEYJvBL1V_1=^@>4L?;G8@#%2wY`#7p1O z03svFWAHc{R06uRc)t_^-*C8mE=+eIp#G~mklQ`0OmJW^`h$kcuNX1QI{=fgyP^Pz zjzk@%lf@>jJIH6}5FU%1d)**P?vNMJLQItVoT0O`@*2iD=;z{WU_-r#peQTfuHgO6 zKYJE|*R*BZIRze5x{8k%ri1o+LQmOI?|3ihkGgJlY4^5(cz^b})@yHmkIv=H+WPY? z#&Qp(RXnMKbdAm90)KriGNRnrZz>k7N;Y<8?8v{Cf^#Z893q(0p5do+W$`5YIrF%` zp#~9`UU0zuIpO8dC#xwfRhMTk4CeTlH@^T&ocLc84JK3nqOi*@-KS7aP8b#(881qg z{voXV+hr4b)fp?wRBiF}mEj7PMZR5>HZk=w-J4du#~a!mUHvjr8-cG^WE9YNJhW)LBS zpP`;fo-rf4$Wv?l$-psx_kn)RRkVYAsC&r4)S%+N9;TD=#eLplT;xHsuDTK+Y~R0I z;BZ&C#%yQ41F0|_j(f9x)Cq6t!crdxJRR#7y|g959ETz|8jWHZ`8}D{^B94ASM3t? z5-9s606-k~TwTRj{b}8E%lvQAk#yCvKe{L;m_L#;>L-EZSEGDnI$vT8iJuP!qD6Rg zbgdl(r7v!45Je2cRZ5x_YOW32=WF%xW_;o^DQglw5j=g;9C9WprS@^w)j9#rz*WLm zxAVHK==-~Zh*Y0c#e&Z+kH;iR2M;D?g4}GiHoz6qEqWr4?#q_F0;t}2m;b7u`_!9( z_bajHJ$ckcKBOvF*QiVc5V3aQE)z==dK8c>Plx@6}N2v+-;v&1>;YNDPnK} z$Hh(<>PcIOTWX+0Ss?j=dxqnf03Rv2%d4@AsRC&@NKF2+?$m-K4oKC9;l`!_nLtZgfl~~CPS)nr?Y&Z_>FaOAGcY5%knJ_CSGi=F(O9QGOUO-na1I5 zV(OWg2YZ={M)F=B@sC4cfX&M~?BvKpgQub{y1hp7$(~nTw^k;$Z78yT2r3$l<{6G;A|>Y?iTv7A;q0yh$Cgam>AZjVpLUo zzE)ppYiTJ>7mB4MJh3&(;FI*)B7Hq-az`&b#r0d6?f$98ZPKW~Z0LzT23|qdh#IPt zNP8Y|*7l*dmnE#u-#hFox<=&0|N1nj{$Ryvc|tmSav1nuvq4i-j{fTGY_a>|!?q)o zp9P7+9YE#Q<c-V}SGoYu3Ok!b_FgC?dBD!fa+Rc8B z{^|#P&>SZk+K<1uBE#-mc4Xdan=8e;yrgd+NLe(r$bT`JcqpdZ(%NagPMDT4StqH( zjoQcuO}=5s6C{-}`(jNzGzdl3w=Q z)09PbhJbWFwe4#goKfL!TtS}Wm@&T)53E?}3L z(s;zh5>h-_!j_~-2U%VlzKRz0v&yv$yk?{f^z87%{v5mbSK8 z4SOB3;orrb(3#UR>|b-GE+^L-+);mksmAyXy4W|?@4+Z7QMO*As!!>;26g6e4Qk7uI-WxtKoRkSSn%K43!kTDWc^eJ~JhR=J5xeI2!wDJ>Zhu%c6 zFk(X3*GpmKhhx)`qgEPbC9yF&8cj?r4qk7^NU2v#qADX~>~$G;W#UYtI@)l`u6kM^ zX=V)(Guyz`V%i@#mRRb@2gz>lk0sL+O!cb7p-|_)Dau8aVecQZ8HKoKtSZzS+)eJ! zh+aic^r%JfN(oqfO!dp+nM_l){qhNvWc!>k+h~u=OesF#4rM4spk0Hlf8SOd>Sxzl z|L7Ps*7oC_C_mE8ZXkEFWC#1itgVi52<>sTiJ48~6U6o=E61}9i(4oh&OICtvL>M2 ztDjC!&V^tWA=^vV!Ti?LFVv4(RxWR)NFQG9ngfxjy-k{vFz1fu1H{^qo09BI z$0`$yzWto)X@Sb@D~wnWnBQ>n-g_D4$;u!AWt^R{Y`*f}k8urTpmGxB^S#J-Auqf? z|5Heo^AaU`evb>Va;|(?rYtLf&gJf7_J*z!DJG?C28*Hw+Mh@r@xK(3xYW}hAr+}s zw&8*}sSrxA zMU%nU&=O5*lJDFbDNz&CT|sY=nC>I2t>b!~-@?t(o6swl;h};5MnB$M9u~3i7T;UA z5xa4P&m*t1XHF)A2jId=7}vZokA|RkMtmS);%Fs#b^q2`f43UMyHw|uTt?;o{{1oc zyrulIS}&mmh-6CM<55KgBCWfs7M#+Ai~yO{lyfF!k?+Y5=RcOV0g9KpIMA6MO@fZ1 zN-;CtA=aYHMl-7d$+acP_FI2tKKBy21XpR>`RFG^#}_@Y z2?9a{DiLSKZjdR|lz)|8KS>~L*(kItT`}L0DuHp>e$P?yR&D&I-cJ22RxY;v`Cor=N&@Zf%iZMFzL>s|=qHq`s)FGhqE>}< z=+sxe1_D#b&<8}HfJXiC!Wnj6ZDMu(rK`}Q(OQWYZi2I~B%Wc3x%*-;@9ir`YG2o4 zfC_(88!dCt?7z%J8=O40@P;t`%hy*BAu)B>5b;i<7Tv{{8r4M5(SlZ@;4CZXZg*_x zWpz*hZt|K*w;Zc3boaTWmGAHxA8d>qDQ2~>O;fYuho4R1ut1&+jx(BDvsb%^g*JvA zU?XqNbOt-WM8?Kmv*g|6@mu(}`oHV)K9)@Ay+R$i-Q+ioJBCrh%lBLf=B^yCTNn=8 zx`xQGF~4+pp`k2*&Px}7SGHsZt++M-1H%|K?}IjC>_$908p%Sua)q$*z4D}56l$RY zYs@?{6E12FoXmFTUabjVOVT^%n%|YNs8LoXuD180Civm@XOAR4KM+(iID1C`4`pIJ zHfI^q1^t|?*l7mU&GI_0nU-SUrglhc4w|Ejn(GDezN4+pzQDDJ>XhfF_OIVw zcPYH4h%azD6IvM3UV?2Eb%A#kU_mR-;BbVq$ztjIi$I)z%|h#SkGJ({LL_wiCz>l| zN-7^zogc8YWF0yv0@hSNvb^{*ld`Il4*3?F3_=lT4VRR;_QhJszS5g zJO30L6~#94>!OEx)_^Pn|a8 zeX-sNSzq)16IPFy!F6P_Gs_9gZ6Toaz68UmfRX> z=+CCD+A}+rScA5@%=~-iFV7|g4%bvOf$wF78oPH~#@LB&-%miH-o zwlQ+_X~!L5wi+o-A>olEJ*7L*>0Dov-5k&O7s)Ip&LVopDTz5s8%bz3@X))_o+(XSEZS^CF?{!Nz_x$DSZBP8r zJo*ntv>`Qr-!GruPt#d0~i{I!bY zyv%a@v~G`Vgp8SKVKjGC=~q_!O4Y7^;9sLlJQB&p8SRNLl45sRsr+mv^M!tSRW?c> zxT8$5DvGa1PgbXB`#Q6ELpwr*C@Dw}m{{hLOIT>Qg71@+Rk{uc@7ABdID52r?z_EZ0P9mfAd-qQ~_PGH#z=12m4 z9IN<{_x(>%sfw~+x7F1KOENkLrbePnK+249B{GD&6UT4A(IJrPUpwVVFdmUx*&ErP!5^x?Ho^t z%<(W|-?=#osNc^gG+wZISyg%#l0CLw zzGPW}7JZPQ{aM$0k-_GSa;)Ty+vS={xBdopPk+`{061uRt}=!240xGiD`(eL+)=tF z_&Q(j#k=rr%mn3qT z?cBTeGw!8@GPRk4;)A^dwaHZFQnRH5?$v~5p0J8YalR2$G;w-++m6|=;gOdAORv9~^^!8wx;Mt#>i0ivnBV!AJoe_md)Q}r z_lc!kTi9AM<3duM%v|IdX}kLp{`_T8@rdj?QLIcWtlnR8nn~*StKJ=x<$K+>wxF$K znqtLKw@p^17&WC?6f>Hy?KF5%poAZDp{^i^qQjrlp{7g#B zwxB~qff~Ejg;O1u6bVw`PM;W;gwzy7K;AcdZ(JwkAW;ab8juC1J7|;f>;8&2czlkq zOHNHCtvb&al>!gP${6U!Qc8lu@f2@QoBup?4_j9VMR{Bxg7IrJ4Y=y^aXFukrYC3_ zx!X($S2?D?9Xz{sL**bCH4Cts5WgplEmu{}ZBbCu5F<$Yp%y@Jz@3{a!b{Ztp3RWS zeWKTgX{ip6gGfD{l@js}v zNe@Yv@-9Oilji=my&fpWusMdHtr^CLFN^2w?oCRc9A0G}yWz8stJAtSwtvF;w#&b}4qsHaWwg6~tV?mLBiT14D(UVl%~)t>88@3- z%tKHLNJu~SyC-wtK4PyCV216(4w3d2M${{@Z~~vFj;6J?#tItcc*{N(z0~IMW6eyL z6;HD`MJ_HUr+QKhN|onr1l_T48`!4gg?FK(%9Ko%rO>Cg{Nimn>S3IR-nwi2KN zCbZT5ajdn{j8tFmah~pbG$Hq;1%K31;C9+lusNzQDT)?L;uFSH@xd{O!L;3=j(5uh z)X#sD&q7a61W^39KbTG6Bbwct!$(>UXZuc-CjGB>wx%ix1DoYeVOH7nTNK8CJg(Pa z0gK2fycM&4G~+rq^Zm%OsMD|wqzwJyNBTHHccu=J=^B*9`+Ao7^6))y-84N zYm%Fjn{8>B9UI2E1LtRsjmmM84y%Y`^O3yNG1k9LGV;@ENT<%Dg;PuDf|@!L0?{Am z9l_nDEKm*NiQw(J{4u};cpDOJ#zy#!B%PUN9J3Jv1cIW1uqkPgMfbn0WeN0@WYzjxme|3@LfF!Jm@KL-*;aH zbng|SCg*$yeMfH?VR=CdwzSN2I5-Y!zfKBj4_f_beY2TkB1cbuRYCrhk^ZVx_U7BN zFEV&J`F!LU<&0V2?LxxGx8@zK!ccOLoTY^B+SS)dW)H7>!t{3^&Cc#3n~kP1AZGAg z`OJ5QGn%^tvT&iEm#h)r7JSJ7lw5pGtIsli$?5Sh6eZgAEVq~@H+=JC`{YFPA`4DJ+0;UHl zy;Y$XPU?q#CRS$d?dn%IA&JQ1&j1e**(5Q!un~-e@g(OA=HChtK4W&uTEaywMFf?$ zupxk#`2E>5*RiuOM^yjUX)w$C0B|+jtPH-*oXwWX_IIRi8Z(32{`lM7>H@v6x_(o^ zmUIGMF%y4v)9@d?Ip@@YgE{PTV{}y1)iI@qv>_@Txa{*Jpmj~c6%u{E^HQ9x8(x!* zN`^FBb^7j|cze?Lg1;VeI3VSm)(@@vh_=R{)LNhxja=^&MOF}ZZvd-Q5ZSVaVjQj7 zGM@vxI~l*t2l~Oy&m}SjQC@P*f_<5jW{(3oNruIfOjCzjY+sT4_B~0MD02HH=5yFDEwcejViGkJ$G7wbll?jGQ#rEl{heuuN(@ ztA5rE-pY&BpV2WT(e3M3hzz)s^5^#=^IIOyz14op1>y%#bTHlS0v9ST z0-QeZA(fkbb%~EPSBTDJTk}`qt@sBG`gN_WY-aZRMbwYY*?X(uA1;e?O|$J8qNE1O z%Egq~Hw-JIx23xo;8R-cc>~fZZmHc=~u(d2GYD% zi>wUV_5-LOlm8F{I~S{+AV`h;`m^DV*|tk^V=nLI^gL(zP=|L1J1DV`GtT6%1pI}K zxkqsHOkXTs>1hSG`qyJRPZ&exFvLFC*^^Fq`N*aG;*|V=@OBF(Y$!=s3#B$I>yV&^ zX|WQ9Jja}(A3g;)onBNnXy(8^oIUpZCCwhZ{s2I}=$g#IkD~+FrX75~9hjq2B&9Y* z=K&R5Fr2+FhXMhCMV90mBE$U;t+mLTKBRRNKCYvwd)I^IMU)ycxabQ_Z82%5c(RYL zMlwlXnl5H(ju)3vaj-Vtn`p7<=wV|QjnV+_QWjO3P=_jyg(Og5mJLPoE7J=`s;F00 zf77UC=Soa6hso{~m9xxN!}M{xs(=b1XnSS9ER+U@fWgL`D3wR0?OrS5X!FCjej*C2 z>A!a<%-yK9UITPN}B={1jpg8Pq)N6D1l{VDV(K-F*#uCueRU)}vY>t`{6(Id2B zs-galmf-EYc8J@Y-};~AW?gra(3An$-|eL6e&Tfa5^|)aK@Hal^(HQ4NWy=`a(j++ z&1RJEz6uI1w_(#9Pt6$|l`x%scm+vt7njYkPMG|7Ek{8Lzein(7$Nw(Q^FWs6 z|MB;@ESgADifL_&Z(JT0w+>q=xSr5~C&q3J4xZzcq@Q*K?dK6#xw3*kQrr7SZp-QE zEx*?-8@%wAHSSVVLKTsR58M0M!xT^Fi;W28sfFu+`?(cHM6du{3lKykl@VA zcvc$?Fsi=2+29x)ZAG#{a<$j=iho3|wR3*G``8oHq=#&uQB%11@N%la2jL8#JO*-I zPx`Z$#S@CrK~-5RdV1>In=`xN?@hQ%62MV{pCz)l1v!MNv`h)Azd$5G=0a1X(&|QN zI$WOV!s$nY$>lHlsjfm6f=LT$U2nwo=2NknopHRKSpA+GZDQ`Q z&*r&L*M01@Wb2y60(Cj`l1u8peGg>HWHE_Rrgy}j3>gZ0$^yCVAF$>#Rg%_{D!0-U zjkTHd4b0lSEXYP$cz+x>;i!D-63(>U*xplrA4&+Oe`fJW&@eyiNw`=>SY1-x!oLR( zj~08cU+)LD6)A$jXI2`n=PT-jTJ35|<~F3x)&qj#;F@rpG8XG^t~VSo^NJ+gLj`1UW!n*6$8Phyn+zr$NTyT9>PJXqJrmTkAWC}J$P zR4=8tV1X5_{W4-YMB64(V&e8O9Z77b7PWy4<@50Xu8|ahLA+0~AG`QqNaZIRmCCoN zqljr4ZQu)SYqj{%K02e3Oxp!h2dc!-*xd%{yy?0qS!02+++Tp$Lw#D0w5-pg@OboW zOfJAswi0$5QK@dZ-1w?LU}e;oYy(c=bGo&+*Ux`b0&H6gRm$wTFjlY(Cgwea-Ni`? zZ)b8{H2I6#cB-qtA@pFBn)cQYhr2v930i)oTl*dxvtcf~eHSh)?z=kt9?0F#probX z*H1XVx&ov^{kkISB_ zKK)Fq7Fm0mx_(QlyH?^{#kGP+c^XwKH6t8ln@3rJ14}fHQLvNv8Wp``UKDXtSg6RJ z6f_HP0)HQNoDRM=*ArzSgFa>Z!y@f|Z2*=G$977A=XZ3QM--=CLOd=Nl~xI(SM`%! z35Xz?R^eZufq`s?*Cx0j2NE^{$M}FlXHMri#*-Mk<*i;JeH9CSy;)va3vja=7uFAs zu3@KH=P23koJhabfzp6?Syr4hzvm~;IeN;!B~%Cf@Qje}m>`_=X!kZ9KT6hey8T5> z^Y7JZUKN6FiuFV74Kv?jrKb)~UaOj}q@Oqluu+?1Tbij(gfj=% zP?rCzo9A89sU?Wkd1hIb%M0;MMQ=voUFcAU1M0l2+be*xf3WknD?|4W3jxzM_CYaH&Ii z%qb4L6KyRzdYE^?v&WvHWYShD<;1(et?eRfcczxeY7(Gbk3Z&Gg#P%O-7eYOC+D|XzOm~C)ey7`lkD!>n))nELc(vcp% zoff-MvvGM<0H2*%sJwC!>!P^AN=9G~7E*G`+L}0Px;OhCu3I5d$jtzId*e80CcQqY zS#fvG$ z>bka9OF5d*f<6BHT4WlDgXgZGRAVUG0b9F>@qwytaI*0D%kqMV6x4b|))(08^` z8fD_zpO&%DzUZ8&QIcYbSErF~Z2)4|VW!C2UK*g=5>=)d=0>?%fy8~oL&e4Hr0-Fj zuz$R@+tlVi`gm=hQ{G8PV5?*FEl#cdTknYSqh9_XV#QYZ43UkHm9RSk2pN1k^@N=m zyyMl!*m)fuq|Xe)tu+<0O_s;DZ2j?|tB@0Wi0qja^2MC@WWYtbbA1rlLcwK9N=%{8 zKj=RuDk~UwV?hdDNBTWMUSrMi=ihU{qjKvsL748hzS~o@VBe;CnYmfN;Q;TTgPmV* z+G#3!WM?aUU{18I$)#44aSi+IHsXeWU>(EU`!g=1+?2uLG4$)X3e-*e3VY{hAC-hk zjeL1ig^!cWDa##wW#Vs}Q>k^ApNB}VeR_m@0ji}0EG?CuF4c6*{C=Yk{=pC13iaTp zBxe#L_N6&?+RFY3+a@?aco3?)B-AYh4#yZ*KMP3t>bgLP(Z+p zd-mFZ(`w)PU`}~K=fAO*=y_klDQ6{j^KE_37PnSCKhh*U3{243zxo2JbV!)lNf+k# z2rT!0mjLI_S*{*$=^^C$a~@ZyLaK|@$Si%Fo=IMY#Ds;7zQw3bJd*|qxhe1OOH}P; zYD%uN=dO6^s~3`o+g056qPmrFN`1SxB2Sb$PPPUe3mn*xM?}A8pwkEtFS8%}7oMhg zpwOYig7(*M;(OJqEJ2l3BxRs%K^j{Dy*9{WxH)5G23LQf1LgtN5VhhkFXzaJL z%^x++i7kT`&xAly=Plo`=7~z#P5SraH}AWWWNhC2MS2@NbNU?mP>8d!lst2EFo3~3 zM$Iez1-RFRR=Loo;qm4B^fL#;6=?S}^*-5k3$UHU7v#9-$2P zG*l}hBs!0YnOTE%vK#`Us&!;yPj*#9QN*eLDnq5pKV)74o+RR*PmAc5*I7}O3(_#~ z-?urGk#|T+6RrF5{0tb`)8=+EuzZHlbt(8ZnQj86CZ)U17AhpBo}DEArdD!S(p})2F*y24uO|T}386n2^z8x*?yK+v zR91zm2kbt!vpBJ~5XEZ!0IY+Hu=;XP7(?)M<%hEaVTfcF&I;KPx^Heh(G@y?q)ZLk zT5MUu>m`}!g|u0VNOhi!@1v)rpXHS2cmA^pYiA_zKEvc+1qq@p%sE*;9d7m+FoF4f zJV=KI@Ud6;PiOh|8V-kd2Y2icU8%n(OpmH`mQYx>2rWkRxk!7!H_^XP9--&Ivdi8# zTZR$Y2SC08qex>_OY8kPPdLyEw_po1v%uv$GRyZlBOY25Ke|aVFj)BW%jSLGs0yOB z?-2v+SI&okIQ+Zcj@snk4%l_rgg*wb$C~cd2h_E!5Mz7PwDII-P|gTVOkl}&VMJ(S z?ZYf4Ws90P;st+8%xNexbhk1Rl-WI*2M4DrlL=Y{mx=fsE06;K;!&}+7$n_>M*%Nj0%P5zJE_&$84_SZ*B=m)2FkH ze)N8VAnAmf7v##EPNi3mm$x^AYZlZ>Sjg2UicUSh3eGvj56$qe94~xzTihtB#Q zVgd*a_UzDq*MmmFoR>e$W&L>wie4|=Rmx<8FfiN@*)J%u3=a$QM0(IJ)L^BAA>gg6 z3GfI6{io?wx83d(GVH~c^IVf9*9lv0>rh+QAti0~Gxz#>hN=1HvOPfKJa72zNC4Xc z;tNzJ*y1ji;aaN5-oxob?SzIDI5=1!{%rlNYb}kM51s!V5?&giS_R_t+DzgJY~eiB zKZU{(Ij@M=$!YvTFTM?kd0E!Fe+0QENr)UIqOVBK^~T$TmwNdUG?Nn?DHF@-9Kv&Q zv1fNqJJV?u2xVn3%=9UNa9NZIzgea^sd&8OK%|fBz-@;qnv+Gq5bFedZ4Gaj?-u)4 z4)$W)8YG}W-s@_Lil+eTzRBYDZOf~zbh*8-L8qq+2ZznfkjdK9Sl+z_L8krr;_L+s zE4xC#+e&$Sc;Gm-OFErNUsUf>?}&x&=L2dsGUYyK)>)>!JOHc`0xgd@vjPWAcI_fZ z65vQbd_TVImWj@k& zY0%W)t24dqOz(9SopPYUPcS^6&Yq_zp+6tS{6jy&v?Tn*4)`yO{W-yGfoT`F)OLaV zg=Q4Sou|Brc9;70>la?0SGILzsNAf4+0(S+H|;ZG?I!9P8qQo+pB?lhdPRP0`2;GK zD85Xy$UhcvwUgv)`J(NFprrHjnH26bZ=9Z$V-BqvQ46jJs8AEnpE%t96Lz(Du{tP> za)sjtv9K?(E*iN#Z5p^HhV>FQJtcA3z*$Gj@!u18q2bED%2rr#tT&MGF(mX}s|STZ zp8yp=FtgW43t2Ef5Y_EngKMYu;L3UQx2qr~N`dL$hgtr#pKfS>-Vc`GLMx@vKSvWY z5N8a8uu~&UC}o1*`>Po5*x1X94eCXCQYZM6GFgF(C^ftQ6_8-x)btuF$&Tc?0b?T9 zu^Md2sTDe?UFsMK=?e8+#qz^p=gk*k#N_H0Vk1omXFmgQ0%E%iJTCGK#DC*c?{y&y zZUQ<)mp8z+`r57uDtAx$2ZVDPDdRwRmqsr}J(R3^7xowX@n-7}KSA$s>tkH`UKB$^!SQ$TKi4LHt`;)Hn zg>o}5C2}IZHnom4wv$C%^Umu#X~v((`xe^oGLkdVeT#!$QB2X@Q(QTwTPHH0-*j6t zdiEeF!Z}mF(F55QLd%fBXLYq4?;uGLS`b{2>tvr|RS&Y&VzR0!s#ak(I?>BH5 z|CF$e_xyb)nncRRNQ41KGJ>+?;Gbov=WcY%xnEe0Dh;X7!s$J*m_GCI{!+Q-S!ABn zWSy*0fUR>H7a-RAAw7jyM?LhT5V<#S^C3GY_9;ICs?3AcusBl>Ggya3%b+SzFO2!W zHVu0uOEu?1n4?c<3*-}=!vw(vfB8gxd7{#1UGKt zfNz_G!=HoDL#@Ff-S7K0lv~Q}!z6dAKkwr#wHG|}1xFqv7V?Z($uPxOfEHXYk8Ezf z-Q!HSQsTHpx9-Z$WB`%A^ATnQKsSMgeO9pqH+BOrBIT<73h + + diff --git a/src/components/common/Input.tsx b/src/components/common/Input.tsx index 291745a..6f39ebd 100644 --- a/src/components/common/Input.tsx +++ b/src/components/common/Input.tsx @@ -1,5 +1,6 @@ // src/components/common/Input.tsx import React, { forwardRef } from 'react'; +import cautionIcon from '@/assets/caution.svg'; interface InputProps extends React.InputHTMLAttributes { leftNode?: React.ReactNode; // 왼쪽 아이콘 (이메일, 자물쇠 등) @@ -66,7 +67,8 @@ export const Input = forwardRef( {/* 4. 에러 메시지 영역 */} {isError && errorMessage && ( - {/* 느낌표 아이콘 등을 넣어도 좋습니다 */}! {errorMessage} + + {errorMessage} )} diff --git a/src/components/layout/RootLayout.tsx b/src/components/layout/RootLayout.tsx index ff6484b..0b7b1b9 100644 --- a/src/components/layout/RootLayout.tsx +++ b/src/components/layout/RootLayout.tsx @@ -2,12 +2,19 @@ import { Outlet } from 'react-router-dom'; export default function RootLayout() { - // 1. PC/태블릿 접속 시 남는 배경 (어두운 회색) return ( -
- {/* 2. 모바일 앱 규격(375px) 컨테이너 */} -
- {/* 자식 라우트(DefaultLayout 또는 FullScreenLayout)가 렌더링될 자리 */} +
+
diff --git a/src/pages/login/login.jsx b/src/pages/login/login.jsx new file mode 100644 index 0000000..f6df921 --- /dev/null +++ b/src/pages/login/login.jsx @@ -0,0 +1,291 @@ +import { useEffect, useRef, useState } from 'react'; +import { twMerge } from 'tailwind-merge'; +import { useNavigate } from 'react-router-dom'; +import styles from './login.module.css'; +// import { loginRequest, refreshTokenRequest, ApiError } from '../../api/authApi'; +// import { saveTokens, clearTokens } from '../../utils/tokenStorage'; +import lockIcon from '../../assets/lock.svg'; +import joinIcon from '../../assets/join.svg'; +import checkIcon from '../../assets/check.svg'; +import emailIcon from '../../assets/email.svg'; +import logo from '../../assets/logo.png'; +import eyeIcon from '../../assets/eye.svg'; +import pwLockIcon from '../../assets/pwlock.svg'; +import Button from '../../components/common/Button'; +import { Input } from '../../components/common/Input'; +import { Spinner } from '../../components/common/Spinner'; + +const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; +const FRAME_WIDTH = 402; +const FRAME_HEIGHT = 874; + +export default function LoginPage() { + const navigate = useNavigate(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [autoLogin, setAutoLogin] = useState(true); + const [fieldErrors, setFieldErrors] = useState({ email: '', password: '' }); + const [banner, setBanner] = useState(null); + const [isSubmitting, setIsSubmitting] = useState(false); + + const refreshTimerRef = useRef(null); + const [scale, setScale] = useState(1); + + useEffect(() => { + function updateScale() { + const scaleByHeight = window.innerHeight / FRAME_HEIGHT; + const scaleByWidth = window.innerWidth / FRAME_WIDTH; + setScale(Math.min(scaleByHeight, scaleByWidth)); + } + updateScale(); + window.addEventListener('resize', updateScale); + return () => window.removeEventListener('resize', updateScale); + }, []); + + useEffect(() => { + return () => clearTimeout(refreshTimerRef.current); + }, []); + + function validate() { + const errors = { email: '', password: '' }; + if (!email.trim()) { + errors.email = '이메일을 입력해주세요.'; + } else if (!EMAIL_REGEX.test(email.trim())) { + errors.email = '올바른 이메일 형식이 아닙니다.'; + } + if (!password) { + errors.password = '비밀번호를 입력해주세요.'; + } + setFieldErrors(errors); + return !errors.email && !errors.password; + } + + function scheduleTokenRefresh(refreshToken, expiresIn) { + clearTimeout(refreshTimerRef.current); + refreshTimerRef.current = setTimeout(async () => { + try { + // const reissued = await refreshTokenRequest(refreshToken); + // saveTokens(reissued, autoLogin); + setBanner({ + type: 'success', + message: '토큰이 만료되어 새 토큰으로 재발급되었습니다.', + }); + // scheduleTokenRefresh(reissued.refreshToken, reissued.expiresIn); + } catch { + // clearTokens(); + setBanner({ + type: 'error', + message: '세션이 만료되었습니다. 다시 로그인해주세요.', + }); + } + }, expiresIn * 1000); + } + + async function handleSubmit(e) { + e.preventDefault(); + setBanner(null); + if (!validate()) return; + + setIsSubmitting(true); + try { + // const tokens = await loginRequest({ email: email.trim(), password }); + // saveTokens(tokens, autoLogin); + setBanner({ + type: 'success', + message: `로그인에 성공했습니다. ${autoLogin ? '자동 로그인이 설정됨' : ''}`, + }); + // scheduleTokenRefresh(tokens.refreshToken, tokens.expiresIn); + } catch (err) { + setBanner({ + type: 'error', + message: '알 수 없는 오류가 발생했습니다. 다시 시도해주세요.', + }); + } finally { + setIsSubmitting(false); + } + } + + return ( +
+
+
+
+
+ SOO +
+

+ 눈송이들의 수강신청을 구조해줄 간편하고 +
+ 안전한 강의 교환 매칭 제안 서비스 +

+
+ +
+ {banner?.message || ''} +
+ +
+ {/* ── 이메일 ── */} +
+ +
+ + + + { + setEmail(e.target.value); + if (e.target.value.trim()) + setFieldErrors((prev) => ({ ...prev, email: '' })); + }} + autoComplete="email" + className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none placeholder:text-[11px] placeholder:leading-[18.384px] placeholder:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" + /> +
+

{fieldErrors.email}

+
+ + {/* ── 비밀번호 ── */} +
+ +
+ + + + { + setPassword(e.target.value); + if (e.target.value) + setFieldErrors((prev) => ({ ...prev, password: '' })); + }} + autoComplete="current-password" + className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none [&::placeholder]:text-[11px] [&::placeholder]:leading-[18.384px] [&::placeholder]:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" + /> + +
+

{fieldErrors.password}

+
+ + {/* ── 자동 로그인 ── */} +
setAutoLogin((v) => !v)} + role="checkbox" + aria-checked={autoLogin} + tabIndex={0} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + setAutoLogin((v) => !v); + } + }} + > + + {autoLogin && ( + + )} + + 자동 로그인 +
+ + {/* ── 로그인 버튼 ── */} + +
+ +
+ + | + +
+
+
+
+ ); +} diff --git a/src/pages/login/login.module.css b/src/pages/login/login.module.css new file mode 100644 index 0000000..fb8188e --- /dev/null +++ b/src/pages/login/login.module.css @@ -0,0 +1,340 @@ +.page { + height: 100vh; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + background: #eeeeee; + font-family: 'Pretendard', 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif; + overflow: hidden; +} + +.frame { + width: 402px; + height: 874px; + flex-shrink: 0; + transform-origin: center center; +} + +.card { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + background: #fbfbfb; + border-radius: 4px; + box-sizing: border-box; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.02); + overflow-y: auto; +} + +.brand { +} + +.logo { + display: block; + width: 131.397px; + height: 59.797px; + margin-top: 214.03px; + margin-left: 135.3px; +} + +.logo img { + width: 100%; + height: 100%; + display: block; +} + +.tagline { + width: 242.66px; + margin-top: 14px; + margin-left: 79.67px; + color: #657a88; + text-align: center; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 400; + line-height: 18.384px; + letter-spacing: 0.368px; +} + +/* 배너: 색깔 박스 없이 텍스트만. 있든 없든 항상 같은 자리를 차지해서 밀림 없음 */ +.bannerSlot { + min-height: 17px; + margin-top: 1.86px; + margin-bottom: 6px; + margin-left: 27.23px; + margin-right: 27.23px; + text-align: center; + font-family: Pretendard; + font-size: 12px; + font-weight: 500; + line-height: 17px; + overflow: hidden; +} + +.bannerErrorText { + color: #e15252; +} + +.bannerSuccessText { + color: #2f7a3d; +} + +.form { + display: flex; + flex-direction: column; +} + +.fieldGroup { + display: flex; + flex-direction: column; +} + +/* 배너 자리가 항상 있으므로, 태그라인과의 원래 간격에서 배너 슬롯 높이를 뺀 값 */ +.emailGroup { + margin-top: 7px; +} + +.pwGroup { + margin-top: 14.47px; +} + +.label { + display: block; + margin-left: 27.23px; + color: #657a88; + font-family: Pretendard; + font-size: 15px; + font-style: normal; + font-weight: 500; + line-height: 20px; + letter-spacing: 0.4px; +} + +.emailLabel { + margin-bottom: 7.78px; +} + +.pwLabel { + margin-bottom: 10.89px; +} + +.inputWrapper { + display: flex; + align-items: center; + gap: 8px; + padding: 0 12px; + box-sizing: border-box; + width: 344.5px; + height: 40.371px; + margin-left: 30.27px; + border: 0.7px solid #afb1b6; + border-radius: 6px; + background: #ffffff; +} + +.inputWrapper:focus-within { + border-color: #4c9dd1; +} + +.inputWrapper.inputError { + border-color: #e15252; +} + +.inputIcon { + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; +} + +.emailIcon { + width: 17px; + height: 15px; +} + +.pwLockIcon { + width: 22px; + height: 22px; +} + +.input { + flex: 1; + min-width: 0; + border: none; + outline: none; + background: transparent; + color: #000; + font-family: Pretendard; + font-size: 15px; + font-style: normal; + font-weight: 400; + line-height: 20px; /* 133.333% */ + letter-spacing: 0.4px; +} + +.input::placeholder { + color: #657a88; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 400; + line-height: 18.384px; /* 167.126% */ + letter-spacing: 0.368px; +} + +.eyeButton { + flex-shrink: 0; + width: 24px; + height: 24px; + padding: 0; + background: none; + border: none; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} + +.errorText { + height: 18.384px; + overflow: hidden; + margin-top: 4px; + margin-left: 30.27px; + font-family: Pretendard; + font-size: 11px; + font-style: normal; + font-weight: 400; + line-height: 18.384px; + letter-spacing: 0.368px; + color: #e15252; +} + +.autoLoginRow { + display: flex; + align-items: center; + gap: 8px; + margin-top: 10.72px; + margin-left: 32.05px; + cursor: pointer; + width: fit-content; + user-select: none; +} + +.checkbox { + width: 17.903px; + height: 17.903px; + flex-shrink: 0; + border-radius: 4px; + border: 1.5px solid #c6cad1; + display: flex; + align-items: center; + justify-content: center; +} + +.checkbox.checked { + background: #4c9dd1; + border-color: #4c9dd1; + color: #ffffff; +} + +.autoLoginLabel { + color: #657a88; + font-family: Pretendard; + font-size: 13px; + font-style: normal; + font-weight: 300; + line-height: 20px; + letter-spacing: 0.4px; +} + +.submitButton { + display: flex; + width: 359px; + height: 53px; + margin-top: 14.74px; + margin-left: 21.5px; + padding: 16px 20px; + box-sizing: border-box; + justify-content: center; + align-items: center; + gap: 6px; + border-radius: 16px; + border: none; + background: #4c9dd1; + color: #fff; + font-family: Pretendard; + font-size: 15px; + font-style: normal; + font-weight: 700; + line-height: 24px; + letter-spacing: 0.2px; + cursor: pointer; +} + +.submitButton:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +.links { + display: flex; + align-items: center; + gap: 12px; + margin-top: 37px; + margin-left: 96px; +} + +.linkButton { + background: none; + border: none; + display: flex; + align-items: center; + gap: 6px; + cursor: pointer; + color: #000; + font-family: Pretendard; + font-size: 14px; + font-weight: 300; + line-height: 20px; + letter-spacing: 0.4px; +} + +.linkButton.join { + color: #4c9dd1; + line-height: 24px; + letter-spacing: 0.2px; +} + +.lockIcon { + width: 10.479px; + height: 13.473px; + margin-top: -3px; +} + +.joinIcon { + width: 11.929px; + height: 11.929px; + margin-top: -4px; +} + +.divider { + color: #d1d5db; +} + +.spinner { + width: 16px; + height: 16px; + border: 2px solid rgba(255, 255, 255, 0.4); + border-top-color: #ffffff; + border-radius: 50%; + animation: spin 0.7s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 69f8987..d34b204 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -17,6 +17,8 @@ import { TestCard } from '../pages/TestCard'; import { TestExtra } from '../pages/TestExtra'; import { TestAvatar } from '../pages/TestAvatar'; import { TestLoading } from '../pages/TestLoading'; +import LoginPage from '../pages/login/login'; +import SignupPage from '../pages/signup'; export const router = createBrowserRouter([ { @@ -53,6 +55,8 @@ export const router = createBrowserRouter([ children: [ // :id 나 :roomId 는 동적 라우팅 기법입니다. (ex. /board/123) // 예시: { path: 'board/:id', element: }, // 상세 게시글 + { path: '/login', element: }, + { path: '/signup', element: }, ], }, ], diff --git a/src/store/tokenStorage.js b/src/store/tokenStorage.js new file mode 100644 index 0000000..c76b227 --- /dev/null +++ b/src/store/tokenStorage.js @@ -0,0 +1,56 @@ +/** + * 토큰 저장 유틸 + * - "자동 로그인" 체크 시: localStorage (브라우저/앱 종료 후에도 유지) + * - 미체크 시: sessionStorage (탭/앱 종료 시 소멸) + */ + +const ACCESS_TOKEN_KEY = "soo_access_token"; +const REFRESH_TOKEN_KEY = "soo_refresh_token"; +const EXPIRES_AT_KEY = "soo_token_expires_at"; + +function getStorage(persist) { + return persist ? window.localStorage : window.sessionStorage; +} + +export function saveTokens({ accessToken, refreshToken, expiresIn }, persist) { + const storage = getStorage(persist); + const expiresAt = Date.now() + expiresIn * 1000; + + storage.setItem(ACCESS_TOKEN_KEY, accessToken); + storage.setItem(REFRESH_TOKEN_KEY, refreshToken); + storage.setItem(EXPIRES_AT_KEY, String(expiresAt)); + + // 두 storage 모두 정리해서 이전 로그인 방식의 잔여 토큰이 남지 않도록 함 + const other = getStorage(!persist); + other.removeItem(ACCESS_TOKEN_KEY); + other.removeItem(REFRESH_TOKEN_KEY); + other.removeItem(EXPIRES_AT_KEY); +} + +export function getTokens() { + const storage = window.localStorage.getItem(ACCESS_TOKEN_KEY) + ? window.localStorage + : window.sessionStorage; + + const accessToken = storage.getItem(ACCESS_TOKEN_KEY); + const refreshToken = storage.getItem(REFRESH_TOKEN_KEY); + const expiresAt = Number(storage.getItem(EXPIRES_AT_KEY)) || 0; + + if (!accessToken || !refreshToken) return null; + + return { accessToken, refreshToken, expiresAt, storage }; +} + +export function isTokenExpired() { + const tokens = getTokens(); + if (!tokens) return true; + return Date.now() >= tokens.expiresAt; +} + +export function clearTokens() { + [window.localStorage, window.sessionStorage].forEach((storage) => { + storage.removeItem(ACCESS_TOKEN_KEY); + storage.removeItem(REFRESH_TOKEN_KEY); + storage.removeItem(EXPIRES_AT_KEY); + }); +} From 762dd5bd49eb91c466bafcdd969ec8e24edaaf43 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Tue, 14 Jul 2026 13:47:52 +0900 Subject: [PATCH 02/28] =?UTF-8?q?style:=20=ED=8F=B0=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 70 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/src/index.css b/src/index.css index 8318682..bad8778 100644 --- a/src/index.css +++ b/src/index.css @@ -44,17 +44,75 @@ /* ── Paperlogy (포인트 제목 폰트) ── */ @font-face { - font-family: 'Paperlogy'; - src: url('./assets/fonts/Paperlogy-7Bold.ttf') format('truetype'); + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-1Thin.woff2') + format('woff2'); + font-weight: 100; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-2ExtraLight.woff2') + format('woff2'); + font-weight: 200; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-3Light.woff2') + format('woff2'); + font-weight: 300; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-4Regular.woff2') + format('woff2'); + font-weight: 400; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-5Medium.woff2') + format('woff2'); + font-weight: 500; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-6SemiBold.woff2') + format('woff2'); + font-weight: 600; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-7Bold.woff2') + format('woff2'); font-weight: 700; - font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-8ExtraBold.woff2') + format('woff2'); + font-weight: 800; + font-display: swap; } @font-face { - font-family: 'Paperlogy'; - src: url('./assets/fonts/Paperlogy-9Black.ttf') format('truetype'); + font-family: 'Paperozi'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/2408-3@1.0/Paperlogy-9Black.woff2') + format('woff2'); font-weight: 900; - font-style: normal; + font-display: swap; } /* ========================================== From 7c694b0e18afc5b41bac403cba5b234f94d44ffb Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Tue, 14 Jul 2026 14:17:56 +0900 Subject: [PATCH 03/28] =?UTF-8?q?style:=20=EA=B2=BD=EA=B3=A0=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Input.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/Input.tsx b/src/components/common/Input.tsx index 6f39ebd..625b389 100644 --- a/src/components/common/Input.tsx +++ b/src/components/common/Input.tsx @@ -41,7 +41,7 @@ export const Input = forwardRef( className={` w-full text-sm text-gray-900 transition-colors duration-200 placeholder:text-gray-400 focus:outline-none - ${variant === 'default' ? 'py-3.5 rounded-xl' : 'py-3 rounded-full'} + ${variant === 'default' ? 'py-3 rounded-md' : 'py-2.5 rounded-full'} ${leftNode ? 'pl-11' : 'pl-4'} ${rightNode ? 'pr-11' : 'pr-4'} ${ From 62f691b0944c8c8efb7c4e66eb0837d15f1c0d74 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Tue, 14 Jul 2026 14:19:28 +0900 Subject: [PATCH 04/28] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=ED=8E=98=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/signup.jsx | 554 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 554 insertions(+) create mode 100644 src/pages/signup.jsx diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx new file mode 100644 index 0000000..08c7c57 --- /dev/null +++ b/src/pages/signup.jsx @@ -0,0 +1,554 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Button from '@/components/common/Button'; +import { Input } from '@/components/common/Input'; +import { Modal } from '@/components/common/Modal'; +import backIcon from '@/assets/back.svg'; +import eyeIcon from '@/assets/eye.svg'; + +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +const API = { + SEND_CODE: `${API_BASE}/api/auth/email/send-code`, + VERIFY_CODE: `${API_BASE}/api/auth/email/verify-code`, + CHECK_DUPLICATE: `${API_BASE}/api/auth/email/check`, + SIGNUP: `${API_BASE}/api/auth/signup`, +}; + +const MOCK_ACCOUNT = { email: 'test1234@sookmyung.ac.kr', code: '123456' }; + +const postJson = async (url, body) => { + if (body?.email === MOCK_ACCOUNT.email) { + await new Promise((resolve) => setTimeout(resolve, 400)); + if (url === API.SEND_CODE) return { status: 200, data: { success: true } }; + if (url === API.VERIFY_CODE) { + const isCorrect = body.code === MOCK_ACCOUNT.code; + return { + status: isCorrect ? 200 : 400, + data: isCorrect + ? { success: true } + : { success: false, message: '잘못된 입력값입니다.' }, + }; + } + if (url === API.CHECK_DUPLICATE) + return { status: 200, data: { success: true, data: { exists: false } } }; + if (url === API.SIGNUP) return { status: 201, data: { success: true } }; + } + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const data = await res.json().catch(() => null); + return { status: res.status, data }; +}; + +const EMAIL_DOMAIN = 'sookmyung.ac.kr'; +const CODE_TIMER_SECONDS = 5 * 60; +const PASSWORD_REGEX = + /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>]).{8,12}$/; + +// 프레임 고정 크기 (Figma 기준) +const FRAME_W = 402; +const FRAME_H = 874; + +export default function SignupPage() { + const navigate = useNavigate(); + const [step, setStep] = useState('email'); + const [email, setEmail] = useState(''); + const [emailError, setEmailError] = useState(''); + const [isSending, setIsSending] = useState(false); + const [isCodeSent, setIsCodeSent] = useState(false); + const [code, setCode] = useState(''); + const [codeError, setCodeError] = useState(''); + const [isVerifying, setIsVerifying] = useState(false); + const [secondsLeft, setSecondsLeft] = useState(CODE_TIMER_SECONDS); + const timerRef = useRef(null); + const [password, setPassword] = useState(''); + const [passwordConfirm, setPasswordConfirm] = useState(''); + const [passwordError, setPasswordError] = useState(''); + const [confirmError, setConfirmError] = useState(''); + const [signupError, setSignupError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const [showCompleteModal, setShowCompleteModal] = useState(false); + const [showPw, setShowPw] = useState(false); + const [showPwConfirm, setShowPwConfirm] = useState(false); + + // 화면 크기에 맞춰 402x874 프레임을 통째로 스케일링 + const wrapRef = useRef(null); + const [scale, setScale] = useState(1); + + useEffect(() => { + const el = wrapRef.current; + if (!el) return; + const ro = new ResizeObserver((entries) => { + const w = entries[0].contentRect.width; + setScale(w / FRAME_W); + }); + ro.observe(el); + return () => ro.disconnect(); + }, []); + + useEffect(() => { + if (isCodeSent) { + timerRef.current = setInterval(() => { + setSecondsLeft((prev) => { + if (prev <= 1) { + if (timerRef.current) clearInterval(timerRef.current); + return 0; + } + return prev - 1; + }); + }, 1000); + } + return () => { + if (timerRef.current) clearInterval(timerRef.current); + }; + }, [isCodeSent]); + + const formatTime = (sec) => { + const m = Math.floor(sec / 60) + .toString() + .padStart(2, '0'); + const s = (sec % 60).toString().padStart(2, '0'); + return `${m}:${s}`; + }; + + const isValidDomainEmail = (value) => + /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value) && + value.toLowerCase().endsWith(`@${EMAIL_DOMAIN}`); + + const handleBack = () => { + if (step === 'password') { + setStep('email'); + return; + } + navigate('/login'); + }; + + const handleSendCode = async () => { + if (!isValidDomainEmail(email)) { + setEmailError('숙명 이메일만 입력 가능합니다.'); + return; + } + setEmailError(''); + setIsSending(true); + try { + const { data } = await postJson(API.SEND_CODE, { email }); + if (data?.success) { + setIsCodeSent(true); + setSecondsLeft(CODE_TIMER_SECONDS); + setCode(''); + setCodeError(''); + } else { + setEmailError(data?.message || '인증코드 발송에 실패했습니다.'); + } + } catch { + setEmailError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsSending(false); + } + }; + + const handleVerifyCode = async () => { + if (!isCodeSent || secondsLeft === 0 || !code.trim()) return; + setCodeError(''); + setIsVerifying(true); + try { + const { data } = await postJson(API.VERIFY_CODE, { email, code }); + if (!data?.success) { + setCodeError(data?.message || '잘못된 입력값입니다.'); + return; + } + const dup = await postJson(API.CHECK_DUPLICATE, { email }); + if (dup.data?.data?.exists) { + setCodeError('이미 가입된 이메일입니다.'); + return; + } + setStep('password'); + } catch { + setCodeError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsVerifying(false); + } + }; + + const validatePassword = () => { + let valid = true; + if (!PASSWORD_REGEX.test(password)) { + setPasswordError('영문, 숫자, 특수문자를 포함하여 8~12자로 작성해주세요'); + valid = false; + } else { + setPasswordError(''); + } + if (password !== passwordConfirm) { + setConfirmError('비밀번호가 일치하지 않습니다.'); + valid = false; + } else { + setConfirmError(''); + } + return valid; + }; + + const handleSignup = async () => { + setSignupError(''); + if (!validatePassword()) return; + setIsSubmitting(true); + try { + const { status, data } = await postJson(API.SIGNUP, { + email, + password, + passwordConfirm, + }); + if (status === 201 && data?.success) { + setShowCompleteModal(true); + return; + } + setSignupError(data?.message || '회원가입에 실패했습니다.'); + } catch { + setSignupError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsSubmitting(false); + } + }; + + const goToLogin = () => { + setShowCompleteModal(false); + navigate('/login'); + }; + + const isSendDisabled = + email.length === 0 || isSending || (isCodeSent && secondsLeft > 0); + + return ( + // 바깥 wrapRef가 실제 사용 가능한 너비를 재고, 그 비율만큼 402x874 프레임을 scale +
+
+ {/* 뒤로가기 버튼 — 확대 (44px 탭 영역, 아이콘 28x16) */} + + + {step === 'email' ? ( + <> +

+ 회원가입 +

+

+ 숙명 이메일을 인증해주세요. +

+ + +
+ { + setEmail(e.target.value); + if (emailError) setEmailError(''); + }} + disabled={isCodeSent} + isError={!!emailError} + errorMessage={emailError} + rightNode={ + + } + /> +
+ + +
+ { + setCode(e.target.value); + if (codeError) setCodeError(''); + }} + disabled={!isCodeSent || secondsLeft === 0} + isError={!!codeError} + errorMessage={codeError} + rightNode={ + isCodeSent ? ( + + {formatTime(secondsLeft)} + + ) : null + } + /> +
+ + {isCodeSent && !codeError && ( +

+ 메일이 발송되었습니다 +

+ )} + +
+ +
+ + ) : ( + <> + {/* 회원가입 */} +

+ 회원가입 +

+ + {/* 가입을 완료해주세요 */} +

+ 가입을 완료해주세요 +

+ + {signupError && ( +

+ {signupError} +

+ )} + + {/* 숙명 이메일 */} + + + {/* 숙명 이메일 텍스트 박스 */} +
+ +
+ + {/* 비밀번호 입력 */} + + + {/* + 비밀번호 입력 텍스트 박스. + */} +
+ { + setPassword(e.target.value); + if (passwordError) setPasswordError(''); + }} + isError={!!passwordError} + errorMessage={passwordError} + className="border-zinc-400 placeholder:text-neutral-400 placeholder:text-s placeholder:font-light" + rightNode={ + // 비밀번호 눈 아이콘 (Input 내부라 rightNode로 우측 정렬됨, 실제 좌표는 top:416.8 left:344.5와 일치) + + } + /> +
+ + {/* 비밀번호 확인 */} + + + {/* 비밀번호 확인 텍스트 박스 (에러 메시지+아이콘은 Input 내부에서 자동 렌더링) */} +
+ { + setPasswordConfirm(e.target.value); + if (confirmError) setConfirmError(''); + }} + isError={!!confirmError} + errorMessage={confirmError} + className="border-zinc-400" + rightNode={ + // 비밀번호 확인 눈 아이콘 (top:510.6 left:344.5와 일치) + + } + /> +
+ + {/* 회원가입 완료 버튼 */} +
+ +
+ + )} +
+ + setShowCompleteModal(false)} + title="가입이 완료되었습니다" + footer={ + + } + > + 필요한 강의는 얻고, 가진 강의는 나누며 +
+ 더 넓게 배워보세요. +
+ 성공적인 강의 교환을 응원합니다! +
+
+ ); +} From cda0f836bcf15df3bdbe7516b720f23f924bc579 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Tue, 14 Jul 2026 14:19:59 +0900 Subject: [PATCH 05/28] =?UTF-8?q?feat:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B3=80=EA=B2=BD=20=ED=8E=98=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/findPW.jsx | 497 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 src/pages/findPW.jsx diff --git a/src/pages/findPW.jsx b/src/pages/findPW.jsx new file mode 100644 index 0000000..2cdf65f --- /dev/null +++ b/src/pages/findPW.jsx @@ -0,0 +1,497 @@ +import { useEffect, useRef, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Button from '@/components/common/Button'; +import { Input } from '@/components/common/Input'; +import { Modal } from '@/components/common/Modal'; +import backIcon from '@/assets/back.svg'; +import eyeIcon from '@/assets/eye.svg'; + +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +const API = { + SEND_CODE: `${API_BASE}/api/auth/email/send-code`, + VERIFY_CODE: `${API_BASE}/api/auth/email/verify-code`, + RESET_PASSWORD: `${API_BASE}/api/auth/password/reset`, +}; + +const MOCK_ACCOUNT = { email: 'test1234@sookmyung.ac.kr', code: '123456' }; + +const postJson = async (url, body) => { + if (body?.email === MOCK_ACCOUNT.email) { + await new Promise((resolve) => setTimeout(resolve, 400)); + if (url === API.SEND_CODE) return { status: 200, data: { success: true } }; + if (url === API.VERIFY_CODE) { + const isCorrect = body.code === MOCK_ACCOUNT.code; + return { + status: isCorrect ? 200 : 400, + data: isCorrect + ? { success: true } + : { success: false, message: '잘못된 입력값입니다.' }, + }; + } + if (url === API.RESET_PASSWORD) + return { status: 200, data: { success: true } }; + } + const res = await fetch(url, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const data = await res.json().catch(() => null); + return { status: res.status, data }; +}; + +const EMAIL_DOMAIN = 'sookmyung.ac.kr'; +const CODE_TIMER_SECONDS = 5 * 60; +const PASSWORD_REGEX = + /^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>]).{8,12}$/; + +// 프레임 고정 크기 (Figma 기준) +const FRAME_W = 402; +const FRAME_H = 874; + +export default function FindPasswordPage() { + const navigate = useNavigate(); + const [step, setStep] = useState('email'); + const [email, setEmail] = useState(''); + const [emailError, setEmailError] = useState(''); + const [isSending, setIsSending] = useState(false); + const [isCodeSent, setIsCodeSent] = useState(false); + const [code, setCode] = useState(''); + const [codeError, setCodeError] = useState(''); + const [isVerifying, setIsVerifying] = useState(false); + const [secondsLeft, setSecondsLeft] = useState(CODE_TIMER_SECONDS); + const timerRef = useRef(null); + const [password, setPassword] = useState(''); + const [passwordConfirm, setPasswordConfirm] = useState(''); + const [passwordError, setPasswordError] = useState(''); + const [confirmError, setConfirmError] = useState(''); + const [resetError, setResetError] = useState(''); + const [isSubmitting, setIsSubmitting] = useState(false); + const [showCompleteModal, setShowCompleteModal] = useState(false); + const [showPw, setShowPw] = useState(false); + const [showPwConfirm, setShowPwConfirm] = useState(false); + + // 화면 크기에 맞춰 402x874 프레임을 통째로 스케일링 + const wrapRef = useRef(null); + const [scale, setScale] = useState(1); + + useEffect(() => { + const el = wrapRef.current; + if (!el) return; + const ro = new ResizeObserver((entries) => { + const w = entries[0].contentRect.width; + setScale(w / FRAME_W); + }); + ro.observe(el); + return () => ro.disconnect(); + }, []); + + useEffect(() => { + if (isCodeSent) { + timerRef.current = setInterval(() => { + setSecondsLeft((prev) => { + if (prev <= 1) { + if (timerRef.current) clearInterval(timerRef.current); + return 0; + } + return prev - 1; + }); + }, 1000); + } + return () => { + if (timerRef.current) clearInterval(timerRef.current); + }; + }, [isCodeSent]); + + const formatTime = (sec) => { + const m = Math.floor(sec / 60) + .toString() + .padStart(2, '0'); + const s = (sec % 60).toString().padStart(2, '0'); + return `${m}:${s}`; + }; + + const isValidDomainEmail = (value) => + /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(value) && + value.toLowerCase().endsWith(`@${EMAIL_DOMAIN}`); + + const handleBack = () => { + if (step === 'password') { + setStep('email'); + return; + } + navigate('/login'); + }; + + const handleSendCode = async () => { + if (!isValidDomainEmail(email)) { + setEmailError('숙명 이메일만 입력 가능합니다.'); + return; + } + setEmailError(''); + setIsSending(true); + try { + const { data } = await postJson(API.SEND_CODE, { email }); + if (data?.success) { + setIsCodeSent(true); + setSecondsLeft(CODE_TIMER_SECONDS); + setCode(''); + setCodeError(''); + } else { + setEmailError(data?.message || '인증코드 발송에 실패했습니다.'); + } + } catch { + setEmailError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsSending(false); + } + }; + + const handleVerifyCode = async () => { + if (!isCodeSent || secondsLeft === 0 || !code.trim()) return; + setCodeError(''); + setIsVerifying(true); + try { + const { data } = await postJson(API.VERIFY_CODE, { email, code }); + if (!data?.success) { + setCodeError(data?.message || '잘못된 입력값입니다.'); + return; + } + setStep('password'); + } catch { + setCodeError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsVerifying(false); + } + }; + + const validatePassword = () => { + let valid = true; + if (!PASSWORD_REGEX.test(password)) { + setPasswordError('영문, 숫자, 특수문자를 포함하여 8~12자로 작성해주세요'); + valid = false; + } else { + setPasswordError(''); + } + if (password !== passwordConfirm) { + setConfirmError('비밀번호가 일치하지 않습니다.'); + valid = false; + } else { + setConfirmError(''); + } + return valid; + }; + + const handleResetPassword = async () => { + setResetError(''); + if (!validatePassword()) return; + setIsSubmitting(true); + try { + const { status, data } = await postJson(API.RESET_PASSWORD, { + email, + password, + passwordConfirm, + }); + if (status === 200 && data?.success) { + setShowCompleteModal(true); + return; + } + setResetError(data?.message || '비밀번호 변경에 실패했습니다.'); + } catch { + setResetError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } finally { + setIsSubmitting(false); + } + }; + + const isSendDisabled = + email.length === 0 || isSending || (isCodeSent && secondsLeft > 0); + + return ( + // 바깥 wrapRef가 실제 사용 가능한 너비를 재고, 그 비율만큼 402x874 프레임을 scale +
+
+ {/* 뒤로가기 버튼 — 확대 (44px 탭 영역, 아이콘 28x16) */} + + + {step === 'email' ? ( + <> +

+ 비밀번호 찾기 +

+

+ 인증번호를 확인하여 비밀번호를 변경합니다. +

+ + +
+ { + setEmail(e.target.value); + if (emailError) setEmailError(''); + }} + disabled={isCodeSent} + isError={!!emailError} + errorMessage={emailError} + rightNode={ + + } + /> +
+ + +
+ { + setCode(e.target.value); + if (codeError) setCodeError(''); + }} + disabled={!isCodeSent || secondsLeft === 0} + isError={!!codeError} + errorMessage={codeError} + rightNode={ + isCodeSent ? ( + + {formatTime(secondsLeft)} + + ) : null + } + /> +
+ + {isCodeSent && !codeError && ( +

+ 메일이 발송되었습니다 +

+ )} + +
+ +
+ + ) : ( + <> + {/* 비밀번호 재설정 (비밀번호 찾기 단계와 동일한 위치) */} +

+ 비밀번호 재설정 +

+ + {/* 새로운 비밀번호로 재설정합니다 */} +

+ 새로운 비밀번호로 재설정합니다 +

+ + {resetError && ( +

+ {resetError} +

+ )} + + {/* 새 비밀번호 (비밀번호 찾기 단계와 동일한 위치) */} + + +
+ { + setPassword(e.target.value); + if (passwordError) setPasswordError(''); + }} + isError={!!passwordError} + errorMessage={passwordError} + className="border-zinc-400 placeholder:text-neutral-400 placeholder:text-s placeholder:font-light" + rightNode={ + + } + /> +
+ + {/* 비밀번호 확인 */} + + +
+ { + setPasswordConfirm(e.target.value); + if (confirmError) setConfirmError(''); + }} + isError={!!confirmError} + errorMessage={confirmError} + className="border-zinc-400" + rightNode={ + + } + /> +
+ + {/* 비밀번호 변경 버튼 */} +
+ +
+ + )} +
+ + setShowCompleteModal(false)} + title={
비밀번호가 변경되었습니다.
} + footer={ + + } + > +
+ +
+ ); +} From 77218f840fd47a67e3a33ec770dffe1d30479f02 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Tue, 14 Jul 2026 14:21:06 +0900 Subject: [PATCH 06/28] =?UTF-8?q?style:=20=ED=8F=B0=ED=8A=B8=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/login/login.jsx | 2 +- src/pages/login/login.module.css | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pages/login/login.jsx b/src/pages/login/login.jsx index f6df921..cb00789 100644 --- a/src/pages/login/login.jsx +++ b/src/pages/login/login.jsx @@ -269,7 +269,7 @@ export default function LoginPage() { + +
{step === 'email' ? ( <> diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx index dbcfb9f..34c6077 100644 --- a/src/pages/signup.jsx +++ b/src/pages/signup.jsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom'; import Button from '@/components/common/Button'; import { Input } from '@/components/common/Input'; import { Modal } from '@/components/common/Modal'; -import backIcon from '@/assets/icons/back.svg'; +import { IconButton } from '@/components/common/IconButton'; import eyeIcon from '@/assets/icons/eye.svg'; const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; @@ -235,20 +235,19 @@ export default function SignupPage() { }} > {/* 뒤로가기 버튼 — 확대 (44px 탭 영역, 아이콘 28x16) */} - + +
{step === 'email' ? ( <> From ce8ab79a661aa2c76401efd0db12f08cc6686cad Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Wed, 15 Jul 2026 10:29:36 +0900 Subject: [PATCH 12/28] =?UTF-8?q?style:=20=EB=92=A4=EB=A1=9C=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/findPW.jsx | 9 +++++---- src/pages/signup.jsx | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/findPW.jsx b/src/pages/findPW.jsx index 15699ac..97a0183 100644 --- a/src/pages/findPW.jsx +++ b/src/pages/findPW.jsx @@ -4,6 +4,7 @@ import Button from '@/components/common/Button'; import { Input } from '@/components/common/Input'; import { Modal } from '@/components/common/Modal'; import { IconButton } from '@/components/common/IconButton'; +import { ICONS } from '@/constants/icons'; import eyeIcon from '@/assets/icons/eye.svg'; const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; @@ -227,14 +228,14 @@ export default function FindPasswordPage() { style={{ position: 'absolute', top: 25, - left: 10, - opacity: 0.4, // 투명도 조절 - transform: 'scale(1.6)', // 크기 조절 + left: 12, + opacity: 0.6, + transform: 'scale(1.3)', transformOrigin: 'top left', }} className="z-10" > - +
{step === 'email' ? ( diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx index 34c6077..743b30c 100644 --- a/src/pages/signup.jsx +++ b/src/pages/signup.jsx @@ -4,6 +4,7 @@ import Button from '@/components/common/Button'; import { Input } from '@/components/common/Input'; import { Modal } from '@/components/common/Modal'; import { IconButton } from '@/components/common/IconButton'; +import { ICONS } from '@/constants/icons'; import eyeIcon from '@/assets/icons/eye.svg'; const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; @@ -239,14 +240,14 @@ export default function SignupPage() { style={{ position: 'absolute', top: 25, - left: 10, - opacity: 0.4, // 투명도 조절 - transform: 'scale(1.6)', // 크기 조절 + left: 12, + opacity: 0.6, + transform: 'scale(1.3)', transformOrigin: 'top left', }} className="z-10" > - + {step === 'email' ? ( From b5fa574fb7e1bfa7c54407a7b702889508cfc9f0 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Wed, 15 Jul 2026 15:20:10 +0900 Subject: [PATCH 13/28] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/sw.js | 53 +++++ src/api/push.js | 83 +++++++ src/assets/icons/dibs.svg | 4 + src/assets/icons/hands.svg | 3 + src/assets/icons/matched.svg | 4 + src/assets/icons/matchoffer.svg | 3 + src/main.tsx | 3 + src/pages/alert.jsx | 381 ++++++++++++++++++++++++++++++++ src/routes/router.tsx | 3 + 9 files changed, 537 insertions(+) create mode 100644 public/sw.js create mode 100644 src/api/push.js create mode 100644 src/assets/icons/dibs.svg create mode 100644 src/assets/icons/hands.svg create mode 100644 src/assets/icons/matched.svg create mode 100644 src/assets/icons/matchoffer.svg create mode 100644 src/pages/alert.jsx diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..8814767 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,53 @@ +// public/sw.js +self.addEventListener('install', () => { + self.skipWaiting(); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil(self.clients.claim()); +}); + +// 서버(FCM/Web Push)가 보낸 푸시를 받아서 브라우저 알림으로 표시 +self.addEventListener('push', (event) => { + let payload = {}; + try { + payload = event.data ? event.data.json() : {}; + } catch { + payload = { title: '알림', body: event.data ? event.data.text() : '' }; + } + + const title = payload.title || '알림'; + const options = { + body: payload.body || '', + icon: '/icons/icon-192.png', // 👈 실제 아이콘 경로로 교체 + badge: '/icons/badge-72.png', // 👈 실제 배지 아이콘으로 교체 + data: { + // 💡 요청대로 딥링크는 항상 /alert로 고정 + url: '/alert', + notificationId: payload.notificationId ?? null, + }, + }; + + event.waitUntil(self.registration.showNotification(title, options)); +}); + +// 알림 클릭 시 /alert로 이동 (이미 열린 탭 있으면 그쪽 포커스) +self.addEventListener('notificationclick', (event) => { + event.notification.close(); + const targetUrl = event.notification.data?.url || '/alert'; + + event.waitUntil( + self.clients + .matchAll({ type: 'window', includeUncontrolled: true }) + .then((clientList) => { + for (const client of clientList) { + if (client.url.includes('/alert') && 'focus' in client) { + return client.focus(); + } + } + if (self.clients.openWindow) { + return self.clients.openWindow(targetUrl); + } + }), + ); +}); diff --git a/src/api/push.js b/src/api/push.js new file mode 100644 index 0000000..2e8bd4e --- /dev/null +++ b/src/api/push.js @@ -0,0 +1,83 @@ +// src/lib/push.js +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +const VAPID_PUBLIC_KEY = import.meta.env.VITE_VAPID_PUBLIC_KEY ?? ''; +// 👆 VAPID 공개키는 백엔드가 발급해줘야 해요. .env에 VITE_VAPID_PUBLIC_KEY=... 로 넣어두세요. + +const urlBase64ToUint8Array = (base64String) => { + const padding = '='.repeat((4 - (base64String.length % 4)) % 4); + const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); + const rawData = atob(base64); + return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0))); +}; + +export const registerServiceWorker = async () => { + if (!('serviceWorker' in navigator)) { + console.warn('이 브라우저는 Service Worker를 지원하지 않습니다.'); + return null; + } + try { + const registration = await navigator.serviceWorker.register('/sw.js'); + return registration; + } catch (err) { + console.error('Service Worker 등록 실패:', err); + return null; + } +}; + +export const subscribeToPush = async () => { + if (!('Notification' in window)) { + return { success: false, reason: 'unsupported' }; + } + + const permission = await Notification.requestPermission(); + if (permission !== 'granted') { + return { success: false, reason: 'denied' }; + } + + const registration = + (await navigator.serviceWorker.getRegistration()) || + (await registerServiceWorker()); + if (!registration) return { success: false, reason: 'no-sw' }; + + const existing = await registration.pushManager.getSubscription(); + const subscription = + existing || + (await registration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY), + })); + + const subJson = subscription.toJSON(); + + // 서버에 구독 정보 등록 (API 문서의 "펌푸시 구독 등록" 엔드포인트) + const res = await fetch(`${API_BASE}/api/notifications/push-subscription`, { + method: 'POST', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + endpoint: subJson.endpoint, + p256dh: subJson.keys?.p256dh, + auth: subJson.keys?.auth, + }), + }); + + return { success: res.ok, subscription }; +}; + +export const unsubscribeFromPush = async () => { + const registration = await navigator.serviceWorker.getRegistration(); + const subscription = await registration?.pushManager.getSubscription(); + if (!subscription) return { success: true }; + + const endpoint = subscription.endpoint; + await subscription.unsubscribe(); + + const res = await fetch(`${API_BASE}/api/notifications/push-subscription`, { + method: 'DELETE', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ endpoint }), + }); + + return { success: res.ok }; +}; diff --git a/src/assets/icons/dibs.svg b/src/assets/icons/dibs.svg new file mode 100644 index 0000000..c1f3a5d --- /dev/null +++ b/src/assets/icons/dibs.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/hands.svg b/src/assets/icons/hands.svg new file mode 100644 index 0000000..19008bc --- /dev/null +++ b/src/assets/icons/hands.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/matched.svg b/src/assets/icons/matched.svg new file mode 100644 index 0000000..82002d6 --- /dev/null +++ b/src/assets/icons/matched.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/matchoffer.svg b/src/assets/icons/matchoffer.svg new file mode 100644 index 0000000..28f1655 --- /dev/null +++ b/src/assets/icons/matchoffer.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/main.tsx b/src/main.tsx index 6358fe6..665abdd 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,9 +2,12 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; import './index.css'; // Tailwind CSS 등 전역 스타일 적용 +import { registerServiceWorker } from './api/push'; ReactDOM.createRoot(document.getElementById('root')!).render( , ); + +registerServiceWorker(); diff --git a/src/pages/alert.jsx b/src/pages/alert.jsx new file mode 100644 index 0000000..a0e6868 --- /dev/null +++ b/src/pages/alert.jsx @@ -0,0 +1,381 @@ +import React from 'react'; +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Header from '@/components/layout/Header'; +import { IconButton } from '@/components/common/IconButton'; +import { Toast } from '@/components/common/Toast'; +import { Modal } from '@/components/common/Modal'; +import Button from '@/components/common/Button'; +import { ICONS } from '@/constants/icons'; +import { subscribeToPush } from '@/api/push'; + +// 💡 알림 타입별 아이콘 - src/assets/icons 안의 실제 파일명으로 교체하세요. +import matchIcon from '@/assets/icons/matchoffer.svg'; +import likeIcon from '@/assets/icons/dibs.svg'; +import checkIcon from '@/assets/icons/matched.svg'; +import clockIcon from '@/assets/icons/hands.svg'; +import cancelIcon from '@/assets/icons/matched.svg'; +import systemIcon from '@/assets/icons/dibs.svg'; + +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +const API = { + UNREAD_COUNT: `${API_BASE}/api/notifications/unread-count`, + LIST: `${API_BASE}/api/notifications`, + READ_ONE: (id) => `${API_BASE}/api/notifications/${id}/read`, + READ_ALL: `${API_BASE}/api/notifications/read-all`, +}; + +const HEADER_H = 80; + +const USE_MOCK = true; + +const MOCK_NOTIFICATIONS = [ + { + id: 1, + type: 'MATCH_PROPOSAL', + title: '마케팅과 소비자이슈 1순위 매칭 제안', + body: '마케팅과소비자이슈의 1순위 과목을 찾았습니다!\n교환을 제안해보세요!', + deepLink: null, + isRead: false, + createdAt: new Date(Date.now() - 1 * 60 * 1000).toISOString(), + }, + { + id: 2, + type: 'MATCH_PROPOSAL', + title: '마케팅과 소비자이슈 2순위 매칭 제안', + body: '마케팅과소비자이슈의 2순위 과목을 찾았습니다!\n교환을 제안해보세요!', + deepLink: null, + isRead: false, + createdAt: new Date(Date.now() - 7 * 60 * 1000).toISOString(), + }, + { + id: 3, + type: 'LIKE', + title: '찜 알림', + body: '누군가 회원님의 [데이터베이스] 과목을 찜했습니다!\n상대방이 버리는 과목을 확인해 볼까요?', + deepLink: null, + isRead: true, + createdAt: new Date(Date.now() - 12 * 60 * 1000).toISOString(), + }, + { + id: 4, + type: 'MATCH_ACCEPTED', + title: '매칭완료', + body: '매칭이 성사되었습니다!\n교환 채팅방으로 이동하여 시간을 조율해 주세요', + deepLink: null, + isRead: true, + createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), + }, + { + id: 5, + type: 'EXCHANGE_SCHEDULED', + title: '매칭 시간 확정', + body: '오후 2시 15분으로 교환 시간이 확정되었습니다.\n해당 시간에 카카오톡 오픈채팅방 링크가 열립니다.', + deepLink: null, + isRead: true, + createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), + }, +]; + +const TYPE_ICON_MAP = { + MATCH_PROPOSAL: { icon: matchIcon, bg: 'bg-blue-100' }, + MATCH_REQUESTED: { icon: matchIcon, bg: 'bg-blue-100' }, + MATCH_ACCEPTED: { icon: checkIcon, bg: 'bg-blue-100' }, + MATCH_REJECTED: { icon: cancelIcon, bg: 'bg-gray-100' }, + MATCH_TIMEOUT: { icon: cancelIcon, bg: 'bg-gray-100' }, + EXCHANGE_SCHEDULED: { icon: clockIcon, bg: 'bg-blue-100' }, + VERIFY_30MIN: { icon: clockIcon, bg: 'bg-blue-100' }, + VERIFY_10MIN: { icon: clockIcon, bg: 'bg-blue-100' }, + VERIFY_5MIN: { icon: clockIcon, bg: 'bg-blue-100' }, + SWAP_RESULT: { icon: checkIcon, bg: 'bg-blue-100' }, + CANCEL: { icon: cancelIcon, bg: 'bg-gray-100' }, + LIKE: { icon: likeIcon, bg: 'bg-pink-50' }, + PENALTY: { icon: systemIcon, bg: 'bg-gray-100' }, + SYSTEM: { icon: systemIcon, bg: 'bg-gray-100' }, +}; + +const TOAST_BY_TYPE = { + EXPIRED_POST: '존재하지 않거나 삭제된 게시글입니다.', + EXPIRED_MATCH: '만료된 매칭 제안입니다.', +}; + +const formatRelativeTime = (iso) => { + const diffMs = Date.now() - new Date(iso).getTime(); + const diffMin = Math.floor(diffMs / 60000); + if (diffMin < 1) return '방금 전'; + if (diffMin < 60) return `${diffMin}분 전`; + const diffHour = Math.floor(diffMin / 60); + if (diffHour < 24) return `${diffHour}시간 전`; + return `${Math.floor(diffHour / 24)}일 전`; +}; + +const getJson = async (url) => { + const res = await fetch(url, { credentials: 'include' }); + const data = await res.json().catch(() => null); + return { status: res.status, data }; +}; + +const patchJson = async (url) => { + const res = await fetch(url, { method: 'PATCH', credentials: 'include' }); + const data = await res.json().catch(() => null); + return { status: res.status, data }; +}; + +export default function AlertPage() { + const navigate = useNavigate(); + const [notifications, setNotifications] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [toastMessage, setToastMessage] = useState(''); + const [isToastVisible, setIsToastVisible] = useState(false); + + // 👇 점 세개(더보기) 눌렀을 때 뜨는 알림 권한 동의 모달 + const [isPermissionModalOpen, setIsPermissionModalOpen] = useState(false); + const [isSubscribing, setIsSubscribing] = useState(false); + + useEffect(() => { + fetchNotifications(); + }, []); + + const showToast = (message) => { + setToastMessage(message); + setIsToastVisible(true); + }; + + const fetchNotifications = async () => { + setIsLoading(true); + try { + if (USE_MOCK) { + await new Promise((r) => setTimeout(r, 300)); + setNotifications(MOCK_NOTIFICATIONS); + return; + } + const { data } = await getJson(`${API.LIST}?page=0&size=20`); + if (data?.success) { + setNotifications(data.data.notifications); + } + } finally { + setIsLoading(false); + } + }; + + const handleBack = () => navigate(-1); + + const handleNotificationClick = async (item) => { + if (!item.isRead) { + try { + await patchJson(API.READ_ONE(item.id)); + setNotifications((prev) => + prev.map((n) => (n.id === item.id ? { ...n, isRead: true } : n)), + ); + } catch { + // 읽음 처리 실패는 조용히 무시 + } + } + + if (!item.deepLink) return; + + try { + const res = await fetch(item.deepLink, { credentials: 'include' }); + if (res.status === 404) { + showToast(TOAST_BY_TYPE.EXPIRED_POST); + return; + } + if (res.status === 410) { + showToast(TOAST_BY_TYPE.EXPIRED_MATCH); + return; + } + navigate(item.deepLink); + } catch { + showToast(TOAST_BY_TYPE.EXPIRED_POST); + } + }; + + // 점 세개 클릭 -> 권한 동의 모달 오픈 + const handleOpenPermissionModal = () => { + setIsPermissionModalOpen(true); + }; + + // 모달에서 "동의" 클릭 -> 실제 권한 요청 + 구독 + const handleAgreePush = async () => { + setIsSubscribing(true); + try { + const result = await subscribeToPush(); + if (!result.success) { + showToast( + result.reason === 'denied' + ? '브라우저 알림 권한이 거부되었습니다.' + : '푸시 알림을 사용할 수 없는 환경입니다.', + ); + } else { + showToast('알림이 활성화되었습니다.'); + } + } finally { + setIsSubscribing(false); + setIsPermissionModalOpen(false); + } + }; + + // 👇 실제 푸시 서버 없이도 "알림 오는 거" 눈으로 확인하기 위한 mock 발송 버튼 + // 브라우저 알림 권한만 허용돼 있으면, 서버 없이 Service Worker의 showNotification을 + // 직접 호출해서 진짜 OS 알림창을 띄울 수 있습니다. + const handleSendMockPush = async () => { + if (Notification.permission !== 'granted') { + showToast('먼저 알림 권한을 허용해주세요.'); + setIsPermissionModalOpen(true); + return; + } + const registration = await navigator.serviceWorker.ready; + registration.showNotification('✨ 새로운 매칭 제안', { + body: '데이터베이스 의 1순위 과목을 찾았습니다!\n교환을 제안해보세요!', + icon: '/icons/icon-192.png', + badge: '/icons/badge-72.png', + data: { url: '/alert' }, + }); + }; + + return ( +
+
+
+ +
+ } + title={알림} + rightNode={ + + } + /> +
+ + {/* 개발 확인용 mock 발송 버튼 - 실제 배포 전엔 삭제하거나 조건부로 숨기세요 */} + {/* 우측 하단 테스트용 버튼 */} + + +
+ {isLoading && ( +
+ 불러오는 중... +
+ )} + {!isLoading && notifications.length === 0 && ( +
+ 새로운 알림이 없습니다. +
+ )} + + {notifications.map((item) => { + const { icon, bg } = TYPE_ICON_MAP[item.type] ?? TYPE_ICON_MAP.SYSTEM; + const [mainLine, subLine] = item.body.split('\n'); + + return ( + + ); + })} +
+ + {/* 알림 권한 동의 모달 */} + setIsPermissionModalOpen(false)} + title="알림을 받아보시겠어요?" + footer={ +
+ + +
+ } + > + 매칭 제안, 교환 요청, 시간 확정 등 중요한 소식을 +
+ 놓치지 않도록 알림을 보내드릴게요. +
+ + setIsToastVisible(false)} + icon={ICONS.CLOSE} + /> + + ); +} diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 0b1530e..2f75987 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import { createBrowserRouter } from 'react-router-dom'; // --- 1. 레이아웃 불러오기 --- @@ -20,6 +21,7 @@ import { TestLoading } from '../pages/TestLoading'; import LoginPage from '../pages/login/login'; import SignupPage from '../pages/signup'; import FindPWPage from '../pages/findPW'; +import AlertPage from '../pages/alert'; export const router = createBrowserRouter([ { @@ -45,6 +47,7 @@ export const router = createBrowserRouter([ { path: '/test-extra', element: }, { path: '/test-avatar', element: }, { path: '/test-loading', element: }, + { path: '/alert', element: }, ], }, { From 4c5f1f435cc698d6d5f355f6dee6bfa92df05c0c Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Wed, 15 Jul 2026 15:32:56 +0900 Subject: [PATCH 14/28] =?UTF-8?q?fix:=20=EC=BB=A4=EB=B0=8B=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/findPW.jsx | 1 + src/pages/signup.jsx | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/pages/findPW.jsx b/src/pages/findPW.jsx index 97a0183..379a659 100644 --- a/src/pages/findPW.jsx +++ b/src/pages/findPW.jsx @@ -1,3 +1,4 @@ +import React from 'react'; import { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import Button from '@/components/common/Button'; diff --git a/src/pages/signup.jsx b/src/pages/signup.jsx index 743b30c..b80b8fe 100644 --- a/src/pages/signup.jsx +++ b/src/pages/signup.jsx @@ -1,3 +1,4 @@ +import React from 'react'; import { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import Button from '@/components/common/Button'; @@ -212,11 +213,6 @@ export default function SignupPage() { } }; - const goToLogin = () => { - setShowCompleteModal(false); - navigate('/login'); - }; - const isSendDisabled = email.length === 0 || isSending || (isCodeSent && secondsLeft > 0); From eb94daf68c5b62fdc0b42fbac726c52f166c545f Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Wed, 15 Jul 2026 17:51:22 +0900 Subject: [PATCH 15/28] =?UTF-8?q?style:=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/findPW.jsx | 11 ++++++++--- src/pages/signup.jsx | 5 +++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/pages/findPW.jsx b/src/pages/findPW.jsx index 379a659..494def2 100644 --- a/src/pages/findPW.jsx +++ b/src/pages/findPW.jsx @@ -318,6 +318,7 @@ export default function FindPasswordPage() { disabled={!isCodeSent || secondsLeft === 0} isError={!!codeError} errorMessage={codeError} + className={isCodeSent ? '!border-brand-lightBlue' : ''} rightNode={ isCodeSent ? ( @@ -331,7 +332,7 @@ export default function FindPasswordPage() { {isCodeSent && !codeError && (

메일이 발송되었습니다

@@ -480,7 +481,11 @@ export default function FindPasswordPage() { setShowCompleteModal(false)} - title={
비밀번호가 변경되었습니다.
} + title={ +
+ 비밀번호가 변경되었습니다. +
+ } footer={ -
+
{isLoading && (
불러오는 중... @@ -308,7 +265,7 @@ export default function AlertPage() { type="button" onClick={() => handleNotificationClick(item)} className={`flex items-start gap-3 px-5 py-4 text-left border-b border-gray-100 transition-colors ${ - item.isRead ? 'bg-white' : 'bg-[#F1F7FB]' + item.isRead ? 'bg-[#fbfbfb]' : 'bg-[#F1F7FB]' }`} > - {/* 알림 권한 동의 모달 */} - setIsPermissionModalOpen(false)} - title="알림을 받아보시겠어요?" - footer={ -
- - -
- } - > - 매칭 제안, 교환 요청, 시간 확정 등 중요한 소식을 -
- 놓치지 않도록 알림을 보내드릴게요. -
- Date: Thu, 16 Jul 2026 16:15:03 +0900 Subject: [PATCH 19/28] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/push.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/api/push.js diff --git a/src/api/push.js b/src/api/push.js new file mode 100644 index 0000000..2e8bd4e --- /dev/null +++ b/src/api/push.js @@ -0,0 +1,83 @@ +// src/lib/push.js +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +const VAPID_PUBLIC_KEY = import.meta.env.VITE_VAPID_PUBLIC_KEY ?? ''; +// 👆 VAPID 공개키는 백엔드가 발급해줘야 해요. .env에 VITE_VAPID_PUBLIC_KEY=... 로 넣어두세요. + +const urlBase64ToUint8Array = (base64String) => { + const padding = '='.repeat((4 - (base64String.length % 4)) % 4); + const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); + const rawData = atob(base64); + return Uint8Array.from([...rawData].map((c) => c.charCodeAt(0))); +}; + +export const registerServiceWorker = async () => { + if (!('serviceWorker' in navigator)) { + console.warn('이 브라우저는 Service Worker를 지원하지 않습니다.'); + return null; + } + try { + const registration = await navigator.serviceWorker.register('/sw.js'); + return registration; + } catch (err) { + console.error('Service Worker 등록 실패:', err); + return null; + } +}; + +export const subscribeToPush = async () => { + if (!('Notification' in window)) { + return { success: false, reason: 'unsupported' }; + } + + const permission = await Notification.requestPermission(); + if (permission !== 'granted') { + return { success: false, reason: 'denied' }; + } + + const registration = + (await navigator.serviceWorker.getRegistration()) || + (await registerServiceWorker()); + if (!registration) return { success: false, reason: 'no-sw' }; + + const existing = await registration.pushManager.getSubscription(); + const subscription = + existing || + (await registration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC_KEY), + })); + + const subJson = subscription.toJSON(); + + // 서버에 구독 정보 등록 (API 문서의 "펌푸시 구독 등록" 엔드포인트) + const res = await fetch(`${API_BASE}/api/notifications/push-subscription`, { + method: 'POST', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + endpoint: subJson.endpoint, + p256dh: subJson.keys?.p256dh, + auth: subJson.keys?.auth, + }), + }); + + return { success: res.ok, subscription }; +}; + +export const unsubscribeFromPush = async () => { + const registration = await navigator.serviceWorker.getRegistration(); + const subscription = await registration?.pushManager.getSubscription(); + if (!subscription) return { success: true }; + + const endpoint = subscription.endpoint; + await subscription.unsubscribe(); + + const res = await fetch(`${API_BASE}/api/notifications/push-subscription`, { + method: 'DELETE', + credentials: 'include', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ endpoint }), + }); + + return { success: res.ok }; +}; From 07064add0d66fdc02abb3dd6a84c529c0b919304 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Sun, 19 Jul 2026 13:26:44 +0900 Subject: [PATCH 20/28] =?UTF-8?q?feat:=20=EA=B5=90=ED=99=98=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/icons/clock.svg | 4 + src/assets/icons/dispute.svg | 3 + src/assets/icons/send.svg | 3 + src/pages/EPR.tsx | 136 ++++ src/pages/chat/CRP.tsx | 1280 ++++++++++++++++++++++++++++++++++ src/pages/chat/SDP.tsx | 224 ++++++ src/pages/chat/TDP.tsx | 240 +++++++ src/pages/mockChat.ts | 29 + src/pages/mockExcn.ts | 100 +++ src/routes/router.tsx | 8 + 10 files changed, 2027 insertions(+) create mode 100644 src/assets/icons/clock.svg create mode 100644 src/assets/icons/dispute.svg create mode 100644 src/assets/icons/send.svg create mode 100644 src/pages/EPR.tsx create mode 100644 src/pages/chat/CRP.tsx create mode 100644 src/pages/chat/SDP.tsx create mode 100644 src/pages/chat/TDP.tsx create mode 100644 src/pages/mockChat.ts create mode 100644 src/pages/mockExcn.ts diff --git a/src/assets/icons/clock.svg b/src/assets/icons/clock.svg new file mode 100644 index 0000000..71e0310 --- /dev/null +++ b/src/assets/icons/clock.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/dispute.svg b/src/assets/icons/dispute.svg new file mode 100644 index 0000000..59c15df --- /dev/null +++ b/src/assets/icons/dispute.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/send.svg b/src/assets/icons/send.svg new file mode 100644 index 0000000..e3a6703 --- /dev/null +++ b/src/assets/icons/send.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/pages/EPR.tsx b/src/pages/EPR.tsx new file mode 100644 index 0000000..5137feb --- /dev/null +++ b/src/pages/EPR.tsx @@ -0,0 +1,136 @@ +import React, { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Header from '@/components/layout/Header'; +import { IconButton } from '@/components/common/IconButton'; +import { ICONS } from '@/constants/icons'; +import clockIcon from '@/assets/icons/clock.svg'; + +const HEADER_H = 80; + +interface ExchangeRoom { + id: number; + myCourseName: string; + counterpartCourseName: string; + remainingMinutes: number | null; // null이면 '미정' + isRead: boolean; +} + +const MOCK_ROOMS: ExchangeRoom[] = [ + { + id: 1, + myCourseName: '마케팅과 소비자이슈', + counterpartCourseName: '프로그래밍언어론', + remainingMinutes: 30, + isRead: false, + }, + { + id: 2, + myCourseName: '자바프로그래밍', + counterpartCourseName: '소비자 경제', + remainingMinutes: null, + isRead: false, + }, +]; + +const formatRemaining = (min: number | null) => { + if (min === null) return '미정'; + if (min < 60) return `${min}m`; + const h = Math.floor(min / 60); + const m = min % 60; + return m === 0 ? `${h}h` : `${h}h ${m}m`; +}; + +export default function ExchangeRoomListPage() { + const navigate = useNavigate(); + const [rooms, setRooms] = useState([]); + const [isLoading, setIsLoading] = useState(true); + + useEffect(() => { + fetchRooms(); + }, []); + + const fetchRooms = async () => { + setIsLoading(true); + try { + // TODO: 채팅방 목록 조회 API 붙이기 (지금은 mock) + await new Promise((r) => setTimeout(r, 200)); + setRooms(MOCK_ROOMS); + } finally { + setIsLoading(false); + } + }; + + const handleBack = () => navigate(-1); + const handleGoAlert = () => navigate('/alert'); + const handleRoomClick = (roomId: number) => navigate(`/chat/${roomId}`); + + return ( +
+
+
+ +
+ } + title={교환준비방} + rightNode={} + /> +
+ +
+ {isLoading && ( +
+ 불러오는 중... +
+ )} + {!isLoading && rooms.length === 0 && ( +
+ 교환 준비방이 없습니다. +
+ )} + + {rooms.map((room) => ( + + ))} +
+
+ ); +} diff --git a/src/pages/chat/CRP.tsx b/src/pages/chat/CRP.tsx new file mode 100644 index 0000000..a40a42f --- /dev/null +++ b/src/pages/chat/CRP.tsx @@ -0,0 +1,1280 @@ +// pages/chat/ChatRoomPage.tsx (crp.tsx) +import React, { useEffect, useRef, useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Icon } from '@iconify/react'; +import Header from '@/components/layout/Header'; +import { IconButton } from '@/components/common/IconButton'; +import { Input } from '@/components/common/Input'; +import Button from '@/components/common/Button'; +import { Modal } from '@/components/common/Modal'; +import { ICONS } from '@/constants/icons'; +import { useScheduledAt } from '../mockChat'; +import { mockExchangeStore, useExchangeState } from '../mockExcn'; +import sendIcon from '@/assets/icons/send.svg'; +import disputeIcon from '@/assets/icons/dispute.svg'; + +const HEADER_H = 80; +const CURRENT_USER_ID = 1; // TODO: 실제 로그인 유저 id로 교체 +const COUNTERPART_ID = 2; + +const VERIFY_WINDOW_SECONDS = 5 * 60; +const COUNTDOWN_START = 10; +const COUNTDOWN_RED_THRESHOLD = 3; + +interface ChatMessage { + id: number; + senderId: number; + content: string; + createdAt: string; +} + +const INITIAL_MESSAGES: ChatMessage[] = [ + { + id: 1, + senderId: CURRENT_USER_ID, + content: '내일 오전 4시에 교환해요', + createdAt: new Date().toISOString(), + }, + { + id: 2, + senderId: COUNTERPART_ID, + content: '좋아요', + createdAt: new Date().toISOString(), + }, +]; + +// TODO: 실제 room 상세 API로 대체 (내 과목명 / 상대 과목명) +const MOCK_ROOM_COURSES: Record = { + '1': { my: '마케팅과 소비자 이슈', counterpart: '프로그래밍언어론' }, + '2': { my: '자바프로그래밍', counterpart: '소비자 경제' }, +}; + +const formatTime = (iso: string) => + new Date(iso).toLocaleTimeString('ko-KR', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }); + +const formatScheduledDate = (iso: string) => { + const d = new Date(iso); + const days = ['일', '월', '화', '수', '목', '금', '토']; + return `${d.getMonth() + 1}월 ${d.getDate()}일 (${days[d.getDay()]})`; +}; + +// 채팅방 내부에서 전환되는 화면 단계 +// CHAT: 평소 채팅 화면 +// GUIDE: 캡쳐 인증 방법 안내 화면 +// VERIFY: 5분 전 강의 보유 인증 (이미지1) +// COUNTDOWN: 카운트다운 + 성공/실패 선택 (이미지2, 전체 오버레이) +// DISPUTE: 분쟁 조정(사후 인증) (이미지3) +// +// ⚠️ 위 단계들은 "페이지 전환"이 아니라 채팅방이라는 하나의 화면 위에 +// 카드 형태로 얹히는 콘텐츠일 뿐이다. 따라서 헤더/푸터는 flowStep과 +// 무관하게 항상 기본으로 노출되어야 한다. (COUNTDOWN도 예외 아님 - +// 다만 카운트다운 중에는 Modal 오버레이가 위에 뜨면서 헤더/푸터는 +// "보이기만" 하고 기능은 동작하지 않아도 된다.) +type FlowStep = 'CHAT' | 'GUIDE' | 'VERIFY' | 'COUNTDOWN' | 'DISPUTE'; +type VerifySubStep = + | 'INTRO' + | 'CAPTURING' + | 'WAITING_COUNTERPART' + | 'CONFIRM_COUNTERPART' + | 'READY'; +type CountdownPhase = 'COUNTING' | 'RESULT_SELECT'; +// DISPUTE 화면 내부 단계 - CAPTURE: 인증 시작 카드, SUBMITTED: 인증 제출 완료 카드 +type DisputeSubStep = 'CAPTURE' | 'SUBMITTED'; + +const GUIDE_STEPS = [ + { + title: '1. 수강신청 내역 페이지를 열어주세요.', + desc: '학교 수강신청 시스템에서 현재 신청한 강의 목록이 보이는 화면을 준비해주세요.', + caption: '실제 수강신청 페이지 예시 · 강의 목록이 표시된 상태', + }, + { + title: '2. 인증 QR 코드가 보이도록 화면을 배치해주세요.', + desc: '수강신청 내역과 인증 QR 코드가 한 화면에 함께 보이도록 창 크기를 조정해주세요.', + caption: '왼쪽: 학교 수강신청 페이지 · 오른쪽: 서비스의 인증 QR 코드', + }, + { + title: '3. [인증 시작] 버튼을 눌러주세요.', + desc: '버튼을 누르면 화면 공유 창이 나타납니다.', + caption: '"인증 시작" 버튼이 강조된 화면', + }, + { + title: '4. 전체 화면을 선택해주세요.', + desc: '화면 공유 창에서 "전체 화면"을 선택한 후 [공유] 버튼을 눌러주세요.', + caption: '브라우저의 화면 공유 선택 창 · "전체 화면" 선택 부분 강조 표시', + }, + { + title: '5. 자동 인증이 진행됩니다.', + desc: '공유가 시작되면 시스템이 현재 화면을 자동으로 촬영하여 인증을 진행합니다.\n※ 촬영 후 화면 공유는 자동으로 종료됩니다.', + caption: '"인증 진행 중..." 로딩 화면', + }, + { + title: '6. 촬영된 이미지를 확인해주세요.', + desc: '촬영된 이미지에서 교환하려는 강의가 정상적으로 보이는지 확인해주세요.', + caption: '실제 촬영된 결과 예시 · 강의 목록과 QR 코드가 함께 보이는 화면', + }, + { + title: '7. 인증 완료', + desc: '인증이 완료되면 다음 단계로 이동할 수 있습니다.', + caption: '"인증이 완료되었습니다" 완료 화면 · "카운트다운 시작" 버튼', + }, +]; + +export default function ChatRoomPage() { + const navigate = useNavigate(); + const { roomId = '' } = useParams(); + const scheduledAt = useScheduledAt(roomId); + const exchange = useExchangeState(roomId); + + const myCourseName = MOCK_ROOM_COURSES[roomId]?.my ?? '알 수 없음'; + const counterpartCourseName = + MOCK_ROOM_COURSES[roomId]?.counterpart ?? '알 수 없음'; + + const [messages, setMessages] = useState( + scheduledAt ? INITIAL_MESSAGES : [], + ); + const [inputValue, setInputValue] = useState(''); + const [isMenuOpen, setIsMenuOpen] = useState(false); + const scrollRef = useRef(null); + const isComposingRef = useRef(false); + + // 💡 왼쪽(상대)/오른쪽(나) 채팅을 둘 다 테스트할 수 있도록 하는 개발용 토글 + const [senderRole, setSenderRole] = useState<'ME' | 'OTHER'>('ME'); + + // ===== 화면 전환 state ===== + const [flowStep, setFlowStep] = useState('CHAT'); + + // 카드(GUIDE/VERIFY/DISPUTE)가 대화 타임라인의 어느 시점에 끼어들었는지 기록. + // 이 인덱스 "이전" 메시지들만 접혀서 "이전 채팅 보기" 안에 들어가고, + // 이 인덱스 "이후"에 보낸 새 메시지는 카드 아래에 항상 펼쳐진 채로 보인다. + const [cardInsertIndex, setCardInsertIndex] = useState(0); + + // "교환 시간 확정" 카드가 대화 타임라인의 어느 시점에 끼어들었는지 기록. + // 이 인덱스 이전 메시지 -> 확정 카드 -> 이후에 보낸 새 메시지 순으로 CHAT 화면에 렌더링한다. + const [scheduleInsertIndex, setScheduleInsertIndex] = useState(() => + scheduledAt ? INITIAL_MESSAGES.length : 0, + ); + const prevScheduledAtRef = useRef(scheduledAt); + + // ----- 이전 채팅 보기 토글 (GUIDE / VERIFY / DISPUTE 화면 공통) ----- + const [showPreviousChat, setShowPreviousChat] = useState(false); + + // ----- VERIFY 관련 state ----- + const [verifyStep, setVerifyStep] = useState('INTRO'); + const [verifySecondsLeft, setVerifySecondsLeft] = useState( + VERIFY_WINDOW_SECONDS, + ); + const [isCaptureFailModalOpen, setIsCaptureFailModalOpen] = useState(false); + const [isCounterpartConfirmedChecked, setIsCounterpartConfirmedChecked] = + useState(false); + const [mockCaptureSucceeds, setMockCaptureSucceeds] = useState(true); // 💡 개발용 + + // ----- COUNTDOWN 관련 state ----- + const [countdownPhase, setCountdownPhase] = + useState('COUNTING'); + const [countdownSecondsLeft, setCountdownSecondsLeft] = + useState(COUNTDOWN_START); + + // ----- DISPUTE 관련 state ----- + const [isDisputeSubmitting, setIsDisputeSubmitting] = useState(false); + const [disputeStep, setDisputeStep] = useState('CAPTURE'); + + // 교환 시간이 방금 확정된 시점(false -> true 전환)의 메시지 개수를 기록해 + // "확정 카드" 위/아래로 메시지를 나눠 보여줄 수 있게 한다. + useEffect(() => { + if (!prevScheduledAtRef.current && scheduledAt) { + setScheduleInsertIndex(messages.length); + } + prevScheduledAtRef.current = scheduledAt; + }, [scheduledAt]); + + // 새 카드/메시지가 생기면 맨 아래로 자동 스크롤한다. + // 단, GUIDE(강의 보유 인증 안내)로 "막 진입"한 순간에는 안내문을 위에서부터 + // 볼 수 있도록 예외적으로 맨 위로 스크롤한다. + const prevFlowStepRef = useRef(flowStep); + useEffect(() => { + const justEnteredGuide = + flowStep === 'GUIDE' && prevFlowStepRef.current !== 'GUIDE'; + if (justEnteredGuide) { + scrollRef.current?.scrollTo({ top: 0 }); + } else { + scrollRef.current?.scrollTo({ top: scrollRef.current?.scrollHeight }); + } + prevFlowStepRef.current = flowStep; + }, [ + messages, + scheduledAt, + flowStep, + verifyStep, + disputeStep, + countdownPhase, + cardInsertIndex, + showPreviousChat, + scheduleInsertIndex, + ]); + + const handleBack = () => { + // VERIFY/GUIDE/COUNTDOWN/DISPUTE 등 어떤 화면이든 뒤로가기는 + // 항상 채팅방을 나가서 목록 화면으로 이동 + navigate(-1); + }; + + const handleSend = () => { + const content = inputValue.trim(); + if (!content) return; + setMessages((prev) => [ + ...prev, + { + id: Date.now(), + senderId: senderRole === 'ME' ? CURRENT_USER_ID : COUNTERPART_ID, + content, + createdAt: new Date().toISOString(), + }, + ]); + setInputValue(''); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !isComposingRef.current && e.keyCode !== 229) { + handleSend(); + } + }; + + const handleCloseGuide = () => { + setFlowStep('CHAT'); + }; + + const handleGoSchedule = () => { + setIsMenuOpen(false); + navigate(`/chat/${roomId}/schedule`); + }; + + const handleTerminateDeal = () => { + setIsMenuOpen(false); + navigate(`/chat/${roomId}/terminate`); + }; + + const handleReport = () => { + setIsMenuOpen(false); + // TODO: 신고하기 - 다음 단계에서 구현 + }; + + // 메시지 리스트 렌더링 (카드 삽입 전/후 구간을 나눠서 재사용) + const renderMessages = (msgs: ChatMessage[] = messages) => + msgs.map((msg) => { + const isMine = msg.senderId === CURRENT_USER_ID; + const timeNode = ( + + {formatTime(msg.createdAt)} + + ); + return ( +
+ {isMine && timeNode} +
+ {msg.content} +
+ {!isMine && timeNode} +
+ ); + }); + + // 교환 시간 확정 노란 박스 (CHAT 화면 + VERIFY/DISPUTE의 "이전 채팅 보기"에서 재사용) + const renderScheduledBox = () => + scheduledAt && ( +
+
+ + + +
+

+ 교환 시간 확정 +

+

+ 날짜 : {formatScheduledDate(scheduledAt)} +

+

+ 시간 : {formatTime(scheduledAt)} +

+
+
+ +
    + {[ + '교환 5분 전 강의 보유 인증이 진행됩니다', + 'PC에서 수강신청(내역) 페이지를 미리 열어주세요', + '모바일 인증은 지원되지 않습니다', + ].map((text) => ( +
  • + + {text} +
  • + ))} +
+ + +
+ ); + + // VERIFY/DISPUTE의 "이전 채팅 보기"에서 쓰는 히스토리 렌더링. + // 단순히 메시지 다 보여주고 확정 카드를 맨 뒤에 붙이는 게 아니라, + // 확정 카드가 실제로 끼어든 시점(scheduleInsertIndex)을 기준으로 + // 메시지 사이 정확한 위치에 카드를 끼워 넣는다. + const renderPreviousChatHistory = (uptoIndex: number) => { + const boxIndex = Math.min(scheduleInsertIndex, uptoIndex); + return ( + <> + {renderMessages(messages.slice(0, boxIndex))} + {boxIndex === scheduleInsertIndex && renderScheduledBox()} + {renderMessages(messages.slice(boxIndex, uptoIndex))} + + ); + }; + + // ============ GUIDE 로직 (캡쳐 인증 방법 안내) ============ + const handleShowGuide = () => { + setCardInsertIndex(messages.length); + setShowPreviousChat(false); + setFlowStep('GUIDE'); + }; + + // ============ VERIFY 로직 (이미지1) ============ + const handleEnterVerify = () => { + setCardInsertIndex(messages.length); + setShowPreviousChat(false); + setFlowStep('VERIFY'); + setVerifyStep('INTRO'); + setVerifySecondsLeft(VERIFY_WINDOW_SECONDS); + mockExchangeStore.generateQrToken(roomId); + mockExchangeStore.setStatus(roomId, 'VERIFYING'); + }; + + useEffect(() => { + if (flowStep !== 'VERIFY' || verifyStep !== 'INTRO') return; + const timer = setInterval( + () => setVerifySecondsLeft((prev) => (prev > 0 ? prev - 1 : 0)), + 1000, + ); + return () => clearInterval(timer); + }, [flowStep, verifyStep]); + + useEffect(() => { + if (flowStep !== 'VERIFY') return; + if (exchange.myVerified && exchange.counterpartVerified) { + if (verifyStep === 'WAITING_COUNTERPART') + setVerifyStep('CONFIRM_COUNTERPART'); + } else if (exchange.myVerified) { + if (verifyStep === 'INTRO' || verifyStep === 'CAPTURING') + setVerifyStep('WAITING_COUNTERPART'); + } + }, [flowStep, exchange.myVerified, exchange.counterpartVerified, verifyStep]); + + const formatVerifyTimer = (sec: number) => { + const m = Math.floor(sec / 60); + const s = sec % 60; + return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`; + }; + + // 💡 실제 화면 캡처 로직 - 백엔드 업로드 API 붙으면 아래 주석 블록 해제 + const startRealCapture = async (): Promise => { + /* + const stream = await navigator.mediaDevices.getDisplayMedia({ video: true }); + const video = document.createElement('video'); + video.srcObject = stream; + await video.play(); + await new Promise((resolve) => setTimeout(resolve, 1000)); + const canvas = document.createElement('canvas'); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + canvas.getContext('2d')?.drawImage(video, 0, 0); + const blob: Blob | null = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png')); + stream.getTracks().forEach((track) => track.stop()); + if (!blob) return false; + + const formData = new FormData(); + formData.append('image', blob); + const res = await fetch(`${API_BASE}/api/exchange/${roomId}/verify-capture`, { + method: 'POST', + body: formData, + credentials: 'include', + }); + const data = await res.json(); + return Boolean(data?.data?.qrValid); + */ + return mockCaptureSucceeds; + }; + + const handleStartCapture = async () => { + setVerifyStep('CAPTURING'); + await new Promise((r) => setTimeout(r, 1200)); + const ok = await startRealCapture(); + if (!ok) { + setIsCaptureFailModalOpen(true); + setVerifyStep('INTRO'); + return; + } + mockExchangeStore.setMyVerified(roomId, true); + }; + + const handleConfirmCounterpart = () => { + mockExchangeStore.setStatus(roomId, 'READY'); + setVerifyStep('READY'); + }; + + const handleToggleCounterpartVerified = () => { + mockExchangeStore.setCounterpartVerified( + roomId, + !exchange.counterpartVerified, + ); + }; + + // ============ COUNTDOWN 로직 (이미지2) ============ + const handleEnterCountdown = () => { + setFlowStep('COUNTDOWN'); + setCountdownPhase('COUNTING'); + setCountdownSecondsLeft(COUNTDOWN_START); + mockExchangeStore.setStatus(roomId, 'COUNTDOWN'); + }; + + useEffect(() => { + if (flowStep !== 'COUNTDOWN' || countdownPhase !== 'COUNTING') return; + if (countdownSecondsLeft <= 0) { + setCountdownPhase('RESULT_SELECT'); + mockExchangeStore.setStatus(roomId, 'RESULT_SELECT'); + return; + } + const timer = setTimeout( + () => setCountdownSecondsLeft((prev) => prev - 1), + 1000, + ); + return () => clearTimeout(timer); + }, [flowStep, countdownPhase, countdownSecondsLeft, roomId]); + + const handleExchangeResult = (result: 'SUCCESS' | 'FAIL') => { + // TODO: 실제로는 5번 API(교환 결과 선택) 호출 { result } + if (result === 'SUCCESS') { + mockExchangeStore.setStatus(roomId, 'COMPLETED'); + setFlowStep('CHAT'); + } else { + mockExchangeStore.setStatus(roomId, 'DISPUTE'); + setCardInsertIndex(messages.length); + setShowPreviousChat(false); + setFlowStep('DISPUTE'); + } + }; + + // ============ DISPUTE 로직 (이미지3) ============ + const handleEnterDispute = () => { + setCardInsertIndex(messages.length); + setShowPreviousChat(false); + setFlowStep('DISPUTE'); + setDisputeStep('CAPTURE'); + }; + + const handleStartDisputeCapture = async () => { + setIsDisputeSubmitting(true); + // TODO: 실제로는 getDisplayMedia 캡처 + 1번 API(캡처 업로드-QR 검증) 호출 + await new Promise((r) => setTimeout(r, 1000)); + mockExchangeStore.setMyDisputeVerified(roomId, true); + setIsDisputeSubmitting(false); + setDisputeStep('SUBMITTED'); + }; + + const handleConfirmDisputeSubmitted = () => { + mockExchangeStore.setStatus(roomId, 'DISPUTE_SUBMITTED'); + setFlowStep('CHAT'); + }; + + return ( +
+ {/* ============ 헤더 (모든 flowStep 공통 디폴트) ============ */} +
+
+ +
+ + {myCourseName} + + + ↔ {counterpartCourseName} + +
+
+ } + rightNode={ + setIsMenuOpen((prev) => !prev)} + className="!opacity-60" + /> + } + /> +
+ + {/* 햄버거 드롭다운 메뉴 - 평소 채팅 화면에서만 노출 */} + {isMenuOpen && flowStep === 'CHAT' && ( + <> +
setIsMenuOpen(false)} + /> +
+ + + +
+ + )} + + {/* ============ CHAT 화면 ============ */} + {flowStep === 'CHAT' && ( +
+

+ {myCourseName.replace(' ', '')} 교환 준비방이 생성되었습니다 +

+ + {!scheduledAt && ( +
+

+ 강의를 교환할 시간을 정해 +
+ 교환 시간 결정 버튼을 눌러 확정해주세요 +

+

+ 다른 학우들이 수강 정정을 +
+ 활발히 하지 않는 새벽 시간대를 추천해요. +

+ +
+ )} + + {renderMessages(messages.slice(0, scheduleInsertIndex))} + + {renderScheduledBox()} + + {renderMessages(messages.slice(scheduleInsertIndex))} + + {/* 개발용: 발신자 전환 + 단계 바로가기 - 실배포 전 삭제 */} +
+ + + + + +
+
+ )} + + {/* ============ GUIDE 화면 (캡쳐 인증 방법 안내) ============ */} + {/* 인증 안내 카드는 처음 보는 안내문이므로 이전 채팅을 숨기지 않고 그냥 노출하지 않는다 (요청: 이전 채팅 안 보이게) */} + {flowStep === 'GUIDE' && ( +
+
+

+ 강의 보유 인증 안내 +

+

+ 안전한 강의 교환을 위해 본인이 실제로 해당 강의를 보유하고 있는지 + 확인하는 절차를 진행합니다. +

+

+ 인증은 교환 예정 시간 5분 전부터 가능합니다. +

+

+ 인증 시작 후 5분 이내에 절차를 완료하지 않으면 거래가 자동 + 취소되며 페널티가 부여될 수 있습니다. 교환 시간을 반드시 준수해 + 주세요. +

+
+ +
+ +
+

인증 방법

+ + {GUIDE_STEPS.map((step, i) => ( +
+

+ {step.title} +

+

+ {step.desc} +

+ + {i === 5 ? ( +
+
+ +
+ +
+ + +
+
+ ) : ( +
+ +
+ )} + + + {step.caption} + +
+ ))} +
+ + + + {/* 인증 안내가 뜬 이후에 보낸 새 메시지 - 카드 아래에 계속 이어짐 */} + {messages.slice(cardInsertIndex).length > 0 && ( +
+ {renderMessages(messages.slice(cardInsertIndex))} +
+ )} +
+ )} + + {/* ============ VERIFY 화면 (이미지1) ============ */} + {flowStep === 'VERIFY' && ( + <> +
+ + +
+ +
+ {!showPreviousChat && ( + + )} + {showPreviousChat && ( + <> +
+ {renderPreviousChatHistory(cardInsertIndex)} +
+ + + )} + + {(verifyStep === 'INTRO' || verifyStep === 'CAPTURING') && ( +
+
+ + + +

+ 교환 5분 전! 강의 보유 인증 시작 +

+
+

+ 안전한 교환을 위해 현재 해당 강의를 보유하고 있는지 + 확인합니다. 5분 이내에 진행해주세요. +

+ +
+ +
    + {[ + 'PC에 수강신청(내역) 페이지를 띄워주세요.', + '[인증 시작] 버튼을 누른 후 화면 공유를 허용해주세요.', + '수강신청(내역) 페이지와 아래 QR 코드가 함께 보이도록 전체 화면을 공유해주세요.', + ].map((text) => ( +
  • + + {text} +
  • + ))} +
+ +

+ ※ 수강신청(내역) 페이지와 QR 코드가 동시에 확인되어야 인증이 + 완료됩니다. +

+ + {exchange.qrToken && ( +
+
+ +
+
+ )} + + +
+ )} + + {verifyStep === 'WAITING_COUNTERPART' && ( +
+ +

+ QR 코드 인증이 완료되었습니다. +

+

+ 상대방의 인증을 기다리고 있어요. +

+
+ )} + + {verifyStep === 'CONFIRM_COUNTERPART' && ( +
+
+ + + +

+ 교환 대상 강의 확인 +

+
+ +
+ + 상대방의 공유 화면 +
+ +

+ QR 코드 인증이 완료되었습니다. +
+ 상대방이 보유한 강의 정보를 확인해주세요. +

+

+ 교환을 진행할 준비가 되었다면 아래 버튼을 눌러주세요. +

+ + + + +
+ )} + + {verifyStep === 'READY' && ( +
+
+ + + +

+ 교환 준비 완료 +

+
+ +

+ 양측이 모두 [카운트다운 시작] 버튼을 누르면 +
+ 10초 후 강의 교환이 시작됩니다 +

+

+ 카운트다운이 종료되면 현재 강의를 버리고 +
+ 상대방의 강의를 신청해 주세요! +

+

+ ※ 카운트다운이 시작되면 취소할 수 없습니다 +

+ + + + +
+ )} + + {/* 5분 전 인증이 뜬 이후에 보낸 새 메시지 - 카드 아래에 계속 이어짐 */} + {messages.slice(cardInsertIndex).length > 0 && ( +
+ {renderMessages(messages.slice(cardInsertIndex))} +
+ )} +
+ + setIsCaptureFailModalOpen(false)} + icon={ + + + + } + title="인증에 실패했습니다" + footer={ + + } + > + {'\n'}인증 QR 코드를 확인할 수 없습니다.{'\n\n'} + 수강신청(내역) 페이지와 인증 QR 코드가{'\n'}한 화면에 모두 보이도록 + 한 뒤{'\n'} + 다시 인증을 진행해주세요. + + + )} + + {/* ============ DISPUTE 화면 (이미지3) ============ */} + {flowStep === 'DISPUTE' && ( +
+ {!showPreviousChat && ( + + )} + {showPreviousChat && ( + <> +
+ {renderPreviousChatHistory(cardInsertIndex)} +
+ + + )} + + {/* ---- 1단계: 인증 시작 카드 ---- */} + {disputeStep === 'CAPTURE' && ( +
+
+ + + +

+ 교환 실패로 인한 분쟁 조정 진행 +

+
+ +

+ 교환 실패로 인해 분쟁 조정 절차가 시작되었습니다. 양측 모두 수강 + 취소 여부를 확인하기 위해 수강 취소 내역 인증을 진행합니다. +

+ +
+ +
    + {[ + 'PC에 수강신청(내역) 페이지를 띄워주세요.', + '[인증 시작] 버튼을 누른 후 화면 공유를 허용해주세요.', + '수강신청(내역) 페이지와 아래 QR 코드가 함께 보이도록 전체 화면을 공유해주세요.', + ].map((text) => ( +
  • + + {text} +
  • + ))} +
+ +

+ ※ 수강신청(내역) 페이지와 QR 코드가 동시에 확인되어야 인증이 + 완료됩니다. +
※ 5분 이내에 인증을 완료하지 않을 경우 거래 결과 판정에 + 불이익이 발생할 수 있습니다 +

+ +
+
+ +
+
+ + +
+ )} + + {/* ---- 2단계: 인증 제출 완료 카드 (모달 아님, 인라인) ---- */} + {disputeStep === 'SUBMITTED' && ( +
+
+ + + +

+ 인증 제출 완료 +

+
+ +

+ 분쟁 조정 결과는 양측의 인증을 관리자가 확인한 후 알림을 통해 + 확인할 수 있습니다. +

+ +
+ +
    + {[ + '양측 모두 정상적으로 수강 취소를 진행한 것으로 확인될 경우, 해당 거래는 사기가 아닌 교환 실패로 처리됩니다.', + '수강신청 결과는 학교 시스템 및 제3자의 신청 상황에 따라 달라질 수 있으며, 이로 인해 발생한 교환 실패에 대해서는 결과를 보장할 수 없습니다.', + '교환 실패로 판정된 경우 양측 모두 페널티 없이 거래가 종료됩니다.', + ].map((text) => ( +
  • + + {text} +
  • + ))} +
+ + +
+ )} + + {/* 분쟁 조정이 뜬 이후에 보낸 새 메시지 - 카드 아래에 계속 이어짐 */} + {messages.slice(cardInsertIndex).length > 0 && ( +
+ {renderMessages(messages.slice(cardInsertIndex))} +
+ )} +
+ )} + + {/* ============ COUNTDOWN 배경 (헤더/푸터 사이 flex-1을 채워 레이아웃 유지) ============ */} + {/* 이 컨테이너가 없으면 헤더-푸터 사이가 비어 푸터가 헤더 바로 아래로 붙어버린다. */} + {flowStep === 'COUNTDOWN' && ( +
+ {renderPreviousChatHistory(messages.length)} +
+ )} + + {/* ============ COUNTDOWN 오버레이 (이미지2) - Modal 컴포넌트 재사용 ============ */} + {/* Modal은 헤더/푸터 위에 오버레이로 뜨므로, 아래 기본 헤더/푸터는 "보이기만" 하고 + 이 동안은 기능(전송 등)이 굳이 동작하지 않아도 된다. */} + {flowStep === 'COUNTDOWN' && countdownPhase === 'COUNTING' && ( + +
+

+ {countdownSecondsLeft}초 +

+

+ 상대방도 준비를 완료했습니다. +
+ 강의를 버리고 잡을 준비를 해주세요. +

+
+
+ )} + + {flowStep === 'COUNTDOWN' && countdownPhase === 'RESULT_SELECT' && ( + 지금 교환하세요} + footer={ +
+ + +
+ } + > +
+
+

1. 현재 강의를 취소하세요.

+

2. 상대방의 강의를 신청하세요.

+
+

+ 강의 신청이 완료되면 +
+ 결과에 따라 아래 버튼을 선택해주세요. +

+
+
+ )} + + {/* ============ 푸터 (모든 flowStep 공통 디폴트) ============ */} + {/* 헤더와 동일하게 flowStep과 무관하게 항상 렌더링된다. + COUNTDOWN 단계에서는 위에 Modal 오버레이가 덮이므로 "보이기만" 하는 상태가 된다. */} +
+ setInputValue(e.target.value)} + onCompositionStart={() => (isComposingRef.current = true)} + onCompositionEnd={() => (isComposingRef.current = false)} + onKeyDown={handleKeyDown} + rightNode={ + + } + /> +
+
+ ); +} diff --git a/src/pages/chat/SDP.tsx b/src/pages/chat/SDP.tsx new file mode 100644 index 0000000..db9f5e1 --- /dev/null +++ b/src/pages/chat/SDP.tsx @@ -0,0 +1,224 @@ +// pages/chat/ScheduleDecisionPage.tsx +import React, { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Icon } from '@iconify/react'; +import Header from '@/components/layout/Header'; +import { IconButton } from '@/components/common/IconButton'; +import Button from '@/components/common/Button'; +import { Modal } from '@/components/common/Modal'; +import { ICONS } from '@/constants/icons'; +import { mockScheduleStore } from '../mockChat'; + +const HEADER_H = 80; + +// TODO: 실제로는 수강신청 가능 날짜/시간 범위 API로 대체 +const DATE_OPTIONS = [ + '2026년 6월 05일 화요일', + '2026년 6월 06일 수요일', + '2026년 6월 07일 목요일', +]; +const TIME_OPTIONS = ['오전 4:00', '오전 4:30', '오전 5:00', '오전 5:30']; + +export default function ScheduleDecisionPage() { + const navigate = useNavigate(); + const { roomId = '' } = useParams(); + + const [date, setDate] = useState(DATE_OPTIONS[0]); + const [time, setTime] = useState(TIME_OPTIONS[0]); + const [isErrorModalOpen, setIsErrorModalOpen] = useState(false); + + // 💡 인증 API 연동 전 임시 토글. 실제 API 붙으면 이 state + 우측 상단 버튼은 삭제. + const [isMockVerified, setIsMockVerified] = useState(true); + + const handleBack = () => navigate(-1); + + const parseToIso = () => { + const [, y, m, d] = date.match(/(\d+)년 (\d+)월 (\d+)일/) ?? []; + const isPM = time.includes('오후'); + const [, hRaw, min] = time.match(/(\d+):(\d+)/) ?? []; + let hour = Number(hRaw ?? 0); + if (isPM && hour !== 12) hour += 12; + if (!isPM && hour === 12) hour = 0; + return new Date( + Number(y), + Number(m) - 1, + Number(d), + hour, + Number(min ?? 0), + ).toISOString(); + }; + + const handleRegister = () => { + if (!isMockVerified) { + setIsErrorModalOpen(true); + return; + } + // TODO: 실제로는 POST 교환 시간 확정 API 호출 (scheduledAt 전송) + mockScheduleStore.set(roomId, parseToIso()); + navigate(-1); + }; + + return ( +
+ {/* 개발용 인증 성공/실패 토글 - 실배포 전 삭제 */} + + +
+
+ +
+ } + title={교환시간 결정} + rightNode={ +
+ +
+ } + /> +
+ +
+ {/* 날짜/시간 블럭 */} +
+ + + +
+ +
+
+

+ 교환 시간 안내 +

+

+ 교환 시간은 양측이 동시에 강의를 취소하고 신청하는 시점입니다. + 원활한 교환을 위해 상대방과 충분히 협의한 후 시간을 결정해 주세요. +

+
+ +
+

유의사항

+
    + {[ + '교환 시간은 수강신청이 가능한 시간대로 설정해 주세요.', + '교환 30분 전, 10분 전에 알림이 발송되며, 교환 5분 전부터 강의 보유 인증이 시작됩니다.', + '인증을 완료하지 않거나 교환 시간에 참여하지 않을 경우 거래가 취소될 수 있으며 페널티가 부여될 수 있습니다.', + '강의 취소 및 수강신청 결과는 학교 시스템 상황에 따라 달라질 수 있습니다.', + ].map((text) => ( +
  • + + {text} +
  • + ))} +
+
+ +
    +
  • + • 상대방과 협의하여 결정한 시간입니다. +
  • +
  • + • 선택한 교환 시간을 확인했으며, 해당 시간에 참여할 수 있습니다. +
  • +
+
+
+ +
+ +
+ + setIsErrorModalOpen(false)} + icon={ + + + + } + title="인증에 실패했습니다" + footer={ + + } + > + {'\n'}인증 QR 코드를 확인할 수 없습니다.{'\n\n'} + 수강신청(내역) 페이지와 인증 QR 코드가{'\n'}한 화면에 모두 보이도록 한 + 뒤{'\n'} + 다시 인증을 진행해주세요. + +
+ ); +} diff --git a/src/pages/chat/TDP.tsx b/src/pages/chat/TDP.tsx new file mode 100644 index 0000000..0131bf5 --- /dev/null +++ b/src/pages/chat/TDP.tsx @@ -0,0 +1,240 @@ +// pages/chat/TerminateDealPage.tsx +import React, { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { Icon } from '@iconify/react'; +import Header from '@/components/layout/Header'; +import { IconButton } from '@/components/common/IconButton'; +import Button from '@/components/common/Button'; +import { Input } from '@/components/common/Input'; +import { Modal } from '@/components/common/Modal'; +import { ICONS } from '@/constants/icons'; + +const HEADER_H = 80; + +interface ReasonGroup { + key: string; + label: string; + subReasons?: string[]; + freeText?: boolean; + blocked?: boolean; +} + +const REASON_GROUPS: ReasonGroup[] = [ + { + key: 'MUTUAL', + label: '상호 합의로 거래 취소', + subReasons: ['시간 조율 실패', '서로 다른 과목으로 진행하기로 함'], + }, + { + key: 'FRAUD', + label: '인증 정보가 의심됨', + subReasons: ['보유 과목 인증 사진이 의심됨', '다른 과목 사진 제출'], + }, + { + key: 'ABUSE', + label: '상대방이 거래를 진행하지 않음', + subReasons: ['과목을 버리지 않음', '거래를 일방적으로 중단함'], + }, + { key: 'NO_RESPONSE', label: '상대방과 연락이 원활하지 않음', blocked: true }, + { key: 'OTHER', label: '기타', freeText: true }, +]; + +export default function TerminateDealPage() { + const navigate = useNavigate(); + const { roomId = '' } = useParams(); + + const [openKey, setOpenKey] = useState(null); + const [selectedGroupKey, setSelectedGroupKey] = useState(null); + const [selectedSubReason, setSelectedSubReason] = useState( + null, + ); + const [otherDetail, setOtherDetail] = useState(''); + const [isBlockedModalOpen, setIsBlockedModalOpen] = useState(false); + + const handleBack = () => navigate(-1); + + const handleToggleGroup = (group: ReasonGroup) => { + if (group.blocked) { + setIsBlockedModalOpen(true); + return; + } + setOpenKey((prev) => (prev === group.key ? null : group.key)); + setSelectedGroupKey(group.key); + setSelectedSubReason(null); + }; + + const handleSelectSubReason = (groupKey: string, sub: string) => { + setSelectedGroupKey(groupKey); + setSelectedSubReason(sub); + }; + + const canSubmit = + selectedGroupKey !== null && + (selectedGroupKey === 'OTHER' + ? otherDetail.trim().length > 0 + : selectedSubReason !== null); + + const handleSubmit = () => { + if (!canSubmit) return; + // TODO: 실제로는 2번 API(거래 파기) 호출 + // reason: selectedGroupKey를 서버 enum(MUTUAL|FRAUD|MONEY_DEMAND|ABUSE|OTHER)에 맞게 매핑 + // detail: selectedGroupKey === 'OTHER' ? otherDetail : selectedSubReason + navigate(`/chat/${roomId}`); + }; + + return ( +
+
+
+ +
+ } + title={거래 파기/원상복구} + rightNode={ +
+ +
+ } + /> +
+ +
+
+ +

+ 정당한 사유 없이 거래를 일방적으로 파기하는 경우 +
+ 서비스 이용이 제한될 수 있습니다. +

+
    +
  • • 1회 위반: 1일 이용 정지
  • +
  • • 2회 위반: 3일 이용 정지
  • +
  • • 3회 위반: 해당 학기 수강정정기간 전체 정지
  • +
+

+ 파기된 사유가 일방적인 것으로 확인되면 상대방의 반박 신고를 통해 + 귀책사유가 인정됩니다. +

+
+ +
+ {REASON_GROUPS.map((group) => { + const isOpen = openKey === group.key; + return ( +
+ + + {isOpen && group.subReasons && ( +
+ {group.subReasons.map((sub) => ( + + ))} +
+ )} + + {isOpen && group.freeText && ( +
+ setOtherDetail(e.target.value)} + /> +
+ )} +
+ ); + })} +
+ +

+ 상대방의 악의적인 행동이 의심된다면 +
+ 거래 파기 후{' '} + 사용자 신고로 + 관리자에게 접수하세요 +

+
+ +
+ +
+ + setIsBlockedModalOpen(false)} + icon={ + + + + } + title="해당 사유로는 직접 파기할 수 없습니다" + footer={ + + } + > + + 상대방이 30분 이상 응답하지 않을 경우{'\n'}거래는 자동으로 종료됩니다. + + {'\n\n'} + 자동 종료 전 거래를 일방적으로 파기하면{'\n'} + 파기한 사용자에게 귀책사유가 인정되어{'\n'} + 페널티가 부여될 수 있습니다. + +
+ ); +} diff --git a/src/pages/mockChat.ts b/src/pages/mockChat.ts new file mode 100644 index 0000000..32c8d7c --- /dev/null +++ b/src/pages/mockChat.ts @@ -0,0 +1,29 @@ +// store/mockScheduleStore.ts +import { useEffect, useState } from 'react'; + +type ScheduleMap = Record; // roomId -> ISO string | null + +let scheduleMap: ScheduleMap = {}; +const listeners = new Set<() => void>(); +const notify = () => listeners.forEach((l) => l()); + +export const mockScheduleStore = { + get: (roomId: string) => scheduleMap[roomId] ?? null, + set: (roomId: string, iso: string) => { + scheduleMap = { ...scheduleMap, [roomId]: iso }; + notify(); + }, + subscribe: (listener: () => void) => { + listeners.add(listener); + return () => void listeners.delete(listener); + }, +}; + +export function useScheduledAt(roomId: string) { + const [, forceRender] = useState(0); + useEffect( + () => mockScheduleStore.subscribe(() => forceRender((n) => n + 1)), + [], + ); + return mockScheduleStore.get(roomId); +} diff --git a/src/pages/mockExcn.ts b/src/pages/mockExcn.ts new file mode 100644 index 0000000..56ed213 --- /dev/null +++ b/src/pages/mockExcn.ts @@ -0,0 +1,100 @@ +// store/mockExchangeStore.ts +import { useEffect, useState } from 'react'; + +export type ExchangeStatus = + | 'IDLE' + | 'VERIFYING' + | 'READY' + | 'COUNTDOWN' + | 'RESULT_SELECT' + | 'DISPUTE' + | 'DISPUTE_SUBMITTED' + | 'COMPLETED'; + +interface ExchangeState { + status: ExchangeStatus; + myVerified: boolean; + counterpartVerified: boolean; + myDisputeVerified: boolean; + counterpartDisputeVerified: boolean; + qrToken: string | null; +} + +const defaultState: ExchangeState = { + status: 'IDLE', + myVerified: false, + counterpartVerified: false, + myDisputeVerified: false, + counterpartDisputeVerified: false, + qrToken: null, +}; + +let stateMap: Record = {}; +const listeners = new Set<() => void>(); +const notify = () => listeners.forEach((l) => l()); +const getState = (roomId: string) => stateMap[roomId] ?? defaultState; + +export const mockExchangeStore = { + get: getState, + setStatus: (roomId: string, status: ExchangeStatus) => { + stateMap = { ...stateMap, [roomId]: { ...getState(roomId), status } }; + notify(); + }, + // TODO: 실제로는 6번 API(강의 보유 인증 QR 생성) 응답의 qrToken/qrImageUrl 사용 + generateQrToken: (roomId: string) => { + const token = `MOCK-QR-${roomId}-${Date.now()}`; + stateMap = { + ...stateMap, + [roomId]: { ...getState(roomId), qrToken: token }, + }; + notify(); + return token; + }, + setMyVerified: (roomId: string, v: boolean) => { + stateMap = { + ...stateMap, + [roomId]: { ...getState(roomId), myVerified: v }, + }; + notify(); + }, + setCounterpartVerified: (roomId: string, v: boolean) => { + stateMap = { + ...stateMap, + [roomId]: { ...getState(roomId), counterpartVerified: v }, + }; + notify(); + }, + setMyDisputeVerified: (roomId: string, v: boolean) => { + stateMap = { + ...stateMap, + [roomId]: { ...getState(roomId), myDisputeVerified: v }, + }; + notify(); + }, + setCounterpartDisputeVerified: (roomId: string, v: boolean) => { + stateMap = { + ...stateMap, + [roomId]: { ...getState(roomId), counterpartDisputeVerified: v }, + }; + notify(); + }, + reset: (roomId: string) => { + stateMap = { ...stateMap, [roomId]: defaultState }; + notify(); + }, + subscribe: (listener: () => void) => { + listeners.add(listener); + return () => { + listeners.delete(listener); + }; + }, +}; + +export function useExchangeState(roomId: string) { + const [, forceRender] = useState(0); + useEffect( + () => mockExchangeStore.subscribe(() => forceRender((n) => n + 1)), + [], + ); + return mockExchangeStore.get(roomId); +} diff --git a/src/routes/router.tsx b/src/routes/router.tsx index a27d256..d934681 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -20,6 +20,10 @@ import LoginPage from '../pages/login/login'; import SignupPage from '../pages/signup'; import FindPWPage from '../pages/findPW'; import AlertPage from '../pages/alert'; +import EPRPage from '../pages/epr'; +import CRPPage from '../pages/chat/crp'; +import SDPPage from '../pages/chat/sdp'; +import TDPPage from '../pages/chat/tdp'; export const router = createBrowserRouter([ { @@ -42,6 +46,7 @@ export const router = createBrowserRouter([ { path: '/test-avatar', element: }, { path: '/test-loading', element: }, { path: '/alert', element: }, + { path: '/chat', element: }, ], }, { @@ -55,6 +60,9 @@ export const router = createBrowserRouter([ { path: '/login', element: }, { path: '/signup', element: }, { path: '/findPW', element: }, + { path: '/chat/:roomId', element: }, + { path: '/chat/:roomId/schedule', element: }, + { path: '/chat/:roomId/terminate', element: }, ], }, ], From 5444748c4f07d9945b47a8680989869c7c884c50 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Sun, 19 Jul 2026 13:37:24 +0900 Subject: [PATCH 21/28] =?UTF-8?q?style:=20=EC=82=BC=EC=84=A0=20=ED=96=84?= =?UTF-8?q?=EB=B2=84=EA=B1=B0=20=EB=B2=84=ED=8A=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/chat/CRP.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/pages/chat/CRP.tsx b/src/pages/chat/CRP.tsx index a40a42f..f23b72a 100644 --- a/src/pages/chat/CRP.tsx +++ b/src/pages/chat/CRP.tsx @@ -556,14 +556,6 @@ export default function ChatRoomPage() { onClick={() => setIsMenuOpen(false)} />
-
+ )} + {/* 개발용: 발신자 전환 + 단계 바로가기 - 실배포 전 삭제 */}
- } - /> -
+ {/* ============ 푸터 (CHAT/GUIDE 단계에서만 노출) ============ */} + {/* VERIFY(5분 전 인증)가 시작된 순간부터 채팅이 완전히 잠긴다. + COUNTDOWN, DISPUTE 단계에서도 계속 잠금 상태를 유지한다. + 거래가 파기(TERMINATED)된 경우에도 flowStep과 무관하게 잠긴다. */} + {CHAT_INPUT_UNLOCKED_STEPS.includes(flowStep) && !isTerminated && ( +
+ setInputValue(e.target.value)} + onCompositionStart={() => (isComposingRef.current = true)} + onCompositionEnd={() => (isComposingRef.current = false)} + onKeyDown={handleKeyDown} + rightNode={ + + } + /> +
+ )}
); } diff --git a/src/pages/chat/TDP.tsx b/src/pages/chat/TDP.tsx index 0131bf5..b49325b 100644 --- a/src/pages/chat/TDP.tsx +++ b/src/pages/chat/TDP.tsx @@ -8,6 +8,7 @@ import Button from '@/components/common/Button'; import { Input } from '@/components/common/Input'; import { Modal } from '@/components/common/Modal'; import { ICONS } from '@/constants/icons'; +import { mockExchangeStore } from '../mockExcn'; const HEADER_H = 80; @@ -79,6 +80,27 @@ export default function TerminateDealPage() { // TODO: 실제로는 2번 API(거래 파기) 호출 // reason: selectedGroupKey를 서버 enum(MUTUAL|FRAUD|MONEY_DEMAND|ABUSE|OTHER)에 맞게 매핑 // detail: selectedGroupKey === 'OTHER' ? otherDetail : selectedSubReason + // + // 💡 실제 API 연동 로직 - 백엔드 거래 파기 API 붙으면 아래 주석 블록 해제 + /* + const reason = selectedGroupKey; + const detail = + selectedGroupKey === 'OTHER' ? otherDetail : selectedSubReason; + const res = await fetch(`${API_BASE}/api/exchange/${roomId}/terminate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ reason, detail }), + credentials: 'include', + }); + if (!res.ok) { + // TODO: 실패 시 에러 토스트/모달 처리 + return; + } + */ + + // 💡 목업: 파기 상태로 전환 → ChatRoomPage에서 이 status를 보고 + // 안내 문구 노출 + 입력창 잠금 처리를 한다. + mockExchangeStore.setStatus(roomId, 'TERMINATED'); navigate(`/chat/${roomId}`); }; diff --git a/src/pages/mockExcn.ts b/src/pages/mockExcn.ts index 56ed213..75dfb32 100644 --- a/src/pages/mockExcn.ts +++ b/src/pages/mockExcn.ts @@ -9,7 +9,8 @@ export type ExchangeStatus = | 'RESULT_SELECT' | 'DISPUTE' | 'DISPUTE_SUBMITTED' - | 'COMPLETED'; + | 'COMPLETED' + | 'TERMINATED'; interface ExchangeState { status: ExchangeStatus; From a60f30b733e1be057015873a03f8ae2e2811fcc4 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Mon, 20 Jul 2026 13:43:28 +0900 Subject: [PATCH 23/28] =?UTF-8?q?style:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 916 ++++++++++++++++++++++++++++++- package.json | 1 + src/api/chat/README.md | 75 +++ src/api/chat/chatApi.ts | 215 ++++++++ src/api/chat/config.ts | 27 + src/api/chat/exchangeApi.ts | 211 +++++++ src/api/chat/http.ts | 46 ++ src/api/chat/mockDb.ts | 166 ++++++ src/api/push.js | 2 +- src/pages/alert.jsx | 87 ++- src/pages/login.jsx | 287 ++++++++++ src/pages/login/login.jsx | 291 ---------- src/pages/login/login.module.css | 342 ------------ src/routes/router.tsx | 2 +- 14 files changed, 2017 insertions(+), 651 deletions(-) create mode 100644 src/api/chat/README.md create mode 100644 src/api/chat/chatApi.ts create mode 100644 src/api/chat/config.ts create mode 100644 src/api/chat/exchangeApi.ts create mode 100644 src/api/chat/http.ts create mode 100644 src/api/chat/mockDb.ts create mode 100644 src/pages/login.jsx delete mode 100644 src/pages/login/login.jsx delete mode 100644 src/pages/login/login.module.css diff --git a/package-lock.json b/package-lock.json index 0b39833..4051664 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,12 @@ "version": "0.0.0", "dependencies": { "@iconify/react": "^6.0.2", + "@stomp/stompjs": "^7.3.0", "axios": "^1.18.1", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0", + "tailwind-merge": "^3.6.0", "zustand": "^5.0.14" }, "devDependencies": { @@ -46,6 +48,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -57,6 +84,192 @@ "tslib": "^2.4.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@iconify/react": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@iconify/react/-/react-6.0.2.tgz", @@ -807,6 +1020,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@stomp/stompjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.3.0.tgz", + "integrity": "sha512-nKMLoFfJhrQAqkvvKd1vLq/cVBGCMwPRCD0LqW7UT1fecRx9C3GoKEIR2CYwVuErGeZu8w0kFkl2rlhPlqHVgQ==", + "license": "Apache-2.0" + }, "node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", @@ -818,6 +1037,30 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/node": { "version": "24.13.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", @@ -832,7 +1075,7 @@ "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -874,6 +1117,31 @@ } } }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -886,6 +1154,24 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", @@ -1024,6 +1310,17 @@ "proxy-from-env": "^2.1.0" } }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.41", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.41.tgz", @@ -1050,6 +1347,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -1247,6 +1558,22 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1264,7 +1591,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/debug": { @@ -1284,6 +1611,14 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1413,6 +1748,80 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", + "dev": true, + "license": "MIT", + "peer": true, + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, "node_modules/eslint-config-prettier": { "version": "10.1.8", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", @@ -1460,6 +1869,109 @@ } } }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", @@ -1467,6 +1979,14 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", @@ -1504,6 +2024,22 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -1532,6 +2068,20 @@ } } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1545,6 +2095,47 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -1762,6 +2353,28 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1840,6 +2453,14 @@ "node": ">=0.12.0" } }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC", + "peer": true + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -1850,6 +2471,56 @@ "jiti": "bin/jiti.js" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -2173,6 +2844,23 @@ "node": ">=22.13.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -2326,6 +3014,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "peer": true, + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2363,6 +3068,14 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/node-releases": { "version": "2.0.50", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", @@ -2419,6 +3132,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/oxlint": { "version": "1.71.0", "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.71.0.tgz", @@ -2468,6 +3200,62 @@ } } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2678,6 +3466,17 @@ "dev": true, "license": "MIT" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", @@ -2716,6 +3515,17 @@ "node": ">=10" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2959,6 +3769,31 @@ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", "license": "MIT" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3094,6 +3929,16 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -3210,6 +4055,20 @@ "license": "0BSD", "optional": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/typescript": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", @@ -3262,6 +4121,17 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3347,6 +4217,34 @@ } } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", @@ -3382,6 +4280,20 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zustand": { "version": "5.0.14", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", diff --git a/package.json b/package.json index ba29833..68b6590 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@iconify/react": "^6.0.2", + "@stomp/stompjs": "^7.3.0", "axios": "^1.18.1", "react": "^19.2.7", "react-dom": "^19.2.7", diff --git a/src/api/chat/README.md b/src/api/chat/README.md new file mode 100644 index 0000000..549309e --- /dev/null +++ b/src/api/chat/README.md @@ -0,0 +1,75 @@ +# API 연동 가이드 + +## 지금 (mock 모드) +`src/api/config.ts` 의 `USE_MOCK = true` 상태입니다. +모든 데이터는 `localStorage`에 저장되고, `BroadcastChannel`로 브라우저 탭 간에 +동기화됩니다 (탭을 2개 열면 한쪽은 나, 한쪽은 상대방처럼 테스트 가능). + +## 백엔드 연결할 때 +`src/api/config.ts` 파일을 열어서 아래 한 줄만 바꾸면 됩니다. + +```ts +export const USE_MOCK = false; +``` + +그리고 `.env`에 실제 서버 주소를 설정하세요. + +``` +VITE_API_BASE_URL=https://your-api-server.com +``` + +이게 전부입니다. `exchangeApi.ts` / `chatApi.ts` 안의 모든 함수가 이미 +명세서에 맞는 실제 fetch 호출 코드를 가지고 있어서, 페이지 컴포넌트 +(ChatRoomPage, ScheduleDecisionPage, TerminateDealPage)는 손댈 필요가 없습니다. + +## 필요한 패키지 +실시간 채팅(WebSocket STOMP)을 위해 아래 패키지가 필요합니다. + +``` +npm i @stomp/stompjs +``` + +(mock 모드에서는 이 패키지가 로드는 되지만 실제로 연결하지 않습니다. +USE_MOCK=true인 동안은 설치 안 해도 당장 에러는 안 나지만, import 자체는 +있으므로 빌드 전에 설치해두는 걸 권장합니다.) + +## 파일별 역할 + +| 파일 | 설명 | +|---|---| +| `config.ts` | USE_MOCK 스위치, API_BASE, WS_URL, 로그인 유저 id 등 공통 설정 | +| `http.ts` | 실제 API 호출용 공통 fetch 래퍼 (에러 처리 포함) | +| `mockDb.ts` | mock 전용 - localStorage + BroadcastChannel 기반 가짜 DB | +| `exchangeApi.ts` | API 1, 2, 5, 7, 8 (QR생성/결과선택/시간확정/파기/캡처업로드) | +| `chatApi.ts` | API 3, 9, 10, 11 (방조회/메시지목록/전송/실시간소켓) | + +## 백엔드와 반드시 확인해야 할 것 (명세서 대비 gap) + +1. **API 11(채팅방 조회) 응답에 아래 필드가 명세에 없지만 화면에 필요합니다.** + - `scheduledAt` (교환 확정 시각) + - `myVerified` / `counterpartVerified` (5분전 인증 완료 여부) + - `myDisputeVerified` (사후 인증 완료 여부) + - `qrToken` (QR 표시용) + → 이 필드들을 room 응답에 포함해달라고 요청하거나, 별도 엔드포인트로 + 받아오도록 협의가 필요합니다. 지금은 `chatApi.ts`의 `RoomInfo` 타입에 + optional로 선언해뒀고, 없으면 그냥 undefined로 처리됩니다. + +2. **상태 실시간 반영 방식이 명세에 없습니다.** + 상대방이 인증을 완료했다든지, 카운트다운이 시작됐다든지 하는 변화를 + 실시간으로 받을 방법이 명세서(웹소켓은 채팅 메시지만 다룸)에 없어서 + `chatApi.ts`의 `subscribeRoomStatus()`가 3초 간격 폴링으로 대체 + 구현되어 있습니다. 웹소켓 상태 이벤트가 추가되면 이 폴링을 제거하고 + 이벤트 구독으로 바꾸는 게 좋습니다. + +3. **원상복구 API가 명세서 1~11번에 없습니다.** + `exchangeApi.ts`의 `restoreDeal()` 안에 TODO로 표시해뒀습니다. + 엔드포인트가 정해지면 그 부분만 채우면 됩니다. + +4. **거래 파기 사유 enum 중 `MONEY_DEMAND`가 화면(TerminateDealPage) UI에 + 대응하는 선택지가 없습니다.** 필요하면 디자인팀과 항목 추가를 논의해야 + 합니다. + +5. **API 8(캡처 업로드-QR검증) 완료 후 바로 COUNTDOWN으로 넘어가는지, + 아니면 화면에 있는 "상대방 강의 확인 → 카운트다운 시작" 중간 단계 + (READY)를 거치는지 명세서와 디자인이 서로 다릅니다.** 지금은 디자인 + 기준(중간 단계 있음)으로 구현했습니다. diff --git a/src/api/chat/chatApi.ts b/src/api/chat/chatApi.ts new file mode 100644 index 0000000..fd063db --- /dev/null +++ b/src/api/chat/chatApi.ts @@ -0,0 +1,215 @@ +// src/api/chatApi.ts +// +// API 명세서 3(메시지 전송), 9(실시간 채팅/이벤트), 10(메시지 목록 조회), +// 11(채팅방 조회)에 대응합니다. +// USE_MOCK일 때는 localStorage + BroadcastChannel로 흉내내고, +// 실제 연결 시에는 STOMP(WebSocket) + REST로 동작합니다. + +import { Client, type IMessage } from '@stomp/stompjs'; +import { API_BASE, USE_MOCK, WS_URL, getCurrentUserId, sleep, MOCK_DELAY_MS } from './config'; +import { apiFetch } from './http'; +import { mockDb, type ExchangeStatus, type MockChatMessage } from './mockDb'; + +export interface ChatMessage { + id: number; + senderId: number; + content: string; + createdAt: string; + system?: boolean; +} + +export interface RoomInfo { + id: number; + status: ExchangeStatus; + exchangeId: number; + // ⚠️ 아래 3개 필드는 API 11 명세서에는 없지만 화면 렌더링(VERIFY 단계)에 필요합니다. + // 백엔드에 추가 요청하거나 별도 엔드포인트 협의가 필요합니다. + scheduledAt?: string; + myVerified?: boolean; + counterpartVerified?: boolean; + myDisputeVerified?: boolean; + qrToken?: string; +} + +// ── 11. 채팅방 조회 (+메시지 내역) ────────────────────────────────────── +export async function fetchRoom( + roomId: string, + params: { before?: string; size?: number } = {}, +): Promise<{ room: RoomInfo; messages: ChatMessage[] }> { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const state = mockDb.get(roomId); + return { + room: { + id: state.id, + exchangeId: state.exchangeId, + status: state.status, + scheduledAt: state.scheduledAt, + myVerified: state.myVerified, + counterpartVerified: state.counterpartVerified, + myDisputeVerified: state.myDisputeVerified, + qrToken: state.qrToken, + }, + messages: state.messages, + }; + } + + const query = new URLSearchParams(); + if (params.before) query.set('before', params.before); + query.set('size', String(params.size ?? 50)); + + const res = await apiFetch<{ room: RoomInfo; messages: ChatMessage[] }>( + `${API_BASE}/api/chat/rooms/${roomId}?${query.toString()}`, + ); + return res.data!; +} + +// ── 10. 메시지 목록 조회 (커서 페이징) ────────────────────────────────── +export async function fetchMessages( + roomId: string, + params: { before?: string; size: number }, +): Promise { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const state = mockDb.get(roomId); + let msgs = state.messages; + if (params.before) { + msgs = msgs.filter((m) => new Date(m.createdAt).getTime() < new Date(params.before!).getTime()); + } + return msgs.slice(-params.size); + } + + const query = new URLSearchParams(); + if (params.before) query.set('before', params.before); + query.set('size', String(params.size)); + + const res = await apiFetch<{ messages: ChatMessage[] }>( + `${API_BASE}/api/chat/rooms/${roomId}/messages?${query.toString()}`, + ); + return res.data!.messages; +} + +// ── 3. 메시지 전송 (REST 폴백 - 소켓 미연결 시 사용) ──────────────────── +export async function sendMessageRest(roomId: string, content: string): Promise { + if (USE_MOCK) { + await sleep(150); + const message = mockDb.addMessage(roomId, { + senderId: getCurrentUserId(), + content, + createdAt: new Date().toISOString(), + }); + mockDb.broadcastMessage(roomId, message); + return; + } + + await apiFetch(`${API_BASE}/api/chat/rooms/${roomId}/send`, { + method: 'POST', + body: JSON.stringify({ content }), + }); +} + +// ── 9. 실시간 채팅/이벤트 ──────────────────────────────────────────────── +// connect()는 구독 해제 함수를 반환합니다. +export interface ChatSocket { + send: (content: string) => void; + disconnect: () => void; +} + +export function connectChatSocket( + roomId: string, + onMessage: (message: ChatMessage) => void, +): ChatSocket { + if (USE_MOCK) { + // mock: BroadcastChannel로 같은 브라우저의 다른 탭과 실시간 동기화됩니다. + const unsubscribe = mockDb.subscribeMessage(roomId, (msg: MockChatMessage) => { + onMessage(msg); + }); + + return { + send: (content: string) => { + const message = mockDb.addMessage(roomId, { + senderId: getCurrentUserId(), + content, + createdAt: new Date().toISOString(), + }); + mockDb.broadcastMessage(roomId, message); + }, + disconnect: unsubscribe, + }; + } + + const client = new Client({ + brokerURL: WS_URL, + reconnectDelay: 3000, + onConnect: () => { + client.subscribe(`/topic/chat/${roomId}`, (message: IMessage) => { + try { + onMessage(JSON.parse(message.body) as ChatMessage); + } catch { + // 파싱 실패 이벤트는 무시 + } + }); + }, + }); + client.activate(); + + return { + send: (content: string) => { + if (!client.connected) return; + client.publish({ + destination: `/app/chat/${roomId}/send`, + body: JSON.stringify({ content }), + }); + }, + disconnect: () => client.deactivate(), + }; +} + +// ── 개발용 헬퍼 (mock 전용) ───────────────────────────────────────────── +// CHAT 화면의 "테스트 발신자 전환" 버튼처럼, 상대방인 척 메시지를 보내는 테스트용 함수. +// 실서버 연결 시(USE_MOCK=false)에는 아무 동작도 하지 않습니다. +export function mockSendMessageAs(roomId: string, content: string, senderId: number) { + if (!USE_MOCK) return; + const message = mockDb.addMessage(roomId, { + senderId, + content, + createdAt: new Date().toISOString(), + }); + mockDb.broadcastMessage(roomId, message); +} + +// 채팅방 상태 변화 구독 (상대방 인증 완료, 카운트다운 시작 등 반영용) +// mock: BroadcastChannel 기반. real: 별도 이벤트가 없어 폴링으로 대체합니다. +export function subscribeRoomStatus( + roomId: string, + onChange: (room: RoomInfo) => void, + pollIntervalMs = 3000, +): () => void { + if (USE_MOCK) { + return mockDb.subscribe(roomId, (state) => { + onChange({ + id: state.id, + exchangeId: state.exchangeId, + status: state.status, + scheduledAt: state.scheduledAt, + myVerified: state.myVerified, + counterpartVerified: state.counterpartVerified, + myDisputeVerified: state.myDisputeVerified, + qrToken: state.qrToken, + }); + }); + } + + // ⚠️ 명세서에 실시간 상태 push 이벤트가 없어 폴링으로 대체합니다. + // 웹소켓 상태 이벤트가 추가되면 이 폴링을 제거하고 이벤트 구독으로 바꾸는 게 좋습니다. + const timer = setInterval(async () => { + try { + const { room } = await fetchRoom(roomId, { size: 1 }); + onChange(room); + } catch { + // 폴링 실패는 조용히 무시하고 다음 주기에 재시도 + } + }, pollIntervalMs); + + return () => clearInterval(timer); +} diff --git a/src/api/chat/config.ts b/src/api/chat/config.ts new file mode 100644 index 0000000..90226dd --- /dev/null +++ b/src/api/chat/config.ts @@ -0,0 +1,27 @@ +// src/api/config.ts +// +// ============================================================================ +// 🔧 백엔드 연결 스위치 +// ============================================================================ +// 지금은 true (mock) 상태입니다. +// 백엔드 API가 준비되면 아래 값을 false로 바꾸기만 하면 됩니다. +// exchangeApi.ts / chatApi.ts 안의 모든 함수가 이 값을 보고 +// mock 구현 / 실제 fetch 구현을 자동으로 분기합니다. (호출부 코드는 수정할 필요 없음) +// ============================================================================ +export const USE_MOCK = true; + +// 실제 API 베이스 URL. .env 파일에 VITE_API_BASE_URL 설정해두면 됩니다. +export const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; + +// WebSocket(STOMP) 연결 URL. 명세서 기준 /ws +export const WS_URL = `${API_BASE.replace(/^http/, 'ws')}/ws`; + +// mock 모드에서 네트워크 지연을 흉내내기 위한 딜레이 (실제 API 느낌 테스트용) +export const MOCK_DELAY_MS = 350; + +// mock 로그인 유저 id. 실제 auth 붙으면 이 부분만 교체하면 됩니다. +// (localStorage에 'userId'가 없으면 1번 유저로 동작) +export const getCurrentUserId = (): number => + Number(localStorage.getItem('userId')) || 1; + +export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)); diff --git a/src/api/chat/exchangeApi.ts b/src/api/chat/exchangeApi.ts new file mode 100644 index 0000000..9621f43 --- /dev/null +++ b/src/api/chat/exchangeApi.ts @@ -0,0 +1,211 @@ +// src/api/exchangeApi.ts +// +// API 명세서 1, 2, 5, 7, 8번에 대응하는 함수들입니다. +// USE_MOCK 값에 따라 mock 구현 / 실제 fetch 구현으로 자동 분기됩니다. +// 응답 형태(status/success/data 필드명)는 명세서와 동일하게 맞춰서, +// 나중에 USE_MOCK=false로 바꿨을 때 호출부(페이지 컴포넌트) 코드는 손댈 필요가 없습니다. + +import { API_BASE, MOCK_DELAY_MS, USE_MOCK, getCurrentUserId, sleep } from './config'; +import { apiFetch } from './http'; +import { mockDb, type ExchangeStatus } from './mockDb'; + +// ── 1. 강의 보유 인증 QR 생성 ─────────────────────────────────────────── +export interface GenerateQrResponse { + qrToken: string; + qrImageUrl: string; + expiresAt: string; +} + +export async function generateVerifyQr(roomId: string): Promise { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const state = mockDb.get(roomId); + // 명세: VERIFYING 상태에서만 호출 가능 + if (!['MATCHED', 'SCHEDULED', 'VERIFYING'].includes(state.status)) { + throw new Error('지금은 인증 QR을 생성할 수 없는 상태입니다.'); + } + const qrToken = `mock-qr-${roomId}-${Date.now()}`; + const expiresAt = new Date(Date.now() + 5 * 60 * 1000).toISOString(); + mockDb.update(roomId, { + status: 'VERIFYING', + qrToken, + qrExpiresAt: expiresAt, + myVerified: false, + }); + return { qrToken, qrImageUrl: '', expiresAt }; + } + + const res = await apiFetch( + `${API_BASE}/api/exchange/${roomId}/verify/qr`, + { method: 'POST' }, + ); + return res.data!; +} + +// ── 2. 교환 결과 선택 (성공/실패) ─────────────────────────────────────── +export interface ExchangeResultResponse { + exchangeStatus: ExchangeStatus; +} + +export async function submitExchangeResult( + roomId: string, + result: 'SUCCESS' | 'FAIL', +): Promise { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + // mock: 상대방도 즉시 같은 값을 선택한다고 가정 (단, FAIL을 고르면 결과는 항상 DISPUTE) + const exchangeStatus: ExchangeStatus = result === 'SUCCESS' ? 'COMPLETED' : 'DISPUTE'; + mockDb.update(roomId, { status: exchangeStatus, myResult: result }); + return { exchangeStatus }; + } + + const res = await apiFetch( + `${API_BASE}/api/exchange/${roomId}/result`, + { method: 'POST', body: JSON.stringify({ result }) }, + ); + return res.data!; +} + +// ── 5. 교환 시간 확정 ─────────────────────────────────────────────────── +export interface ConfirmScheduleResponse { + scheduledAt: string; + autoConfirmAt: string; +} + +export async function confirmSchedule( + roomId: string, + scheduledAt: string, +): Promise { + if (new Date(scheduledAt).getTime() <= Date.now()) { + throw new Error('과거 시간으로는 교환 시간을 설정할 수 없습니다.'); + } + + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const autoConfirmAt = new Date( + new Date(scheduledAt).getTime() + 72 * 60 * 60 * 1000, + ).toISOString(); + + mockDb.update(roomId, { scheduledAt, autoConfirmAt, status: 'SCHEDULED' }); + + // 명세: 확정 시 시스템 메시지 발송 + const d = new Date(scheduledAt); + const hour = d.getHours(); + const isPM = hour >= 12; + const displayHour = hour % 12 === 0 ? 12 : hour % 12; + mockDb.addMessage(roomId, { + senderId: 0, + system: true, + content: `${isPM ? '오후' : '오전'} ${displayHour}시 ${d.getMinutes()}분으로 교환 시간이 확정되었습니다.`, + createdAt: new Date().toISOString(), + }); + + return { scheduledAt, autoConfirmAt }; + } + + const res = await apiFetch( + `${API_BASE}/api/exchange/${roomId}/schedule`, + { method: 'POST', body: JSON.stringify({ scheduledAt }) }, + ); + return res.data!; +} + +// ── 7. 거래 파기 ──────────────────────────────────────────────────────── +export type TerminateReason = 'MUTUAL' | 'FRAUD' | 'MONEY_DEMAND' | 'ABUSE' | 'OTHER'; + +export async function terminateDeal( + roomId: string, + reason: TerminateReason, + detail?: string, +): Promise<{ message: string }> { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const state = mockDb.get(roomId); + mockDb.update(roomId, { + status: 'TERMINATED', + statusBeforeTerminate: state.status, + }); + return { message: '거래가 파기되었습니다.' }; + } + + const res = await apiFetch(`${API_BASE}/api/exchange/${roomId}/terminate`, { + method: 'POST', + body: JSON.stringify({ reason, detail }), + }); + return { message: res.message ?? '거래가 파기되었습니다.' }; +} + +// ⚠️ 원상복구는 명세서(1~11번)에 없는 기능입니다. +// 백엔드 엔드포인트가 확정되면 아래 URL만 채우면 됩니다. +export async function restoreDeal(roomId: string): Promise { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS); + const state = mockDb.get(roomId); + mockDb.update(roomId, { + status: state.statusBeforeTerminate ?? 'MATCHED', + statusBeforeTerminate: null, + }); + return; + } + + // TODO: 실제 엔드포인트 확정되면 교체 + await apiFetch(`${API_BASE}/api/exchange/${roomId}/terminate/restore`, { + method: 'POST', + }); +} + +// ── 8. 화면 캡처 업로드 - QR 검증 ─────────────────────────────────────── +export interface CaptureUploadResponse { + qrValid: boolean; + status: 'PASSED' | 'FAILED'; +} + +export async function uploadVerifyCapture( + roomId: string, + image: Blob, + mode: 'VERIFY' | 'DISPUTE' = 'VERIFY', +): Promise { + if (USE_MOCK) { + await sleep(MOCK_DELAY_MS + 600); // 업로드+검증 느낌으로 조금 더 대기 + const state = mockDb.get(roomId); + const passed = state.mockCaptureSucceeds; + + if (mode === 'VERIFY') { + mockDb.update(roomId, { myVerified: passed || state.myVerified }); + } else { + mockDb.update(roomId, { myDisputeVerified: passed || state.myDisputeVerified }); + } + + return { qrValid: passed, status: passed ? 'PASSED' : 'FAILED' }; + } + + const formData = new FormData(); + formData.append('image', image, 'capture.png'); + + // ⚠️ 명세서엔 사후 인증(분쟁조정) 전용 업로드 엔드포인트가 별도로 없어서 + // 일단 동일한 verify-capture 엔드포인트를 재사용한다고 가정했습니다. + // 백엔드에서 분쟁조정용 엔드포인트를 따로 준다면 mode에 따라 URL을 분기하면 됩니다. + const res = await apiFetch( + `${API_BASE}/api/exchange/${roomId}/verify-capture`, + { method: 'POST', body: formData }, + ); + return res.data!; +} + +// ── 개발용 헬퍼 (mock 전용) ───────────────────────────────────────────── +// 실배포/실서버 연결 시 아무 의미 없어지는 함수들입니다. UI의 [TEST] 버튼들이 사용합니다. +export const mockDevHelpers = { + setStatus(roomId: string, status: ExchangeStatus) { + if (!USE_MOCK) return; + mockDb.update(roomId, { status }); + }, + setCounterpartVerified(roomId: string, verified: boolean) { + if (!USE_MOCK) return; + mockDb.update(roomId, { counterpartVerified: verified }); + }, + setCaptureSucceeds(roomId: string, succeeds: boolean) { + if (!USE_MOCK) return; + mockDb.update(roomId, { mockCaptureSucceeds: succeeds }); + }, + getCurrentUserId, +}; diff --git a/src/api/chat/http.ts b/src/api/chat/http.ts new file mode 100644 index 0000000..dd4aff1 --- /dev/null +++ b/src/api/chat/http.ts @@ -0,0 +1,46 @@ +// src/api/http.ts +// +// USE_MOCK = false일 때 실제 서버와 통신하는 공통 fetch 래퍼입니다. +// 명세서 공통 응답 형식 { status, success, message?, data? } 을 기준으로 +// success가 false이거나 http status가 실패면 예외를 던집니다. + +export interface ApiEnvelope { + status: number; + success: boolean; + message?: string; + data?: T; +} + +export class ApiError extends Error { + status: number; + constructor(message: string, status: number) { + super(message); + this.status = status; + this.name = 'ApiError'; + } +} + +export async function apiFetch( + url: string, + options: RequestInit = {}, +): Promise> { + const isFormData = options.body instanceof FormData; + + const res = await fetch(url, { + credentials: 'include', + ...options, + headers: isFormData + ? options.headers + : { 'Content-Type': 'application/json', ...(options.headers ?? {}) }, + }); + + const json = (await res.json().catch(() => null)) as ApiEnvelope | null; + + if (!res.ok || json?.success === false) { + throw new ApiError(json?.message ?? `요청 실패 (${res.status})`, res.status); + } + if (!json) { + throw new ApiError('서버 응답을 해석할 수 없습니다.', res.status); + } + return json; +} diff --git a/src/api/chat/mockDb.ts b/src/api/chat/mockDb.ts new file mode 100644 index 0000000..7fb6e29 --- /dev/null +++ b/src/api/chat/mockDb.ts @@ -0,0 +1,166 @@ +// src/api/mockDb.ts +// +// USE_MOCK = true일 때 사용하는 가짜 DB입니다. +// - roomId별 교환 상태를 localStorage에 저장해서 새로고침해도 유지됩니다. +// - BroadcastChannel로 같은 브라우저의 다른 탭(=상대방 역할)과 상태를 동기화합니다. +// 즉, 탭을 2개 열어서 한쪽은 나, 한쪽은 상대방처럼 테스트할 수 있습니다. +// +// 실제 백엔드 연결 시(USE_MOCK=false) 이 파일은 전혀 사용되지 않습니다. + +export type ExchangeStatus = + | 'MATCHED' + | 'SCHEDULED' + | 'VERIFYING' + | 'READY' + | 'COUNTDOWN' + | 'RESULT_SELECT' + | 'DISPUTE' + | 'DISPUTE_SUBMITTED' + | 'COMPLETED' + | 'TERMINATED'; + +export interface MockChatMessage { + id: number; + senderId: number; + content: string; + createdAt: string; + system?: boolean; +} + +export interface MockRoomState { + id: number; + exchangeId: number; + status: ExchangeStatus; + statusBeforeTerminate: ExchangeStatus | null; + scheduledAt?: string; + autoConfirmAt?: string; + qrToken?: string; + qrExpiresAt?: string; + myVerified: boolean; + counterpartVerified: boolean; + myDisputeVerified: boolean; + counterpartDisputeVerified: boolean; + myResult?: 'SUCCESS' | 'FAIL'; + counterpartResult?: 'SUCCESS' | 'FAIL'; + messages: MockChatMessage[]; + // 개발용: 다음 캡처 업로드가 성공할지 실패할지 (실제로는 서버 QR 검증 결과) + mockCaptureSucceeds: boolean; +} + +const STORAGE_PREFIX = 'mock_exchange_room_'; +const CHANNEL_PREFIX = 'mock_exchange_channel_'; + +const defaultState = (roomId: string): MockRoomState => ({ + id: Number(roomId), + exchangeId: Number(roomId), + status: 'MATCHED', + statusBeforeTerminate: null, + myVerified: false, + counterpartVerified: false, + myDisputeVerified: false, + counterpartDisputeVerified: false, + mockCaptureSucceeds: true, + messages: [ + { + id: 1, + senderId: 1, + content: '내일 오전 4시에 교환해요', + createdAt: new Date().toISOString(), + }, + { + id: 2, + senderId: 2, + content: '좋아요', + createdAt: new Date().toISOString(), + }, + ], +}); + +const storageKey = (roomId: string) => `${STORAGE_PREFIX}${roomId}`; + +function readState(roomId: string): MockRoomState { + try { + const raw = localStorage.getItem(storageKey(roomId)); + if (!raw) { + const initial = defaultState(roomId); + localStorage.setItem(storageKey(roomId), JSON.stringify(initial)); + return initial; + } + return JSON.parse(raw) as MockRoomState; + } catch { + return defaultState(roomId); + } +} + +function writeState(roomId: string, state: MockRoomState) { + localStorage.setItem(storageKey(roomId), JSON.stringify(state)); + getChannel(roomId).postMessage({ type: 'state', state }); +} + +const channels = new Map(); +function getChannel(roomId: string): BroadcastChannel { + if (!channels.has(roomId)) { + channels.set(roomId, new BroadcastChannel(`${CHANNEL_PREFIX}${roomId}`)); + } + return channels.get(roomId)!; +} + +export const mockDb = { + get(roomId: string): MockRoomState { + return readState(roomId); + }, + + update(roomId: string, patch: Partial): MockRoomState { + const next = { ...readState(roomId), ...patch }; + writeState(roomId, next); + return next; + }, + + addMessage(roomId: string, message: Omit): MockChatMessage { + const state = readState(roomId); + const newMessage: MockChatMessage = { ...message, id: Date.now() + Math.random() }; + const next = { ...state, messages: [...state.messages, newMessage] }; + writeState(roomId, next); + return newMessage; + }, + + // roomId의 상태 변화를 구독 (다른 탭에서의 변경 포함) + subscribe(roomId: string, callback: (state: MockRoomState) => void): () => void { + const channel = getChannel(roomId); + const handler = (e: MessageEvent) => { + if (e.data?.type === 'state') callback(e.data.state as MockRoomState); + }; + channel.addEventListener('message', handler); + + // storage 이벤트도 함께 구독 (다른 탭에서 직접 localStorage를 바꾼 경우 대비) + const storageHandler = (e: StorageEvent) => { + if (e.key === storageKey(roomId) && e.newValue) { + callback(JSON.parse(e.newValue) as MockRoomState); + } + }; + window.addEventListener('storage', storageHandler); + + return () => { + channel.removeEventListener('message', handler); + window.removeEventListener('storage', storageHandler); + }; + }, + + // 새 메시지 브로드캐스트 구독 (채팅 실시간 수신 mock) + subscribeMessage(roomId: string, callback: (message: MockChatMessage) => void): () => void { + const channel = getChannel(roomId); + const handler = (e: MessageEvent) => { + if (e.data?.type === 'message') callback(e.data.message as MockChatMessage); + }; + channel.addEventListener('message', handler); + return () => channel.removeEventListener('message', handler); + }, + + broadcastMessage(roomId: string, message: MockChatMessage) { + getChannel(roomId).postMessage({ type: 'message', message }); + }, + + reset(roomId: string) { + localStorage.removeItem(storageKey(roomId)); + }, +}; diff --git a/src/api/push.js b/src/api/push.js index 2e8bd4e..69f2517 100644 --- a/src/api/push.js +++ b/src/api/push.js @@ -1,4 +1,4 @@ -// src/lib/push.js +// src/api/push.js const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; const VAPID_PUBLIC_KEY = import.meta.env.VITE_VAPID_PUBLIC_KEY ?? ''; // 👆 VAPID 공개키는 백엔드가 발급해줘야 해요. .env에 VITE_VAPID_PUBLIC_KEY=... 로 넣어두세요. diff --git a/src/pages/alert.jsx b/src/pages/alert.jsx index a5aa7df..50b9d59 100644 --- a/src/pages/alert.jsx +++ b/src/pages/alert.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import Header from '@/components/layout/Header'; import { IconButton } from '@/components/common/IconButton'; @@ -23,6 +23,7 @@ const API = { }; const HEADER_H = 80; +const PAGE_SIZE = 20; const USE_MOCK = true; @@ -67,7 +68,7 @@ const MOCK_NOTIFICATIONS = [ id: 5, type: 'EXCHANGE_SCHEDULED', title: '매칭 시간 확정', - body: '오후 2시 15분으로 교환 시간이 확정되었습니다.\n해당 시간에 카카오톡 오픈채팅방 링크가 열립니다.', + body: '오후 2시 15분으로 교환 시간이 확정되었습니다.\n교환 5분 전 과목 보유 인증이 진행됩니다. 약속 시간을 꼭 지켜주세요.', deepLink: null, isRead: true, createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), @@ -94,6 +95,7 @@ const TYPE_ICON_MAP = { const TOAST_BY_TYPE = { EXPIRED_POST: '존재하지 않거나 삭제된 게시글입니다.', EXPIRED_MATCH: '만료된 매칭 제안입니다.', + LOAD_FAILED: '알림을 불러오지 못했습니다. 잠시 후 다시 시도해주세요.', }; const formatRelativeTime = (iso) => { @@ -122,11 +124,16 @@ export default function AlertPage() { const navigate = useNavigate(); const [notifications, setNotifications] = useState([]); const [isLoading, setIsLoading] = useState(true); + const [isLoadingMore, setIsLoadingMore] = useState(false); + const [hasMore, setHasMore] = useState(true); const [toastMessage, setToastMessage] = useState(''); const [isToastVisible, setIsToastVisible] = useState(false); + const pageRef = useRef(0); + const listRef = useRef(null); + useEffect(() => { - fetchNotifications(); + fetchNotifications({ reset: true }); }, []); const showToast = (message) => { @@ -134,20 +141,52 @@ export default function AlertPage() { setIsToastVisible(true); }; - const fetchNotifications = async () => { - setIsLoading(true); + // page: 알림 목록 조회 (page/size 파라미터로 페이지네이션) + const fetchNotifications = async ({ reset = false } = {}) => { + const page = reset ? 0 : pageRef.current; + + if (reset) { + setIsLoading(true); + } else { + setIsLoadingMore(true); + } + try { if (USE_MOCK) { await new Promise((r) => setTimeout(r, 300)); setNotifications(MOCK_NOTIFICATIONS); + setHasMore(false); return; } - const { data } = await getJson(`${API.LIST}?page=0&size=20`); - if (data?.success) { - setNotifications(data.data.notifications); + + const { status, data } = await getJson( + `${API.LIST}?page=${page}&size=${PAGE_SIZE}`, + ); + + if (status === 200 && data?.success) { + const fetched = data.data.notifications ?? []; + setNotifications((prev) => (reset ? fetched : [...prev, ...fetched])); + setHasMore(fetched.length === PAGE_SIZE); + pageRef.current = page + 1; + } else { + showToast(TOAST_BY_TYPE.LOAD_FAILED); } + } catch { + showToast(TOAST_BY_TYPE.LOAD_FAILED); } finally { setIsLoading(false); + setIsLoadingMore(false); + } + }; + + // 리스트를 끝까지 스크롤하면 다음 페이지 로드 (기존 "불러오는 중..." 표시를 그대로 재사용) + const handleScroll = () => { + if (USE_MOCK || isLoading || isLoadingMore || !hasMore) return; + const el = listRef.current; + if (!el) return; + const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 80; + if (nearBottom) { + fetchNotifications({ reset: false }); } }; @@ -155,18 +194,28 @@ export default function AlertPage() { const handleNotificationClick = async (item) => { if (!item.isRead) { - try { - await patchJson(API.READ_ONE(item.id)); + if (USE_MOCK) { setNotifications((prev) => prev.map((n) => (n.id === item.id ? { ...n, isRead: true } : n)), ); - } catch { - // 읽음 처리 실패는 조용히 무시 + } else { + try { + const { status } = await patchJson(API.READ_ONE(item.id)); + if (status === 200) { + setNotifications((prev) => + prev.map((n) => (n.id === item.id ? { ...n, isRead: true } : n)), + ); + } + } catch { + // 읽음 처리 실패는 조용히 무시 (다음 진입 시 재시도됨) + } } } if (!item.deepLink) return; + // 3번 API(알림 목록 조회) 명세에 정의된 두 케이스만 만료/삭제로 취급한다. + // 그 외 네트워크 오류 등은 "삭제됨"으로 단정할 근거가 없으므로 일단 이동시킨다. try { const res = await fetch(item.deepLink, { credentials: 'include' }); if (res.status === 404) { @@ -179,7 +228,7 @@ export default function AlertPage() { } navigate(item.deepLink); } catch { - showToast(TOAST_BY_TYPE.EXPIRED_POST); + navigate(item.deepLink); } }; @@ -243,7 +292,11 @@ export default function AlertPage() { 🔔 -
+
{isLoading && (
불러오는 중... @@ -295,6 +348,12 @@ export default function AlertPage() { ); })} + + {!isLoading && isLoadingMore && ( +
+ 불러오는 중... +
+ )}
{ + return () => clearTimeout(refreshTimerRef.current); + }, []); + + function validate() { + const errors = { email: '', password: '' }; + if (!email.trim()) { + errors.email = '이메일을 입력해주세요.'; + } else if (!EMAIL_REGEX.test(email.trim())) { + errors.email = '올바른 이메일 형식이 아닙니다.'; + } + if (!password) { + errors.password = '비밀번호를 입력해주세요.'; + } + setFieldErrors(errors); + return !errors.email && !errors.password; + } + + // function scheduleTokenRefresh(refreshToken, expiresIn) { + // clearTimeout(refreshTimerRef.current); + // refreshTimerRef.current = setTimeout(async () => { + // try { + // // const reissued = await refreshTokenRequest(refreshToken); + // // saveTokens(reissued, autoLogin); + // setBanner({ + // type: 'success', + // message: '토큰이 만료되어 새 토큰으로 재발급되었습니다.', + // }); + // // scheduleTokenRefresh(reissued.refreshToken, reissued.expiresIn); + // } catch { + // // clearTokens(); + // setBanner({ + // type: 'error', + // message: '세션이 만료되었습니다. 다시 로그인해주세요.', + // }); + // } + // }, expiresIn * 1000); + // } + + async function handleSubmit(e) { + e.preventDefault(); + setBanner(null); + if (!validate()) return; + + setIsSubmitting(true); + try { + // const tokens = await loginRequest({ email: email.trim(), password }); + // saveTokens(tokens, autoLogin); + setBanner({ + type: 'success', + message: `로그인에 성공했습니다. ${autoLogin ? '자동 로그인이 설정됨' : ''}`, + }); + // scheduleTokenRefresh(tokens.refreshToken, tokens.expiresIn); + } catch { + setBanner({ + type: 'error', + message: '알 수 없는 오류가 발생했습니다. 다시 시도해주세요.', + }); + } finally { + setIsSubmitting(false); + } + } + + return ( +
+
+
+
+ SOO +
+

+ 눈송이들의 수강신청을 구조해줄 간편하고 +
+ 안전한 강의 교환 매칭 제안 서비스 +

+
+ +
+ {banner?.message || ''} +
+ +
+ {/* ── 이메일 ── */} +
+ +
+ + + + { + setEmail(e.target.value); + if (e.target.value.trim()) + setFieldErrors((prev) => ({ ...prev, email: '' })); + }} + autoComplete="email" + className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none placeholder:text-[11px] placeholder:leading-[18.384px] placeholder:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" + /> +
+

+ {fieldErrors.email} +

+
+ + {/* ── 비밀번호 ── */} +
+ +
+ + + + { + setPassword(e.target.value); + if (e.target.value) + setFieldErrors((prev) => ({ ...prev, password: '' })); + }} + autoComplete="current-password" + className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none [&::placeholder]:text-[11px] [&::placeholder]:leading-[18.384px] [&::placeholder]:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" + /> + +
+

+ {fieldErrors.password} +

+
+ + {/* ── 자동 로그인 ── */} +
setAutoLogin((v) => !v)} + role="checkbox" + aria-checked={autoLogin} + tabIndex={0} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + setAutoLogin((v) => !v); + } + }} + > + + {autoLogin && ( + + )} + + + 자동 로그인 + +
+ + {/* ── 로그인 버튼 ── */} + +
+ +
+ + | + +
+
+
+ ); +} diff --git a/src/pages/login/login.jsx b/src/pages/login/login.jsx deleted file mode 100644 index d49df0d..0000000 --- a/src/pages/login/login.jsx +++ /dev/null @@ -1,291 +0,0 @@ -import { useEffect, useRef, useState } from 'react'; -import { twMerge } from 'tailwind-merge'; -import { useNavigate } from 'react-router-dom'; -import styles from './login.module.css'; -// import { loginRequest, refreshTokenRequest, ApiError } from '../../api/authApi'; -// import { saveTokens, clearTokens } from '../../utils/tokenStorage'; -import lockIcon from '../../assets/icons/lock.svg'; -import joinIcon from '../../assets/icons/join.svg'; -import checkIcon from '../../assets/icons/check.svg'; -import emailIcon from '../../assets/icons/email.svg'; -import logo from '../../assets/icons/logo.png'; -import eyeIcon from '../../assets/icons/eye.svg'; -import pwLockIcon from '../../assets/icons/pwlock.svg'; -import Button from '../../components/common/Button'; -import { Input } from '../../components/common/Input'; -import { Spinner } from '../../components/common/Spinner'; - -const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; -const FRAME_WIDTH = 402; -const FRAME_HEIGHT = 874; - -export default function LoginPage() { - const navigate = useNavigate(); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [showPassword, setShowPassword] = useState(false); - const [autoLogin, setAutoLogin] = useState(true); - const [fieldErrors, setFieldErrors] = useState({ email: '', password: '' }); - const [banner, setBanner] = useState(null); - const [isSubmitting, setIsSubmitting] = useState(false); - - const refreshTimerRef = useRef(null); - const [scale, setScale] = useState(1); - - useEffect(() => { - function updateScale() { - const scaleByHeight = window.innerHeight / FRAME_HEIGHT; - const scaleByWidth = window.innerWidth / FRAME_WIDTH; - setScale(Math.min(scaleByHeight, scaleByWidth)); - } - updateScale(); - window.addEventListener('resize', updateScale); - return () => window.removeEventListener('resize', updateScale); - }, []); - - useEffect(() => { - return () => clearTimeout(refreshTimerRef.current); - }, []); - - function validate() { - const errors = { email: '', password: '' }; - if (!email.trim()) { - errors.email = '이메일을 입력해주세요.'; - } else if (!EMAIL_REGEX.test(email.trim())) { - errors.email = '올바른 이메일 형식이 아닙니다.'; - } - if (!password) { - errors.password = '비밀번호를 입력해주세요.'; - } - setFieldErrors(errors); - return !errors.email && !errors.password; - } - - function scheduleTokenRefresh(refreshToken, expiresIn) { - clearTimeout(refreshTimerRef.current); - refreshTimerRef.current = setTimeout(async () => { - try { - // const reissued = await refreshTokenRequest(refreshToken); - // saveTokens(reissued, autoLogin); - setBanner({ - type: 'success', - message: '토큰이 만료되어 새 토큰으로 재발급되었습니다.', - }); - // scheduleTokenRefresh(reissued.refreshToken, reissued.expiresIn); - } catch { - // clearTokens(); - setBanner({ - type: 'error', - message: '세션이 만료되었습니다. 다시 로그인해주세요.', - }); - } - }, expiresIn * 1000); - } - - async function handleSubmit(e) { - e.preventDefault(); - setBanner(null); - if (!validate()) return; - - setIsSubmitting(true); - try { - // const tokens = await loginRequest({ email: email.trim(), password }); - // saveTokens(tokens, autoLogin); - setBanner({ - type: 'success', - message: `로그인에 성공했습니다. ${autoLogin ? '자동 로그인이 설정됨' : ''}`, - }); - // scheduleTokenRefresh(tokens.refreshToken, tokens.expiresIn); - } catch (err) { - setBanner({ - type: 'error', - message: '알 수 없는 오류가 발생했습니다. 다시 시도해주세요.', - }); - } finally { - setIsSubmitting(false); - } - } - - return ( -
-
-
-
-
- SOO -
-

- 눈송이들의 수강신청을 구조해줄 간편하고 -
- 안전한 강의 교환 매칭 제안 서비스 -

-
- -
- {banner?.message || ''} -
- -
- {/* ── 이메일 ── */} -
- -
- - - - { - setEmail(e.target.value); - if (e.target.value.trim()) - setFieldErrors((prev) => ({ ...prev, email: '' })); - }} - autoComplete="email" - className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none placeholder:text-[11px] placeholder:leading-[18.384px] placeholder:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" - /> -
-

{fieldErrors.email}

-
- - {/* ── 비밀번호 ── */} -
- -
- - - - { - setPassword(e.target.value); - if (e.target.value) - setFieldErrors((prev) => ({ ...prev, password: '' })); - }} - autoComplete="current-password" - className="flex-1 min-w-0 !border-none !bg-transparent !p-0 !rounded-none !shadow-none [&::placeholder]:text-[11px] [&::placeholder]:leading-[18.384px] [&::placeholder]:tracking-[0.368px] placeholder:text-[#657a88] placeholder:font-['Pretendard'] placeholder:font-normal" - /> - -
-

{fieldErrors.password}

-
- - {/* ── 자동 로그인 ── */} -
setAutoLogin((v) => !v)} - role="checkbox" - aria-checked={autoLogin} - tabIndex={0} - onKeyDown={(e) => { - if (e.key === 'Enter' || e.key === ' ') { - e.preventDefault(); - setAutoLogin((v) => !v); - } - }} - > - - {autoLogin && ( - - )} - - 자동 로그인 -
- - {/* ── 로그인 버튼 ── */} - -
- -
- - | - -
-
-
-
- ); -} diff --git a/src/pages/login/login.module.css b/src/pages/login/login.module.css deleted file mode 100644 index 075d371..0000000 --- a/src/pages/login/login.module.css +++ /dev/null @@ -1,342 +0,0 @@ -@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); - -.page { - height: 100vh; - width: 100%; - display: flex; - align-items: center; - justify-content: center; - background: #eeeeee; - font-family: 'Pretendard', 'Apple SD Gothic Neo', 'Noto Sans KR', sans-serif; - overflow: hidden; -} - -.frame { - width: 402px; - height: 874px; - flex-shrink: 0; - transform-origin: center center; -} - -.card { - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - background: #fbfbfb; - border-radius: 4px; - box-sizing: border-box; - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.02); - overflow-y: auto; -} - -.brand { -} - -.logo { - display: block; - width: 131.397px; - height: 59.797px; - margin-top: 214.03px; - margin-left: 135.3px; -} - -.logo img { - width: 100%; - height: 100%; - display: block; -} - -.tagline { - width: 242.66px; - margin-top: 14px; - margin-left: 79.67px; - color: #657a88; - text-align: center; - font-family: Pretendard; - font-size: 11px; - font-style: normal; - font-weight: 400; - line-height: 18.384px; - letter-spacing: 0.368px; -} - -/* 배너: 색깔 박스 없이 텍스트만. 있든 없든 항상 같은 자리를 차지해서 밀림 없음 */ -.bannerSlot { - min-height: 17px; - margin-top: 1.86px; - margin-bottom: 6px; - margin-left: 27.23px; - margin-right: 27.23px; - text-align: center; - font-family: Pretendard; - font-size: 12px; - font-weight: 500; - line-height: 17px; - overflow: hidden; -} - -.bannerErrorText { - color: #e15252; -} - -.bannerSuccessText { - color: #2f7a3d; -} - -.form { - display: flex; - flex-direction: column; -} - -.fieldGroup { - display: flex; - flex-direction: column; -} - -/* 배너 자리가 항상 있으므로, 태그라인과의 원래 간격에서 배너 슬롯 높이를 뺀 값 */ -.emailGroup { - margin-top: 7px; -} - -.pwGroup { - margin-top: 14.47px; -} - -.label { - display: block; - margin-left: 27.23px; - color: #657a88; - font-family: Pretendard; - font-size: 15px; - font-style: normal; - font-weight: 500; - line-height: 20px; - letter-spacing: 0.4px; -} - -.emailLabel { - margin-bottom: 7.78px; -} - -.pwLabel { - margin-bottom: 10.89px; -} - -.inputWrapper { - display: flex; - align-items: center; - gap: 8px; - padding: 0 12px; - box-sizing: border-box; - width: 344.5px; - height: 40.371px; - margin-left: 30.27px; - border: 0.7px solid #afb1b6; - border-radius: 6px; - background: #ffffff; -} - -.inputWrapper:focus-within { - border-color: #4c9dd1; -} - -.inputWrapper.inputError { - border-color: #e15252; -} - -.inputIcon { - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: center; -} - -.emailIcon { - width: 17px; - height: 15px; -} - -.pwLockIcon { - width: 22px; - height: 22px; -} - -.input { - flex: 1; - min-width: 0; - border: none; - outline: none; - background: transparent; - color: #000; - font-family: Pretendard; - font-size: 15px; - font-style: normal; - font-weight: 400; - line-height: 20px; /* 133.333% */ - letter-spacing: 0.4px; -} - -.input::placeholder { - color: #657a88; - font-family: Pretendard; - font-size: 11px; - font-style: normal; - font-weight: 400; - line-height: 18.384px; /* 167.126% */ - letter-spacing: 0.368px; -} - -.eyeButton { - flex-shrink: 0; - width: 24px; - height: 24px; - padding: 0; - background: none; - border: none; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; -} - -.errorText { - height: 18.384px; - overflow: hidden; - margin-top: 4px; - margin-left: 30.27px; - font-family: Pretendard; - font-size: 11px; - font-style: normal; - font-weight: 400; - line-height: 18.384px; - letter-spacing: 0.368px; - color: #e15252; -} - -.autoLoginRow { - display: flex; - align-items: center; - gap: 8px; - margin-top: 10.72px; - margin-left: 32.05px; - cursor: pointer; - width: fit-content; - user-select: none; -} - -.checkbox { - width: 17.903px; - height: 17.903px; - flex-shrink: 0; - border-radius: 4px; - border: 1.5px solid #c6cad1; - display: flex; - align-items: center; - justify-content: center; -} - -.checkbox.checked { - background: #4c9dd1; - border-color: #4c9dd1; - color: #ffffff; -} - -.autoLoginLabel { - color: #657a88; - font-family: Pretendard; - font-size: 13px; - font-style: normal; - font-weight: 300; - line-height: 20px; - letter-spacing: 0.4px; -} - -.submitButton { - display: flex; - width: 359px; - height: 53px; - margin-top: 14.74px; - margin-left: 21.5px; - padding: 16px 20px; - box-sizing: border-box; - justify-content: center; - align-items: center; - gap: 6px; - border-radius: 16px; - border: none; - background: #4c9dd1; - color: #fff; - font-family: Pretendard; - font-size: 15px; - font-style: normal; - font-weight: 700; - line-height: 24px; - letter-spacing: 0.2px; - cursor: pointer; -} - -.submitButton:disabled { - opacity: 0.6; - cursor: not-allowed; -} - -.links { - display: flex; - align-items: center; - gap: 12px; - margin-top: 37px; - margin-left: 96px; -} - -.linkButton { - background: none; - border: none; - display: flex; - align-items: center; - gap: 6px; - cursor: pointer; - color: #000; - font-family: Pretendard; - font-size: 14px; - font-weight: 300; - line-height: 20px; - letter-spacing: 0.4px; -} - -.linkButton.join { - color: #4c9dd1; - line-height: 24px; - letter-spacing: 0.2px; -} - -.lockIcon { - width: 10.479px; - height: 13.473px; - margin-top: -3px; -} - -.joinIcon { - width: 11.929px; - height: 11.929px; - margin-top: -4px; -} - -.divider { - color: #d1d5db; -} - -.spinner { - width: 16px; - height: 16px; - border: 2px solid rgba(255, 255, 255, 0.4); - border-top-color: #ffffff; - border-radius: 50%; - animation: spin 0.7s linear infinite; -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} diff --git a/src/routes/router.tsx b/src/routes/router.tsx index d934681..342a79c 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -16,7 +16,7 @@ import { TestCard } from '../pages/TestCard'; import { TestExtra } from '../pages/TestExtra'; import { TestAvatar } from '../pages/TestAvatar'; import { TestLoading } from '../pages/TestLoading'; -import LoginPage from '../pages/login/login'; +import LoginPage from '../pages/login'; import SignupPage from '../pages/signup'; import FindPWPage from '../pages/findPW'; import AlertPage from '../pages/alert'; From 8f3c1540e5d5b779933e744f4ca05c450a9e850a Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Mon, 20 Jul 2026 14:24:48 +0900 Subject: [PATCH 24/28] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=9A=94=EB=A5=98,=20style:=20=ED=97=A4?= =?UTF-8?q?=EB=8D=94,=20=EC=95=8C=EB=A6=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/layout/Header.tsx | 15 ++++++++++++--- src/pages/alert.jsx | 6 ++---- src/pages/login.jsx | 14 +++++++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 82dbc8f..d88689b 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -4,12 +4,21 @@ interface HeaderProps { leftNode?: React.ReactNode; title?: string | React.ReactNode; rightNode?: React.ReactNode; + height?: number; } -export default function Header({ leftNode, title, rightNode }: HeaderProps) { +export default function Header({ + leftNode, + title, + rightNode, + height = 80, +}: HeaderProps) { return ( - // 💡 높이를 56px(모바일 표준)로 고정하고, z-index를 높여 스크롤 시 위로 올라오게 합니다. -
+ // 💡 높이를 60px(모바일 표준)로 기본 고정하되, height prop으로 오버라이드 가능. z-index를 높여 스크롤 시 위로 올라오게 합니다. +
{/* 1. 왼쪽 영역 (뒤로가기 버튼 or 메인 로고) */}
{leftNode}
diff --git a/src/pages/alert.jsx b/src/pages/alert.jsx index 50b9d59..dcf435b 100644 --- a/src/pages/alert.jsx +++ b/src/pages/alert.jsx @@ -247,11 +247,9 @@ export default function AlertPage() { return (
-
+
Date: Mon, 20 Jul 2026 14:28:34 +0900 Subject: [PATCH 25/28] =?UTF-8?q?style:=20=ED=97=A4=EB=8D=94=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/EPR.tsx | 7 +------ src/pages/alert.jsx | 2 -- src/pages/chat/CRP.tsx | 6 +----- src/pages/chat/SDP.tsx | 7 +------ src/pages/chat/TDP.tsx | 7 +------ 5 files changed, 4 insertions(+), 25 deletions(-) diff --git a/src/pages/EPR.tsx b/src/pages/EPR.tsx index 5137feb..cbb2e10 100644 --- a/src/pages/EPR.tsx +++ b/src/pages/EPR.tsx @@ -5,8 +5,6 @@ import { IconButton } from '@/components/common/IconButton'; import { ICONS } from '@/constants/icons'; import clockIcon from '@/assets/icons/clock.svg'; -const HEADER_H = 80; - interface ExchangeRoom { id: number; myCourseName: string; @@ -66,10 +64,7 @@ export default function ExchangeRoomListPage() { return (
-
+
{/* ============ 헤더 (모든 flowStep 공통 디폴트) ============ */} -
+
diff --git a/src/pages/chat/SDP.tsx b/src/pages/chat/SDP.tsx index db9f5e1..01beede 100644 --- a/src/pages/chat/SDP.tsx +++ b/src/pages/chat/SDP.tsx @@ -9,8 +9,6 @@ import { Modal } from '@/components/common/Modal'; import { ICONS } from '@/constants/icons'; import { mockScheduleStore } from '../mockChat'; -const HEADER_H = 80; - // TODO: 실제로는 수강신청 가능 날짜/시간 범위 API로 대체 const DATE_OPTIONS = [ '2026년 6월 05일 화요일', @@ -69,10 +67,7 @@ export default function ScheduleDecisionPage() { 인증 mock: {isMockVerified ? '성공' : '실패'} -
+
-
+
From 416b67e8eb20a5dc439dea26a0956e842216c3b8 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Mon, 27 Jul 2026 12:30:33 +0900 Subject: [PATCH 26/28] =?UTF-8?q?style:=20=ED=8C=8C=EC=9D=BC=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/{ => auth}/findPW.jsx | 0 src/pages/{ => auth}/login.jsx | 6 +++--- src/pages/{ => auth}/signup.jsx | 0 src/routes/router.tsx | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) rename src/pages/{ => auth}/findPW.jsx (100%) rename src/pages/{ => auth}/login.jsx (98%) rename src/pages/{ => auth}/signup.jsx (100%) diff --git a/src/pages/findPW.jsx b/src/pages/auth/findPW.jsx similarity index 100% rename from src/pages/findPW.jsx rename to src/pages/auth/findPW.jsx diff --git a/src/pages/login.jsx b/src/pages/auth/login.jsx similarity index 98% rename from src/pages/login.jsx rename to src/pages/auth/login.jsx index 7df6501..4a9ec32 100644 --- a/src/pages/login.jsx +++ b/src/pages/auth/login.jsx @@ -11,9 +11,9 @@ import emailIcon from '../assets/icons/email.svg'; import logo from '../assets/icons/logo.png'; import eyeIcon from '../assets/icons/eye.svg'; import pwLockIcon from '../assets/icons/pwlock.svg'; -import Button from '../components/common/Button'; -import { Input } from '../components/common/Input'; -import { Spinner } from '../components/common/Spinner'; +import Button from '../../components/common/Button'; +import { Input } from '../../components/common/Input'; +import { Spinner } from '../../components/common/Spinner'; const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; diff --git a/src/pages/signup.jsx b/src/pages/auth/signup.jsx similarity index 100% rename from src/pages/signup.jsx rename to src/pages/auth/signup.jsx diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 342a79c..6ccce00 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -16,9 +16,9 @@ import { TestCard } from '../pages/TestCard'; import { TestExtra } from '../pages/TestExtra'; import { TestAvatar } from '../pages/TestAvatar'; import { TestLoading } from '../pages/TestLoading'; -import LoginPage from '../pages/login'; +import LoginPage from '../pages/auth/login'; import SignupPage from '../pages/signup'; -import FindPWPage from '../pages/findPW'; +import FindPWPage from '../pages/auth/findPW'; import AlertPage from '../pages/alert'; import EPRPage from '../pages/epr'; import CRPPage from '../pages/chat/crp'; From 247b41cbbe9342531af8b4c8986a00d0babcda28 Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Sun, 2 Aug 2026 00:11:43 +0900 Subject: [PATCH 27/28] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8,=20?= =?UTF-8?q?=EC=95=8C=EB=9E=8C=20api=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/auth/authApi.js | 115 ++++++++++++++++++++++++++++++++++++++ src/api/auth/client.js | 37 ++++++++++++ src/api/authApi.js | 93 ------------------------------ src/pages/alert.jsx | 114 +++++++++++++++---------------------- src/pages/auth/findPW.jsx | 88 +++++++++-------------------- src/pages/auth/login.jsx | 60 ++++++++------------ src/pages/auth/signup.jsx | 90 ++++++++--------------------- src/routes/router.tsx | 2 +- src/store/tokenStorage.js | 29 +++++----- 9 files changed, 285 insertions(+), 343 deletions(-) create mode 100644 src/api/auth/authApi.js create mode 100644 src/api/auth/client.js delete mode 100644 src/api/authApi.js diff --git a/src/api/auth/authApi.js b/src/api/auth/authApi.js new file mode 100644 index 0000000..ba0abf1 --- /dev/null +++ b/src/api/auth/authApi.js @@ -0,0 +1,115 @@ +import { apiFetch, ApiError } from './client'; +import { getTokens } from '../../store/tokenStorage'; + +export { ApiError }; + +/** + * 이메일 인증코드 발송 + * POST /api/auth/email/code + * body: { email } + */ +export function sendEmailCode(email) { + return apiFetch('/api/auth/email/code', { method: 'POST', body: { email } }); +} + +/** + * 이메일 인증코드 검증 + * POST /api/auth/email/verify + * body: { email, code } + */ +export function verifyEmailCode(email, code) { + return apiFetch('/api/auth/email/verify', { + method: 'POST', + body: { email, code }, + }); +} + +/** + * 이메일(아이디) 중복 확인 + * GET /api/auth/email/exists?email=... + * ⚠ 쿼리 파라미터 이름 미확인 상태 (email로 가정). 실제 응답 확인 후 조정 필요. + */ +export function checkEmailExists(email) { + return apiFetch(`/api/auth/email/exists?email=${encodeURIComponent(email)}`); +} + +/** + * 회원가입 + * POST /api/auth/signup + * body: { email, password, passwordConfirm } + */ +export function signupRequest({ email, password, passwordConfirm }) { + return apiFetch('/api/auth/signup', { + method: 'POST', + body: { email, password, passwordConfirm }, + }); +} + +/** + * 로그인 + * POST /api/auth/login + * body: { email, password } + * response.data: { accessToken, refreshToken } + */ +export function loginRequest({ email, password }) { + return apiFetch('/api/auth/login', { + method: 'POST', + body: { email, password }, + }); +} + +/** + * 토큰 재발급 + * POST /api/auth/token/refresh + * body: { refreshToken } + * response.data: { accessToken, refreshToken } + */ +export function refreshTokenRequest(refreshToken) { + return apiFetch('/api/auth/token/refresh', { + method: 'POST', + body: { refreshToken }, + }); +} + +/** + * 로그아웃 + * POST /api/auth/logout + * Authorization: Bearer {accessToken} + */ +export function logoutRequest() { + const tokens = getTokens(); + return apiFetch('/api/auth/logout', { + method: 'POST', + token: tokens?.accessToken, + }); +} + +/** + * 비밀번호 재설정용 인증코드 발송 (findpw 전용, 미가입 이메일이면 404) + * POST /api/auth/password/email/code + * body: { email } + */ +export function sendPasswordResetCode(email) { + return apiFetch('/api/auth/password/email/code', { + method: 'POST', + body: { email }, + }); +} + +/** + * 비밀번호 재설정 (인증 완료 후 새 비밀번호로 교체) + * POST /api/auth/password/reset + * body: { email, newPassword, newPasswordConfirm } + * + * ※ 인증코드 확인 자체는 기존 verifyEmailCode(/api/auth/email/verify)를 재사용 + */ +export function resetPasswordRequest({ + email, + newPassword, + newPasswordConfirm, +}) { + return apiFetch('/api/auth/password/reset', { + method: 'POST', + body: { email, newPassword, newPasswordConfirm }, + }); +} diff --git a/src/api/auth/client.js b/src/api/auth/client.js new file mode 100644 index 0000000..416cca5 --- /dev/null +++ b/src/api/auth/client.js @@ -0,0 +1,37 @@ +const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; + +export class ApiError extends Error { + constructor(status, message, data) { + super(message); + this.status = status; + this.data = data; + } +} + +export async function apiFetch(path, { method = 'GET', body, token } = {}) { + const headers = { 'Content-Type': 'application/json' }; + if (token) headers.Authorization = `Bearer ${token}`; + + const res = await fetch(`${API_BASE}${path}`, { + method, + headers, + body: body ? JSON.stringify(body) : undefined, + }); + + let payload = null; + try { + payload = await res.json(); + } catch { + // body 없는 응답 대비 + } + + if (!res.ok || payload?.success === false) { + throw new ApiError( + res.status, + payload?.message ?? '요청에 실패했습니다.', + payload, + ); + } + + return payload; // { success, data, message } +} diff --git a/src/api/authApi.js b/src/api/authApi.js deleted file mode 100644 index 56b66d6..0000000 --- a/src/api/authApi.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Mock 인증 API - * 실제 백엔드가 준비되면 이 파일의 함수 내부만 fetch 호출로 교체하면 됩니다. - * - * POST /auth/login - * body: { email: string, password: string } - * 200 OK -> { accessToken, refreshToken, expiresIn } - * 400 Bad Request -> 비밀번호 불일치 / 존재하지 않는 계정 - * 403 Forbidden -> 정지된 계정 - */ - -// 테스트용 mock 계정 -const MOCK_USERS = [ - { - email: "vortexjml@sookmyung.ac.kr", - password: "abc123!@", - status: "active", - }, - { - email: "suspended@sookmyung.ac.kr", - password: "abc123!@", - status: "suspended", // 정지된 계정 테스트용 - }, -]; - -const NETWORK_DELAY_MS = 700; - -function generateMockToken(prefix) { - const random = Math.random().toString(36).slice(2, 12); - return `${prefix}.${random}.${Date.now()}`; -} - -export class ApiError extends Error { - constructor(status, message) { - super(message); - this.status = status; - } -} - -/** - * 이메일/비밀번호 로그인 - * @param {{ email: string, password: string }} payload - * @returns {Promise<{ accessToken: string, refreshToken: string, expiresIn: number }>} - */ -export function loginRequest({ email, password }) { - return new Promise((resolve, reject) => { - setTimeout(() => { - const user = MOCK_USERS.find((u) => u.email === email); - - if (!user) { - reject(new ApiError(400, "이메일 또는 비밀번호가 올바르지 않습니다.")); - return; - } - - if (user.status === "suspended") { - reject(new ApiError(403, "정지된 계정입니다. 고객센터로 문의해주세요.")); - return; - } - - if (user.password !== password) { - reject(new ApiError(400, "비밀번호가 일치하지 않습니다.")); - return; - } - - resolve({ - accessToken: generateMockToken("access"), - refreshToken: generateMockToken("refresh"), - // 데모/테스트 편의를 위해 30초로 설정 (실서비스는 30분 등으로 조정) - expiresIn: 30, - }); - }, NETWORK_DELAY_MS); - }); -} - -/** - * Refresh Token으로 Access Token 재발급 - * @param {string} refreshToken - */ -export function refreshTokenRequest(refreshToken) { - return new Promise((resolve, reject) => { - setTimeout(() => { - if (!refreshToken) { - reject(new ApiError(401, "Refresh Token이 없습니다. 다시 로그인해주세요.")); - return; - } - resolve({ - accessToken: generateMockToken("access"), - refreshToken, - expiresIn: 30, - }); - }, 400); - }); -} diff --git a/src/pages/alert.jsx b/src/pages/alert.jsx index 663aaa8..1750266 100644 --- a/src/pages/alert.jsx +++ b/src/pages/alert.jsx @@ -5,6 +5,8 @@ import Header from '@/components/layout/Header'; import { IconButton } from '@/components/common/IconButton'; import { Toast } from '@/components/common/Toast'; import { ICONS } from '@/constants/icons'; +import { apiFetch } from '@/api/auth/client'; +import { getTokens } from '@/store/tokenStorage'; // 💡 알림 타입별 아이콘 - src/assets/icons 안의 실제 파일명으로 교체하세요. import matchIcon from '@/assets/icons/matchoffer.svg'; @@ -14,17 +16,17 @@ import clockIcon from '@/assets/icons/hands.svg'; import cancelIcon from '@/assets/icons/matched.svg'; import systemIcon from '@/assets/icons/dibs.svg'; -const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; +// apiFetch가 API_BASE를 이미 붙이므로 여기는 path만 관리 const API = { - UNREAD_COUNT: `${API_BASE}/api/notifications/unread-count`, - LIST: `${API_BASE}/api/notifications`, - READ_ONE: (id) => `${API_BASE}/api/notifications/${id}/read`, - READ_ALL: `${API_BASE}/api/notifications/read-all`, + UNREAD_COUNT: '/api/notifications/unread-count', + LIST: '/api/notifications', + READ_ONE: (id) => `/api/notifications/${id}/read`, + READ_ALL: '/api/notifications/read-all', }; const PAGE_SIZE = 20; -const USE_MOCK = true; +const USE_MOCK = false; const MOCK_NOTIFICATIONS = [ { @@ -107,18 +109,6 @@ const formatRelativeTime = (iso) => { return `${Math.floor(diffHour / 24)}일 전`; }; -const getJson = async (url) => { - const res = await fetch(url, { credentials: 'include' }); - const data = await res.json().catch(() => null); - return { status: res.status, data }; -}; - -const patchJson = async (url) => { - const res = await fetch(url, { method: 'PATCH', credentials: 'include' }); - const data = await res.json().catch(() => null); - return { status: res.status, data }; -}; - export default function AlertPage() { const navigate = useNavigate(); const [notifications, setNotifications] = useState([]); @@ -158,19 +148,17 @@ export default function AlertPage() { return; } - const { status, data } = await getJson( + const token = getTokens()?.accessToken; + const payload = await apiFetch( `${API.LIST}?page=${page}&size=${PAGE_SIZE}`, + { token }, ); - - if (status === 200 && data?.success) { - const fetched = data.data.notifications ?? []; - setNotifications((prev) => (reset ? fetched : [...prev, ...fetched])); - setHasMore(fetched.length === PAGE_SIZE); - pageRef.current = page + 1; - } else { - showToast(TOAST_BY_TYPE.LOAD_FAILED); - } + const fetched = payload?.data?.notifications ?? []; + setNotifications((prev) => (reset ? fetched : [...prev, ...fetched])); + setHasMore(fetched.length === PAGE_SIZE); + pageRef.current = page + 1; } catch { + // apiFetch는 401/403/네트워크 오류 시 ApiError를 던짐 (여기서는 메시지 구분 없이 안내) showToast(TOAST_BY_TYPE.LOAD_FAILED); } finally { setIsLoading(false); @@ -178,6 +166,31 @@ export default function AlertPage() { } }; + // API 1. 안 읽은 알림 개수 조회 + // TODO: 헤더/탭바 뱃지 UI 나오면 마운트 시(or 폴링)로 연결 + const fetchUnreadCount = async () => { + try { + const token = getTokens()?.accessToken; + const payload = await apiFetch(API.UNREAD_COUNT, { token }); + return payload?.data?.unreadCount ?? null; + } catch { + return null; + } + }; + + // API 5. 알림 전체 읽음 처리 + // TODO: '모두 읽음' 버튼 UI 나오면 onClick에 연결하고 아래처럼 로컬 상태도 갱신 + const markAllAsRead = async () => { + try { + const token = getTokens()?.accessToken; + await apiFetch(API.READ_ALL, { method: 'PATCH', token }); + setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true }))); + return true; + } catch { + return false; + } + }; + // 리스트를 끝까지 스크롤하면 다음 페이지 로드 (기존 "불러오는 중..." 표시를 그대로 재사용) const handleScroll = () => { if (USE_MOCK || isLoading || isLoadingMore || !hasMore) return; @@ -199,12 +212,11 @@ export default function AlertPage() { ); } else { try { - const { status } = await patchJson(API.READ_ONE(item.id)); - if (status === 200) { - setNotifications((prev) => - prev.map((n) => (n.id === item.id ? { ...n, isRead: true } : n)), - ); - } + const token = getTokens()?.accessToken; + await apiFetch(API.READ_ONE(item.id), { method: 'PATCH', token }); + setNotifications((prev) => + prev.map((n) => (n.id === item.id ? { ...n, isRead: true } : n)), + ); } catch { // 읽음 처리 실패는 조용히 무시 (다음 진입 시 재시도됨) } @@ -231,19 +243,6 @@ export default function AlertPage() { } }; - // 👇 실제 푸시 서버 없이도 "알림 오는 거" 눈으로 확인하기 위한 mock 발송 버튼 - // 브라우저 알림 권한만 허용돼 있으면, 서버 없이 Service Worker의 showNotification을 - // 직접 호출해서 진짜 OS 알림창을 띄울 수 있습니다. - const handleSendMockPush = async () => { - const registration = await navigator.serviceWorker.ready; - registration.showNotification('✨ 새로운 매칭 제안', { - body: '데이터베이스 의 1순위 과목을 찾았습니다!\n교환을 제안해보세요!', - icon: '/icons/icon-192.png', - badge: '/icons/badge-72.png', - data: { url: '/alert' }, - }); - }; - return (
@@ -267,27 +266,6 @@ export default function AlertPage() { />
- {/* 개발 확인용 mock 발송 버튼 - 실제 배포 전엔 삭제하거나 조건부로 숨기세요 */} - {/* 우측 하단 테스트용 버튼 */} - -
{ - if (body?.email === MOCK_ACCOUNT.email) { - await new Promise((resolve) => setTimeout(resolve, 400)); - if (url === API.SEND_CODE) return { status: 200, data: { success: true } }; - if (url === API.VERIFY_CODE) { - const isCorrect = body.code === MOCK_ACCOUNT.code; - return { - status: isCorrect ? 200 : 400, - data: isCorrect - ? { success: true } - : { success: false, message: '잘못된 입력값입니다.' }, - }; - } - if (url === API.RESET_PASSWORD) - return { status: 200, data: { success: true } }; - } - const res = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }); - const data = await res.json().catch(() => null); - return { status: res.status, data }; -}; +import { + sendPasswordResetCode, + verifyEmailCode, + resetPasswordRequest, +} from '@/api/auth/authApi'; const EMAIL_DOMAIN = 'sookmyung.ac.kr'; const CODE_TIMER_SECONDS = 5 * 60; @@ -133,17 +104,18 @@ export default function FindPasswordPage() { setEmailError(''); setIsSending(true); try { - const { data } = await postJson(API.SEND_CODE, { email }); - if (data?.success) { - setIsCodeSent(true); - setSecondsLeft(CODE_TIMER_SECONDS); - setCode(''); - setCodeError(''); - } else { - setEmailError(data?.message || '인증코드 발송에 실패했습니다.'); - } - } catch { - setEmailError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + await sendPasswordResetCode(email); + setIsCodeSent(true); + setSecondsLeft(CODE_TIMER_SECONDS); + setCode(''); + setCodeError(''); + } catch (err) { + // 404: 가입되지 않은 이메일 + setEmailError( + err.status === 404 + ? '가입되지 않은 이메일입니다.' + : err.message || '인증코드 발송에 실패했습니다.', + ); } finally { setIsSending(false); } @@ -154,14 +126,10 @@ export default function FindPasswordPage() { setCodeError(''); setIsVerifying(true); try { - const { data } = await postJson(API.VERIFY_CODE, { email, code }); - if (!data?.success) { - setCodeError(data?.message || '잘못된 입력값입니다.'); - return; - } + await verifyEmailCode(email, code); setStep('password'); - } catch { - setCodeError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } catch (err) { + setCodeError(err.message || '잘못된 입력값입니다.'); } finally { setIsVerifying(false); } @@ -189,18 +157,14 @@ export default function FindPasswordPage() { if (!validatePassword()) return; setIsSubmitting(true); try { - const { status, data } = await postJson(API.RESET_PASSWORD, { + await resetPasswordRequest({ email, - password, - passwordConfirm, + newPassword: password, + newPasswordConfirm: passwordConfirm, }); - if (status === 200 && data?.success) { - setShowCompleteModal(true); - return; - } - setResetError(data?.message || '비밀번호 변경에 실패했습니다.'); - } catch { - setResetError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + setShowCompleteModal(true); + } catch (err) { + setResetError(err.message || '비밀번호 변경에 실패했습니다.'); } finally { setIsSubmitting(false); } diff --git a/src/pages/auth/login.jsx b/src/pages/auth/login.jsx index 4a9ec32..7bd5370 100644 --- a/src/pages/auth/login.jsx +++ b/src/pages/auth/login.jsx @@ -2,15 +2,15 @@ import React from 'react'; import { useEffect, useRef, useState } from 'react'; import { twMerge } from 'tailwind-merge'; import { useNavigate } from 'react-router-dom'; -// import { loginRequest, refreshTokenRequest, ApiError } from '../../api/authApi'; -// import { saveTokens, clearTokens } from '../../utils/tokenStorage'; -import lockIcon from '../assets/icons/lock.svg'; -import joinIcon from '../assets/icons/join.svg'; -import checkIcon from '../assets/icons/check.svg'; -import emailIcon from '../assets/icons/email.svg'; -import logo from '../assets/icons/logo.png'; -import eyeIcon from '../assets/icons/eye.svg'; -import pwLockIcon from '../assets/icons/pwlock.svg'; +import { loginRequest, ApiError } from '@/api/auth/authApi'; +import { saveTokens } from '@/store/tokenStorage'; +import lockIcon from '../../assets/icons/lock.svg'; +import joinIcon from '../../assets/icons/join.svg'; +import checkIcon from '../../assets/icons/check.svg'; +import emailIcon from '../../assets/icons/email.svg'; +import logo from '../../assets/icons/logo.png'; +import eyeIcon from '../../assets/icons/eye.svg'; +import pwLockIcon from '../../assets/icons/pwlock.svg'; import Button from '../../components/common/Button'; import { Input } from '../../components/common/Input'; import { Spinner } from '../../components/common/Spinner'; @@ -47,27 +47,6 @@ export default function LoginPage() { return !errors.email && !errors.password; } - // function scheduleTokenRefresh(refreshToken, expiresIn) { - // clearTimeout(refreshTimerRef.current); - // refreshTimerRef.current = setTimeout(async () => { - // try { - // // const reissued = await refreshTokenRequest(refreshToken); - // // saveTokens(reissued, autoLogin); - // setBanner({ - // type: 'success', - // message: '토큰이 만료되어 새 토큰으로 재발급되었습니다.', - // }); - // // scheduleTokenRefresh(reissued.refreshToken, reissued.expiresIn); - // } catch { - // // clearTokens(); - // setBanner({ - // type: 'error', - // message: '세션이 만료되었습니다. 다시 로그인해주세요.', - // }); - // } - // }, expiresIn * 1000); - // } - async function handleSubmit(e) { e.preventDefault(); setBanner(null); @@ -75,18 +54,23 @@ export default function LoginPage() { setIsSubmitting(true); try { - // const tokens = await loginRequest({ email: email.trim(), password }); - // saveTokens(tokens, autoLogin); + const { data } = await loginRequest({ email: email.trim(), password }); + saveTokens(data, autoLogin); setBanner({ type: 'success', message: `로그인에 성공했습니다. ${autoLogin ? '자동 로그인이 설정됨' : ''}`, }); - // scheduleTokenRefresh(tokens.refreshToken, tokens.expiresIn); - } catch { - setBanner({ - type: 'error', - message: '알 수 없는 오류가 발생했습니다. 다시 시도해주세요.', - }); + navigate('/'); // TODO: 실제 로그인 후 이동할 경로로 교체 + } catch (err) { + if (err instanceof ApiError) { + // 400: 비밀번호 불일치, 403: 정지된 계정 등 서버 메시지 그대로 노출 + setBanner({ type: 'error', message: err.message }); + } else { + setBanner({ + type: 'error', + message: '네트워크 오류가 발생했습니다. 다시 시도해주세요.', + }); + } } finally { setIsSubmitting(false); } diff --git a/src/pages/auth/signup.jsx b/src/pages/auth/signup.jsx index ef623e6..adb8583 100644 --- a/src/pages/auth/signup.jsx +++ b/src/pages/auth/signup.jsx @@ -7,42 +7,12 @@ import { Modal } from '@/components/common/Modal'; import { IconButton } from '@/components/common/IconButton'; import { ICONS } from '@/constants/icons'; import eyeIcon from '@/assets/icons/eye.svg'; - -const API_BASE = import.meta.env.VITE_API_BASE_URL ?? ''; -const API = { - SEND_CODE: `${API_BASE}/api/auth/email/send-code`, - VERIFY_CODE: `${API_BASE}/api/auth/email/verify-code`, - CHECK_DUPLICATE: `${API_BASE}/api/auth/email/check`, - SIGNUP: `${API_BASE}/api/auth/signup`, -}; - -const MOCK_ACCOUNT = { email: 'test1234@sookmyung.ac.kr', code: '123456' }; - -const postJson = async (url, body) => { - if (body?.email === MOCK_ACCOUNT.email) { - await new Promise((resolve) => setTimeout(resolve, 400)); - if (url === API.SEND_CODE) return { status: 200, data: { success: true } }; - if (url === API.VERIFY_CODE) { - const isCorrect = body.code === MOCK_ACCOUNT.code; - return { - status: isCorrect ? 200 : 400, - data: isCorrect - ? { success: true } - : { success: false, message: '잘못된 입력값입니다.' }, - }; - } - if (url === API.CHECK_DUPLICATE) - return { status: 200, data: { success: true, data: { exists: false } } }; - if (url === API.SIGNUP) return { status: 201, data: { success: true } }; - } - const res = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }); - const data = await res.json().catch(() => null); - return { status: res.status, data }; -}; +import { + sendEmailCode, + verifyEmailCode, + checkEmailExists, + signupRequest, +} from '@/api/auth/authApi'; const EMAIL_DOMAIN = 'sookmyung.ac.kr'; const CODE_TIMER_SECONDS = 5 * 60; @@ -135,17 +105,13 @@ export default function SignupPage() { setEmailError(''); setIsSending(true); try { - const { data } = await postJson(API.SEND_CODE, { email }); - if (data?.success) { - setIsCodeSent(true); - setSecondsLeft(CODE_TIMER_SECONDS); - setCode(''); - setCodeError(''); - } else { - setEmailError(data?.message || '인증코드 발송에 실패했습니다.'); - } - } catch { - setEmailError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + await sendEmailCode(email); + setIsCodeSent(true); + setSecondsLeft(CODE_TIMER_SECONDS); + setCode(''); + setCodeError(''); + } catch (err) { + setEmailError(err.message || '인증코드 발송에 실패했습니다.'); } finally { setIsSending(false); } @@ -156,19 +122,15 @@ export default function SignupPage() { setCodeError(''); setIsVerifying(true); try { - const { data } = await postJson(API.VERIFY_CODE, { email, code }); - if (!data?.success) { - setCodeError(data?.message || '잘못된 입력값입니다.'); - return; - } - const dup = await postJson(API.CHECK_DUPLICATE, { email }); - if (dup.data?.data?.exists) { + await verifyEmailCode(email, code); + const { data } = await checkEmailExists(email); + if (data?.exists) { setCodeError('이미 가입된 이메일입니다.'); return; } setStep('password'); - } catch { - setCodeError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + } catch (err) { + setCodeError(err.message || '잘못된 입력값입니다.'); } finally { setIsVerifying(false); } @@ -196,18 +158,10 @@ export default function SignupPage() { if (!validatePassword()) return; setIsSubmitting(true); try { - const { status, data } = await postJson(API.SIGNUP, { - email, - password, - passwordConfirm, - }); - if (status === 201 && data?.success) { - setShowCompleteModal(true); - return; - } - setSignupError(data?.message || '회원가입에 실패했습니다.'); - } catch { - setSignupError('네트워크 오류가 발생했습니다. 다시 시도해주세요.'); + await signupRequest({ email, password, passwordConfirm }); + setShowCompleteModal(true); + } catch (err) { + setSignupError(err.message || '회원가입에 실패했습니다.'); } finally { setIsSubmitting(false); } diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 6ccce00..4899c55 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -17,7 +17,7 @@ import { TestExtra } from '../pages/TestExtra'; import { TestAvatar } from '../pages/TestAvatar'; import { TestLoading } from '../pages/TestLoading'; import LoginPage from '../pages/auth/login'; -import SignupPage from '../pages/signup'; +import SignupPage from '../pages/auth/signup'; import FindPWPage from '../pages/auth/findPW'; import AlertPage from '../pages/alert'; import EPRPage from '../pages/epr'; diff --git a/src/store/tokenStorage.js b/src/store/tokenStorage.js index c76b227..4f4af93 100644 --- a/src/store/tokenStorage.js +++ b/src/store/tokenStorage.js @@ -1,26 +1,30 @@ -/** - * 토큰 저장 유틸 - * - "자동 로그인" 체크 시: localStorage (브라우저/앱 종료 후에도 유지) - * - 미체크 시: sessionStorage (탭/앱 종료 시 소멸) - */ - -const ACCESS_TOKEN_KEY = "soo_access_token"; -const REFRESH_TOKEN_KEY = "soo_refresh_token"; -const EXPIRES_AT_KEY = "soo_token_expires_at"; +const ACCESS_TOKEN_KEY = 'soo_access_token'; +const REFRESH_TOKEN_KEY = 'soo_refresh_token'; +const EXPIRES_AT_KEY = 'soo_token_expires_at'; function getStorage(persist) { return persist ? window.localStorage : window.sessionStorage; } -export function saveTokens({ accessToken, refreshToken, expiresIn }, persist) { +function decodeJwtExpiresAt(token) { + try { + const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'); + const payload = JSON.parse(atob(base64)); + return payload.exp ? payload.exp * 1000 : null; + } catch { + return null; + } +} + +export function saveTokens({ accessToken, refreshToken }, persist) { const storage = getStorage(persist); - const expiresAt = Date.now() + expiresIn * 1000; + const expiresAt = + decodeJwtExpiresAt(accessToken) ?? Date.now() + 30 * 60 * 1000; storage.setItem(ACCESS_TOKEN_KEY, accessToken); storage.setItem(REFRESH_TOKEN_KEY, refreshToken); storage.setItem(EXPIRES_AT_KEY, String(expiresAt)); - // 두 storage 모두 정리해서 이전 로그인 방식의 잔여 토큰이 남지 않도록 함 const other = getStorage(!persist); other.removeItem(ACCESS_TOKEN_KEY); other.removeItem(REFRESH_TOKEN_KEY); @@ -37,7 +41,6 @@ export function getTokens() { const expiresAt = Number(storage.getItem(EXPIRES_AT_KEY)) || 0; if (!accessToken || !refreshToken) return null; - return { accessToken, refreshToken, expiresAt, storage }; } From 9fa114d6f75892c4109c767474204f5103eb639f Mon Sep 17 00:00:00 2001 From: ziaiz <23.cs.qkrwldk@sookmyung.ac.kr> Date: Sun, 2 Aug 2026 01:06:13 +0900 Subject: [PATCH 28/28] =?UTF-8?q?style:=20=ED=8C=8C=EC=9D=BC=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 703 ++++++++++++++++++++++++++++++++ package.json | 3 + src/api/{ => alert}/push.js | 0 src/main.tsx | 2 +- src/pages/{ => alert}/alert.jsx | 97 +---- src/pages/{ => chat}/EPR.tsx | 0 src/pages/global.d.ts | 11 + src/routes/router.tsx | 10 +- 8 files changed, 744 insertions(+), 82 deletions(-) rename src/api/{ => alert}/push.js (100%) rename src/pages/{ => alert}/alert.jsx (78%) rename src/pages/{ => chat}/EPR.tsx (100%) create mode 100644 src/pages/global.d.ts diff --git a/package-lock.json b/package-lock.json index cd5a1b9..4ea03ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,13 @@ "version": "0.0.0", "dependencies": { "@iconify/react": "^6.0.2", + "@stomp/stompjs": "^7.3.0", "@tanstack/react-query": "^5.101.4", "axios": "^1.18.1", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0", + "tailwind-merge": "^3.6.0", "zustand": "^5.0.14" }, "devDependencies": { @@ -23,6 +25,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "autoprefixer": "^10.5.2", + "eslint": "^10.8.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", @@ -104,6 +107,47 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, "node_modules/@eslint/js": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", @@ -125,6 +169,96 @@ } } }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@iconify/react": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@iconify/react/-/react-6.0.2.tgz", @@ -875,6 +1009,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@stomp/stompjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@stomp/stompjs/-/stompjs-7.3.0.tgz", + "integrity": "sha512-nKMLoFfJhrQAqkvvKd1vLq/cVBGCMwPRCD0LqW7UT1fecRx9C3GoKEIR2CYwVuErGeZu8w0kFkl2rlhPlqHVgQ==", + "license": "Apache-2.0" + }, "node_modules/@tanstack/query-core": { "version": "5.101.4", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.4.tgz", @@ -912,6 +1052,27 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.13.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", @@ -1211,6 +1372,29 @@ } } }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -1223,6 +1407,23 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", @@ -1814,6 +2015,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1905,6 +2121,13 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2233,6 +2456,78 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", + "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, "node_modules/eslint-config-prettier": { "version": "10.1.8", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", @@ -2368,6 +2663,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", @@ -2381,6 +2695,50 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -2408,6 +2766,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", @@ -2445,6 +2810,20 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -2473,6 +2852,19 @@ } } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2486,6 +2878,44 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -2853,6 +3283,26 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -3312,6 +3762,13 @@ "dev": true, "license": "MIT" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", @@ -3347,6 +3804,27 @@ "dev": true, "license": "MIT" }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -3363,6 +3841,30 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -3686,6 +4188,22 @@ "node": ">=22.13.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", @@ -4085,6 +4603,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/own-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", @@ -4153,6 +4689,58 @@ } } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4373,6 +4961,16 @@ "dev": true, "license": "MIT" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.1.tgz", @@ -4423,6 +5021,16 @@ "node": ">=10" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -4831,6 +5439,29 @@ "node": ">= 0.4" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", @@ -5155,6 +5786,16 @@ "url": "https://opencollective.com/synckit" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -5284,6 +5925,19 @@ "license": "0BSD", "optional": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -5457,6 +6111,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5542,6 +6206,22 @@ } } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", @@ -5631,6 +6311,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.0.tgz", @@ -5666,6 +6356,19 @@ "url": "https://github.com/sponsors/eemeli" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zustand": { "version": "5.0.14", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", diff --git a/package.json b/package.json index f53b019..3bbc17f 100644 --- a/package.json +++ b/package.json @@ -12,11 +12,13 @@ }, "dependencies": { "@iconify/react": "^6.0.2", + "@stomp/stompjs": "^7.3.0", "@tanstack/react-query": "^5.101.4", "axios": "^1.18.1", "react": "^19.2.7", "react-dom": "^19.2.7", "react-router-dom": "^7.18.0", + "tailwind-merge": "^3.6.0", "zustand": "^5.0.14" }, "devDependencies": { @@ -26,6 +28,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "autoprefixer": "^10.5.2", + "eslint": "^10.8.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", diff --git a/src/api/push.js b/src/api/alert/push.js similarity index 100% rename from src/api/push.js rename to src/api/alert/push.js diff --git a/src/main.tsx b/src/main.tsx index 665abdd..b530452 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,7 +2,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; import './index.css'; // Tailwind CSS 등 전역 스타일 적용 -import { registerServiceWorker } from './api/push'; +import { registerServiceWorker } from './api/alert/push'; ReactDOM.createRoot(document.getElementById('root')!).render( diff --git a/src/pages/alert.jsx b/src/pages/alert/alert.jsx similarity index 78% rename from src/pages/alert.jsx rename to src/pages/alert/alert.jsx index 1750266..96dc29c 100644 --- a/src/pages/alert.jsx +++ b/src/pages/alert/alert.jsx @@ -28,54 +28,6 @@ const PAGE_SIZE = 20; const USE_MOCK = false; -const MOCK_NOTIFICATIONS = [ - { - id: 1, - type: 'MATCH_PROPOSAL', - title: '마케팅과 소비자이슈 1순위 매칭 제안', - body: '마케팅과소비자이슈의 1순위 과목을 찾았습니다!\n교환을 제안해보세요!', - deepLink: null, - isRead: false, - createdAt: new Date(Date.now() - 1 * 60 * 1000).toISOString(), - }, - { - id: 2, - type: 'MATCH_PROPOSAL', - title: '마케팅과 소비자이슈 2순위 매칭 제안', - body: '마케팅과소비자이슈의 2순위 과목을 찾았습니다!\n교환을 제안해보세요!', - deepLink: null, - isRead: false, - createdAt: new Date(Date.now() - 7 * 60 * 1000).toISOString(), - }, - { - id: 3, - type: 'LIKE', - title: '찜 알림', - body: '누군가 회원님의 [데이터베이스] 과목을 찜했습니다!\n상대방이 버리는 과목을 확인해 볼까요?', - deepLink: null, - isRead: true, - createdAt: new Date(Date.now() - 12 * 60 * 1000).toISOString(), - }, - { - id: 4, - type: 'MATCH_ACCEPTED', - title: '매칭완료', - body: '매칭이 성사되었습니다!\n교환 채팅방으로 이동하여 시간을 조율해 주세요', - deepLink: null, - isRead: true, - createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), - }, - { - id: 5, - type: 'EXCHANGE_SCHEDULED', - title: '매칭 시간 확정', - body: '오후 2시 15분으로 교환 시간이 확정되었습니다.\n교환 5분 전 과목 보유 인증이 진행됩니다. 약속 시간을 꼭 지켜주세요.', - deepLink: null, - isRead: true, - createdAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(), - }, -]; - const TYPE_ICON_MAP = { MATCH_PROPOSAL: { icon: matchIcon, bg: 'bg-blue-100' }, MATCH_REQUESTED: { icon: matchIcon, bg: 'bg-blue-100' }, @@ -141,13 +93,6 @@ export default function AlertPage() { } try { - if (USE_MOCK) { - await new Promise((r) => setTimeout(r, 300)); - setNotifications(MOCK_NOTIFICATIONS); - setHasMore(false); - return; - } - const token = getTokens()?.accessToken; const payload = await apiFetch( `${API.LIST}?page=${page}&size=${PAGE_SIZE}`, @@ -168,28 +113,28 @@ export default function AlertPage() { // API 1. 안 읽은 알림 개수 조회 // TODO: 헤더/탭바 뱃지 UI 나오면 마운트 시(or 폴링)로 연결 - const fetchUnreadCount = async () => { - try { - const token = getTokens()?.accessToken; - const payload = await apiFetch(API.UNREAD_COUNT, { token }); - return payload?.data?.unreadCount ?? null; - } catch { - return null; - } - }; + // const fetchUnreadCount = async () => { + // try { + // const token = getTokens()?.accessToken; + // const payload = await apiFetch(API.UNREAD_COUNT, { token }); + // return payload?.data?.unreadCount ?? null; + // } catch { + // return null; + // } + // }; - // API 5. 알림 전체 읽음 처리 - // TODO: '모두 읽음' 버튼 UI 나오면 onClick에 연결하고 아래처럼 로컬 상태도 갱신 - const markAllAsRead = async () => { - try { - const token = getTokens()?.accessToken; - await apiFetch(API.READ_ALL, { method: 'PATCH', token }); - setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true }))); - return true; - } catch { - return false; - } - }; + // // API 5. 알림 전체 읽음 처리 + // // TODO: '모두 읽음' 버튼 UI 나오면 onClick에 연결하고 아래처럼 로컬 상태도 갱신 + // const markAllAsRead = async () => { + // try { + // const token = getTokens()?.accessToken; + // await apiFetch(API.READ_ALL, { method: 'PATCH', token }); + // setNotifications((prev) => prev.map((n) => ({ ...n, isRead: true }))); + // return true; + // } catch { + // return false; + // } + // }; // 리스트를 끝까지 스크롤하면 다음 페이지 로드 (기존 "불러오는 중..." 표시를 그대로 재사용) const handleScroll = () => { diff --git a/src/pages/EPR.tsx b/src/pages/chat/EPR.tsx similarity index 100% rename from src/pages/EPR.tsx rename to src/pages/chat/EPR.tsx diff --git a/src/pages/global.d.ts b/src/pages/global.d.ts new file mode 100644 index 0000000..a66e54f --- /dev/null +++ b/src/pages/global.d.ts @@ -0,0 +1,11 @@ +declare module '*.jsx' { + import React from 'react'; + + const Component: React.ComponentType; + export default Component; +} + +declare module '*.js' { + const content: unknown; + export default content; +} diff --git a/src/routes/router.tsx b/src/routes/router.tsx index 8956c3e..cc6efce 100644 --- a/src/routes/router.tsx +++ b/src/routes/router.tsx @@ -10,11 +10,11 @@ import FullScreenLayout from '@/components/layout/FullScreenLayout'; import LoginPage from '../pages/auth/login'; import SignupPage from '../pages/auth/signup'; import FindPWPage from '../pages/auth/findPW'; -import AlertPage from '../pages/alert'; -import EPRPage from '../pages/epr'; -import CRPPage from '../pages/chat/crp'; -import SDPPage from '../pages/chat/sdp'; -import TDPPage from '../pages/chat/tdp'; +import AlertPage from '../pages/alert/alert'; +import EPRPage from '../pages/chat/EPR'; +import CRPPage from '../pages/chat/CRP'; +import SDPPage from '../pages/chat/SDP'; +import TDPPage from '../pages/chat/TDP'; // --- 2. 페이지 불러오기 --- export const router = createBrowserRouter([